diff --git a/docs/reference-guides/core-blocks.md b/docs/reference-guides/core-blocks.md
index f59b472bdabdd1..73e4186fce9b67 100644
--- a/docs/reference-guides/core-blocks.md
+++ b/docs/reference-guides/core-blocks.md
@@ -340,7 +340,7 @@ Insert an image to make a visual statement. ([Source](https://github.com/WordPre
- **Name:** core/image
- **Category:** media
- **Supports:** anchor, behaviors (lightbox), color (~~background~~, ~~text~~), filter (duotone)
-- **Attributes:** align, alt, caption, height, href, id, linkClass, linkDestination, linkTarget, rel, sizeSlug, title, url, width
+- **Attributes:** align, alt, aspectRatio, caption, height, href, id, linkClass, linkDestination, linkTarget, rel, scale, sizeSlug, title, url, width
## Latest Comments
diff --git a/lib/compat/wordpress-6.3/blocks.php b/lib/compat/wordpress-6.3/blocks.php
index 6902a258c5c3d8..b338d0a2467096 100644
--- a/lib/compat/wordpress-6.3/blocks.php
+++ b/lib/compat/wordpress-6.3/blocks.php
@@ -47,6 +47,7 @@ function gutenberg_rename_reusable_block_cpt_to_pattern( $args, $post_type ) {
$args['labels']['new_item'] = __( 'New Pattern' );
$args['labels']['edit_item'] = __( 'Edit Pattern' );
$args['labels']['view_item'] = __( 'View Pattern' );
+ $args['labels']['view_items'] = __( 'View Patterns' );
$args['labels']['all_items'] = __( 'All Patterns' );
$args['labels']['search_items'] = __( 'Search Patterns' );
$args['labels']['not_found'] = __( 'No Patterns found.' );
diff --git a/package-lock.json b/package-lock.json
index 3aa3c53844ff07..e8e218128f5f36 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10455,7 +10455,7 @@
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
@@ -13585,7 +13585,7 @@
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
@@ -16068,7 +16068,7 @@
"@types/json5": {
"version": "0.0.29",
"resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
- "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
"dev": true
},
"@types/keyv": {
@@ -17252,6 +17252,7 @@
"version": "file:packages/block-editor",
"requires": {
"@babel/runtime": "^7.16.0",
+ "@emotion/styled": "^11.6.0",
"@react-spring/web": "^9.4.5",
"@wordpress/a11y": "file:packages/a11y",
"@wordpress/api-fetch": "file:packages/api-fetch",
@@ -17450,7 +17451,7 @@
"dom-scroll-into-view": "^1.2.1",
"downshift": "^6.0.15",
"fast-deep-equal": "^3.1.3",
- "framer-motion": "^10.11.6",
+ "framer-motion": "~10.11.6",
"gradient-parser": "^0.1.5",
"highlight-words-core": "^1.2.2",
"is-plain-object": "^5.0.0",
@@ -17741,27 +17742,27 @@
},
"dependencies": {
"@wordpress/dom": {
- "version": "3.20.0",
- "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-3.20.0.tgz",
- "integrity": "sha512-Q35qCW8jj/JXTTujcC0wDDaLNNdzivkWkvCQj9FTyb+SoT8ZMwcwipnNvhyC0qprPlEREdQtNODmlSm4Ur4YkA==",
+ "version": "3.36.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-3.36.0.tgz",
+ "integrity": "sha512-JZDZnY0lBdYVsB53gBuxfjxD+8NUpL3vOtj4bkSP8V6HisVd7OJBep2CeyOTzRsYtBebU4NYvgbk3taFVI6Fgw==",
"requires": {
"@babel/runtime": "^7.16.0",
- "@wordpress/deprecated": "^3.20.0"
+ "@wordpress/deprecated": "^3.36.0"
},
"dependencies": {
"@wordpress/deprecated": {
- "version": "3.20.0",
- "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-3.20.0.tgz",
- "integrity": "sha512-JruZLx74uP9uI5qi7uTANMXwLBNtGHvw/pYCtWBaisFTUutGm1fF1tGWFtIgTy5j1SjHtN0PMkTFlvdpJ+HASQ==",
+ "version": "3.36.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-3.36.0.tgz",
+ "integrity": "sha512-wFk2rI5tK+TBQNhRd9hyVe7gp3J7dUIrHmIXotN291GZjpm48Q3NiOi/gcCbeIKmsfy++g20tNAQ9YkG81Zocg==",
"requires": {
"@babel/runtime": "^7.16.0",
- "@wordpress/hooks": "^3.20.0"
+ "@wordpress/hooks": "^3.36.0"
}
},
"@wordpress/hooks": {
- "version": "3.20.0",
- "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-3.20.0.tgz",
- "integrity": "sha512-OMOJwmbubrKueXhXEyBNU8CXBycawmtXCWbhqgYYbihgecB7cSZ1kAAPz+Oi/5j+3+XDfSlZXgWM1lCwvfnzPQ==",
+ "version": "3.36.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-3.36.0.tgz",
+ "integrity": "sha512-1GZcDPXaCBjdWHJEy7SGSGXdikL6+ErAKvLb9CFbliyiEMR1FIoiNQD9IchmnDxBZo68mwajyz6dco9I2BAwDg==",
"requires": {
"@babel/runtime": "^7.16.0"
}
@@ -18806,7 +18807,7 @@
"absolute-path": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/absolute-path/-/absolute-path-0.0.0.tgz",
- "integrity": "sha1-p4di+9rftSl76ZsV01p4Wy8JW/c="
+ "integrity": "sha512-HQiug4c+/s3WOvEnDRxXVmNtSG5s2gJM9r19BTcqjp7BWcE48PB+Y2G6jE65kqI0LpsQeMZygt/b60Gi4KxGyA=="
},
"accepts": {
"version": "1.3.7",
@@ -25848,7 +25849,7 @@
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
}
}
},
@@ -25873,7 +25874,7 @@
"arr-diff": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA=="
},
"arr-flatten": {
"version": "1.1.0",
@@ -25883,7 +25884,7 @@
"arr-union": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
- "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+ "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q=="
},
"array-differ": {
"version": "3.0.0",
@@ -25894,20 +25895,20 @@
"array-find-index": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
- "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==",
"dev": true,
"optional": true
},
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
"dev": true
},
"array-ify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
- "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=",
+ "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==",
"dev": true
},
"array-includes": {
@@ -26158,7 +26159,7 @@
"array-union": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==",
"dev": true,
"requires": {
"array-uniq": "^1.0.1"
@@ -26167,13 +26168,13 @@
"array-uniq": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+ "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
"dev": true
},
"array-unique": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+ "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ=="
},
"array.prototype.flat": {
"version": "1.2.1",
@@ -26917,7 +26918,7 @@
"asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
},
"asn1": {
"version": "0.2.3",
@@ -26958,13 +26959,13 @@
"inherits": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
- "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+ "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==",
"dev": true
},
"util": {
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
- "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==",
"dev": true,
"requires": {
"inherits": "2.0.1"
@@ -26975,13 +26976,13 @@
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
"dev": true
},
"assign-symbols": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
- "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+ "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw=="
},
"ast-types": {
"version": "0.14.2",
@@ -26994,7 +26995,7 @@
"ast-types-flow": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
- "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=",
+ "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==",
"dev": true
},
"astral-regex": {
@@ -27022,7 +27023,7 @@
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"dev": true
},
"at-least-node": {
@@ -27039,7 +27040,7 @@
"atob-lite": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz",
- "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=",
+ "integrity": "sha512-LEeSAWeh2Gfa2FtlQE1shxQ8zi5F9GHarrGKz08TMdODD5T4eH6BMsvtnhbWZ+XQn+Gb6om/917ucvRu7l7ukw==",
"dev": true
},
"autoprefixer": {
@@ -27109,7 +27110,7 @@
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
"dev": true
},
"aws4": {
@@ -27542,7 +27543,7 @@
"babel-plugin-transform-remove-console": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz",
- "integrity": "sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A=",
+ "integrity": "sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==",
"dev": true
},
"babel-preset-current-node-syntax": {
@@ -27637,7 +27638,7 @@
"define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
"requires": {
"is-descriptor": "^1.0.0"
}
@@ -27678,7 +27679,7 @@
"batch": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
"dev": true
},
"batch-processor": {
@@ -27690,7 +27691,7 @@
"bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
"dev": true,
"optional": true,
"requires": {
@@ -27706,7 +27707,7 @@
"benchmark": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz",
- "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=",
+ "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==",
"dev": true,
"requires": {
"lodash": "^4.17.4",
@@ -27892,7 +27893,7 @@
"boolbase": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
- "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
},
"boxen": {
"version": "5.1.2",
@@ -28018,7 +28019,7 @@
"brorand": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
- "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
"dev": true
},
"browser-assert": {
@@ -28160,7 +28161,7 @@
"btoa-lite": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz",
- "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=",
+ "integrity": "sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA==",
"dev": true
},
"buffer": {
@@ -28177,7 +28178,7 @@
"buffer-crc32": {
"version": "0.2.13",
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
"dev": true
},
"buffer-from": {
@@ -28194,7 +28195,7 @@
"buffer-xor": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
- "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+ "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
"dev": true
},
"builtin-modules": {
@@ -28206,13 +28207,13 @@
"builtin-status-codes": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
- "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+ "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==",
"dev": true
},
"builtins": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
- "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=",
+ "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==",
"dev": true
},
"byte-size": {
@@ -28459,7 +28460,7 @@
"caller-callsite": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
- "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
+ "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==",
"requires": {
"callsites": "^2.0.0"
},
@@ -28467,14 +28468,14 @@
"callsites": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
- "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA="
+ "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ=="
}
}
},
"caller-path": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
- "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
+ "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==",
"requires": {
"caller-callsite": "^2.0.0"
}
@@ -28482,7 +28483,7 @@
"callsite": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
- "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
+ "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==",
"dev": true
},
"callsites": {
@@ -28513,7 +28514,7 @@
"camelcase-keys": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
- "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==",
"dev": true,
"optional": true,
"requires": {
@@ -28524,7 +28525,7 @@
"camelcase": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
- "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==",
"dev": true,
"optional": true
}
@@ -28580,7 +28581,7 @@
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
"dev": true
},
"ccount": {
@@ -28899,7 +28900,7 @@
"define-property": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
"requires": {
"is-descriptor": "^0.1.0"
}
@@ -29093,7 +29094,7 @@
"cli-truncate": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz",
- "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=",
+ "integrity": "sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==",
"dev": true,
"requires": {
"slice-ansi": "0.0.4",
@@ -29103,13 +29104,13 @@
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
"dev": true
},
"is-fullwidth-code-point": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
"dev": true,
"requires": {
"number-is-nan": "^1.0.0"
@@ -29118,7 +29119,7 @@
"string-width": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
"dev": true,
"requires": {
"code-point-at": "^1.0.0",
@@ -29129,7 +29130,7 @@
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
@@ -29201,7 +29202,7 @@
"clone": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="
},
"clone-deep": {
"version": "4.0.1",
@@ -29276,7 +29277,7 @@
"code-point-at": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==",
"dev": true
},
"collapse-white-space": {
@@ -29294,7 +29295,7 @@
"collection-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
- "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==",
"requires": {
"map-visit": "^1.0.0",
"object-visit": "^1.0.0"
@@ -29441,7 +29442,7 @@
"commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="
},
"compare-func": {
"version": "2.0.0",
@@ -29553,12 +29554,12 @@
"computed-style": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/computed-style/-/computed-style-0.1.4.tgz",
- "integrity": "sha1-fzRP2FhLLkJb7cpKGvwOMAuwXXQ="
+ "integrity": "sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w=="
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
},
"concat-stream": {
"version": "1.6.2",
@@ -29575,7 +29576,7 @@
"concurrently": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/concurrently/-/concurrently-3.5.0.tgz",
- "integrity": "sha1-jPG3cHppFqeKT/W3e7BN7FSzebI=",
+ "integrity": "sha512-Z2iVM5+c0VxKmENTXrG/kp+MUhWEEH+wI5wV/L8CTFJDb/uae1zSVIkNM7o3W4Tdt42pv7RGsOICaskWy9bqSA==",
"dev": true,
"requires": {
"chalk": "0.5.1",
@@ -29591,19 +29592,19 @@
"ansi-regex": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz",
- "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=",
+ "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==",
"dev": true
},
"ansi-styles": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz",
- "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=",
+ "integrity": "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==",
"dev": true
},
"chalk": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz",
- "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=",
+ "integrity": "sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==",
"dev": true,
"requires": {
"ansi-styles": "^1.1.0",
@@ -29616,7 +29617,7 @@
"supports-color": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz",
- "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=",
+ "integrity": "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==",
"dev": true
}
}
@@ -29624,7 +29625,7 @@
"commander": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz",
- "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=",
+ "integrity": "sha512-PhbTMT+ilDXZKqH8xbvuUY2ZEQNef0Q7DKxgoEKb4ccytsdvVVJmYqR0sGbi96nxU6oGrwEIQnclpK2NBZuQlg==",
"dev": true
},
"date-fns": {
@@ -29645,13 +29646,13 @@
"has-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
- "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==",
"dev": true
},
"strip-ansi": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz",
- "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=",
+ "integrity": "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==",
"dev": true,
"requires": {
"ansi-regex": "^0.2.1"
@@ -29660,7 +29661,7 @@
"supports-color": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
- "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
"dev": true,
"requires": {
"has-flag": "^1.0.0"
@@ -29714,7 +29715,7 @@
"console-control-strings": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
"dev": true
},
"constant-case": {
@@ -29730,7 +29731,7 @@
"constants-browserify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
- "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+ "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==",
"dev": true
},
"content-type": {
@@ -30065,7 +30066,7 @@
"cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
"dev": true
},
"copy-concurrently": {
@@ -30110,7 +30111,7 @@
"copy-descriptor": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+ "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw=="
},
"copy-dir": {
"version": "1.3.0",
@@ -30686,7 +30687,7 @@
"cross-env": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/cross-env/-/cross-env-3.2.4.tgz",
- "integrity": "sha1-ngWF8neGTtQhznVvgamA/w1piro=",
+ "integrity": "sha512-T8AFEAiuJ0w53ou6rnu3Fipaiu1W6ZO9GYfd33uxe1kAIiXM0fD8QnIm7orcJBOt7WQC5Ply63E7WZW/jSM+FA==",
"dev": true,
"requires": {
"cross-spawn": "^5.1.0",
@@ -30744,7 +30745,7 @@
"css-color-keywords": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
- "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU="
+ "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg=="
},
"css-color-names": {
"version": "1.0.1",
@@ -30829,7 +30830,7 @@
"css-mediaquery": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz",
- "integrity": "sha1-aiw3NEkoYYYxxUvTPO3TAdoYvqA="
+ "integrity": "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q=="
},
"css-to-react-native": {
"version": "2.3.2",
@@ -30982,7 +30983,7 @@
"currently-unhandled": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
- "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==",
"dev": true,
"optional": true,
"requires": {
@@ -30992,7 +30993,7 @@
"cwd": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz",
- "integrity": "sha1-FyQAaUBXwioTsM8WFix+S3p/5Wc=",
+ "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==",
"dev": true,
"requires": {
"find-pkg": "^0.1.2",
@@ -31020,7 +31021,7 @@
"dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
"dev": true,
"requires": {
"assert-plus": "^1.0.0"
@@ -31116,7 +31117,7 @@
"debuglog": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz",
- "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=",
+ "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==",
"dev": true
},
"decache": {
@@ -31131,7 +31132,7 @@
"decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="
},
"decamelize-keys": {
"version": "1.1.0",
@@ -31182,7 +31183,7 @@
"dedent": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
- "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
+ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
"dev": true
},
"deep-equal": {
@@ -31216,7 +31217,7 @@
"deep-freeze": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz",
- "integrity": "sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=",
+ "integrity": "sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==",
"dev": true
},
"deep-is": {
@@ -31525,7 +31526,7 @@
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"dev": true
},
"delegate": {
@@ -31536,13 +31537,13 @@
"delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
"dev": true
},
"denodeify": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz",
- "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE="
+ "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg=="
},
"depd": {
"version": "1.1.2",
@@ -31588,7 +31589,7 @@
"detect-indent": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz",
- "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=",
+ "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==",
"dev": true
},
"detect-newline": {
@@ -31812,7 +31813,7 @@
"dns-equal": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
- "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
+ "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==",
"dev": true
},
"dns-packet": {
@@ -31867,7 +31868,7 @@
"dom-scroll-into-view": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-1.2.1.tgz",
- "integrity": "sha1-6PNnMt0ImwIBqI14Fdw/iObWbH4="
+ "integrity": "sha512-LwNVg3GJOprWDO+QhLL1Z9MMgWe/KAFLxVWKzjRTxNSPn8/LLDIfmuG71YHznXCqaqTjvHJDYO1MEAgX6XCNbQ=="
},
"dom-serializer": {
"version": "0.1.0",
@@ -31977,7 +31978,7 @@
"downloadjs": {
"version": "1.4.7",
"resolved": "https://registry.npmjs.org/downloadjs/-/downloadjs-1.4.7.tgz",
- "integrity": "sha1-9p+W+UDg0FU9rCkROYZaPNAQHjw="
+ "integrity": "sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q=="
},
"downshift": {
"version": "6.1.0",
@@ -32028,12 +32029,12 @@
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
},
"elegant-spinner": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz",
- "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=",
+ "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==",
"dev": true
},
"element-resize-detector": {
@@ -32094,7 +32095,7 @@
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
},
"encoding": {
"version": "0.1.12",
@@ -32336,7 +32337,7 @@
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
},
"escape-latex": {
"version": "1.2.0",
@@ -33843,7 +33844,7 @@
"etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
},
"event-target-shim": {
"version": "5.0.1",
@@ -33853,7 +33854,7 @@
"eventemitter2": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-1.0.5.tgz",
- "integrity": "sha1-+YNhBRexc3wLncZDvsqTiTwE3xg="
+ "integrity": "sha512-EUFhWUYzqqBZlzBMI+dPU8rnKXfQZEUnitnccQuEIAnvWFHCpt3+4fts2+4dpxLtlsiseVXCMFg37KjYChSxpg=="
},
"eventemitter3": {
"version": "4.0.7",
@@ -34010,13 +34011,13 @@
"exit": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
"dev": true
},
"expand-brackets": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==",
"requires": {
"debug": "^2.3.3",
"define-property": "^0.2.5",
@@ -34038,7 +34039,7 @@
"define-property": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
"requires": {
"is-descriptor": "^0.1.0"
}
@@ -34046,7 +34047,7 @@
"extend-shallow": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
"requires": {
"is-extendable": "^0.1.0"
}
@@ -34056,7 +34057,7 @@
"expand-tilde": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
- "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=",
+ "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==",
"dev": true,
"requires": {
"os-homedir": "^1.0.1"
@@ -34297,7 +34298,7 @@
"extend-shallow": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
- "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
"requires": {
"assign-symbols": "^1.0.0",
"is-extendable": "^1.0.1"
@@ -34363,7 +34364,7 @@
"define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
"requires": {
"is-descriptor": "^1.0.0"
}
@@ -34371,7 +34372,7 @@
"extend-shallow": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
"requires": {
"is-extendable": "^0.1.0"
}
@@ -34430,7 +34431,7 @@
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
"dev": true
},
"fast-average-color": {
@@ -34566,7 +34567,7 @@
"fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
"dev": true
},
"fast-memoize": {
@@ -34756,7 +34757,7 @@
"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=",
+ "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==",
"dev": true
},
"filenamify": {
@@ -34799,7 +34800,7 @@
"filter-obj": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz",
- "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs="
+ "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ=="
},
"finalhandler": {
"version": "1.1.2",
@@ -34831,7 +34832,7 @@
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="
}
}
},
@@ -34915,7 +34916,7 @@
"find-file-up": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz",
- "integrity": "sha1-z2gJG8+fMApA2kEbN9pczlovvqA=",
+ "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==",
"dev": true,
"requires": {
"fs-exists-sync": "^0.1.0",
@@ -34931,7 +34932,7 @@
"find-pkg": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz",
- "integrity": "sha1-G9wiwG42NlUy4qJIBGhUuXiNpVc=",
+ "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==",
"dev": true,
"requires": {
"find-file-up": "^0.1.2"
@@ -35136,12 +35137,12 @@
"for-in": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+ "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ=="
},
"for-own": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
- "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+ "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==",
"dev": true,
"requires": {
"for-in": "^1.0.1"
@@ -35208,7 +35209,7 @@
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
"dev": true
},
"fork-ts-checker-webpack-plugin": {
@@ -35355,7 +35356,7 @@
"format": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
- "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=",
+ "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==",
"dev": true
},
"fraction.js": {
@@ -35367,7 +35368,7 @@
"fragment-cache": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
- "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==",
"requires": {
"map-cache": "^0.2.2"
}
@@ -35391,12 +35392,12 @@
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
},
"from2": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
- "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+ "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
"dev": true,
"requires": {
"inherits": "^2.0.1",
@@ -35412,7 +35413,7 @@
"fs-exists-sync": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
- "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=",
+ "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==",
"dev": true
},
"fs-extra": {
@@ -35467,7 +35468,7 @@
"fs-write-stream-atomic": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
- "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+ "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
@@ -35479,7 +35480,7 @@
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
},
"fsevents": {
"version": "2.3.2",
@@ -35832,7 +35833,7 @@
"get-stdin": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
- "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==",
"dev": true,
"optional": true
},
@@ -35899,12 +35900,12 @@
"get-value": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+ "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA=="
},
"getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
"dev": true,
"requires": {
"assert-plus": "^1.0.0"
@@ -35957,7 +35958,7 @@
"git-remote-origin-url": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz",
- "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=",
+ "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==",
"dev": true,
"requires": {
"gitconfiglocal": "^1.0.0",
@@ -36004,7 +36005,7 @@
"gitconfiglocal": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz",
- "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=",
+ "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==",
"dev": true,
"requires": {
"ini": "^1.3.2"
@@ -36283,13 +36284,13 @@
"globjoin": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
- "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=",
+ "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
"dev": true
},
"good-listener": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
- "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
+ "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
"requires": {
"delegate": "^3.1.2"
}
@@ -36321,7 +36322,7 @@
"gradient-parser": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/gradient-parser/-/gradient-parser-0.1.5.tgz",
- "integrity": "sha1-DH4heVWeXOfY1x9EI6+TcQCyJIw="
+ "integrity": "sha512-+uPlcVbjrKOnTzvz0MjTj7BfACj8OmxIa1moIjJV7btvhUMSJk0D47RfDCgDrZE3dYMz9Cf5xKJwnrKLjUq0KQ=="
},
"handle-thing": {
"version": "2.0.1",
@@ -36353,7 +36354,7 @@
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
"dev": true
},
"har-validator": {
@@ -36420,7 +36421,7 @@
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
},
"has-glob": {
"version": "1.0.0",
@@ -36495,13 +36496,13 @@
"has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
"dev": true
},
"has-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
- "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==",
"requires": {
"get-value": "^2.0.6",
"has-values": "^1.0.0",
@@ -36511,7 +36512,7 @@
"has-values": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
- "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==",
"requires": {
"is-number": "^3.0.0",
"kind-of": "^4.0.0"
@@ -36520,7 +36521,7 @@
"kind-of": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==",
"requires": {
"is-buffer": "^1.1.5"
}
@@ -36826,7 +36827,7 @@
"hmac-drbg": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
- "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
"dev": true,
"requires": {
"hash.js": "^1.0.3",
@@ -36880,7 +36881,7 @@
"hpack.js": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
- "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
"dev": true,
"requires": {
"inherits": "^2.0.1",
@@ -36986,7 +36987,7 @@
"htmlparser2-without-node-native": {
"version": "3.9.2",
"resolved": "https://registry.npmjs.org/htmlparser2-without-node-native/-/htmlparser2-without-node-native-3.9.2.tgz",
- "integrity": "sha1-s+0FDYd9D/NGWWnjOYd7f59mMfY=",
+ "integrity": "sha512-+FplQXqmY5fRx6vCIp2P5urWaoBCpTNJMXnKP/6mNCcyb+AZWWJzA8D03peXfozlxDL+vpgLK5dJblqEgu8j6A==",
"requires": {
"domelementtype": "^1.3.0",
"domhandler": "^2.3.0",
@@ -37006,7 +37007,7 @@
"http-deceiver": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
- "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+ "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
"dev": true
},
"http-errors": {
@@ -37184,7 +37185,7 @@
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
"dev": true,
"requires": {
"assert-plus": "^1.0.0",
@@ -37213,7 +37214,7 @@
"https-browserify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
- "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+ "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==",
"dev": true
},
"https-proxy-agent": {
@@ -37252,7 +37253,7 @@
"humanize-ms": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
- "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=",
+ "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
"dev": true,
"requires": {
"ms": "^2.0.0"
@@ -37287,7 +37288,7 @@
"iferr": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
- "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
+ "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==",
"dev": true
},
"ignore": {
@@ -37405,7 +37406,7 @@
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="
},
"indent-string": {
"version": "3.2.0",
@@ -37428,7 +37429,7 @@
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"requires": {
"once": "^1.3.0",
"wrappy": "1"
@@ -37822,7 +37823,7 @@
"is-accessor-descriptor": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
"requires": {
"kind-of": "^3.0.2"
},
@@ -37830,7 +37831,7 @@
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
"requires": {
"is-buffer": "^1.1.5"
}
@@ -37846,7 +37847,7 @@
"is-alphanumeric": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz",
- "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=",
+ "integrity": "sha512-ZmRL7++ZkcMOfDuWZuMJyIVLr2keE1o/DeNWh1EmgqGhUcV+9BIVsx0BcSBOHTZqzjs4+dISzr2KAeBEWGgXeA==",
"dev": true
},
"is-alphanumerical": {
@@ -37871,7 +37872,7 @@
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
},
"is-bigint": {
"version": "1.0.1",
@@ -37958,7 +37959,7 @@
"is-data-descriptor": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
"requires": {
"kind-of": "^3.0.2"
},
@@ -37966,7 +37967,7 @@
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
"requires": {
"is-buffer": "^1.1.5"
}
@@ -38005,7 +38006,7 @@
"is-directory": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
- "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE="
+ "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw=="
},
"is-docker": {
"version": "2.2.1",
@@ -38026,12 +38027,12 @@
"is-extendable": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="
},
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true
},
"is-finite": {
@@ -38044,7 +38045,7 @@
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w=="
},
"is-function": {
"version": "1.0.2",
@@ -38218,7 +38219,7 @@
"is-regexp": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
- "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
+ "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==",
"dev": true
},
"is-resolvable": {
@@ -38251,7 +38252,7 @@
"is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+ "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ=="
},
"is-string": {
"version": "1.0.5",
@@ -38268,7 +38269,7 @@
"is-text-path": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
- "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=",
+ "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==",
"dev": true,
"requires": {
"text-extensions": "^1.0.0"
@@ -38502,7 +38503,7 @@
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
"dev": true
},
"is-unicode-supported": {
@@ -38513,7 +38514,7 @@
"is-utf8": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==",
"dev": true,
"optional": true
},
@@ -38597,22 +38598,22 @@
"is-wsl": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
- "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
+ "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw=="
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
},
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
},
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="
},
"isomorphic-unfetch": {
"version": "3.1.0",
@@ -38627,7 +38628,7 @@
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
"dev": true
},
"istanbul-lib-coverage": {
@@ -38760,7 +38761,7 @@
"jed": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/jed/-/jed-1.1.1.tgz",
- "integrity": "sha1-elSbvZ/+FYWwzQoZHiAwVb7ldLQ="
+ "integrity": "sha512-z35ZSEcXHxLW4yumw0dF6L464NT36vmx3wxJw8MDpraBcWuNVgUPZgPJKcu1HekNgwlMFNqol7i/IpSbjhqwqA=="
},
"jest": {
"version": "29.5.0",
@@ -39662,7 +39663,7 @@
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
"dev": true,
"optional": true
},
@@ -39998,7 +39999,7 @@
"json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
"dev": true
},
"json-stringify-nice": {
@@ -40010,7 +40011,7 @@
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
"dev": true
},
"json2php": {
@@ -40033,7 +40034,7 @@
"jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
"requires": {
"graceful-fs": "^4.1.6"
}
@@ -40041,7 +40042,7 @@
"jsonparse": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
- "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
+ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
"dev": true
},
"jsprim": {
@@ -40230,7 +40231,7 @@
"klaw": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
- "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
+ "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==",
"requires": {
"graceful-fs": "^4.1.9"
}
@@ -40270,7 +40271,7 @@
"language-tags": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
- "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=",
+ "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==",
"dev": true,
"requires": {
"language-subtag-registry": "~0.3.2"
@@ -40279,7 +40280,7 @@
"lazy-cache": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
- "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+ "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==",
"dev": true
},
"lazy-universal-dotenv": {
@@ -40340,7 +40341,7 @@
"levn": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
"dev": true,
"requires": {
"prelude-ls": "~1.1.2",
@@ -40547,7 +40548,7 @@
"line-height": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/line-height/-/line-height-0.3.1.tgz",
- "integrity": "sha1-SxIF7d4YKHKl76PI9iCzGHqcVMk=",
+ "integrity": "sha512-YExecgqPwnp5gplD2+Y8e8A5+jKpr25+DzMbFdI1/1UAr0FJrTFv4VkHLf8/6B590i1wUPJWMKKldkd/bdQ//w==",
"requires": {
"computed-style": "~0.1.3"
}
@@ -40754,13 +40755,13 @@
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true
},
"supports-color": {
@@ -40922,7 +40923,7 @@
"listr-silent-renderer": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz",
- "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=",
+ "integrity": "sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==",
"dev": true
},
"listr-update-renderer": {
@@ -40944,19 +40945,19 @@
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
"dev": true
},
"ansi-styles": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
"dev": true
},
"chalk": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
"dev": true,
"requires": {
"ansi-styles": "^2.2.1",
@@ -40969,7 +40970,7 @@
"figures": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
- "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+ "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==",
"dev": true,
"requires": {
"escape-string-regexp": "^1.0.5",
@@ -40979,7 +40980,7 @@
"log-symbols": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
- "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
+ "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==",
"dev": true,
"requires": {
"chalk": "^1.0.0"
@@ -40988,7 +40989,7 @@
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
@@ -40997,7 +40998,7 @@
"supports-color": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
"dev": true
}
}
@@ -41045,7 +41046,7 @@
"load-json-file": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
- "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==",
"dev": true,
"optional": true,
"requires": {
@@ -41059,7 +41060,7 @@
"parse-json": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==",
"dev": true,
"optional": true,
"requires": {
@@ -41113,53 +41114,53 @@
"lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
},
"lodash.defaults": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
- "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
+ "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==",
"dev": true
},
"lodash.difference": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
- "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=",
+ "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==",
"dev": true
},
"lodash.flatten": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
- "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
+ "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==",
"dev": true
},
"lodash.get": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
- "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
+ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
"dev": true
},
"lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
- "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
},
"lodash.ismatch": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz",
- "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=",
+ "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==",
"dev": true
},
"lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
"dev": true
},
"lodash.memoize": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
- "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
"dev": true
},
"lodash.merge": {
@@ -41171,30 +41172,30 @@
"lodash.set": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
- "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=",
+ "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==",
"dev": true
},
"lodash.throttle": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
- "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ="
+ "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
},
"lodash.truncate": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
- "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
+ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
"dev": true
},
"lodash.union": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
- "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=",
+ "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==",
"dev": true
},
"lodash.uniq": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
- "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
"dev": true
},
"log-symbols": {
@@ -41209,7 +41210,7 @@
"log-update": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz",
- "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=",
+ "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==",
"dev": true,
"requires": {
"ansi-escapes": "^3.0.0",
@@ -41241,7 +41242,7 @@
"wrap-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz",
- "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=",
+ "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==",
"dev": true,
"requires": {
"string-width": "^2.1.1",
@@ -41382,7 +41383,7 @@
"loud-rejection": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
- "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==",
"dev": true,
"optional": true,
"requires": {
@@ -41627,31 +41628,31 @@
"map-cache": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+ "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg=="
},
"map-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
"dev": true,
"optional": true
},
"map-or-similar": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz",
- "integrity": "sha1-beJlMXSt+12e3DPGnT6Sobdvrwg=",
+ "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==",
"dev": true
},
"map-values": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/map-values/-/map-values-1.0.1.tgz",
- "integrity": "sha1-douOecAJvytk/ugG4ip7HEGQyZA=",
+ "integrity": "sha512-BbShUnr5OartXJe1GeccAWtfro11hhgNJg6G9/UtWKjVGvV5U4C09cg5nk8JUevhXODaXY+hQ3xxMUKSs62ONQ==",
"dev": true
},
"map-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
- "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==",
"requires": {
"object-visit": "^1.0.0"
}
@@ -42109,7 +42110,7 @@
"mdast-util-inject": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/mdast-util-inject/-/mdast-util-inject-1.1.0.tgz",
- "integrity": "sha1-2wa4tYW+lZotzS+H9HK6m3VvNnU=",
+ "integrity": "sha512-CcJ0mHa36QYumDKiZ2OIR+ClhfOM7zIzN+Wfy8tRZ1hpH9DKLCS+Mh4DyK5bCxzE9uxMWcbIpeNFWsg1zrj/2g==",
"dev": true,
"requires": {
"mdast-util-to-string": "^1.0.0"
@@ -42174,13 +42175,13 @@
"mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
- "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=",
+ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
"dev": true
},
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
"dev": true
},
"mem": {
@@ -42223,7 +42224,7 @@
"memoizerific": {
"version": "1.11.3",
"resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz",
- "integrity": "sha1-fIekZGREwy11Q4VwkF8tvRsagFo=",
+ "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==",
"dev": true,
"requires": {
"map-or-similar": "^1.5.0"
@@ -42232,7 +42233,7 @@
"memory-fs": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
- "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+ "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==",
"dev": true,
"requires": {
"errno": "^0.1.3",
@@ -42242,7 +42243,7 @@
"memorystream": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
- "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=",
+ "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
"dev": true
},
"meow": {
@@ -42379,7 +42380,7 @@
"clone-deep": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz",
- "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=",
+ "integrity": "sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==",
"dev": true,
"requires": {
"for-own": "^0.1.3",
@@ -42403,7 +42404,7 @@
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
"dev": true,
"requires": {
"is-buffer": "^1.1.5"
@@ -42412,7 +42413,7 @@
"shallow-clone": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz",
- "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=",
+ "integrity": "sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==",
"dev": true,
"requires": {
"is-extendable": "^0.1.1",
@@ -42424,7 +42425,7 @@
"kind-of": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz",
- "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=",
+ "integrity": "sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==",
"dev": true,
"requires": {
"is-buffer": "^1.0.2"
@@ -42433,7 +42434,7 @@
"lazy-cache": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
- "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=",
+ "integrity": "sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==",
"dev": true
}
}
@@ -42443,7 +42444,7 @@
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
"dev": true
},
"merge-stream": {
@@ -42460,7 +42461,7 @@
"methods": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
"dev": true
},
"metro": {
@@ -43603,7 +43604,7 @@
"min-document": {
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
- "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
+ "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==",
"dev": true,
"requires": {
"dom-walk": "^0.1.0"
@@ -43680,7 +43681,7 @@
"minimalistic-crypto-utils": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
- "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
"dev": true
},
"minimatch": {
@@ -43942,7 +43943,7 @@
"mixin-object": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
- "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=",
+ "integrity": "sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==",
"dev": true,
"requires": {
"for-in": "^0.1.3",
@@ -43952,7 +43953,7 @@
"for-in": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
- "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=",
+ "integrity": "sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==",
"dev": true
}
}
@@ -43960,7 +43961,7 @@
"mkdirp": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==",
"requires": {
"minimist": "0.0.8"
},
@@ -43968,7 +43969,7 @@
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+ "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q=="
}
}
},
@@ -44039,7 +44040,7 @@
"move-concurrently": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
- "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+ "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==",
"dev": true,
"requires": {
"aproba": "^1.1.1",
@@ -44170,7 +44171,7 @@
"natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true
},
"negotiator": {
@@ -44246,7 +44247,7 @@
"node-dir": {
"version": "0.1.17",
"resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz",
- "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=",
+ "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==",
"requires": {
"minimatch": "^3.0.2"
}
@@ -44314,7 +44315,7 @@
"node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
- "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs="
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="
},
"node-libs-browser": {
"version": "2.2.1",
@@ -44350,7 +44351,7 @@
"punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
"dev": true
}
}
@@ -44413,7 +44414,7 @@
"normalize-range": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
- "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
"dev": true
},
"normalize-selector": {
@@ -44998,7 +44999,7 @@
"load-json-file": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
- "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+ "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
@@ -45010,7 +45011,7 @@
"parse-json": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
"dev": true,
"requires": {
"error-ex": "^1.3.1",
@@ -45020,13 +45021,13 @@
"pify": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
"dev": true
},
"read-pkg": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
- "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
+ "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==",
"dev": true,
"requires": {
"load-json-file": "^4.0.0",
@@ -45043,7 +45044,7 @@
"strip-bom": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
"dev": true
}
}
@@ -45051,7 +45052,7 @@
"npm-run-path": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==",
"requires": {
"path-key": "^2.0.0"
}
@@ -45082,7 +45083,7 @@
"number-is-nan": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==",
"dev": true
},
"nwsapi": {
@@ -45494,12 +45495,12 @@
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
},
"object-copy": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
- "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==",
"requires": {
"copy-descriptor": "^0.1.0",
"define-property": "^0.2.5",
@@ -45509,7 +45510,7 @@
"define-property": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
"requires": {
"is-descriptor": "^0.1.0"
}
@@ -45517,7 +45518,7 @@
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
"requires": {
"is-buffer": "^1.1.5"
}
@@ -45527,7 +45528,7 @@
"object-filter": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/object-filter/-/object-filter-1.0.2.tgz",
- "integrity": "sha1-rwt5f/6+r4pSxmN87b6IFs/sG8g=",
+ "integrity": "sha512-NahvP2vZcy1ZiiYah30CEPw0FpDcSkSePJBMpzl5EQgCmISijiGuJm3SPYp7U+Lf2TljyaIw3E5EgkEx/TNEVA==",
"dev": true
},
"object-inspect": {
@@ -45575,7 +45576,7 @@
"object-visit": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
- "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==",
"requires": {
"isobject": "^3.0.0"
}
@@ -46178,7 +46179,7 @@
"object.pick": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
- "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==",
"requires": {
"isobject": "^3.0.1"
}
@@ -46357,7 +46358,7 @@
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"requires": {
"wrappy": "1"
}
@@ -46497,13 +46498,13 @@
"os-browserify": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
- "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+ "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
"dev": true
},
"os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
"dev": true
},
"os-name": {
@@ -46519,7 +46520,7 @@
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="
},
"p-all": {
"version": "2.1.0",
@@ -46579,7 +46580,7 @@
"p-finally": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+ "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="
},
"p-limit": {
"version": "3.1.0",
@@ -47015,7 +47016,7 @@
"parse-passwd": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
- "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
"dev": true
},
"parse-path": {
@@ -47070,7 +47071,7 @@
"pascalcase": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+ "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw=="
},
"patch-package": {
"version": "6.2.2",
@@ -47191,29 +47192,29 @@
"path-dirname": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
- "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==",
"dev": true
},
"path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
},
"path-is-inside": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
- "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==",
"dev": true
},
"path-key": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+ "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw=="
},
"path-parse": {
"version": "1.0.7",
@@ -47223,7 +47224,7 @@
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
"dev": true
},
"path-type": {
@@ -47259,24 +47260,24 @@
"pegjs": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz",
- "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0="
+ "integrity": "sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow=="
},
"pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
"dev": true
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
"dev": true
},
"phpegjs": {
"version": "1.0.0-beta7",
"resolved": "https://registry.npmjs.org/phpegjs/-/phpegjs-1.0.0-beta7.tgz",
- "integrity": "sha1-uLbthQGYB//Q7+ID4AKj5e2LTZQ="
+ "integrity": "sha512-SO+NP5argMoJVCWcYiOofPUeEWDIM47FNCBJtp6uJ8PpjtBcudYJTzCbCMit5dzmfSLCoijzEwIXOqPqD45xQg=="
},
"picocolors": {
"version": "1.0.0",
@@ -47303,13 +47304,13 @@
"pinkie": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
"dev": true
},
"pinkie-promise": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
"dev": true,
"requires": {
"pinkie": "^2.0.0"
@@ -47427,7 +47428,7 @@
"posix-character-classes": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
- "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+ "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg=="
},
"postcss": {
"version": "8.4.16",
@@ -47588,7 +47589,7 @@
"postcss-media-query-parser": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
- "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=",
+ "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
"dev": true
},
"postcss-merge-longhand": {
@@ -47960,7 +47961,7 @@
"postcss-resolve-nested-selector": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
- "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=",
+ "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==",
"dev": true
},
"postcss-safe-parser": {
@@ -48035,7 +48036,7 @@
"prelude-ls": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
"dev": true
},
"prettier": {
@@ -48109,7 +48110,7 @@
"process": {
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
"dev": true
},
"process-nextick-args": {
@@ -48146,7 +48147,7 @@
"promise-inflight": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
- "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
+ "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
"dev": true
},
"promise-retry": {
@@ -48650,7 +48651,7 @@
"promzard": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz",
- "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=",
+ "integrity": "sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw==",
"dev": true,
"requires": {
"read": "1"
@@ -48684,7 +48685,7 @@
"proto-list": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
- "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=",
+ "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
"dev": true
},
"protocols": {
@@ -48707,13 +48708,13 @@
"prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
- "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
"dev": true
},
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
"dev": true
},
"psl": {
@@ -49069,7 +49070,7 @@
"q": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+ "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
"dev": true
},
"qs": {
@@ -49100,7 +49101,7 @@
"querystring-es3": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
- "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+ "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
"dev": true
},
"querystringify": {
@@ -50301,7 +50302,7 @@
"read": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
- "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=",
+ "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==",
"dev": true,
"requires": {
"mute-stream": "~0.0.4"
@@ -50580,7 +50581,7 @@
"readline": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz",
- "integrity": "sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw="
+ "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg=="
},
"reakit": {
"version": "1.3.11",
@@ -50647,7 +50648,7 @@
"redent": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
- "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==",
"dev": true,
"optional": true,
"requires": {
@@ -50658,7 +50659,7 @@
"indent-string": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
- "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==",
"dev": true,
"optional": true,
"requires": {
@@ -51285,7 +51286,7 @@
"remove-trailing-separator": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==",
"dev": true
},
"renderkid": {
@@ -51409,12 +51410,12 @@
"repeat-string": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+ "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="
},
"repeating": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
- "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==",
"dev": true,
"optional": true,
"requires": {
@@ -51424,7 +51425,7 @@
"replace-ext": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+ "integrity": "sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==",
"dev": true
},
"request": {
@@ -51503,7 +51504,7 @@
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="
},
"require-from-string": {
"version": "2.0.2",
@@ -51525,7 +51526,7 @@
"requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
"dev": true
},
"resize-observer-polyfill": {
@@ -51591,7 +51592,7 @@
"resolve-dir": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
- "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=",
+ "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==",
"dev": true,
"requires": {
"expand-tilde": "^1.2.2",
@@ -51636,7 +51637,7 @@
"resolve-url": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+ "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg=="
},
"resolve.exports": {
"version": "2.0.1",
@@ -51800,7 +51801,7 @@
"run-queue": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
- "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+ "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==",
"dev": true,
"requires": {
"aproba": "^1.1.1"
@@ -51809,12 +51810,12 @@
"rungen": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/rungen/-/rungen-0.3.2.tgz",
- "integrity": "sha1-QAwJ6+kU57F+C27zJjQA/Cq8fLM="
+ "integrity": "sha512-zWl10xu2D7zoR8zSC2U6bg5bYF6T/Wk7rxwp8IPaJH7f0Ge21G03kNHVgHR7tyVkSSfAOG0Rqf/Cl38JftSmtw=="
},
"rx": {
"version": "2.3.24",
"resolved": "https://registry.npmjs.org/rx/-/rx-2.3.24.tgz",
- "integrity": "sha1-FPlQpCF9fjXapxu8vljv9o6ksrc=",
+ "integrity": "sha512-Ue4ZB7Dzbn2I9sIj8ws536nOP2S53uypyCkCz9q0vlYD5Kn6/pu4dE+wt2ZfFzd9m73hiYKnnCb1OyKqc+MRkg==",
"dev": true
},
"rxjs": {
@@ -51842,7 +51843,7 @@
"safe-regex": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
- "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==",
"requires": {
"ret": "~0.1.10"
}
@@ -52244,12 +52245,12 @@
"select": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
- "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0="
+ "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
},
"select-hose": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
- "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
"dev": true
},
"selfsigned": {
@@ -52290,7 +52291,7 @@
"semver-compare": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
- "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
+ "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
"dev": true
},
"send": {
@@ -52376,7 +52377,7 @@
"serialize-error": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz",
- "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go="
+ "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw=="
},
"serialize-javascript": {
"version": "4.0.0",
@@ -52390,7 +52391,7 @@
"serve-favicon": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz",
- "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=",
+ "integrity": "sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==",
"dev": true,
"requires": {
"etag": "~1.8.1",
@@ -52417,7 +52418,7 @@
"serve-index": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+ "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
"dev": true,
"requires": {
"accepts": "~1.3.4",
@@ -52441,7 +52442,7 @@
"http-errors": {
"version": "1.6.3",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+ "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
"dev": true,
"requires": {
"depd": "~1.1.2",
@@ -52472,7 +52473,7 @@
"set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
},
"set-value": {
"version": "2.0.1",
@@ -52488,7 +52489,7 @@
"extend-shallow": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
"requires": {
"is-extendable": "^0.1.0"
}
@@ -52506,7 +52507,7 @@
"setimmediate": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
- "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
},
"setprototypeof": {
"version": "1.2.0",
@@ -52540,7 +52541,7 @@
"shebang-command": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
"requires": {
"shebang-regex": "^1.0.0"
}
@@ -52548,7 +52549,7 @@
"shebang-regex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+ "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ=="
},
"shell-quote": {
"version": "1.7.3",
@@ -52748,7 +52749,7 @@
"simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
- "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
"requires": {
"is-arrayish": "^0.3.1"
},
@@ -52836,7 +52837,7 @@
"define-property": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
"requires": {
"is-descriptor": "^0.1.0"
}
@@ -52844,7 +52845,7 @@
"extend-shallow": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
"requires": {
"is-extendable": "^0.1.0"
}
@@ -52869,7 +52870,7 @@
"define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
"requires": {
"is-descriptor": "^1.0.0"
}
@@ -52913,7 +52914,7 @@
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
"requires": {
"is-buffer": "^1.1.5"
}
@@ -53011,7 +53012,7 @@
"sort-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
- "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=",
+ "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==",
"dev": true,
"requires": {
"is-plain-obj": "^1.0.0"
@@ -53088,7 +53089,7 @@
"spawn-command": {
"version": "0.0.2-1",
"resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
- "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=",
+ "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==",
"dev": true
},
"spawnd": {
@@ -53267,7 +53268,7 @@
"sprintf-js": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz",
- "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw="
+ "integrity": "sha512-h/U+VScR2Ft+aXDjGTLtguUEIrYuOjTj79BAOElUvdahYMaaa7SNLjJpOIn+Uzt0hsgHfYvlbcno3e9yXOSo8Q=="
},
"sshpk": {
"version": "1.14.2",
@@ -53347,7 +53348,7 @@
"static-extend": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
- "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==",
"requires": {
"define-property": "^0.2.5",
"object-copy": "^0.1.0"
@@ -53356,7 +53357,7 @@
"define-property": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
"requires": {
"is-descriptor": "^0.1.0"
}
@@ -53423,7 +53424,7 @@
"strict-uri-encode": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
- "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY="
+ "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ=="
},
"string-hash-64": {
"version": "1.0.3",
@@ -54434,7 +54435,7 @@
"strip-eof": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+ "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q=="
},
"strip-final-newline": {
"version": "2.0.0",
@@ -54445,7 +54446,7 @@
"strip-indent": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
- "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==",
"dev": true,
"optional": true,
"requires": {
@@ -54487,7 +54488,7 @@
"style-search": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
- "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=",
+ "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==",
"dev": true
},
"style-to-object": {
@@ -55104,7 +55105,7 @@
"svg-tags": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
- "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
+ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
"dev": true
},
"svgo": {
@@ -55675,7 +55676,7 @@
"temp": {
"version": "0.8.3",
"resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz",
- "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=",
+ "integrity": "sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw==",
"requires": {
"os-tmpdir": "^1.0.0",
"rimraf": "~2.2.6"
@@ -55684,14 +55685,14 @@
"rimraf": {
"version": "2.2.8",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
- "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI="
+ "integrity": "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg=="
}
}
},
"temp-dir": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz",
- "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=",
+ "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==",
"dev": true
},
"terminal-link": {
@@ -55858,7 +55859,7 @@
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
},
"throat": {
@@ -55875,7 +55876,7 @@
"through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
"dev": true
},
"through2": {
@@ -55935,18 +55936,18 @@
"to-arraybuffer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
- "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+ "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==",
"dev": true
},
"to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="
},
"to-object-path": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
- "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==",
"requires": {
"kind-of": "^3.0.2"
},
@@ -55954,7 +55955,7 @@
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
"requires": {
"is-buffer": "^1.1.5"
}
@@ -56031,20 +56032,20 @@
"trim": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
- "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
+ "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==",
"dev": true
},
"trim-newlines": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
- "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==",
"dev": true,
"optional": true
},
"trim-repeated": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
- "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
+ "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==",
"dev": true,
"requires": {
"escape-string-regexp": "^1.0.2"
@@ -56128,7 +56129,7 @@
"tty-browserify": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
- "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+ "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==",
"dev": true
},
"tunnel": {
@@ -56140,7 +56141,7 @@
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
"dev": true,
"requires": {
"safe-buffer": "^5.0.1"
@@ -56154,14 +56155,14 @@
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
"dev": true,
"optional": true
},
"type-check": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
"dev": true,
"requires": {
"prelude-ls": "~1.1.2"
@@ -56215,7 +56216,7 @@
"typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
"dev": true
},
"typedarray-to-buffer": {
@@ -56525,12 +56526,12 @@
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
},
"unset-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
- "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==",
"requires": {
"has-value": "^0.3.1",
"isobject": "^3.0.0"
@@ -56539,7 +56540,7 @@
"has-value": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
- "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==",
"requires": {
"get-value": "^2.0.3",
"has-values": "^0.1.4",
@@ -56549,7 +56550,7 @@
"isobject": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==",
"requires": {
"isarray": "1.0.0"
}
@@ -56559,14 +56560,14 @@
"has-values": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
- "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+ "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ=="
}
}
},
"untildify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz",
- "integrity": "sha1-F+soB5h/dpUunASF/DEdBqgmouA=",
+ "integrity": "sha512-sJjbDp2GodvkB0FZZcn7k6afVisqX5BZD7Yq3xp4nN2O15BBK0cLm3Vwn2vQaF7UDS0UUsrQMkkplmDI5fskig==",
"dev": true,
"optional": true,
"requires": {
@@ -56608,7 +56609,7 @@
"urix": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
- "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+ "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg=="
},
"url": {
"version": "0.11.0",
@@ -56720,7 +56721,7 @@
"url-template": {
"version": "2.0.8",
"resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz",
- "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=",
+ "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==",
"dev": true
},
"use": {
@@ -56795,7 +56796,7 @@
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
},
"util.promisify": {
"version": "1.0.0",
@@ -56810,7 +56811,7 @@
"utila": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
- "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
+ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
"dev": true
},
"utility-types": {
@@ -56821,7 +56822,7 @@
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
},
"uuid": {
"version": "8.3.0",
@@ -56831,7 +56832,7 @@
"uuid-browser": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/uuid-browser/-/uuid-browser-3.1.0.tgz",
- "integrity": "sha1-DwWkCu90+eWVHiDvv0SxGHHlZBA=",
+ "integrity": "sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg==",
"dev": true
},
"v8-compile-cache": {
@@ -56872,7 +56873,7 @@
"validate-npm-package-name": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
- "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
+ "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==",
"dev": true,
"requires": {
"builtins": "^1.0.3"
@@ -56890,13 +56891,13 @@
"vargs": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz",
- "integrity": "sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8=",
+ "integrity": "sha512-d/j1kMUt0YjLCQPAI+VMZ7IKwNGjk8dSHMCrHq9txFOCcCIDoe8ck9FmPvABJgxIaZO1tabXmNojQG6mBkLLCw==",
"dev": true
},
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
},
"vendors": {
"version": "1.0.4",
@@ -56907,7 +56908,7 @@
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
"dev": true,
"requires": {
"assert-plus": "^1.0.0",
@@ -56918,7 +56919,7 @@
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
"dev": true
}
}
@@ -57174,7 +57175,7 @@
"is-binary-path": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
- "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==",
"dev": true,
"optional": true,
"requires": {
@@ -57236,7 +57237,7 @@
"wcwidth": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
"requires": {
"defaults": "^1.0.3"
}
@@ -58817,7 +58818,7 @@
"wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
"dev": true
},
"worker-farm": {
@@ -58907,7 +58908,7 @@
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
},
"write-file-atomic": {
"version": "2.4.3",
@@ -58990,7 +58991,7 @@
"x-default-browser": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/x-default-browser/-/x-default-browser-0.4.0.tgz",
- "integrity": "sha1-cM8NqF2nwKtcsPFaiX8jIqa91IE=",
+ "integrity": "sha512-7LKo7RtWfoFN/rHx1UELv/2zHGMx8MkZKDq1xENmOCTkfIqZJ0zZ26NEJX8czhnPXVcqS0ARjjfJB+eJ0/5Cvw==",
"dev": true,
"requires": {
"default-browser-id": "^1.0.4"
@@ -58999,13 +59000,13 @@
"x-is-string": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz",
- "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=",
+ "integrity": "sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w==",
"dev": true
},
"xml": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
- "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=",
+ "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==",
"dev": true
},
"xml-name-validator": {
diff --git a/packages/base-styles/_variables.scss b/packages/base-styles/_variables.scss
index 31f197ba64270e..584c057ec1ecab 100644
--- a/packages/base-styles/_variables.scss
+++ b/packages/base-styles/_variables.scss
@@ -48,7 +48,7 @@ $icon-size: 24px;
$button-size: 36px;
$button-size-next-default-40px: 40px; // transitionary variable for next default button size
$button-size-small: 24px;
-$button-size-small-next-default-32px: 32px; // transitionary variable for next small button size
+$button-size-compact: 32px;
$header-height: 60px;
$panel-header-height: $grid-unit-60;
$nav-sidebar-width: 360px;
diff --git a/packages/base-styles/_z-index.scss b/packages/base-styles/_z-index.scss
index 96040ec29d07b8..cc4a42df98f0aa 100644
--- a/packages/base-styles/_z-index.scss
+++ b/packages/base-styles/_z-index.scss
@@ -182,6 +182,7 @@ $z-layers: (
".customize-widgets__block-toolbar": 7,
// Site editor layout
+ ".edit-site-layout__header-container": 4,
".edit-site-layout__hub": 3,
".edit-site-layout__header": 2,
".edit-site-page-header": 2,
diff --git a/packages/block-editor/README.md b/packages/block-editor/README.md
index 72c3d50372e48e..2c42b42afc4424 100644
--- a/packages/block-editor/README.md
+++ b/packages/block-editor/README.md
@@ -711,6 +711,7 @@ _Properties_
- _maxWidth_ `number`: Max width to constraint resizing
- _allowedBlockTypes_ `boolean|Array`: Allowed block types
- _hasFixedToolbar_ `boolean`: Whether or not the editor toolbar is fixed
+- _distractionFree_ `boolean`: Whether or not the editor UI is distraction free
- _focusMode_ `boolean`: Whether the focus mode is enabled or not
- _styles_ `Array`: Editor Styles
- _keepCaretInsideBlock_ `boolean`: Whether caret should move between blocks in edit mode
diff --git a/packages/block-editor/package.json b/packages/block-editor/package.json
index 7cee038023ee9c..0ce645e74244d8 100644
--- a/packages/block-editor/package.json
+++ b/packages/block-editor/package.json
@@ -32,6 +32,7 @@
],
"dependencies": {
"@babel/runtime": "^7.16.0",
+ "@emotion/styled": "^11.6.0",
"@react-spring/web": "^9.4.5",
"@wordpress/a11y": "file:../a11y",
"@wordpress/api-fetch": "file:../api-fetch",
diff --git a/packages/block-editor/src/components/alignment-control/test/__snapshots__/index.js.snap b/packages/block-editor/src/components/alignment-control/test/__snapshots__/index.js.snap
index addd49efc4d0f6..f2915ead7417b1 100644
--- a/packages/block-editor/src/components/alignment-control/test/__snapshots__/index.js.snap
+++ b/packages/block-editor/src/components/alignment-control/test/__snapshots__/index.js.snap
@@ -25,7 +25,7 @@ exports[`AlignmentUI should allow custom alignment controls to be specified 1`]
xmlns="http://www.w3.org/2000/svg"
>
@@ -48,7 +48,7 @@ exports[`AlignmentUI should allow custom alignment controls to be specified 1`]
xmlns="http://www.w3.org/2000/svg"
>
@@ -80,7 +80,7 @@ exports[`AlignmentUI should match snapshot when controls are hidden 1`] = `
xmlns="http://www.w3.org/2000/svg"
>
@@ -113,7 +113,7 @@ exports[`AlignmentUI should match snapshot when controls are visible 1`] = `
xmlns="http://www.w3.org/2000/svg"
>
@@ -136,7 +136,7 @@ exports[`AlignmentUI should match snapshot when controls are visible 1`] = `
xmlns="http://www.w3.org/2000/svg"
>
@@ -159,7 +159,7 @@ exports[`AlignmentUI should match snapshot when controls are visible 1`] = `
xmlns="http://www.w3.org/2000/svg"
>
diff --git a/packages/block-editor/src/components/block-alignment-control/test/__snapshots__/index.js.snap b/packages/block-editor/src/components/block-alignment-control/test/__snapshots__/index.js.snap
index 9b56e451a56bdd..246e5dca2ae324 100644
--- a/packages/block-editor/src/components/block-alignment-control/test/__snapshots__/index.js.snap
+++ b/packages/block-editor/src/components/block-alignment-control/test/__snapshots__/index.js.snap
@@ -23,7 +23,7 @@ exports[`BlockAlignmentUI should match snapshot when controls are hidden 1`] = `
xmlns="http://www.w3.org/2000/svg"
>
@@ -55,7 +55,7 @@ exports[`BlockAlignmentUI should match snapshot when controls are visible 1`] =
xmlns="http://www.w3.org/2000/svg"
>
@@ -77,7 +77,7 @@ exports[`BlockAlignmentUI should match snapshot when controls are visible 1`] =
xmlns="http://www.w3.org/2000/svg"
>
@@ -99,7 +99,7 @@ exports[`BlockAlignmentUI should match snapshot when controls are visible 1`] =
xmlns="http://www.w3.org/2000/svg"
>
@@ -121,7 +121,7 @@ exports[`BlockAlignmentUI should match snapshot when controls are visible 1`] =
xmlns="http://www.w3.org/2000/svg"
>
diff --git a/packages/block-editor/src/components/block-lock/toolbar.js b/packages/block-editor/src/components/block-lock/toolbar.js
index d0a9d3d8bf3d3d..0abd693b5a7c99 100644
--- a/packages/block-editor/src/components/block-lock/toolbar.js
+++ b/packages/block-editor/src/components/block-lock/toolbar.js
@@ -3,7 +3,8 @@
*/
import { __ } from '@wordpress/i18n';
import { ToolbarButton, ToolbarGroup } from '@wordpress/components';
-import { useReducer } from '@wordpress/element';
+import { focus } from '@wordpress/dom';
+import { useReducer, useRef, useEffect } from '@wordpress/element';
import { lock } from '@wordpress/icons';
/**
@@ -12,7 +13,7 @@ import { lock } from '@wordpress/icons';
import BlockLockModal from './modal';
import useBlockLock from './use-block-lock';
-export default function BlockLockToolbar( { clientId } ) {
+export default function BlockLockToolbar( { clientId, wrapperRef } ) {
const { canEdit, canMove, canRemove, canLock } = useBlockLock( clientId );
const [ isModalOpen, toggleModal ] = useReducer(
@@ -20,11 +21,37 @@ export default function BlockLockToolbar( { clientId } ) {
false
);
- if ( ! canLock ) {
- return null;
- }
+ const lockButtonRef = useRef( null );
+ const isFirstRender = useRef( true );
+
+ const shouldHideBlockLockUI =
+ ! canLock || ( canEdit && canMove && canRemove );
+
+ // Restore focus manually on the first focusable element in the toolbar
+ // when the block lock modal is closed and the block is not locked anymore.
+ // See https://github.com/WordPress/gutenberg/issues/51447
+ useEffect( () => {
+ if ( isFirstRender.current ) {
+ isFirstRender.current = false;
+ return;
+ }
+
+ if ( ! isModalOpen && shouldHideBlockLockUI ) {
+ focus.focusable
+ .find( wrapperRef.current, {
+ sequential: false,
+ } )
+ .find(
+ ( element ) =>
+ element.tagName === 'BUTTON' &&
+ element !== lockButtonRef.current
+ )
+ ?.focus();
+ }
+ // wrapperRef is a reference object and should be stable
+ }, [ isModalOpen, shouldHideBlockLockUI, wrapperRef ] );
- if ( canEdit && canMove && canRemove ) {
+ if ( shouldHideBlockLockUI ) {
return null;
}
@@ -35,6 +62,7 @@ export default function BlockLockToolbar( { clientId } ) {
icon={ lock }
label={ __( 'Unlock' ) }
onClick={ toggleModal }
+ ref={ lockButtonRef }
/>
{ isModalOpen && (
diff --git a/packages/block-editor/src/components/block-toolbar/index.js b/packages/block-editor/src/components/block-toolbar/index.js
index 4dc53aae0afffc..0f968b8a209a73 100644
--- a/packages/block-editor/src/components/block-toolbar/index.js
+++ b/packages/block-editor/src/components/block-toolbar/index.js
@@ -78,6 +78,8 @@ const BlockToolbar = ( { hideDragHandle } ) => {
};
}, [] );
+ const toolbarWrapperRef = useRef( null );
+
// Handles highlighting the current block outline on hover or focus of the
// block type toolbar area.
const { toggleBlockHighlight } = useDispatch( blockEditorStore );
@@ -123,18 +125,19 @@ const BlockToolbar = ( { hideDragHandle } ) => {
} );
return (
-
+
{ ! isMultiToolbar &&
isLargeViewport &&
blockEditingMode === 'default' &&
}
-
- { ( shouldShowVisualToolbar || isMultiToolbar ) &&
- blockEditingMode === 'default' && (
+ { ( shouldShowVisualToolbar || isMultiToolbar ) &&
+ blockEditingMode === 'default' && (
+
{ ! isMultiToolbar && (
) }
{
hideDragHandle={ hideDragHandle }
/>
- ) }
-
+
+ ) }
{ shouldShowVisualToolbar && isMultiToolbar && (
) }
diff --git a/packages/block-editor/src/components/block-tools/style.scss b/packages/block-editor/src/components/block-tools/style.scss
index cf38c9ee47de21..c55b8e651c2e7e 100644
--- a/packages/block-editor/src/components/block-tools/style.scss
+++ b/packages/block-editor/src/components/block-tools/style.scss
@@ -121,6 +121,10 @@
}
}
+ &:has(.block-editor-block-toolbar:empty) {
+ display: none;
+ }
+
// on desktop and tablet viewports the toolbar is fixed
// on top of interface header
diff --git a/packages/block-editor/src/components/dimensions-tool/aspect-ratio-tool.js b/packages/block-editor/src/components/dimensions-tool/aspect-ratio-tool.js
new file mode 100644
index 00000000000000..988c6b5c286869
--- /dev/null
+++ b/packages/block-editor/src/components/dimensions-tool/aspect-ratio-tool.js
@@ -0,0 +1,124 @@
+/**
+ * WordPress dependencies
+ */
+import {
+ SelectControl,
+ __experimentalToolsPanelItem as ToolsPanelItem,
+} from '@wordpress/components';
+import { __, _x } from '@wordpress/i18n';
+
+/**
+ * @typedef {import('@wordpress/components/build-types/select-control/types').SelectControlProps} SelectControlProps
+ */
+
+/**
+ * @type {SelectControlProps[]}
+ */
+export const DEFAULT_ASPECT_RATIO_OPTIONS = [
+ {
+ label: _x( 'Original', 'Aspect ratio option for dimensions control' ),
+ value: 'auto',
+ },
+ {
+ label: _x(
+ 'Square - 1:1',
+ 'Aspect ratio option for dimensions control'
+ ),
+ value: '1',
+ },
+ {
+ label: _x(
+ 'Standard - 4:3',
+ 'Aspect ratio option for dimensions control'
+ ),
+ value: '4/3',
+ },
+ {
+ label: _x(
+ 'Portrait - 3:4',
+ 'Aspect ratio option for dimensions control'
+ ),
+ value: '3/4',
+ },
+ {
+ label: _x(
+ 'Classic - 3:2',
+ 'Aspect ratio option for dimensions control'
+ ),
+ value: '3/2',
+ },
+ {
+ label: _x(
+ 'Classic Portrait - 2:3',
+ 'Aspect ratio option for dimensions control'
+ ),
+ value: '2/3',
+ },
+ {
+ label: _x(
+ 'Wide - 16:9',
+ 'Aspect ratio option for dimensions control'
+ ),
+ value: '16/9',
+ },
+ {
+ label: _x(
+ 'Tall - 9:16',
+ 'Aspect ratio option for dimensions control'
+ ),
+ value: '9/16',
+ },
+ {
+ label: _x( 'Custom', 'Aspect ratio option for dimensions control' ),
+ value: 'custom',
+ disabled: true,
+ hidden: true,
+ },
+];
+
+/**
+ * @callback AspectRatioToolPropsOnChange
+ * @param {string} [value] New aspect ratio value.
+ * @return {void} No return.
+ */
+
+/**
+ * @typedef {Object} AspectRatioToolProps
+ * @property {string} [panelId] ID of the panel this tool is associated with.
+ * @property {string} [value] Current aspect ratio value.
+ * @property {AspectRatioToolPropsOnChange} [onChange] Callback to update the aspect ratio value.
+ * @property {SelectControlProps[]} [options] Aspect ratio options.
+ * @property {string} [defaultValue] Default aspect ratio value.
+ * @property {boolean} [isShownByDefault] Whether the tool is shown by default.
+ */
+
+export default function AspectRatioTool( {
+ panelId,
+ value,
+ onChange = () => {},
+ options = DEFAULT_ASPECT_RATIO_OPTIONS,
+ defaultValue = DEFAULT_ASPECT_RATIO_OPTIONS[ 0 ].value,
+ isShownByDefault = true,
+} ) {
+ // Match the CSS default so if the value is used directly in CSS it will look correct in the control.
+ const displayValue = value ?? 'auto';
+
+ return (
+
displayValue !== defaultValue }
+ label={ __( 'Aspect ratio' ) }
+ onDeselect={ () => onChange( undefined ) }
+ isShownByDefault={ isShownByDefault }
+ panelId={ panelId }
+ >
+
+
+ );
+}
diff --git a/packages/block-editor/src/components/dimensions-tool/index.js b/packages/block-editor/src/components/dimensions-tool/index.js
new file mode 100644
index 00000000000000..a81a399b7b79d8
--- /dev/null
+++ b/packages/block-editor/src/components/dimensions-tool/index.js
@@ -0,0 +1,212 @@
+/**
+ * WordPress dependencies
+ */
+import { useState } from '@wordpress/element';
+
+/**
+ * Internal dependencies
+ */
+import AspectRatioTool from './aspect-ratio-tool';
+import ScaleTool from './scale-tool';
+import WidthHeightTool from './width-height-tool';
+
+/**
+ * @typedef {import('@wordpress/components/build-types/select-control/types').SelectControlProps} SelectControlProps
+ */
+
+/**
+ * @typedef {import('@wordpress/components/build-types/unit-control/types').WPUnitControlUnit} WPUnitControlUnit
+ */
+
+/**
+ * @typedef {Object} Dimensions
+ * @property {string} [width] CSS width property.
+ * @property {string} [height] CSS height property.
+ * @property {string} [scale] CSS object-fit property.
+ * @property {string} [aspectRatio] CSS aspect-ratio property.
+ */
+
+/**
+ * @callback DimensionsControlsOnChange
+ * @param {Dimensions} nextValue
+ * @return {void}
+ */
+
+/**
+ * @typedef {Object} DimensionsControlsProps
+ * @property {string} [panelId] ID of the panel that contains the controls.
+ * @property {Dimensions} [value] Current dimensions values.
+ * @property {DimensionsControlsOnChange} [onChange] Callback to update the dimensions values.
+ * @property {SelectControlProps[]} [aspectRatioOptions] Aspect ratio options.
+ * @property {SelectControlProps[]} [scaleOptions] Scale options.
+ * @property {WPUnitControlUnit[]} [unitsOptions] Units options.
+ */
+
+/**
+ * Component that renders controls to edit the dimensions of an image or container.
+ *
+ * @param {DimensionsControlsProps} props The component props.
+ *
+ * @return {WPElement} The dimensions controls.
+ */
+function DimensionsTool( {
+ panelId,
+ value = {},
+ onChange = () => {},
+ aspectRatioOptions, // Default options handled by AspectRatioTool.
+ defaultAspectRatio = 'auto', // Match CSS default value for aspect-ratio.
+ scaleOptions, // Default options handled by ScaleTool.
+ defaultScale = 'fill', // Match CSS default value for object-fit.
+ unitsOptions, // Default options handled by UnitControl.
+} ) {
+ // Coerce undefined and CSS default values to be null.
+ const width =
+ value.width === undefined || value.width === 'auto'
+ ? null
+ : value.width;
+ const height =
+ value.height === undefined || value.height === 'auto'
+ ? null
+ : value.height;
+ const aspectRatio =
+ value.aspectRatio === undefined || value.aspectRatio === 'auto'
+ ? null
+ : value.aspectRatio;
+ const scale =
+ value.scale === undefined || value.scale === 'fill'
+ ? null
+ : value.scale;
+
+ // Keep track of state internally, so when the value is cleared by means
+ // other than directly editing that field, it's easier to restore the
+ // previous value.
+ const [ lastScale, setLastScale ] = useState( scale );
+ const [ lastAspectRatio, setLastAspectRatio ] = useState( aspectRatio );
+
+ // 'custom' is not a valid value for CSS aspect-ratio, but it is used in the
+ // dropdown to indicate that setting both the width and height is the same
+ // as a custom aspect ratio.
+ const aspectRatioValue = width && height ? 'custom' : lastAspectRatio;
+
+ const showScaleControl = aspectRatio || ( width && height );
+
+ return (
+ <>
+
{
+ const nextValue = { ...value };
+
+ // 'auto' is CSS default, so it gets treated as null.
+ nextAspectRatio =
+ nextAspectRatio === 'auto' ? null : nextAspectRatio;
+
+ setLastAspectRatio( nextAspectRatio );
+
+ // Update aspectRatio.
+ if ( ! nextAspectRatio ) {
+ delete nextValue.aspectRatio;
+ } else {
+ nextValue.aspectRatio = nextAspectRatio;
+ }
+
+ // Auto-update scale.
+ if ( ! nextAspectRatio ) {
+ delete nextValue.scale;
+ } else if ( lastScale ) {
+ nextValue.scale = lastScale;
+ } else {
+ nextValue.scale = defaultScale;
+ setLastScale( defaultScale );
+ }
+
+ // Auto-update width and height.
+ if ( nextAspectRatio && width && height ) {
+ delete nextValue.height;
+ }
+
+ onChange( nextValue );
+ } }
+ />
+ { showScaleControl && (
+ {
+ const nextValue = { ...value };
+
+ // 'fill' is CSS default, so it gets treated as null.
+ nextScale = nextScale === 'fill' ? null : nextScale;
+
+ setLastScale( nextScale );
+
+ // Update scale.
+ if ( ! nextScale ) {
+ delete nextValue.scale;
+ } else {
+ nextValue.scale = nextScale;
+ }
+
+ onChange( nextValue );
+ } }
+ />
+ ) }
+ {
+ const nextValue = { ...value };
+
+ // 'auto' is CSS default, so it gets treated as null.
+ nextWidth = nextWidth === 'auto' ? null : nextWidth;
+ nextHeight = nextHeight === 'auto' ? null : nextHeight;
+
+ // Update width.
+ if ( ! nextWidth ) {
+ delete nextValue.width;
+ } else {
+ nextValue.width = nextWidth;
+ }
+
+ // Update height.
+ if ( ! nextHeight ) {
+ delete nextValue.height;
+ } else {
+ nextValue.height = nextHeight;
+ }
+
+ // Auto-update aspectRatio.
+ if ( nextWidth && nextHeight ) {
+ delete nextValue.aspectRatio;
+ } else if ( lastAspectRatio ) {
+ nextValue.aspectRatio = lastAspectRatio;
+ } else {
+ // No setting defaultAspectRatio here, because
+ // aspectRatio is optional in this scenario,
+ // unlike scale.
+ }
+
+ // Auto-update scale.
+ if ( ! lastAspectRatio && !! nextWidth !== !! nextHeight ) {
+ delete nextValue.scale;
+ } else if ( lastScale ) {
+ nextValue.scale = lastScale;
+ } else {
+ nextValue.scale = defaultScale;
+ setLastScale( defaultScale );
+ }
+
+ onChange( nextValue );
+ } }
+ />
+ >
+ );
+}
+
+export default DimensionsTool;
diff --git a/packages/block-editor/src/components/dimensions-tool/scale-tool.js b/packages/block-editor/src/components/dimensions-tool/scale-tool.js
new file mode 100644
index 00000000000000..e39ee1d837f5c7
--- /dev/null
+++ b/packages/block-editor/src/components/dimensions-tool/scale-tool.js
@@ -0,0 +1,124 @@
+/**
+ * WordPress dependencies
+ */
+import {
+ __experimentalToolsPanelItem as ToolsPanelItem,
+ __experimentalToggleGroupControl as ToggleGroupControl,
+ __experimentalToggleGroupControlOption as ToggleGroupControlOption,
+} from '@wordpress/components';
+import { useMemo } from '@wordpress/element';
+import { __, _x } from '@wordpress/i18n';
+
+/**
+ * @typedef {import('@wordpress/components/build-types/select-control/types').SelectControlProps} SelectControlProps
+ */
+
+/**
+ * The descriptions are purposely made generic as object-fit could be used for
+ * any replaced element. Provide your own set of options if you need different
+ * help text or labels.
+ *
+ * @see https://developer.mozilla.org/en-US/docs/Web/CSS/Replaced_element
+ *
+ * @type {SelectControlProps[]}
+ */
+const DEFAULT_SCALE_OPTIONS = [
+ {
+ value: 'fill',
+ label: _x( 'Fill', 'Scale option for dimensions control' ),
+ help: __( 'Fill the space by stretching the content.' ),
+ },
+ {
+ value: 'contain',
+ label: _x( 'Contain', 'Scale option for dimensions control' ),
+ help: __( 'Fit the content to the space without clipping.' ),
+ },
+ {
+ value: 'cover',
+ label: _x( 'Cover', 'Scale option for dimensions control' ),
+ help: __( "Fill the space by clipping what doesn't fit." ),
+ },
+ {
+ value: 'none',
+ label: _x( 'None', 'Scale option for dimensions control' ),
+ help: __(
+ 'Do not adjust the sizing of the content. Content that is too large will be clipped, and content that is too small will have additional padding.'
+ ),
+ },
+ {
+ value: 'scale-down',
+ label: _x( 'Scale down', 'Scale option for dimensions control' ),
+ help: __(
+ 'Scale down the content to fit the space if it is too big. Content that is too small will have additional padding.'
+ ),
+ },
+];
+
+/**
+ * @callback ScaleToolPropsOnChange
+ * @param {string} nextValue New scale value.
+ * @return {void}
+ */
+
+/**
+ * @typedef {Object} ScaleToolProps
+ * @property {string} [panelId] ID of the panel that contains the controls.
+ * @property {string} [value] Current scale value.
+ * @property {ScaleToolPropsOnChange} [onChange] Callback to update the scale value.
+ * @property {SelectControlProps[]} [options] Scale options.
+ * @property {string} [defaultValue] Default scale value.
+ * @property {boolean} [showControl=true] Whether to show the control.
+ * @property {boolean} [isShownByDefault=true] Whether the tool panel is shown by default.
+ */
+
+/**
+ * A tool to select the CSS object-fit property for the image.
+ *
+ * @param {ScaleToolProps} props
+ *
+ * @return {import('@wordpress/element').WPElement} The scale tool.
+ */
+export default function ScaleTool( {
+ panelId,
+ value,
+ onChange,
+ options = DEFAULT_SCALE_OPTIONS,
+ defaultValue = DEFAULT_SCALE_OPTIONS[ 0 ].value,
+ isShownByDefault = true,
+} ) {
+ // Match the CSS default so if the value is used directly in CSS it will look correct in the control.
+ const displayValue = value ?? 'fill';
+
+ const scaleHelp = useMemo( () => {
+ return options.reduce( ( acc, option ) => {
+ acc[ option.value ] = option.help;
+ return acc;
+ }, {} );
+ }, [ options ] );
+
+ return (
+ displayValue !== defaultValue }
+ onDeselect={ () => onChange( defaultValue ) }
+ panelId={ panelId }
+ >
+
+ { options.map( ( option ) => (
+
+ ) ) }
+
+
+ );
+}
diff --git a/packages/block-editor/src/components/dimensions-tool/stories/aspect-ratio-tool.js b/packages/block-editor/src/components/dimensions-tool/stories/aspect-ratio-tool.js
new file mode 100644
index 00000000000000..9b82404a23c255
--- /dev/null
+++ b/packages/block-editor/src/components/dimensions-tool/stories/aspect-ratio-tool.js
@@ -0,0 +1,52 @@
+/**
+ * WordPress dependencies
+ */
+import { useState } from '@wordpress/element';
+import {
+ Panel,
+ __experimentalToolsPanel as ToolsPanel,
+} from '@wordpress/components';
+
+/**
+ * Internal dependencies
+ */
+import AspectRatioTool from '../aspect-ratio-tool';
+
+export default {
+ title: 'BlockEditor (Private APIs)/DimensionsTool/AspectRatioTool',
+ component: AspectRatioTool,
+ argTypes: {
+ panelId: { control: { type: null } },
+ onChange: { action: 'changed' },
+ },
+};
+
+export const Default = ( { panelId, onChange: onChangeProp, ...props } ) => {
+ const [ value, setValue ] = useState( undefined );
+ const resetAll = () => {
+ setValue( undefined );
+ onChangeProp( undefined );
+ };
+ return (
+
+
+ {
+ setValue( nextValue );
+ onChangeProp( nextValue );
+ } }
+ value={ value }
+ { ...props }
+ />
+
+
+ );
+};
+Default.args = {
+ panelId: 'panel-id',
+};
diff --git a/packages/block-editor/src/components/dimensions-tool/stories/index.js b/packages/block-editor/src/components/dimensions-tool/stories/index.js
new file mode 100644
index 00000000000000..d9e1a82771282e
--- /dev/null
+++ b/packages/block-editor/src/components/dimensions-tool/stories/index.js
@@ -0,0 +1,54 @@
+/**
+ * WordPress dependencies
+ */
+import { useState } from '@wordpress/element';
+import {
+ Panel,
+ __experimentalToolsPanel as ToolsPanel,
+} from '@wordpress/components';
+
+/**
+ * Internal dependencies
+ */
+import DimensionsTool from '..';
+
+export default {
+ title: 'BlockEditor (Private APIs)/DimensionsTool',
+ component: DimensionsTool,
+ argTypes: {
+ panelId: { control: { type: null } },
+ onChange: { action: 'changed' },
+ },
+};
+
+const EMPTY_OBJECT = {};
+
+export const Default = ( { panelId, onChange, ...props } ) => {
+ const [ value, setValue ] = useState( EMPTY_OBJECT );
+ const resetAll = () => {
+ setValue( EMPTY_OBJECT );
+ onChange( EMPTY_OBJECT );
+ };
+ return (
+
+
+ {
+ setValue( nextValue );
+ onChange( nextValue );
+ } }
+ value={ value }
+ { ...props }
+ />
+
+
+ );
+};
+Default.args = {
+ panelId: 'panel-id',
+};
diff --git a/packages/block-editor/src/components/dimensions-tool/stories/scale-tool.js b/packages/block-editor/src/components/dimensions-tool/stories/scale-tool.js
new file mode 100644
index 00000000000000..a5ff9a81b5304b
--- /dev/null
+++ b/packages/block-editor/src/components/dimensions-tool/stories/scale-tool.js
@@ -0,0 +1,48 @@
+/**
+ * WordPress dependencies
+ */
+import { useState } from '@wordpress/element';
+import {
+ Panel,
+ __experimentalToolsPanel as ToolsPanel,
+} from '@wordpress/components';
+
+/**
+ * Internal dependencies
+ */
+import ScaleTool from '../scale-tool';
+
+export default {
+ title: 'BlockEditor (Private APIs)/DimensionsTool/ScaleTool',
+ component: ScaleTool,
+ argTypes: {
+ panelId: { control: { type: null } },
+ onChange: { action: 'changed' },
+ },
+};
+
+export const Default = ( { panelId, onChange: onChangeProp, ...props } ) => {
+ const [ value, setValue ] = useState( undefined );
+ const resetAll = () => {
+ setValue( undefined );
+ onChangeProp( undefined );
+ };
+ return (
+
+
+ {
+ setValue( nextValue );
+ onChangeProp( nextValue );
+ } }
+ value={ value }
+ { ...props }
+ />
+
+
+ );
+};
+Default.args = {
+ panelId: 'panel-id',
+};
diff --git a/packages/block-editor/src/components/dimensions-tool/stories/width-height-tool.js b/packages/block-editor/src/components/dimensions-tool/stories/width-height-tool.js
new file mode 100644
index 00000000000000..4a9d9782ad16b7
--- /dev/null
+++ b/packages/block-editor/src/components/dimensions-tool/stories/width-height-tool.js
@@ -0,0 +1,54 @@
+/**
+ * WordPress dependencies
+ */
+import { useState } from '@wordpress/element';
+import {
+ Panel,
+ __experimentalToolsPanel as ToolsPanel,
+} from '@wordpress/components';
+
+/**
+ * Internal dependencies
+ */
+import WidthHeightTool from '../width-height-tool';
+
+export default {
+ title: 'BlockEditor (Private APIs)/DimensionsTool/WidthHeightTool',
+ component: WidthHeightTool,
+ argTypes: {
+ panelId: { control: { type: null } },
+ onChange: { action: 'changed' },
+ },
+};
+
+const EMPTY_OBJECT = {};
+
+export const Default = ( { panelId, onChange: onChangeProp, ...props } ) => {
+ const [ value, setValue ] = useState( EMPTY_OBJECT );
+ const resetAll = () => {
+ setValue( EMPTY_OBJECT );
+ onChangeProp( EMPTY_OBJECT );
+ };
+ return (
+
+
+ {
+ setValue( nextValue );
+ onChangeProp( nextValue );
+ } }
+ value={ value }
+ { ...props }
+ />
+
+
+ );
+};
+Default.args = {
+ panelId: 'panel-id',
+};
diff --git a/packages/block-editor/src/components/dimensions-tool/test/index.js b/packages/block-editor/src/components/dimensions-tool/test/index.js
new file mode 100644
index 00000000000000..6bfa2af057f7c6
--- /dev/null
+++ b/packages/block-editor/src/components/dimensions-tool/test/index.js
@@ -0,0 +1,641 @@
+/**
+ * External dependencies
+ */
+import { render, screen } from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
+
+/**
+ * WordPress dependencies
+ */
+import { __experimentalToolsPanel as ToolsPanel } from '@wordpress/components';
+import { useState } from '@wordpress/element';
+
+/**
+ * Internal dependencies
+ */
+import DimensionsTool from '../';
+
+const EMPTY_OBJECT = {};
+
+function Example( { initialValue, onChange, ...props } ) {
+ const [ value, setValue ] = useState( initialValue );
+ const resetAll = () => {
+ setValue( EMPTY_OBJECT );
+ onChange( EMPTY_OBJECT );
+ };
+ return (
+
+ {
+ setValue( nextValue );
+ onChange( nextValue );
+ } }
+ defaultScale="cover"
+ defaultAspectRatio="auto"
+ value={ value }
+ { ...props }
+ />
+
+ );
+}
+
+// (xxxx) -> (yyyy) is a shorthand for categorizing the test cases by initial
+// state (xxxx) and final state (yyyy). Each digit represents whether or not the
+// value is set, in the order: [aspectRatio, scale, width, height].
+//
+// See https://github.com/WordPress/gutenberg/pull/51545#issuecomment-1601326289
+
+// Using expect( onChange.mock.calls ).toStrictEqual(...) so undefined
+// properties are treated differently from missing properties.
+
+describe( 'DimensionsTool', () => {
+ describe( 'updating aspectRatio', () => {
+ it( 'when starting with empty initial state, setting aspectRatio also sets scale (0000) -> (1100)', async () => {
+ const user = userEvent.setup();
+ const onChange = jest.fn();
+
+ const initialValue = {
+ // aspectRatio,
+ // scale,
+ // width,
+ // height,
+ };
+
+ render(
+
+ );
+
+ const aspectRatioSelect = screen.getByRole( 'combobox', {
+ name: 'Aspect ratio',
+ } );
+
+ await user.selectOptions( aspectRatioSelect, '16/9' );
+
+ expect( aspectRatioSelect ).toHaveValue( '16/9' );
+
+ const scaleRadioGroup = screen.queryByRole( 'radiogroup', {
+ name: 'Scale',
+ } );
+
+ expect( scaleRadioGroup ).toBeInTheDocument();
+
+ const scaleCoverRadio = screen.getByRole( 'radio', {
+ name: 'Cover',
+ } );
+
+ expect( scaleCoverRadio ).toBeChecked();
+
+ expect( onChange.mock.calls ).toStrictEqual( [
+ [ { aspectRatio: '16/9', scale: 'cover' } ],
+ ] );
+ } );
+
+ it( 'when starting with just height, setting aspectRatio also sets scale (0001) -> (1101)', async () => {
+ const user = userEvent.setup();
+ const onChange = jest.fn();
+
+ const initialValue = {
+ // aspectRatio,
+ // scale,
+ // width,
+ height: '6px',
+ };
+
+ render(
+
+ );
+
+ const aspectRatioSelect = screen.getByRole( 'combobox', {
+ name: 'Aspect ratio',
+ } );
+
+ await user.selectOptions( aspectRatioSelect, '16/9' );
+
+ expect( aspectRatioSelect ).toHaveValue( '16/9' );
+
+ const scaleRadioGroup = screen.queryByRole( 'radiogroup', {
+ name: 'Scale',
+ } );
+
+ expect( scaleRadioGroup ).toBeInTheDocument();
+
+ const scaleCoverRadio = screen.getByRole( 'radio', {
+ name: 'Cover',
+ } );
+
+ expect( scaleCoverRadio ).toBeChecked();
+
+ expect( onChange.mock.calls ).toStrictEqual( [
+ [ { aspectRatio: '16/9', scale: 'cover', height: '6px' } ],
+ ] );
+ } );
+
+ it( 'when starting with just width, setting aspectRatio also sets scale (0010) -> (1110)', async () => {
+ const user = userEvent.setup();
+ const onChange = jest.fn();
+
+ const initialValue = {
+ // aspectRatio,
+ // scale,
+ width: '8px',
+ // height,
+ };
+
+ render(
+
+ );
+
+ const aspectRatioSelect = screen.getByRole( 'combobox', {
+ name: 'Aspect ratio',
+ } );
+
+ await user.selectOptions( aspectRatioSelect, '16/9' );
+
+ expect( aspectRatioSelect ).toHaveValue( '16/9' );
+
+ const scaleRadioGroup = screen.queryByRole( 'radiogroup', {
+ name: 'Scale',
+ } );
+
+ expect( scaleRadioGroup ).toBeInTheDocument();
+
+ const scaleCoverRadio = screen.getByRole( 'radio', {
+ name: 'Cover',
+ } );
+
+ expect( scaleCoverRadio ).toBeChecked();
+
+ expect( onChange.mock.calls ).toStrictEqual( [
+ [ { aspectRatio: '16/9', scale: 'cover', width: '8px' } ],
+ ] );
+ } );
+
+ it( 'when starting with scale, width, and height, setting aspectRatio also clears height (0111) -> (1110)', async () => {
+ const user = userEvent.setup();
+ const onChange = jest.fn();
+
+ const initialValue = {
+ // aspectRatio,
+ scale: 'cover',
+ width: '8px',
+ height: '6px',
+ };
+
+ render(
+
+ );
+
+ const aspectRatioSelect = screen.getByRole( 'combobox', {
+ name: 'Aspect ratio',
+ } );
+
+ await user.selectOptions( aspectRatioSelect, '16/9' );
+
+ expect( aspectRatioSelect ).toHaveValue( '16/9' );
+
+ const scaleRadioGroup = screen.queryByRole( 'radiogroup', {
+ name: 'Scale',
+ } );
+
+ expect( scaleRadioGroup ).toBeInTheDocument();
+
+ const scaleCoverRadio = screen.getByRole( 'radio', {
+ name: 'Cover',
+ } );
+
+ expect( scaleCoverRadio ).toBeChecked();
+
+ expect( onChange.mock.calls ).toStrictEqual( [
+ [ { aspectRatio: '16/9', scale: 'cover', width: '8px' } ],
+ ] );
+ } );
+
+ it( 'when starting with aspectRatio and scale, setting aspectRatio to "Original" also clears scale (1100) -> (0000)', async () => {
+ const user = userEvent.setup();
+ const onChange = jest.fn();
+
+ const initialValue = {
+ aspectRatio: '16/9',
+ scale: 'cover',
+ // width,
+ // height,
+ };
+
+ render(
+
+ );
+
+ const aspectRatioSelect = screen.getByRole( 'combobox', {
+ name: 'Aspect ratio',
+ } );
+
+ await user.selectOptions( aspectRatioSelect, 'auto' );
+
+ expect( aspectRatioSelect ).toHaveValue( 'auto' );
+
+ const scaleRadioGroup = screen.queryByRole( 'radiogroup', {
+ name: 'Scale',
+ } );
+
+ expect( scaleRadioGroup ).not.toBeInTheDocument();
+
+ expect( onChange.mock.calls ).toStrictEqual( [ [ {} ] ] );
+ } );
+
+ it( 'when starting with aspectRatio, scale, and height, setting aspectRatio to "Original" also clears scale (1101) -> (0001)', async () => {
+ const user = userEvent.setup();
+ const onChange = jest.fn();
+
+ const initialValue = {
+ aspectRatio: '16/9',
+ scale: 'cover',
+ // width,
+ height: '6px',
+ };
+
+ render(
+
+ );
+
+ const aspectRatioSelect = screen.getByRole( 'combobox', {
+ name: 'Aspect ratio',
+ } );
+
+ await user.selectOptions( aspectRatioSelect, 'auto' );
+
+ expect( aspectRatioSelect ).toHaveValue( 'auto' );
+
+ const scaleRadioGroup = screen.queryByRole( 'radiogroup', {
+ name: 'Scale',
+ } );
+
+ expect( scaleRadioGroup ).not.toBeInTheDocument();
+
+ expect( onChange.mock.calls ).toStrictEqual( [
+ [ { height: '6px' } ],
+ ] );
+ } );
+
+ it( 'when starting with aspectRatio, scale, and width, setting aspectRatio to "Original" also clears scale (1110) -> (0010)', async () => {
+ const user = userEvent.setup();
+ const onChange = jest.fn();
+
+ const initialValue = {
+ aspectRatio: '16/9',
+ scale: 'cover',
+ width: '8px',
+ // height,
+ };
+
+ render(
+
+ );
+
+ const aspectRatioSelect = screen.getByRole( 'combobox', {
+ name: 'Aspect ratio',
+ } );
+
+ await user.selectOptions( aspectRatioSelect, 'auto' );
+
+ expect( aspectRatioSelect ).toHaveValue( 'auto' );
+
+ const scaleRadioGroup = screen.queryByRole( 'radiogroup', {
+ name: 'Scale',
+ } );
+
+ expect( scaleRadioGroup ).not.toBeInTheDocument();
+
+ expect( onChange.mock.calls ).toStrictEqual( [
+ [ { width: '8px' } ],
+ ] );
+ } );
+ } );
+
+ describe( 'updating scale', () => {
+ // No custom interactions here. Things should just update normally.
+ } );
+
+ describe( 'updating dimensions', () => {
+ it( 'when starting with just height, setting width also sets scale (0001) -> (0111)', async () => {
+ const user = userEvent.setup();
+ const onChange = jest.fn();
+
+ const initialValue = {
+ // aspectRatio,
+ // scale,
+ // width,
+ height: '6px',
+ };
+
+ render(
+
+ );
+
+ const widthInput = screen.getByRole( 'spinbutton', {
+ name: 'Width',
+ } );
+
+ await user.type( widthInput, '8' );
+
+ expect( widthInput ).toHaveValue( 8 );
+
+ const scaleRadioGroup = screen.queryByRole( 'radiogroup', {
+ name: 'Scale',
+ } );
+
+ expect( scaleRadioGroup ).toBeInTheDocument();
+
+ const scaleCoverRadio = screen.getByRole( 'radio', {
+ name: 'Cover',
+ } );
+
+ expect( scaleCoverRadio ).toBeChecked();
+
+ expect( onChange.mock.calls ).toStrictEqual( [
+ [ { scale: 'cover', width: '8px', height: '6px' } ],
+ ] );
+ } );
+
+ it( 'when starting with just width, setting height also sets scale (0010) -> (0111)', async () => {
+ const user = userEvent.setup();
+ const onChange = jest.fn();
+
+ const initialValue = {
+ // aspectRatio,
+ // scale,
+ width: '8px',
+ // height,
+ };
+
+ render(
+
+ );
+
+ const heightInput = screen.getByRole( 'spinbutton', {
+ name: 'Height',
+ } );
+
+ await user.type( heightInput, '6' );
+
+ expect( heightInput ).toHaveValue( 6 );
+
+ const scaleRadioGroup = screen.queryByRole( 'radiogroup', {
+ name: 'Scale',
+ } );
+
+ expect( scaleRadioGroup ).toBeInTheDocument();
+
+ const scaleCoverRadio = screen.getByRole( 'radio', {
+ name: 'Cover',
+ } );
+
+ expect( scaleCoverRadio ).toBeChecked();
+
+ expect( onChange.mock.calls ).toStrictEqual( [
+ [ { scale: 'cover', width: '8px', height: '6px' } ],
+ ] );
+ } );
+
+ it( 'when starting with scale, width, and height, clearing width also clears scale (0111) -> (0001)', async () => {
+ const user = userEvent.setup();
+ const onChange = jest.fn();
+
+ const initialValue = {
+ // aspectRatio,
+ scale: 'cover',
+ width: '8px',
+ height: '6px',
+ };
+
+ render(
+
+ );
+
+ const widthInput = screen.getByRole( 'spinbutton', {
+ name: 'Width',
+ } );
+
+ await user.clear( widthInput );
+
+ expect( widthInput ).toHaveValue( null );
+
+ const scaleRadioGroup = screen.queryByRole( 'radiogroup', {
+ name: 'Scale',
+ } );
+
+ expect( scaleRadioGroup ).not.toBeInTheDocument();
+
+ expect( onChange.mock.calls ).toStrictEqual( [
+ [ { height: '6px' } ],
+ ] );
+ } );
+
+ it( 'when starting with scale, width, and height, clearing height also clears scale (0111) -> (0010)', async () => {
+ const user = userEvent.setup();
+ const onChange = jest.fn();
+
+ const initialValue = {
+ // aspectRatio,
+ scale: 'cover',
+ width: '8px',
+ height: '6px',
+ };
+
+ render(
+
+ );
+
+ const heightInput = screen.getByRole( 'spinbutton', {
+ name: 'Height',
+ } );
+
+ await user.clear( heightInput );
+
+ expect( heightInput ).toHaveValue( null );
+
+ const scaleRadioGroup = screen.queryByRole( 'radiogroup', {
+ name: 'Scale',
+ } );
+
+ expect( scaleRadioGroup ).not.toBeInTheDocument();
+
+ expect( onChange.mock.calls ).toStrictEqual( [
+ [ { width: '8px' } ],
+ ] );
+ } );
+
+ it( 'when starting with aspectRatio, scale, and height, setting width also clears aspectRatio (1101) -> (0111)', async () => {
+ const user = userEvent.setup();
+ const onChange = jest.fn();
+
+ const initialValue = {
+ aspectRatio: '16/9',
+ scale: 'cover',
+ // width,
+ height: '6px',
+ };
+
+ render(
+
+ );
+
+ const widthInput = screen.getByRole( 'spinbutton', {
+ name: 'Width',
+ } );
+
+ await user.type( widthInput, '8' );
+
+ expect( widthInput ).toHaveValue( 8 );
+
+ const aspectRatioSelect = screen.getByRole( 'combobox', {
+ name: 'Aspect ratio',
+ } );
+
+ expect( aspectRatioSelect ).toHaveValue( 'custom' );
+
+ const scaleRadioGroup = screen.queryByRole( 'radiogroup', {
+ name: 'Scale',
+ } );
+
+ expect( scaleRadioGroup ).toBeInTheDocument();
+
+ const scaleCoverRadio = screen.getByRole( 'radio', {
+ name: 'Cover',
+ } );
+
+ expect( scaleCoverRadio ).toBeChecked();
+
+ expect( onChange.mock.calls ).toStrictEqual( [
+ [ { scale: 'cover', width: '8px', height: '6px' } ],
+ ] );
+ } );
+
+ it( 'when starting with aspectRatio, scale, and width, setting height also clears aspectRatio (1110) -> (0111)', async () => {
+ const user = userEvent.setup();
+ const onChange = jest.fn();
+
+ const initialValue = {
+ aspectRatio: '16/9',
+ scale: 'cover',
+ width: '8px',
+ // height,
+ };
+
+ render(
+
+ );
+
+ const heightInput = screen.getByRole( 'spinbutton', {
+ name: 'Height',
+ } );
+
+ await user.type( heightInput, '6' );
+
+ expect( heightInput ).toHaveValue( 6 );
+
+ const aspectRatioSelect = screen.getByRole( 'combobox', {
+ name: 'Aspect ratio',
+ } );
+
+ expect( aspectRatioSelect ).toHaveValue( 'custom' );
+
+ const scaleRadioGroup = screen.queryByRole( 'radiogroup', {
+ name: 'Scale',
+ } );
+
+ expect( scaleRadioGroup ).toBeInTheDocument();
+
+ const scaleCoverRadio = screen.getByRole( 'radio', {
+ name: 'Cover',
+ } );
+
+ expect( scaleCoverRadio ).toBeChecked();
+
+ expect( onChange.mock.calls ).toStrictEqual( [
+ [ { scale: 'cover', width: '8px', height: '6px' } ],
+ ] );
+ } );
+ } );
+
+ describe( 'internal component state', () => {
+ it( 'when aspect ratio is change to custom by setting width and height then removing a width value should return the original aspect ratio (1100) -> (1110) -> (0111) -> (1101)', async () => {
+ const user = userEvent.setup();
+ const onChange = jest.fn();
+
+ const value = {
+ aspectRatio: '16/9',
+ scale: 'cover',
+ };
+
+ render( );
+
+ const aspectRatioSelect = screen.getByRole( 'combobox', {
+ name: 'Aspect ratio',
+ } );
+
+ const widthInput = screen.getByRole( 'spinbutton', {
+ name: 'Width',
+ } );
+
+ const heightInput = screen.getByRole( 'spinbutton', {
+ name: 'Height',
+ } );
+
+ await user.type( widthInput, '8' );
+ expect( aspectRatioSelect ).toHaveValue( '16/9' );
+
+ await user.type( heightInput, '6' );
+ expect( aspectRatioSelect ).toHaveValue( 'custom' );
+
+ await user.clear( widthInput, '' );
+ expect( aspectRatioSelect ).toHaveValue( '16/9' );
+
+ expect( onChange.mock.calls ).toStrictEqual( [
+ [ { aspectRatio: '16/9', scale: 'cover', width: '8px' } ],
+ [ { scale: 'cover', width: '8px', height: '6px' } ],
+ [ { aspectRatio: '16/9', scale: 'cover', height: '6px' } ],
+ ] );
+ } );
+
+ it( 'when custom scale is set then aspect ratio is set to original and then aspect ratio is changed back (1100) -> (1100) -> (0000) -> (1100)', async () => {
+ const user = userEvent.setup();
+ const onChange = jest.fn();
+
+ const value = {
+ aspectRatio: '16/9',
+ scale: 'cover',
+ };
+
+ render( );
+
+ const aspectRatioSelect = screen.getByRole( 'combobox', {
+ name: 'Aspect ratio',
+ } );
+
+ const scaleContainRadio = screen.getByRole( 'radio', {
+ name: 'Contain',
+ } );
+
+ await user.click( scaleContainRadio );
+ expect( scaleContainRadio ).toBeChecked();
+
+ await user.selectOptions( aspectRatioSelect, 'auto' );
+ expect( aspectRatioSelect ).toHaveValue( 'auto' );
+
+ await user.selectOptions( aspectRatioSelect, '16/9' );
+ expect( aspectRatioSelect ).toHaveValue( '16/9' );
+
+ expect( onChange.mock.calls ).toStrictEqual( [
+ [ { aspectRatio: '16/9', scale: 'contain' } ],
+ [ {} ],
+ [
+ {
+ aspectRatio: '16/9',
+ scale: 'contain',
+ },
+ ],
+ ] );
+ } );
+ } );
+} );
diff --git a/packages/block-editor/src/components/dimensions-tool/width-height-tool.js b/packages/block-editor/src/components/dimensions-tool/width-height-tool.js
new file mode 100644
index 00000000000000..2c1db64954ff93
--- /dev/null
+++ b/packages/block-editor/src/components/dimensions-tool/width-height-tool.js
@@ -0,0 +1,113 @@
+/**
+ * External dependencies
+ */
+import styled from '@emotion/styled';
+
+/**
+ * WordPress dependencies
+ */
+import {
+ __experimentalToolsPanelItem as ToolsPanelItem,
+ __experimentalUnitControl as UnitControl,
+} from '@wordpress/components';
+import { __ } from '@wordpress/i18n';
+
+const SingleColumnToolsPanelItem = styled( ToolsPanelItem )`
+ grid-column: span 1;
+`;
+
+/**
+ * @typedef {import('@wordpress/components/build-types/unit-control/types').WPUnitControlUnit} WPUnitControlUnit
+ */
+
+/**
+ * @typedef {Object} WidthHeightToolValue
+ * @property {string} [width] Width CSS value.
+ * @property {string} [height] Height CSS value.
+ */
+
+/**
+ * @callback WidthHeightToolOnChange
+ * @param {WidthHeightToolValue} nextValue Next dimensions value.
+ * @return {void}
+ */
+
+/**
+ * @typedef {Object} WidthHeightToolProps
+ * @property {string} [panelId] ID of the panel that contains the controls.
+ * @property {WidthHeightToolValue} [value] Current dimensions values.
+ * @property {WidthHeightToolOnChange} [onChange] Callback to update the dimensions values.
+ * @property {WPUnitControlUnit[]} [units] Units options.
+ * @property {boolean} [isShownByDefault] Whether the panel is shown by default.
+ */
+
+/**
+ * Component that renders controls to edit the dimensions of an image or container.
+ *
+ * @param {WidthHeightToolProps} props The component props.
+ *
+ * @return {import('@wordpress/element').WPElement} The width and height tool.
+ */
+export default function WidthHeightTool( {
+ panelId,
+ value = {},
+ onChange = () => {},
+ units,
+ isShownByDefault = true,
+} ) {
+ // null, undefined, and 'auto' all represent the default value.
+ const width = value.width === 'auto' ? '' : value.width ?? '';
+ const height = value.height === 'auto' ? '' : value.height ?? '';
+
+ const onDimensionChange = ( dimension ) => ( nextDimension ) => {
+ const nextValue = { ...value };
+ // Empty strings or undefined may be passed and both represent removing the value.
+ if ( ! nextDimension ) {
+ delete nextValue[ dimension ];
+ } else {
+ nextValue[ dimension ] = nextDimension;
+ }
+ onChange( nextValue );
+ };
+
+ return (
+ <>
+ width !== '' }
+ onDeselect={ onDimensionChange( 'width' ) }
+ panelId={ panelId }
+ >
+
+
+ height !== '' }
+ onDeselect={ onDimensionChange( 'height' ) }
+ panelId={ panelId }
+ >
+
+
+ >
+ );
+}
diff --git a/packages/block-editor/src/components/image-editor/aspect-ratio-dropdown.js b/packages/block-editor/src/components/image-editor/aspect-ratio-dropdown.js
index c2e8a2cefe4773..5019da9c515d05 100644
--- a/packages/block-editor/src/components/image-editor/aspect-ratio-dropdown.js
+++ b/packages/block-editor/src/components/image-editor/aspect-ratio-dropdown.js
@@ -54,7 +54,7 @@ export default function AspectRatioDropdown( { toggleProps } ) {
} }
value={ aspect }
aspectRatios={ [
- // All ratios should be mirrored in PostFeaturedImage in @wordpress/block-library
+ // All ratios should be mirrored in AspectRatioTool in @wordpress/block-editor.
{
title: __( 'Original' ),
aspect: defaultAspect,
diff --git a/packages/block-editor/src/components/image-editor/use-save-image.js b/packages/block-editor/src/components/image-editor/use-save-image.js
index 2d1515ff0e3f0e..dbd95323225cb7 100644
--- a/packages/block-editor/src/components/image-editor/use-save-image.js
+++ b/packages/block-editor/src/components/image-editor/use-save-image.js
@@ -66,7 +66,6 @@ export default function useSaveImage( {
onSaveImage( {
id: response.id,
url: response.source_url,
- height: height && width ? width / aspect : undefined,
} );
} )
.catch( ( error ) => {
diff --git a/packages/block-editor/src/components/image-size-control/index.js b/packages/block-editor/src/components/image-size-control/index.js
index 46e87de60f2fc8..d929b129313938 100644
--- a/packages/block-editor/src/components/image-size-control/index.js
+++ b/packages/block-editor/src/components/image-size-control/index.js
@@ -8,6 +8,7 @@ import {
__experimentalNumberControl as NumberControl,
__experimentalHStack as HStack,
} from '@wordpress/components';
+import deprecated from '@wordpress/deprecated';
import { __ } from '@wordpress/i18n';
/**
@@ -30,6 +31,11 @@ export default function ImageSizeControl( {
onChange,
onChangeImage = noop,
} ) {
+ deprecated( 'wp.blockEditor.__experimentalImageSizeControl', {
+ since: '6.3',
+ alternative:
+ 'wp.blockEditor.privateApis.DimensionsTool and wp.blockEditor.privateApis.ResolutionTool',
+ } );
const { currentHeight, currentWidth, updateDimension, updateDimensions } =
useDimensionHandler( height, width, imageHeight, imageWidth, onChange );
diff --git a/packages/block-editor/src/components/link-control/index.js b/packages/block-editor/src/components/link-control/index.js
index 4803b9a0efebc4..41455c4ecf9704 100644
--- a/packages/block-editor/src/components/link-control/index.js
+++ b/packages/block-editor/src/components/link-control/index.js
@@ -292,7 +292,8 @@ function LinkControl( {
const shownUnlinkControl =
onRemove && value && ! isEditingLink && ! isCreatingPage;
- const showSettings = !! settings?.length;
+ const showSettings = !! settings?.length && isEditingLink && hasLinkValue;
+ const showActions = isEditingLink && hasLinkValue;
// Only show text control once a URL value has been committed
// and it isn't just empty whitespace.
@@ -322,6 +323,18 @@ function LinkControl( {
'has-text-control': showTextControl,
} ) }
>
+ { showTextControl && (
+
+ ) }
- { showTextControl && (
-
- ) }
{ errorMessage && (
) }
- { isEditing && (
+ { showSettings && (
- { showSettings && (
+ { ! currentInputIsEmpty && (
) }
+
+ ) }
-
-
-
-
+ { showActions && (
+
+
+
) }
diff --git a/packages/block-editor/src/components/link-control/search-input.js b/packages/block-editor/src/components/link-control/search-input.js
index 4e30daaa96524b..d6023b9220d630 100644
--- a/packages/block-editor/src/components/link-control/search-input.js
+++ b/packages/block-editor/src/components/link-control/search-input.js
@@ -46,7 +46,7 @@ const LinkControlSearchInput = forwardRef(
suggestionsQuery = {},
withURLSuggestion = true,
createSuggestionButtonText,
- useLabel = false,
+ hideLabelFromVision = false,
},
ref
) => {
@@ -120,7 +120,7 @@ const LinkControlSearchInput = forwardRef(
};
const inputClasses = classnames( className, {
- 'has-no-label': ! useLabel,
+ // 'has-no-label': ! hideLabelFromVision,
} );
return (
@@ -128,7 +128,8 @@ const LinkControlSearchInput = forwardRef(
setSettingsOpen( ! settingsOpen ) }
- icon={ settingsIcon }
- label={ __( 'Link Settings' ) }
+ icon={ isRTL() ? chevronLeftSmall : chevronRightSmall }
aria-controls={ settingsDrawerId }
- />
+ >
+ { _x( 'Advanced', 'Additional link settings' ) }
+
{ settingsOpen && (
.components-base-control__field {
- display: flex;
- align-items: center;
- }
-
- .components-base-control__label {
- margin-right: $grid-unit-20;
- margin-bottom: 0;
- min-width: 29px; // align with search results.
- }
-
input[type="text"],
// Specificity overide of URLInput defaults.
&.block-editor-url-input input[type="text"].block-editor-url-input__input {
@include input-control;
- width: calc(100% - #{$grid-unit-20 * 2});
display: block;
- padding: 11px $grid-unit-20;
+ border: 1px solid $gray-600;
+ border-radius: $radius-block-ui;
+ height: $button-size-next-default-40px; // components do not properly support unstable-large yet.
margin: 0;
+ padding: $grid-unit-10 $grid-unit-20;
position: relative;
- border: 1px solid $gray-300;
- border-radius: $radius-block-ui;
+ width: 100%;
}
}
@@ -94,12 +83,12 @@ $preview-image-height: 140px;
flex-direction: row-reverse; // put "Cancel" on the left but retain DOM order.
justify-content: flex-start;
gap: $grid-unit-10;
+ padding: $grid-unit-10;
order: 20;
}
.block-editor-link-control__search-results-wrapper {
position: relative;
- margin-top: -$grid-unit-20 + 1px;
&::before,
&::after {
@@ -440,36 +429,7 @@ $preview-image-height: 140px;
display: flex; // allow for ordering.
flex-direction: column;
flex-basis: 100%; // occupy full width.
- margin-top: $grid-unit-20;
- padding-top: $grid-unit-20;
position: relative;
-
- &::after {
- content: "";
- display: block;
- height: 1px;
- background-color: $gray-300;
- position: absolute;
- left: -$grid-unit-20;
- right: -$grid-unit-20;
- top: 0;
- }
-}
-
-.block-editor-link-control__tools {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- justify-content: space-between;
- margin: 0;
- padding: $grid-unit-20;
-
- // To hide the horizontal scrollbar on toggle.
- // Margin and padding are needed to prevent cutoff of the toggle button focus outline.
- // See: https://github.com/WordPress/gutenberg/pull/47986
- margin-top: calc(var(--wp-admin-border-width-focus) * -1);
- padding-top: var(--wp-admin-border-width-focus);
- overflow: hidden;
}
.block-editor-link-control__unlink {
@@ -477,17 +437,10 @@ $preview-image-height: 140px;
padding-right: $grid-unit-20;
}
-.block-editor-link-control__settings {
- flex: 1;
- margin: 0;
-
- .is-alternate & {
- border-top: $border-width solid $gray-900;
- }
-}
-
.block-editor-link-control__setting {
margin-bottom: $grid-unit-20;
+ flex: 1;
+ padding: $grid-unit-10 0 $grid-unit-10 $grid-unit-30;
// Cancel left margin inherited from WP Admin Forms CSS.
input {
@@ -499,6 +452,31 @@ $preview-image-height: 140px;
}
}
+.block-editor-link-control__tools {
+ padding: $grid-unit-10 $grid-unit-10 0 $grid-unit-10;
+ margin-top: #{$grid-unit-20 * -1};
+
+ .components-button.block-editor-link-control__drawer-toggle {
+ padding-left: 0;
+ gap: 0;
+
+ // Point downwards when open (same as list view expander)
+ &[aria-expanded="true"] svg {
+ visibility: visible;
+ transition: transform 0.1s ease;
+ transform: rotate(90deg);
+ @include reduce-motion("transition");
+ }
+ // Point rightwards when closed (same as list view expander)
+ &[aria-expanded="false"] svg {
+ visibility: visible;
+ transform: rotate(0deg);
+ transition: transform 0.1s ease;
+ @include reduce-motion("transition");
+ }
+ }
+}
+
.block-editor-link-control .block-editor-link-control__search-input .components-spinner {
display: block;
diff --git a/packages/block-editor/src/components/link-control/test/index.js b/packages/block-editor/src/components/link-control/test/index.js
index e5084844946be5..20b72363391ee1 100644
--- a/packages/block-editor/src/components/link-control/test/index.js
+++ b/packages/block-editor/src/components/link-control/test/index.js
@@ -138,7 +138,7 @@ describe( 'Basic rendering', () => {
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
expect( searchInput ).toBeVisible();
} );
@@ -147,7 +147,7 @@ describe( 'Basic rendering', () => {
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
expect( searchInput ).toBeVisible();
// Make sure we use the ARIA 1.0 pattern with aria-owns.
@@ -170,7 +170,7 @@ describe( 'Basic rendering', () => {
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
// Simulate searching for a term.
await user.type( searchInput, 'Hello' );
@@ -283,7 +283,7 @@ describe( 'Basic rendering', () => {
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
// Simulate searching for a term.
await user.type( searchInput, searchTerm );
@@ -296,7 +296,7 @@ describe( 'Basic rendering', () => {
render( );
expect(
- screen.queryByRole( 'combobox', { name: 'URL' } )
+ screen.queryByRole( 'combobox', { name: 'Link' } )
).not.toBeInTheDocument();
} );
@@ -309,7 +309,7 @@ describe( 'Basic rendering', () => {
);
expect(
- screen.getByRole( 'combobox', { name: 'URL' } )
+ screen.getByRole( 'combobox', { name: 'Link' } )
).toBeVisible();
} );
@@ -327,7 +327,7 @@ describe( 'Basic rendering', () => {
await user.click( editButton );
expect(
- screen.getByRole( 'combobox', { name: 'URL' } )
+ screen.getByRole( 'combobox', { name: 'Link' } )
).toBeVisible();
// If passed `forceIsEditingLink` of `false` while editing, should
@@ -340,7 +340,7 @@ describe( 'Basic rendering', () => {
);
expect(
- screen.queryByRole( 'combobox', { name: 'URL' } )
+ screen.queryByRole( 'combobox', { name: 'Link' } )
).not.toBeInTheDocument();
} );
@@ -424,7 +424,7 @@ describe( 'Searching for a link', () => {
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
// Simulate searching for a term.
await user.type( searchInput, searchTerm );
@@ -448,7 +448,9 @@ describe( 'Searching for a link', () => {
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', {
+ name: 'Link',
+ } );
// Simulate searching for a term.
await user.type( searchInput, searchTerm );
@@ -497,7 +499,9 @@ describe( 'Searching for a link', () => {
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', {
+ name: 'Link',
+ } );
// Simulate searching for a term.
await user.type( searchInput, searchTerm );
@@ -528,7 +532,7 @@ describe( 'Searching for a link', () => {
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
// Simulate searching for a term.
await user.type( searchInput, searchTerm );
@@ -571,7 +575,7 @@ describe( 'Searching for a link', () => {
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
// Simulate searching for a term.
await user.type( searchInput, 'anything' );
@@ -582,12 +586,43 @@ describe( 'Searching for a link', () => {
expect( mockFetchSearchSuggestions ).not.toHaveBeenCalled();
} );
+ it( 'should not display a URL suggestion when input is not likely to be a URL.', async () => {
+ const searchTerm = 'unlikelytobeaURL';
+ const user = userEvent.setup();
+ render( );
+
+ // Search Input UI.
+ const searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
+
+ // Simulate searching for a term.
+ await user.type( searchInput, searchTerm );
+
+ const searchResultElements = within(
+ await screen.findByRole( 'listbox', {
+ name: /Search results for.*/,
+ } )
+ ).getAllByRole( 'option' );
+
+ const lastSearchResultItem =
+ searchResultElements[ searchResultElements.length - 1 ];
+
+ // We should see a search result for each of the expect search suggestions.
+ expect( searchResultElements ).toHaveLength(
+ fauxEntitySuggestions.length
+ );
+
+ // The URL search suggestion should not exist.
+ expect( lastSearchResultItem ).not.toHaveTextContent(
+ 'Press ENTER to add this link'
+ );
+ } );
+
it( 'should not display a URL suggestion as a default fallback when noURLSuggestion is passed.', async () => {
const user = userEvent.setup();
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
// Simulate searching for a term.
await user.type( searchInput, 'couldbeurlorentitysearchterm' );
@@ -617,7 +652,9 @@ describe( 'Manual link entry', () => {
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', {
+ name: 'Link',
+ } );
// Simulate searching for a term.
await user.type( searchInput, searchTerm );
@@ -653,19 +690,9 @@ describe( 'Manual link entry', () => {
// Search Input UI.
const searchInput = screen.getByRole( 'combobox', {
- name: 'URL',
- } );
-
- let submitButton = screen.getByRole( 'button', {
- name: 'Save',
+ name: 'Link',
} );
- expect( submitButton ).toHaveAttribute(
- 'aria-disabled',
- 'true'
- );
- expect( submitButton ).toBeVisible();
-
if ( searchString.length ) {
// Simulate searching for a term.
await user.type( searchInput, searchString );
@@ -677,102 +704,74 @@ describe( 'Manual link entry', () => {
// Attempt to submit the empty search value in the input.
await user.keyboard( '[Enter]' );
- submitButton = screen.getByRole( 'button', {
- name: 'Save',
- } );
-
- // Verify the UI hasn't allowed submission.
+ // Verify the UI hasn't allowed submission because
+ // the search input is still visible.
expect( searchInput ).toBeVisible();
- expect( submitButton ).toHaveAttribute(
- 'aria-disabled',
- 'true'
- );
- expect( submitButton ).toBeVisible();
}
);
it.each( testTable )(
- 'should not allow creation of links %s via the UI "submit" button',
+ 'should not allow editing of links to a new link %s via the UI "submit" button',
async ( _desc, searchString ) => {
const user = userEvent.setup();
- render( );
+ render(
+
+ );
// Search Input UI.
const searchInput = screen.getByRole( 'combobox', {
- name: 'URL',
+ name: 'Link',
} );
- let submitButton = screen.queryByRole( 'button', {
- name: 'Save',
- } );
+ // Remove the existing link.
+ await user.clear( searchInput );
- expect( submitButton ).toHaveAttribute(
- 'aria-disabled',
- 'true'
- );
- expect( submitButton ).toBeVisible();
-
- // Simulate searching for a term.
if ( searchString.length ) {
- // Simulate searching for a term.
await user.type( searchInput, searchString );
} else {
// Simulate clearing the search term.
await user.clear( searchInput );
}
- // Attempt to submit the empty search value in the input.
- await user.click( submitButton );
-
- submitButton = screen.queryByRole( 'button', {
+ const submitButton = screen.queryByRole( 'button', {
name: 'Save',
} );
- // Verify the UI hasn't allowed submission.
- expect( searchInput ).toBeVisible();
+ // debug the UI state
+ // screen.debug();
+
+ // Verify the submission UI is disabled.
+ expect( submitButton ).toBeVisible();
expect( submitButton ).toHaveAttribute(
'aria-disabled',
'true'
);
- expect( submitButton ).toBeVisible();
+
+ // Attempt to submit the empty search value in the input.
+ await user.click( submitButton );
+
+ // Verify the UI hasn't allowed submission because
+ // the search input is still visible.
+ expect( searchInput ).toBeVisible();
}
);
} );
describe( 'Handling cancellation', () => {
- it( 'should allow cancellation of the link creation process and reset any entered values', async () => {
- const user = userEvent.setup();
+ it( 'should not show cancellation button during link creation', async () => {
const mockOnRemove = jest.fn();
- const mockOnCancel = jest.fn();
render( );
- // Search Input UI.
- const searchInput = screen.getByRole( 'combobox', {
- name: 'URL',
- } );
-
const cancelButton = screen.queryByRole( 'button', {
name: 'Cancel',
} );
- expect( cancelButton ).toBeEnabled();
- expect( cancelButton ).toBeVisible();
-
- // Simulate adding a link for a term.
- await user.type( searchInput, 'https://www.wordpress.org' );
-
- // Attempt to submit the empty search value in the input.
- await user.click( cancelButton );
-
- // Verify the consumer can handle the cancellation.
- expect( mockOnRemove ).toHaveBeenCalled();
-
- // Ensure optional callback is not called.
- expect( mockOnCancel ).not.toHaveBeenCalled();
-
- expect( searchInput ).toHaveValue( '' );
+ expect( cancelButton ).not.toBeInTheDocument();
} );
it( 'should allow cancellation of the link editing process and reset any entered values', async () => {
@@ -809,7 +808,7 @@ describe( 'Manual link entry', () => {
await toggleSettingsDrawer( user );
let searchInput = screen.getByRole( 'combobox', {
- name: 'URL',
+ name: 'Link',
} );
let textInput = screen.getByRole( 'textbox', {
@@ -844,7 +843,7 @@ describe( 'Manual link entry', () => {
// Re-query the inputs as they have been replaced.
searchInput = screen.getByRole( 'combobox', {
- name: 'URL',
+ name: 'Link',
} );
textInput = screen.getByRole( 'textbox', {
@@ -860,7 +859,13 @@ describe( 'Manual link entry', () => {
const user = userEvent.setup();
const mockOnCancel = jest.fn();
- render( );
+ render(
+
+ );
const cancelButton = screen.queryByRole( 'button', {
name: 'Cancel',
@@ -886,7 +891,7 @@ describe( 'Manual link entry', () => {
// Search Input UI.
const searchInput = screen.getByRole( 'combobox', {
- name: 'URL',
+ name: 'Link',
} );
// Simulate searching for a term.
@@ -922,7 +927,7 @@ describe( 'Default search suggestions', () => {
// Verify input has no value has default suggestions should only show
// when this does not have a value.
// Search Input UI.
- expect( screen.getByRole( 'combobox', { name: 'URL' } ) ).toHaveValue(
+ expect( screen.getByRole( 'combobox', { name: 'Link' } ) ).toHaveValue(
''
);
@@ -951,7 +956,7 @@ describe( 'Default search suggestions', () => {
} );
await user.click( currentLinkBtn );
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
// Search input is set to the URL value.
expect( searchInput ).toHaveValue( initialValue.url );
@@ -973,7 +978,7 @@ describe( 'Default search suggestions', () => {
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
// Simulate searching for a term.
await user.type( searchInput, searchTerm );
@@ -1011,7 +1016,7 @@ describe( 'Default search suggestions', () => {
render( );
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
const searchResultsField = screen.queryByRole( 'listbox', {
name: 'Suggestions',
@@ -1069,7 +1074,9 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => {
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', {
+ name: 'Link',
+ } );
// Simulate searching for a term.
await user.type( searchInput, entityNameText );
@@ -1136,7 +1143,7 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => {
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
// Simulate searching for a term.
await user.type( searchInput, 'Some new page to create' );
@@ -1185,7 +1192,7 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => {
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
// Simulate searching for a term.
await user.type( searchInput, entityNameText );
@@ -1228,7 +1235,7 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => {
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
// Simulate searching for a term.
await user.type( searchInput, entityNameText );
@@ -1252,7 +1259,7 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => {
// Search Input UI.
const searchInput = screen.getByRole( 'combobox', {
- name: 'URL',
+ name: 'Link',
} );
const searchResultsField = screen.queryByRole( 'listbox' );
@@ -1272,7 +1279,9 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => {
);
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', {
+ name: 'Link',
+ } );
const searchResultsField = screen.queryByRole( 'listbox' );
@@ -1295,7 +1304,7 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => {
// Search Input UI.
const searchInput = screen.getByRole( 'combobox', {
- name: 'URL',
+ name: 'Link',
} );
// Simulate searching for a term.
@@ -1329,7 +1338,7 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => {
render( );
// Search Input UI.
- searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
// Simulate searching for a term.
await user.type( searchInput, searchText );
@@ -1344,7 +1353,7 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => {
await user.click( createButton );
- searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
const errorNotice = screen.getAllByText(
'API response returned invalid entity.'
@@ -1417,7 +1426,7 @@ describe( 'Selecting links', () => {
// Simulate searching for a term.
await user.click( currentLinkBtn );
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
currentLinkUI = screen.queryByLabelText( 'Currently selected' );
// We should be back to showing the search input.
@@ -1458,7 +1467,7 @@ describe( 'Selecting links', () => {
// Search Input UI.
const searchInput = screen.getByRole( 'combobox', {
- name: 'URL',
+ name: 'Link',
} );
// Simulate searching for a term.
@@ -1520,7 +1529,7 @@ describe( 'Selecting links', () => {
// Search Input UI.
const searchInput = screen.getByRole( 'combobox', {
- name: 'URL',
+ name: 'Link',
} );
// Simulate searching for a term.
@@ -1609,7 +1618,9 @@ describe( 'Selecting links', () => {
).toBeVisible();
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', {
+ name: 'Link',
+ } );
// Step down into the search results, highlighting the first result item.
triggerArrowDown( searchInput );
@@ -1665,7 +1676,9 @@ describe( 'Selecting links', () => {
render( );
// focus the search input
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', {
+ name: 'Link',
+ } );
fireEvent.focus( searchInput );
@@ -1707,10 +1720,7 @@ describe( 'Addition Settings UI', () => {
render( );
- const settingsToggle = screen.queryByRole( 'button', {
- name: 'Link Settings',
- ariaControls: 'link-settings-1',
- } );
+ const settingsToggle = getSettingsDrawerToggle();
expect( settingsToggle ).not.toBeInTheDocument();
} );
@@ -1727,10 +1737,7 @@ describe( 'Addition Settings UI', () => {
const user = userEvent.setup();
- const settingsToggle = screen.queryByRole( 'button', {
- name: 'Link Settings',
- ariaControls: 'link-settings-1',
- } );
+ const settingsToggle = getSettingsDrawerToggle();
expect( settingsToggle ).toHaveAttribute( 'aria-expanded', 'false' );
@@ -1891,7 +1898,7 @@ describe( 'Post types', () => {
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', { name: 'Link' } );
// Simulate searching for a term.
await user.type( searchInput, searchTerm );
@@ -1918,7 +1925,9 @@ describe( 'Post types', () => {
render( );
// Search Input UI.
- const searchInput = screen.getByRole( 'combobox', { name: 'URL' } );
+ const searchInput = screen.getByRole( 'combobox', {
+ name: 'Link',
+ } );
// Simulate searching for a term.
await user.type( searchInput, searchTerm );
@@ -2376,10 +2385,14 @@ describe( 'Controlling link title text', () => {
} );
} );
-async function toggleSettingsDrawer( user ) {
- const settingsToggle = screen.queryByRole( 'button', {
- name: 'Link Settings',
+function getSettingsDrawerToggle() {
+ return screen.queryByRole( 'button', {
+ name: 'Advanced',
} );
+}
+
+async function toggleSettingsDrawer( user ) {
+ const settingsToggle = getSettingsDrawerToggle();
await user.click( settingsToggle );
}
diff --git a/packages/block-editor/src/components/media-replace-flow/test/index.js b/packages/block-editor/src/components/media-replace-flow/test/index.js
index 2be7e7372260df..cef747ce6be639 100644
--- a/packages/block-editor/src/components/media-replace-flow/test/index.js
+++ b/packages/block-editor/src/components/media-replace-flow/test/index.js
@@ -128,7 +128,7 @@ describe( 'General media replace flow', () => {
);
const mediaURLInput = screen.getByRole( 'combobox', {
- name: 'URL',
+ name: 'Link',
expanded: false,
} );
diff --git a/packages/block-editor/src/components/provider/test/use-block-sync.js b/packages/block-editor/src/components/provider/test/use-block-sync.js
index 7901c3d98f3a92..b1e6a97d137c91 100644
--- a/packages/block-editor/src/components/provider/test/use-block-sync.js
+++ b/packages/block-editor/src/components/provider/test/use-block-sync.js
@@ -48,7 +48,7 @@ describe( 'useBlockSync hook', () => {
jest.clearAllMocks();
} );
- it( 'resets the block-editor blocks when the controll value changes', async () => {
+ it( 'resets the block-editor blocks when the controlled value changes', async () => {
const fakeBlocks = [];
const resetBlocks = jest.spyOn( blockEditorActions, 'resetBlocks' );
const replaceInnerBlocks = jest.spyOn(
@@ -58,7 +58,7 @@ describe( 'useBlockSync hook', () => {
const onChange = jest.fn();
const onInput = jest.fn();
- const { rerender } = render(
+ const { rerender, unmount } = render(
{
expect( onInput ).not.toHaveBeenCalled();
expect( replaceInnerBlocks ).not.toHaveBeenCalled();
expect( resetBlocks ).toHaveBeenCalledWith( testBlocks );
+
+ unmount();
+
+ expect( onChange ).not.toHaveBeenCalled();
+ expect( onInput ).not.toHaveBeenCalled();
+ expect( replaceInnerBlocks ).not.toHaveBeenCalled();
+ expect( resetBlocks ).toHaveBeenCalledWith( [] );
} );
- it( 'replaces the inner blocks of a block when the control value changes if a clientId is passed', async () => {
+ it( 'replaces the inner blocks of a block when the controlled value changes if a clientId is passed', async () => {
const fakeBlocks = [];
const replaceInnerBlocks = jest.spyOn(
blockEditorActions,
@@ -100,7 +107,7 @@ describe( 'useBlockSync hook', () => {
const onChange = jest.fn();
const onInput = jest.fn();
- const { rerender } = render(
+ const { rerender, unmount } = render(
{
expect( onChange ).not.toHaveBeenCalled();
expect( onInput ).not.toHaveBeenCalled();
expect( resetBlocks ).not.toHaveBeenCalled();
- // We can't check the args because the blocks are cloned.
- expect( replaceInnerBlocks ).toHaveBeenCalled();
+ expect( replaceInnerBlocks ).toHaveBeenCalledWith( 'test', [
+ expect.objectContaining( { name: 'test/test-block' } ),
+ ] );
+
+ unmount();
+
+ expect( onChange ).not.toHaveBeenCalled();
+ expect( onInput ).not.toHaveBeenCalled();
+ expect( resetBlocks ).not.toHaveBeenCalled();
+ expect( replaceInnerBlocks ).toHaveBeenCalledWith( 'test', [] );
} );
it( 'does not add the controlled blocks to the block-editor store if the store already contains them', async () => {
diff --git a/packages/block-editor/src/components/provider/use-block-sync.js b/packages/block-editor/src/components/provider/use-block-sync.js
index f7392f99035a95..d788c7b4442304 100644
--- a/packages/block-editor/src/components/provider/use-block-sync.js
+++ b/packages/block-editor/src/components/provider/use-block-sync.js
@@ -134,6 +134,19 @@ export default function useBlockSync( {
}
};
+ // Clean up the changes made by setControlledBlocks() when the component
+ // containing useBlockSync() unmounts.
+ const unsetControlledBlocks = () => {
+ __unstableMarkNextChangeAsNotPersistent();
+ if ( clientId ) {
+ setHasControlledInnerBlocks( clientId, false );
+ __unstableMarkNextChangeAsNotPersistent();
+ replaceInnerBlocks( clientId, [] );
+ } else {
+ resetBlocks( [] );
+ }
+ };
+
// Add a subscription to the block-editor registry to detect when changes
// have been made. This lets us inform the data source of changes. This
// is an effect so that the subscriber can run synchronously without
@@ -287,4 +300,10 @@ export default function useBlockSync( {
unsubscribe();
};
}, [ registry, clientId ] );
+
+ useEffect( () => {
+ return () => {
+ unsetControlledBlocks();
+ };
+ }, [] );
}
diff --git a/packages/block-editor/src/components/resolution-tool/index.js b/packages/block-editor/src/components/resolution-tool/index.js
new file mode 100644
index 00000000000000..71c7e508ca3edb
--- /dev/null
+++ b/packages/block-editor/src/components/resolution-tool/index.js
@@ -0,0 +1,56 @@
+/**
+ * WordPress dependencies
+ */
+import {
+ SelectControl,
+ __experimentalToolsPanelItem as ToolsPanelItem,
+} from '@wordpress/components';
+import { __, _x } from '@wordpress/i18n';
+
+const DEFAULT_SIZE_OPTIONS = [
+ {
+ label: _x( 'Thumbnail', 'Image size option for resolution control' ),
+ value: 'thumbnail',
+ },
+ {
+ label: _x( 'Medium', 'Image size option for resolution control' ),
+ value: 'medium',
+ },
+ {
+ label: _x( 'Large', 'Image size option for resolution control' ),
+ value: 'large',
+ },
+ {
+ label: _x( 'Full Size', 'Image size option for resolution control' ),
+ value: 'full',
+ },
+];
+
+export default function ResolutionTool( {
+ panelId,
+ value,
+ onChange,
+ options = DEFAULT_SIZE_OPTIONS,
+ defaultValue = DEFAULT_SIZE_OPTIONS[ 0 ].value,
+ isShownByDefault = true,
+} ) {
+ const displayValue = value ?? defaultValue;
+ return (
+ displayValue !== defaultValue }
+ label={ __( 'Resolution' ) }
+ onDeselect={ () => onChange( defaultValue ) }
+ isShownByDefault={ isShownByDefault }
+ panelId={ panelId }
+ >
+
+
+ );
+}
diff --git a/packages/block-editor/src/components/resolution-tool/stories/index.js b/packages/block-editor/src/components/resolution-tool/stories/index.js
new file mode 100644
index 00000000000000..ed598acd4df98f
--- /dev/null
+++ b/packages/block-editor/src/components/resolution-tool/stories/index.js
@@ -0,0 +1,48 @@
+/**
+ * WordPress dependencies
+ */
+import { useState } from '@wordpress/element';
+import {
+ Panel,
+ __experimentalToolsPanel as ToolsPanel,
+} from '@wordpress/components';
+
+/**
+ * Internal dependencies
+ */
+import ResolutionTool from '..';
+
+export default {
+ title: 'BlockEditor (Private APIs)/ResolutionControl',
+ component: ResolutionTool,
+ argTypes: {
+ panelId: { control: { type: null } },
+ onChange: { action: 'changed' },
+ },
+};
+
+export const Default = ( { panelId, onChange: onChangeProp, ...props } ) => {
+ const [ resolution, setResolution ] = useState( undefined );
+ const resetAll = () => {
+ setResolution( undefined );
+ onChangeProp( undefined );
+ };
+ return (
+
+
+ {
+ setResolution( newValue );
+ onChangeProp( newValue );
+ } }
+ value={ resolution }
+ { ...props }
+ />
+
+
+ );
+};
+Default.args = {
+ panelId: 'panel-id',
+};
diff --git a/packages/block-editor/src/components/url-input/index.js b/packages/block-editor/src/components/url-input/index.js
index eb448f79d1b3f5..1451397ce68e5f 100644
--- a/packages/block-editor/src/components/url-input/index.js
+++ b/packages/block-editor/src/components/url-input/index.js
@@ -434,6 +434,7 @@ class URLInput extends Component {
placeholder = __( 'Paste URL or type to search' ),
__experimentalRenderControl: renderControl,
value = '',
+ hideLabelFromVision = false,
} = this.props;
const {
@@ -452,6 +453,7 @@ class URLInput extends Component {
className: classnames( 'block-editor-url-input', className, {
'is-full-width': isFullWidth,
} ),
+ hideLabelFromVision,
};
const inputProps = {
diff --git a/packages/block-editor/src/private-apis.js b/packages/block-editor/src/private-apis.js
index 9cef7e0cda8e0f..dd8d2d8ff411f7 100644
--- a/packages/block-editor/src/private-apis.js
+++ b/packages/block-editor/src/private-apis.js
@@ -16,6 +16,8 @@ import BlockQuickNavigation from './components/block-quick-navigation';
import { LayoutStyle } from './components/block-list/layout';
import { BlockRemovalWarningModal } from './components/block-removal-warning-modal';
import { useLayoutClasses, useLayoutStyles } from './hooks';
+import DimensionsTool from './components/dimensions-tool';
+import ResolutionTool from './components/resolution-tool';
/**
* Private @wordpress/block-editor APIs.
@@ -37,4 +39,6 @@ lock( privateApis, {
BlockRemovalWarningModal,
useLayoutClasses,
useLayoutStyles,
+ DimensionsTool,
+ ResolutionTool,
} );
diff --git a/packages/block-editor/src/store/defaults.js b/packages/block-editor/src/store/defaults.js
index 7c33350d12dd01..acd40244cb2604 100644
--- a/packages/block-editor/src/store/defaults.js
+++ b/packages/block-editor/src/store/defaults.js
@@ -18,6 +18,7 @@ export const PREFERENCES_DEFAULTS = {
* @property {number} maxWidth Max width to constraint resizing
* @property {boolean|Array} allowedBlockTypes Allowed block types
* @property {boolean} hasFixedToolbar Whether or not the editor toolbar is fixed
+ * @property {boolean} distractionFree Whether or not the editor UI is distraction free
* @property {boolean} focusMode Whether the focus mode is enabled or not
* @property {Array} styles Editor Styles
* @property {boolean} keepCaretInsideBlock Whether caret should move between blocks in edit mode
diff --git a/packages/block-library/src/avatar/block.json b/packages/block-library/src/avatar/block.json
index 652a9a04cdebe5..12e81d68aa767d 100644
--- a/packages/block-library/src/avatar/block.json
+++ b/packages/block-library/src/avatar/block.json
@@ -48,6 +48,6 @@
"__experimentalDuotone": "img"
}
},
- "editorStyle": "wp-block-avatar",
+ "editorStyle": "wp-block-avatar-editor",
"style": "wp-block-avatar"
}
diff --git a/packages/block-library/src/buttons/edit.js b/packages/block-library/src/buttons/edit.js
index 869968e5951a8f..78be70ed9dc354 100644
--- a/packages/block-library/src/buttons/edit.js
+++ b/packages/block-library/src/buttons/edit.js
@@ -36,7 +36,7 @@ const DEFAULT_BLOCK = {
};
function ButtonsEdit( { attributes, className } ) {
- const { fontSize, style } = attributes;
+ const { fontSize, layout, style } = attributes;
const blockProps = useBlockProps( {
className: classnames( className, {
'has-custom-font-size': fontSize || style?.typography?.fontSize,
@@ -59,8 +59,8 @@ function ButtonsEdit( { attributes, className } ) {
{ className: preferredStyle && `is-style-${ preferredStyle }` },
],
],
-
templateInsertUpdatesSelection: true,
+ orientation: layout?.orientation ?? 'horizontal',
} );
return ;
diff --git a/packages/block-library/src/image/block.json b/packages/block-library/src/image/block.json
index 436331e37c3321..7c8b2c2715c99a 100644
--- a/packages/block-library/src/image/block.json
+++ b/packages/block-library/src/image/block.json
@@ -69,6 +69,12 @@
"height": {
"type": "number"
},
+ "aspectRatio": {
+ "type": "string"
+ },
+ "scale": {
+ "type": "string"
+ },
"sizeSlug": {
"type": "string"
},
diff --git a/packages/block-library/src/image/edit.js b/packages/block-library/src/image/edit.js
index dc82b7227a701d..9bd175607c5248 100644
--- a/packages/block-library/src/image/edit.js
+++ b/packages/block-library/src/image/edit.js
@@ -183,8 +183,6 @@ export function ImageEdit( {
// Reset the dimension attributes if changing to a different image.
if ( ! media.id || media.id !== id ) {
additionalAttributes = {
- width: undefined,
- height: undefined,
// Fallback to size "full" if there's no default image size.
// It means the image is smaller, and the block will use a full-size URL.
sizeSlug: hasDefaultSize( media, imageDefaultSize )
@@ -248,8 +246,6 @@ export function ImageEdit( {
setAttributes( {
url: newURL,
id: undefined,
- width: undefined,
- height: undefined,
sizeSlug: imageDefaultSize,
} );
}
diff --git a/packages/block-library/src/image/image.js b/packages/block-library/src/image/image.js
index d9da5067f36259..2dc39751de7101 100644
--- a/packages/block-library/src/image/image.js
+++ b/packages/block-library/src/image/image.js
@@ -4,13 +4,15 @@
import { isBlobURL } from '@wordpress/blob';
import {
ExternalLink,
- PanelBody,
ResizableBox,
Spinner,
TextareaControl,
TextControl,
ToolbarButton,
ToolbarGroup,
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
+ __experimentalUseCustomUnits as useCustomUnits,
} from '@wordpress/components';
import { useViewportMatch, usePrevious } from '@wordpress/compose';
import { useSelect, useDispatch } from '@wordpress/data';
@@ -18,7 +20,6 @@ import {
BlockControls,
InspectorControls,
RichText,
- __experimentalImageSizeControl as ImageSizeControl,
__experimentalImageURLInputUI as ImageURLInputUI,
MediaReplaceFlow,
store as blockEditorStore,
@@ -26,6 +27,7 @@ import {
__experimentalImageEditor as ImageEditor,
__experimentalGetElementClassName,
__experimentalUseBorderProps as useBorderProps,
+ privateApis as blockEditorPrivateApis,
} from '@wordpress/block-editor';
import {
useEffect,
@@ -34,7 +36,7 @@ import {
useRef,
useCallback,
} from '@wordpress/element';
-import { __, sprintf, isRTL } from '@wordpress/i18n';
+import { __, _x, sprintf, isRTL } from '@wordpress/i18n';
import { getFilename } from '@wordpress/url';
import {
createBlock,
@@ -53,6 +55,7 @@ import { store as coreStore } from '@wordpress/core-data';
/**
* Internal dependencies
*/
+import { unlock } from '../lock-unlock';
import { createUpgradedEmbedBlock } from '../embed/util';
import useClientWidth from './use-client-width';
import { isExternalImage } from './edit';
@@ -61,6 +64,22 @@ import { isExternalImage } from './edit';
* Module constants
*/
import { MIN_SIZE, ALLOWED_MEDIA_TYPES } from './constants';
+import { evalAspectRatio } from './utils';
+
+const { DimensionsTool, ResolutionTool } = unlock( blockEditorPrivateApis );
+
+const scaleOptions = [
+ {
+ value: 'cover',
+ label: _x( 'Cover', 'Scale option for dimensions control' ),
+ help: __( 'Image covers the space evenly.' ),
+ },
+ {
+ value: 'contain',
+ label: _x( 'Contain', 'Scale option for dimensions control' ),
+ help: __( 'Image is contained without distortion.' ),
+ },
+];
export default function Image( {
temporaryURL,
@@ -90,6 +109,8 @@ export default function Image( {
title,
width,
height,
+ aspectRatio,
+ scale,
linkTarget,
sizeSlug,
} = attributes;
@@ -272,8 +293,6 @@ export default function Image( {
setAttributes( {
url: newUrl,
- width: undefined,
- height: undefined,
sizeSlug: newSizeSlug,
} );
}
@@ -329,6 +348,13 @@ export default function Image( {
);
}
+ // TODO: Can allow more units after figuring out how they should interact
+ // with the ResizableBox and ImageEditor components. Calculations later on
+ // for those components are currently assuming px units.
+ const dimensionsUnitsOptions = useCustomUnits( {
+ availableUnits: [ 'px' ],
+ } );
+
const controls = (
<>
@@ -407,41 +433,78 @@ export default function Image( {
) }
-
+
+ setAttributes( {
+ width: undefined,
+ height: undefined,
+ scale: undefined,
+ aspectRatio: undefined,
+ } )
+ }
+ >
{ ! multiImageSelection && (
-
-
- { __(
- 'Describe the purpose of the image.'
- ) }
-
-
- { __( 'Leave empty if decorative.' ) }
- >
+ isShownByDefault={ true }
+ hasValue={ () => alt !== '' }
+ onDeselect={ () =>
+ setAttributes( { alt: undefined } )
}
- />
+ >
+
+
+ { __(
+ 'Describe the purpose of the image.'
+ ) }
+
+
+ { __( 'Leave empty if decorative.' ) }
+ >
+ }
+ __nextHasNoMarginBottom
+ />
+
) }
- setAttributes( value ) }
- slug={ sizeSlug }
- width={ width }
- height={ height }
- imageSizeOptions={ imageSizeOptions }
- isResizable={ isResizable }
- imageWidth={ naturalWidth }
- imageHeight={ naturalHeight }
- imageSizeHelp={ __(
- 'Select the size of the source image.'
- ) }
+ {
+ // Rebuilding the object forces setting `undefined`
+ // for values that are removed since setAttributes
+ // doesn't do anything with keys that aren't set.
+ setAttributes( {
+ width:
+ newValue.width &&
+ parseInt( newValue.width, 10 ),
+ height:
+ newValue.height &&
+ parseInt( newValue.height, 10 ),
+ scale: newValue.scale,
+ aspectRatio: newValue.aspectRatio,
+ } );
+ } }
+ defaultScale="cover"
+ defaultAspectRatio="auto"
+ scaleOptions={ scaleOptions }
+ unitsOptions={ dimensionsUnitsOptions }
+ />
+
-
+
0 );
let img = (
// Disable reason: Image itself is not meant to be interactive, but
@@ -504,25 +564,20 @@ export default function Image( {
} }
ref={ imageRef }
className={ borderProps.className }
- style={ borderProps.style }
+ style={ {
+ width:
+ ( width && height ) || aspectRatio ? '100%' : 'inherit',
+ height:
+ ( width && height ) || aspectRatio ? '100%' : 'inherit',
+ objectFit: scale,
+ ...borderProps.style,
+ } }
/>
{ temporaryURL && }
>
/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */
);
- let imageWidthWithinContainer;
- let imageHeightWithinContainer;
-
- if ( clientWidth && naturalWidth && naturalHeight ) {
- const exceedMaxWidth = naturalWidth > clientWidth;
- const ratio = naturalHeight / naturalWidth;
- imageWidthWithinContainer = exceedMaxWidth ? clientWidth : naturalWidth;
- imageHeightWithinContainer = exceedMaxWidth
- ? clientWidth * ratio
- : naturalHeight;
- }
-
// clientWidth needs to be a number for the image Cropper to work, but sometimes it's 0
// So we try using the imageRef width first and fallback to clientWidth.
const fallbackClientWidth = imageRef.current?.width || clientWidth;
@@ -546,13 +601,17 @@ export default function Image( {
borderProps={ isRounded ? undefined : borderProps }
/>
);
- } else if ( ! isResizable || ! imageWidthWithinContainer ) {
- img = { img }
;
+ } else if ( ! isResizable ) {
+ img = { img }
;
} else {
- const currentWidth = width || imageWidthWithinContainer;
- const currentHeight = height || imageHeightWithinContainer;
+ const ratio =
+ ( aspectRatio && evalAspectRatio( aspectRatio ) ) ||
+ ( width && height && width / height ) ||
+ naturalWidth / naturalHeight;
+
+ const currentWidth = ! width && height ? height * ratio : width;
+ const currentHeight = ! height && width ? width / ratio : height;
- const ratio = naturalWidth / naturalHeight;
const minWidth =
naturalWidth < naturalHeight ? MIN_SIZE : MIN_SIZE * ratio;
const minHeight =
@@ -600,16 +659,24 @@ export default function Image( {
img = (
{
+ onResizeStop={ ( event, direction, elt ) => {
onResizeStop();
setAttributes( {
- width: parseInt( currentWidth + delta.width, 10 ),
- height: parseInt( currentHeight + delta.height, 10 ),
+ width: elt.offsetWidth,
+ height: elt.offsetHeight,
+ aspectRatio: undefined,
} );
} }
resizeRatio={ align === 'center' ? 2 : 1 }
diff --git a/packages/block-library/src/image/save.js b/packages/block-library/src/image/save.js
index d0fd5ef3d6f98b..95e8803dd67858 100644
--- a/packages/block-library/src/image/save.js
+++ b/packages/block-library/src/image/save.js
@@ -24,6 +24,8 @@ export default function save( { attributes } ) {
linkClass,
width,
height,
+ aspectRatio,
+ scale,
id,
linkTarget,
sizeSlug,
@@ -52,7 +54,11 @@ export default function save( { attributes } ) {
src={ url }
alt={ alt }
className={ imageClasses || undefined }
- style={ borderProps.style }
+ style={ {
+ ...borderProps.style,
+ aspectRatio,
+ objectFit: scale,
+ } }
width={ width }
height={ height }
title={ title }
diff --git a/packages/block-library/src/image/utils.js b/packages/block-library/src/image/utils.js
index 839628fa978b00..1ef7973b4e57a3 100644
--- a/packages/block-library/src/image/utils.js
+++ b/packages/block-library/src/image/utils.js
@@ -3,6 +3,22 @@
*/
import { NEW_TAB_REL } from './constants';
+/**
+ * Evaluates a CSS aspect-ratio property value as a number.
+ *
+ * Degenerate or invalid ratios behave as 'auto'. And 'auto' ratios return NaN.
+ *
+ * @see https://drafts.csswg.org/css-sizing-4/#aspect-ratio
+ *
+ * @param {string} value CSS aspect-ratio property value.
+ * @return {number} Numerical aspect ratio or NaN if invalid.
+ */
+export function evalAspectRatio( value ) {
+ const [ width, height = 1 ] = value.split( '/' ).map( Number );
+ const aspectRatio = width / height;
+ return aspectRatio === Infinity || aspectRatio === 0 ? NaN : aspectRatio;
+}
+
export function removeNewTabRel( currentRel ) {
let newRel = currentRel;
diff --git a/packages/block-library/src/query-pagination-numbers/block.json b/packages/block-library/src/query-pagination-numbers/block.json
index a6263ec1312795..f00b2993a75f63 100644
--- a/packages/block-library/src/query-pagination-numbers/block.json
+++ b/packages/block-library/src/query-pagination-numbers/block.json
@@ -32,5 +32,5 @@
}
}
},
- "editorStyle": "query-pagination-numbers-editor"
+ "editorStyle": "wp-block-query-pagination-numbers-editor"
}
diff --git a/packages/block-library/src/site-tagline/icon.js b/packages/block-library/src/site-tagline/icon.js
index 262b980c1ce111..908d7149aa112a 100644
--- a/packages/block-library/src/site-tagline/icon.js
+++ b/packages/block-library/src/site-tagline/icon.js
@@ -5,6 +5,6 @@ import { SVG, Path } from '@wordpress/components';
export default (
);
diff --git a/packages/commands/src/hooks/use-command.js b/packages/commands/src/hooks/use-command.js
index e3f56662b91f29..7d92439a3d5edc 100644
--- a/packages/commands/src/hooks/use-command.js
+++ b/packages/commands/src/hooks/use-command.js
@@ -28,7 +28,7 @@ export default function useCommand( command ) {
label: command.label,
searchLabel: command.searchLabel,
icon: command.icon,
- callback: currentCallback.current,
+ callback: ( ...args ) => currentCallback.current( ...args ),
} );
return () => {
unregisterCommand( command.name );
diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md
index f33d32ed894974..01db98978c1088 100644
--- a/packages/components/CHANGELOG.md
+++ b/packages/components/CHANGELOG.md
@@ -4,15 +4,20 @@
### Enhancements
+- `SelectControl`: Added option to set hidden options. ([#51545](https://github.com/WordPress/gutenberg/pull/51545))
- `UnitControl`: Revamp support for changing unit by typing ([#39303](https://github.com/WordPress/gutenberg/pull/39303)).
- `Modal`: Update corner radius to be between buttons and the site view frame, in a 2-4-8 system. ([#51254](https://github.com/WordPress/gutenberg/pull/51254)).
+- `Button`: Introduce `size` prop with `default`, `compact`, and `small` variants ([#51842](https://github.com/WordPress/gutenberg/pull/51842)).
- `ItemGroup`: Update button focus state styles to be inline with other button focus states in the editor. ([#51576](https://github.com/WordPress/gutenberg/pull/51576)).
+- `ItemGroup`: Update button focus state styles to target `:focus-visible` rather than `:focus`. ([#51787](https://github.com/WordPress/gutenberg/pull/51787)).
### Bug Fix
- `Popover`: Allow legitimate 0 positions to update popover position ([#51320](https://github.com/WordPress/gutenberg/pull/51320)).
- `Button`: Remove unnecessary margin from dashicon ([#51395](https://github.com/WordPress/gutenberg/pull/51395)).
- `Autocomplete`: Announce how many results are available to screen readers when suggestions list first renders ([#51018](https://github.com/WordPress/gutenberg/pull/51018)).
+- `ConfirmDialog`: Ensure onConfirm isn't called an extra time when submitting one of the buttons using the keyboard ([#51730](https://github.com/WordPress/gutenberg/pull/51730)).
+- `ZStack`: ZStack: fix component bounding box to match children ([#51836](https://github.com/WordPress/gutenberg/pull/51836)).
### Internal
diff --git a/packages/components/package.json b/packages/components/package.json
index 22d664914795f7..c29f5c8cc8171b 100644
--- a/packages/components/package.json
+++ b/packages/components/package.json
@@ -66,7 +66,7 @@
"dom-scroll-into-view": "^1.2.1",
"downshift": "^6.0.15",
"fast-deep-equal": "^3.1.3",
- "framer-motion": "^10.11.6",
+ "framer-motion": "~10.11.6",
"gradient-parser": "^0.1.5",
"highlight-words-core": "^1.2.2",
"is-plain-object": "^5.0.0",
diff --git a/packages/components/src/button/README.md b/packages/components/src/button/README.md
index 66bbae67ebcd57..5430b869485ea0 100644
--- a/packages/components/src/button/README.md
+++ b/packages/components/src/button/README.md
@@ -198,6 +198,8 @@ Renders a pressed button style.
Decreases the size of the button.
+Deprecated in favor of the `size` prop. If both props are defined, the `size` prop will take precedence.
+
- Required: No
#### `label`: `string`
@@ -218,6 +220,19 @@ If provided, renders a [Tooltip](/packages/components/src/tooltip/README.md) com
- Required: No
+#### `size`: `'default'` | `'compact'` | `'small'`
+
+The size of the button.
+
+- `'default'`: For normal text-label buttons, unless it is a toggle button.
+- `'compact'`: For toggle buttons, icon buttons, and buttons when used in context of either.
+- `'small'`: For icon buttons associated with more advanced or auxiliary features.
+
+If the deprecated `isSmall` prop is also defined, this prop will take precedence.
+
+- Required: No
+- Default: `'default'`
+
#### `target`: `string`
If provided with `href`, sets the `target` attribute to the `a`.
diff --git a/packages/components/src/button/index.tsx b/packages/components/src/button/index.tsx
index 24932ab06a9b69..cc91cf46425867 100644
--- a/packages/components/src/button/index.tsx
+++ b/packages/components/src/button/index.tsx
@@ -33,11 +33,18 @@ function useDeprecatedProps( {
isSecondary,
isTertiary,
isLink,
+ isSmall,
+ size,
variant,
...otherProps
}: ButtonProps & DeprecatedButtonProps ): ButtonProps {
+ let computedSize = size;
let computedVariant = variant;
+ if ( isSmall ) {
+ computedSize ??= 'small';
+ }
+
if ( isPrimary ) {
computedVariant ??= 'primary';
}
@@ -66,6 +73,7 @@ function useDeprecatedProps( {
return {
...otherProps,
+ size: computedSize,
variant: computedVariant,
};
}
@@ -76,8 +84,6 @@ export function UnforwardedButton(
) {
const {
__next40pxDefaultSize,
- __next32pxSmallSize,
- isSmall,
isPressed,
isBusy,
isDestructive,
@@ -91,6 +97,7 @@ export function UnforwardedButton(
shortcut,
label,
children,
+ size = 'default',
text,
variant,
__experimentalIsFocusable: isFocusable,
@@ -118,10 +125,10 @@ export function UnforwardedButton(
const classes = classnames( 'components-button', className, {
'is-next-40px-default-size': __next40pxDefaultSize,
- 'is-next-32px-small-size': __next32pxSmallSize,
'is-secondary': variant === 'secondary',
'is-primary': variant === 'primary',
- 'is-small': isSmall,
+ 'is-small': size === 'small',
+ 'is-compact': size === 'compact',
'is-tertiary': variant === 'tertiary',
'is-pressed': isPressed,
'is-busy': isBusy,
diff --git a/packages/components/src/button/style.scss b/packages/components/src/button/style.scss
index c93d7e2070c43b..a450ef60b46afd 100644
--- a/packages/components/src/button/style.scss
+++ b/packages/components/src/button/style.scss
@@ -257,25 +257,26 @@
/* stylelint-enable */
}
+ &.is-compact {
+ height: $button-size-compact;
+
+ &.has-icon:not(.has-text) {
+ padding: 0;
+ width: $button-size-compact;
+ min-width: $button-size-compact;
+ }
+ }
+
&.is-small {
- height: $button-size-small-next-default-32px;
+ height: $button-size-small;
line-height: 22px;
padding: 0 8px;
font-size: 11px;
&.has-icon:not(.has-text) {
padding: 0;
- width: $button-size-small-next-default-32px;
- min-width: $button-size-small-next-default-32px;
- }
-
- &:not(.is-next-32px-small-size) {
- height: $button-size-small;
-
- &.has-icon:not(.has-text) {
- width: $button-size-small;
- min-width: $button-size-small;
- }
+ width: $button-size-small;
+ min-width: $button-size-small;
}
}
diff --git a/packages/components/src/button/test/index.tsx b/packages/components/src/button/test/index.tsx
index 0219896781534e..881a71484c18f2 100644
--- a/packages/components/src/button/test/index.tsx
+++ b/packages/components/src/button/test/index.tsx
@@ -402,6 +402,19 @@ describe( 'Button', () => {
);
expect( console ).toHaveWarned();
} );
+
+ it( 'should not break when the legacy isSmall prop is passed', () => {
+ render( );
+ expect( screen.getByRole( 'button' ) ).toHaveClass( 'is-small' );
+ } );
+
+ it( 'should prioritize the `size` prop over `isSmall`', () => {
+ render( );
+ expect( screen.getByRole( 'button' ) ).not.toHaveClass(
+ 'is-small'
+ );
+ expect( screen.getByRole( 'button' ) ).toHaveClass( 'is-compact' );
+ } );
} );
describe( 'static typing', () => {
diff --git a/packages/components/src/button/types.ts b/packages/components/src/button/types.ts
index 85188476e5f370..c55b74c0461573 100644
--- a/packages/components/src/button/types.ts
+++ b/packages/components/src/button/types.ts
@@ -25,15 +25,6 @@ type BaseButtonProps = {
* @default false
*/
__next40pxDefaultSize?: boolean;
- /**
- * Start opting into the larger `isSmall` button size that will become the
- * default small size in a future version.
- *
- * Only takes effect when the `isSmall` prop is `true`.
- *
- * @default false
- */
- __next32pxSmallSize?: boolean;
/**
* The button's children.
*/
@@ -74,8 +65,13 @@ type BaseButtonProps = {
* Renders a pressed button style.
*/
isPressed?: boolean;
+ // TODO: Deprecate officially (add console warning and move to DeprecatedButtonProps).
/**
* Decreases the size of the button.
+ *
+ * Deprecated in favor of the `size` prop. If both props are defined, the `size` prop will take precedence.
+ *
+ * @deprecated Use the `'small'` value on the `size` prop instead.
*/
isSmall?: boolean;
/**
@@ -92,6 +88,18 @@ type BaseButtonProps = {
* If provided, renders a Tooltip component for the button.
*/
showTooltip?: boolean;
+ /**
+ * The size of the button.
+ *
+ * - `'default'`: For normal text-label buttons, unless it is a toggle button.
+ * - `'compact'`: For toggle buttons, icon buttons, and buttons when used in context of either.
+ * - `'small'`: For icon buttons associated with more advanced or auxiliary features.
+ *
+ * If the deprecated `isSmall` prop is also defined, this prop will take precedence.
+ *
+ * @default 'default'
+ */
+ size?: 'default' | 'compact' | 'small';
/**
* If provided, displays the given text inside the button. If the button contains children elements, the text is displayed before them.
*/
diff --git a/packages/components/src/confirm-dialog/component.tsx b/packages/components/src/confirm-dialog/component.tsx
index 92fb3fa08fbb17..b5c6cdf45f99af 100644
--- a/packages/components/src/confirm-dialog/component.tsx
+++ b/packages/components/src/confirm-dialog/component.tsx
@@ -7,7 +7,7 @@ import type { ForwardedRef, KeyboardEvent } from 'react';
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n';
-import { useCallback, useEffect, useState } from '@wordpress/element';
+import { useCallback, useEffect, useRef, useState } from '@wordpress/element';
/**
* Internal dependencies
@@ -42,6 +42,8 @@ function ConfirmDialog(
const cx = useCx();
const wrapperClassName = cx( styles.wrapper );
+ const cancelButtonRef = useRef();
+ const confirmButtonRef = useRef();
const [ isOpen, setIsOpen ] = useState< boolean >();
const [ shouldSelfClose, setShouldSelfClose ] = useState< boolean >();
@@ -69,7 +71,13 @@ function ConfirmDialog(
const handleEnter = useCallback(
( event: KeyboardEvent< HTMLDivElement > ) => {
- if ( event.key === 'Enter' ) {
+ // Avoid triggering the 'confirm' action when a button is focused,
+ // as this can cause a double submission.
+ const isConfirmOrCancelButton =
+ event.target === cancelButtonRef.current ||
+ event.target === confirmButtonRef.current;
+
+ if ( ! isConfirmOrCancelButton && event.key === 'Enter' ) {
handleEvent( onConfirm )( event );
}
},
@@ -96,12 +104,14 @@ function ConfirmDialog(
{ children }
diff --git a/packages/components/src/font-size-picker/styles.ts b/packages/components/src/font-size-picker/styles.ts
index 525c1be0c94b07..8ba0ce661c5eb7 100644
--- a/packages/components/src/font-size-picker/styles.ts
+++ b/packages/components/src/font-size-picker/styles.ts
@@ -11,7 +11,6 @@ import Button from '../button';
import { HStack } from '../h-stack';
import { space } from '../ui/utils/space';
import { COLORS } from '../utils';
-import type { FontSizePickerProps } from './types';
export const Container = styled.fieldset`
border: 0;
@@ -44,12 +43,3 @@ export const Controls = styled.div< {
${ ( props ) =>
! props.__nextHasNoMarginBottom && `margin-bottom: ${ space( 6 ) };` }
`;
-
-export const ResetButton = styled( Button )< {
- size: FontSizePickerProps[ 'size' ];
-} >`
- &&& {
- height: ${ ( props ) =>
- props.size === '__unstable-large' ? '40px' : '30px' };
- }
-`;
diff --git a/packages/components/src/item-group/styles.ts b/packages/components/src/item-group/styles.ts
index 07ef6ba28db6e5..670fdf987dd932 100644
--- a/packages/components/src/item-group/styles.ts
+++ b/packages/components/src/item-group/styles.ts
@@ -24,7 +24,7 @@ export const unstyledButton = css`
color: ${ COLORS.ui.theme };
}
- &:focus {
+ &:focus-visible {
box-shadow: 0 0 0 var( --wp-admin-border-width-focus )
var(
--wp-components-color-accent,
diff --git a/packages/components/src/number-control/index.tsx b/packages/components/src/number-control/index.tsx
index 0df307e4ee45c2..b2ab417d18af21 100644
--- a/packages/components/src/number-control/index.tsx
+++ b/packages/components/src/number-control/index.tsx
@@ -16,7 +16,7 @@ import deprecated from '@wordpress/deprecated';
/**
* Internal dependencies
*/
-import { Input, SpinButton } from './styles/number-control-styles';
+import { Input, SpinButton, styles } from './styles/number-control-styles';
import * as inputControlActionTypes from '../input-control/reducer/actions';
import { add, subtract, roundClamp } from '../utils/math';
import { ensureNumber, isValueEmpty } from '../utils/values';
@@ -24,6 +24,7 @@ import type { WordPressComponentProps } from '../ui/context/wordpress-component'
import type { NumberControlProps } from './types';
import { HStack } from '../h-stack';
import { Spacer } from '../spacer';
+import { useCx } from '../utils';
const noop = () => {};
@@ -78,6 +79,8 @@ function UnforwardedNumberControl(
const autoComplete = typeProp === 'number' ? 'off' : undefined;
const classes = classNames( 'components-number-control', className );
+ const cx = useCx();
+ const spinButtonClasses = cx( size === 'small' && styles.smallSpinButtons );
const spinValue = (
value: string | number | undefined,
@@ -236,6 +239,7 @@ function UnforwardedNumberControl(
diff --git a/packages/components/src/number-control/styles/number-control-styles.ts b/packages/components/src/number-control/styles/number-control-styles.ts
index dfc6171cf411b4..c18c02c69b790c 100644
--- a/packages/components/src/number-control/styles/number-control-styles.ts
+++ b/packages/components/src/number-control/styles/number-control-styles.ts
@@ -11,7 +11,6 @@ import InputControl from '../../input-control';
import { COLORS } from '../../utils';
import Button from '../../button';
import { space } from '../../ui/utils/space';
-import type { NumberControlProps } from '../types';
const htmlArrowStyles = ( { hideHTMLArrows }: { hideHTMLArrows: boolean } ) => {
if ( ! hideHTMLArrows ) {
@@ -35,23 +34,16 @@ export const Input = styled( InputControl )`
${ htmlArrowStyles };
`;
-const spinButtonSizeStyles = ( {
- size,
-}: Pick< NumberControlProps, 'size' > ) => {
- if ( size !== 'small' ) {
- return ``;
- }
-
- return css`
- width: ${ space( 5 ) };
- min-width: ${ space( 5 ) };
- height: ${ space( 5 ) };
- `;
-};
-
export const SpinButton = styled( Button )`
&&&&& {
color: ${ COLORS.ui.theme };
- ${ spinButtonSizeStyles }
}
`;
+
+const smallSpinButtons = css`
+ width: ${ space( 5 ) };
+ min-width: ${ space( 5 ) };
+ height: ${ space( 5 ) };
+`;
+
+export const styles = { smallSpinButtons };
diff --git a/packages/components/src/select-control/index.tsx b/packages/components/src/select-control/index.tsx
index 57af9bee92b044..8edd322ece883d 100644
--- a/packages/components/src/select-control/index.tsx
+++ b/packages/components/src/select-control/index.tsx
@@ -135,6 +135,7 @@ function UnforwardedSelectControl(
key={ key }
value={ option.value }
disabled={ option.disabled }
+ hidden={ option.hidden }
>
{ option.label }
diff --git a/packages/components/src/select-control/types.ts b/packages/components/src/select-control/types.ts
index d052f81203a7ef..a5699bc7f5e04e 100644
--- a/packages/components/src/select-control/types.ts
+++ b/packages/components/src/select-control/types.ts
@@ -40,6 +40,12 @@ type SelectControlBaseProps = Pick<
* @default false
*/
disabled?: boolean;
+ /**
+ * Whether or not the option should be hidden.
+ *
+ * @default false
+ */
+ hidden?: boolean;
}[];
/**
* As an alternative to the `options` prop, `optgroup`s and `options` can be
diff --git a/packages/components/src/z-stack/component.tsx b/packages/components/src/z-stack/component.tsx
index 1cbcac56e4fb70..e087f8536e3401 100644
--- a/packages/components/src/z-stack/component.tsx
+++ b/packages/components/src/z-stack/component.tsx
@@ -35,13 +35,14 @@ function UnconnectedZStack(
const clonedChildren = validChildren.map( ( child, index ) => {
const zIndex = isReversed ? childrenLastIndex - index : index;
- const offsetAmount = offset * index;
+ // Only when the component is layered, the offset needs to be multiplied by
+ // the item's index, so that items can correctly stack at the right distance
+ const offsetAmount = isLayered ? offset * index : offset;
const key = isValidElement( child ) ? child.key : index;
return (
{ clonedChildren }
diff --git a/packages/components/src/z-stack/stories/index.tsx b/packages/components/src/z-stack/stories/index.tsx
index b04e19962aed15..9b0b0803780339 100644
--- a/packages/components/src/z-stack/stories/index.tsx
+++ b/packages/components/src/z-stack/stories/index.tsx
@@ -8,7 +8,6 @@ import type { ComponentMeta, ComponentStory } from '@storybook/react';
* Internal dependencies
*/
import { Elevation } from '../../elevation';
-import { HStack } from '../../h-stack';
import { View } from '../../view';
import { ZStack } from '..';
@@ -55,18 +54,12 @@ const Avatar = ( {
const Template: ComponentStory< typeof ZStack > = ( args ) => {
return (
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
);
};
diff --git a/packages/components/src/z-stack/styles.ts b/packages/components/src/z-stack/styles.ts
index d0bf20d38b1f4c..186f268e643663 100644
--- a/packages/components/src/z-stack/styles.ts
+++ b/packages/components/src/z-stack/styles.ts
@@ -4,36 +4,35 @@
import { css } from '@emotion/react';
import styled from '@emotion/styled';
-/**
- * Internal dependencies
- */
-import { rtl } from '../utils';
-
-export const ZStackView = styled.div`
- display: flex;
- position: relative;
-`;
-
export const ZStackChildView = styled.div< {
- isLayered: boolean;
offsetAmount: number;
zIndex: number;
} >`
- ${ ( { isLayered, offsetAmount } ) =>
- isLayered
- ? css( rtl( { marginLeft: offsetAmount } )() )
- : css( rtl( { right: offsetAmount * -1 } )() ) }
+ &:not( :first-of-type ) {
+ ${ ( { offsetAmount } ) =>
+ css( {
+ marginInlineStart: offsetAmount,
+ } ) };
+ }
- ${ ( { isLayered } ) =>
- isLayered ? positionAbsolute : positionRelative }
-
- ${ ( { zIndex } ) => css( { zIndex } ) }
-`;
-
-const positionAbsolute = css`
- position: absolute;
+ ${ ( { zIndex } ) => css( { zIndex } ) };
`;
-const positionRelative = css`
+export const ZStackView = styled.div< {
+ isLayered: boolean;
+} >`
+ display: inline-grid;
+ grid-auto-flow: column;
position: relative;
+
+ & > ${ ZStackChildView } {
+ position: relative;
+ justify-self: start;
+
+ ${ ( { isLayered } ) =>
+ isLayered
+ ? // When `isLayered` is true, all items overlap in the same grid cell
+ css( { gridRowStart: 1, gridColumnStart: 1 } )
+ : undefined };
+ }
`;
diff --git a/packages/core-commands/src/add-post-type-commands.js b/packages/core-commands/src/admin-navigation-commands.js
similarity index 60%
rename from packages/core-commands/src/add-post-type-commands.js
rename to packages/core-commands/src/admin-navigation-commands.js
index 47e6014f569444..577e7258df0b63 100644
--- a/packages/core-commands/src/add-post-type-commands.js
+++ b/packages/core-commands/src/admin-navigation-commands.js
@@ -3,9 +3,9 @@
*/
import { useCommand } from '@wordpress/commands';
import { __ } from '@wordpress/i18n';
-import { plus } from '@wordpress/icons';
+import { external, plus } from '@wordpress/icons';
-export function useAddPostTypeCommands() {
+export function useAdminNavigationCommands() {
useCommand( {
name: 'core/add-new-post',
label: __( 'Add new post' ),
@@ -22,4 +22,12 @@ export function useAddPostTypeCommands() {
document.location.href = 'post-new.php?post_type=page';
},
} );
+ useCommand( {
+ name: 'core/manage-reusable-blocks',
+ label: __( 'Manage all custom patterns' ),
+ callback: () => {
+ document.location.href = 'edit.php?post_type=wp_block';
+ },
+ icon: external,
+ } );
}
diff --git a/packages/core-commands/src/private-apis.js b/packages/core-commands/src/private-apis.js
index b0e0cd87040f6a..de5b0de197600f 100644
--- a/packages/core-commands/src/private-apis.js
+++ b/packages/core-commands/src/private-apis.js
@@ -1,12 +1,12 @@
/**
* Internal dependencies
*/
-import { useAddPostTypeCommands } from './add-post-type-commands';
+import { useAdminNavigationCommands } from './admin-navigation-commands';
import { useSiteEditorNavigationCommands } from './site-editor-navigation-commands';
import { lock } from './lock-unlock';
function useCommands() {
- useAddPostTypeCommands();
+ useAdminNavigationCommands();
useSiteEditorNavigationCommands();
}
diff --git a/packages/core-data/src/resolvers.js b/packages/core-data/src/resolvers.js
index 6437b759976901..32baa691ddd822 100644
--- a/packages/core-data/src/resolvers.js
+++ b/packages/core-data/src/resolvers.js
@@ -585,10 +585,14 @@ export const getNavigationFallbackId =
dispatch.receiveNavigationFallbackId( fallback?.id );
if ( record ) {
+ const invalidateNavigationQueries = true;
+
dispatch.receiveEntityRecords(
'postType',
'wp_navigation',
- record
+ record,
+ undefined,
+ invalidateNavigationQueries
);
// Resolve to avoid further network requests.
diff --git a/packages/e2e-tests/specs/editor/various/links.test.js b/packages/e2e-tests/specs/editor/various/links.test.js
index 3be80f786fbc28..719d00afe076bb 100644
--- a/packages/e2e-tests/specs/editor/various/links.test.js
+++ b/packages/e2e-tests/specs/editor/various/links.test.js
@@ -105,7 +105,8 @@ describe( 'Links', () => {
await waitForURLFieldAutoFocus();
const urlInputValue = await page.evaluate(
- () => document.querySelector( '[aria-label="URL"]' ).value
+ () =>
+ document.querySelector( '.block-editor-url-input__input' ).value
);
expect( urlInputValue ).toBe( '' );
@@ -496,7 +497,7 @@ describe( 'Links', () => {
await pressKeyWithModifier( 'primary', 'K' );
const [ settingsToggle ] = await page.$x(
- '//button[contains(@aria-label, "Link Settings")]'
+ '//button[contains(text(), "Advanced")]'
);
await settingsToggle.click();
@@ -528,7 +529,7 @@ describe( 'Links', () => {
await waitForURLFieldAutoFocus();
- await page.keyboard.press( 'Tab' );
+ await pressKeyWithModifier( 'shift', 'Tab' );
// Tabbing should land us in the text input.
const { isTextInput, textValue } = await page.evaluate( () => {
@@ -585,8 +586,10 @@ describe( 'Links', () => {
await editButton.click();
- // Tabbing forward should land us in the "Text" input.
- await page.keyboard.press( 'Tab' );
+ await waitForURLFieldAutoFocus();
+
+ // Tabbing backward should land us in the "Text" input.
+ await pressKeyWithModifier( 'shift', 'Tab' );
const textInputValue = await page.evaluate(
() => document.activeElement.value
@@ -614,8 +617,9 @@ describe( 'Links', () => {
);
await editButton.click();
- // tab forward to the text input.
- await page.keyboard.press( 'Tab' );
+ await waitForURLFieldAutoFocus();
+
+ await pressKeyWithModifier( 'shift', 'Tab' );
const textInputValue = await page.evaluate(
() => document.activeElement.value
@@ -661,7 +665,7 @@ describe( 'Links', () => {
await waitForURLFieldAutoFocus();
const [ settingsToggle ] = await page.$x(
- '//button[contains(@aria-label, "Link Settings")]'
+ '//button[contains(text(), "Advanced")]'
);
await settingsToggle.click();
@@ -679,7 +683,7 @@ describe( 'Links', () => {
await pressKeyWithModifier( 'shift', 'ArrowRight' );
// Move back to the text input.
- await pressKeyTimes( 'Tab', 2 );
+ await pressKeyTimes( 'Tab', 1 );
// Tabbing back should land us in the text input.
const textInputValue = await page.evaluate(
@@ -879,8 +883,11 @@ describe( 'Links', () => {
await waitForURLFieldAutoFocus();
- // Move to Link Text field.
- await page.keyboard.press( 'Tab' );
+ // Move to "Text" field.
+ await pressKeyWithModifier( 'shift', 'Tab' );
+
+ // Delete existing value from "Text" field
+ await page.keyboard.press( 'Delete' );
// Change text to "z"
await page.keyboard.type( 'z' );
diff --git a/packages/edit-post/src/components/header/index.js b/packages/edit-post/src/components/header/index.js
index dfdeb2d130aa35..3f42d4736f57bb 100644
--- a/packages/edit-post/src/components/header/index.js
+++ b/packages/edit-post/src/components/header/index.js
@@ -20,6 +20,16 @@ import MainDashboardButton from './main-dashboard-button';
import { store as editPostStore } from '../../store';
import DocumentTitle from './document-title';
+const slideY = {
+ hidden: { y: '-50px' },
+ hover: { y: 0, transition: { type: 'tween', delay: 0.2 } },
+};
+
+const slideX = {
+ hidden: { x: '-100%' },
+ hover: { x: 0, transition: { type: 'tween', delay: 0.2 } },
+};
+
function Header( { setEntitiesSavedStatesCallback } ) {
const isLargeViewport = useViewportMatch( 'large' );
const {
@@ -39,16 +49,6 @@ function Header( { setEntitiesSavedStatesCallback } ) {
[]
);
- const slideY = {
- hidden: { y: '-50px' },
- hover: { y: 0, transition: { type: 'tween', delay: 0.2 } },
- };
-
- const slideX = {
- hidden: { x: '-100%' },
- hover: { x: 0, transition: { type: 'tween', delay: 0.2 } },
- };
-
return (
diff --git a/packages/edit-post/src/components/keyboard-shortcuts/index.js b/packages/edit-post/src/components/keyboard-shortcuts/index.js
index 432bce0a3bff5c..9a9574fd38bb7e 100644
--- a/packages/edit-post/src/components/keyboard-shortcuts/index.js
+++ b/packages/edit-post/src/components/keyboard-shortcuts/index.js
@@ -223,8 +223,6 @@ function KeyboardShortcuts() {
} );
useShortcut( 'core/edit-post/toggle-distraction-free', () => {
- closeGeneralSidebar();
- setIsListViewOpened( false );
toggleDistractionFree();
toggleFeature( 'distractionFree' );
createInfoNotice(
diff --git a/packages/edit-post/src/components/preferences-modal/test/__snapshots__/index.js.snap b/packages/edit-post/src/components/preferences-modal/test/__snapshots__/index.js.snap
index a962cfbe81919d..182531ee01c02f 100644
--- a/packages/edit-post/src/components/preferences-modal/test/__snapshots__/index.js.snap
+++ b/packages/edit-post/src/components/preferences-modal/test/__snapshots__/index.js.snap
@@ -616,7 +616,7 @@ exports[`EditPostPreferencesModal should match snapshot when the modal is active
color: var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
-.emotion-13:focus {
+.emotion-13:focus-visible {
box-shadow: 0 0 0 var( --wp-admin-border-width-focus ) var(
--wp-components-color-accent,
var( --wp-admin-theme-color, var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9)) )
diff --git a/packages/edit-post/src/editor.js b/packages/edit-post/src/editor.js
index 42a393c5fe3242..6ec907bfe4b0b0 100644
--- a/packages/edit-post/src/editor.js
+++ b/packages/edit-post/src/editor.js
@@ -25,6 +25,7 @@ import Layout from './components/layout';
import EditorInitialization from './components/editor-initialization';
import { store as editPostStore } from './store';
import { unlock } from './lock-unlock';
+import useCommonCommands from './hooks/commands/use-common-commands';
const { ExperimentalEditorProvider } = unlock( editorPrivateApis );
const { getLayoutStyles } = unlock( blockEditorPrivateApis );
@@ -32,6 +33,7 @@ const { useCommands } = unlock( coreCommandsPrivateApis );
function Editor( { postId, postType, settings, initialEdits, ...props } ) {
useCommands();
+ useCommonCommands();
const {
hasFixedToolbar,
focusMode,
diff --git a/packages/edit-post/src/hooks/commands/use-common-commands.js b/packages/edit-post/src/hooks/commands/use-common-commands.js
new file mode 100644
index 00000000000000..796e0665fc2fa3
--- /dev/null
+++ b/packages/edit-post/src/hooks/commands/use-common-commands.js
@@ -0,0 +1,103 @@
+/**
+ * WordPress dependencies
+ */
+import { useSelect, useDispatch } from '@wordpress/data';
+import { __, isRTL } from '@wordpress/i18n';
+import {
+ code,
+ cog,
+ drawerLeft,
+ drawerRight,
+ blockDefault,
+} from '@wordpress/icons';
+import { useCommand } from '@wordpress/commands';
+import { store as preferencesStore } from '@wordpress/preferences';
+import { store as interfaceStore } from '@wordpress/interface';
+
+/**
+ * Internal dependencies
+ */
+import { store as editPostStore } from '../../store';
+
+export default function useCommonCommands() {
+ const { openGeneralSidebar, closeGeneralSidebar, switchEditorMode } =
+ useDispatch( editPostStore );
+ const { editorMode, activeSidebar } = useSelect(
+ ( select ) => ( {
+ activeSidebar: select( interfaceStore ).getActiveComplementaryArea(
+ editPostStore.name
+ ),
+ editorMode: select( editPostStore ).getEditorMode(),
+ } ),
+ []
+ );
+ const { toggle } = useDispatch( preferencesStore );
+
+ useCommand( {
+ name: 'core/open-settings-sidebar',
+ label: __( 'Toggle settings sidebar' ),
+ icon: isRTL() ? drawerLeft : drawerRight,
+ callback: ( { close } ) => {
+ close();
+ if ( activeSidebar === 'edit-post/document' ) {
+ closeGeneralSidebar();
+ } else {
+ openGeneralSidebar( 'edit-post/document' );
+ }
+ },
+ } );
+
+ useCommand( {
+ name: 'core/open-block-inspector',
+ label: __( 'Toggle block inspector' ),
+ icon: blockDefault,
+ callback: ( { close } ) => {
+ close();
+ if ( activeSidebar === 'edit-post/block' ) {
+ closeGeneralSidebar();
+ } else {
+ openGeneralSidebar( 'edit-post/block' );
+ }
+ },
+ } );
+
+ useCommand( {
+ name: 'core/toggle-distraction-free',
+ label: __( 'Toggle distraction free' ),
+ icon: cog,
+ callback: ( { close } ) => {
+ toggle( 'core/edit-post', 'distractionFree' );
+ close();
+ },
+ } );
+
+ useCommand( {
+ name: 'core/toggle-spotlight-mode',
+ label: __( 'Toggle spotlight mode' ),
+ icon: cog,
+ callback: ( { close } ) => {
+ toggle( 'core/edit-post', 'focusMode' );
+ close();
+ },
+ } );
+
+ useCommand( {
+ name: 'core/toggle-top-toolbar',
+ label: __( 'Toggle top toolbar' ),
+ icon: cog,
+ callback: ( { close } ) => {
+ toggle( 'core/edit-post', 'fixedToolbar' );
+ close();
+ },
+ } );
+
+ useCommand( {
+ name: 'core/toggle-code-editor',
+ label: __( 'Toggle code editor' ),
+ icon: code,
+ callback: ( { close } ) => {
+ switchEditorMode( editorMode === 'visual' ? 'text' : 'visual' );
+ close();
+ },
+ } );
+}
diff --git a/packages/edit-site/src/components/add-new-pattern/index.js b/packages/edit-site/src/components/add-new-pattern/index.js
index 54b6f48488aebc..ab309da1ab12d8 100644
--- a/packages/edit-site/src/components/add-new-pattern/index.js
+++ b/packages/edit-site/src/components/add-new-pattern/index.js
@@ -12,8 +12,8 @@ import { privateApis as routerPrivateApis } from '@wordpress/router';
*/
import CreatePatternModal from '../create-pattern-modal';
import CreateTemplatePartModal from '../create-template-part-modal';
-import { unlock } from '../../lock-unlock';
import SidebarButton from '../sidebar-button';
+import { unlock } from '../../lock-unlock';
const { useHistory } = unlock( routerPrivateApis );
@@ -58,21 +58,19 @@ export default function AddNewPattern() {
{
icon: header,
onClick: () => setShowTemplatePartModal( true ),
- title: 'Create a template part',
+ title: __( 'Create template part' ),
},
{
icon: file,
onClick: () => setShowPatternModal( true ),
- title: 'Create a pattern',
+ title: __( 'Create pattern' ),
},
] }
- icon={
-
- }
- label="Create a pattern."
+ toggleProps={ {
+ as: SidebarButton,
+ } }
+ icon={ plus }
+ label={ __( 'Create pattern' ) }
/>
{ showPatternModal && (
-
+
-
+
+
+
- { title }
-
-
- { description }
-
-
+
+ { title }
+
+ { children }
+
+
);
}
@@ -104,6 +161,26 @@ export default function NewTemplate( {
const { createErrorNotice, createSuccessNotice } =
useDispatch( noticesStore );
const { setTemplate } = unlock( useDispatch( editSiteStore ) );
+
+ const { homeUrl } = useSelect( ( select ) => {
+ const {
+ getUnstableBase, // Site index.
+ } = select( coreStore );
+
+ return {
+ homeUrl: getUnstableBase()?.home,
+ };
+ }, [] );
+
+ const TEMPLATE_SHORT_DESCRIPTIONS = {
+ 'front-page': homeUrl,
+ date: sprintf(
+ // translators: %s: The homepage url.
+ __( 'E.g. %s' ),
+ homeUrl + '/' + new Date().getFullYear()
+ ),
+ };
+
async function createTemplate( template, isWPSuggestion = true ) {
if ( isCreatingTemplate ) {
return;
@@ -220,14 +297,25 @@ export default function NewTemplate( {
justify="center"
className="edit-site-add-new-template__template-list__contents"
>
+
+ { __(
+ 'Select what the new template should apply to:'
+ ) }
+
{ missingTemplates.map( ( template ) => {
- const { title, description, slug, onClick } =
- template;
+ const { title, slug, onClick } = template;
return (
onClick
? onClick( template )
@@ -238,15 +326,23 @@ export default function NewTemplate( {
} ) }
setModalContent(
modalContentMap.customGenericTemplate
)
}
- />
+ >
+
+ { __(
+ 'A custom template can be manually applied to any post or page.'
+ ) }
+
+
) }
{ modalContent === modalContentMap.customTemplate && (
diff --git a/packages/edit-site/src/components/add-new-template/style.scss b/packages/edit-site/src/components/add-new-template/style.scss
index c8c2ef9f54a071..b1c2b669e24cef 100644
--- a/packages/edit-site/src/components/add-new-template/style.scss
+++ b/packages/edit-site/src/components/add-new-template/style.scss
@@ -138,17 +138,39 @@
@include break-large() {
width: calc(100% - #{$grid-unit-80 * 2});
}
+
+ .edit-site-add-new-template__template-button,
+ .edit-site-add-new-template__custom-template-button {
+ svg {
+ fill: var(--wp-admin-theme-color);
+ }
+ }
+
+ .edit-site-add-new-template__custom-template-button {
+ .edit-site-add-new-template__template-name {
+ flex-grow: 1;
+ align-items: flex-start;
+ }
+ }
+
+ .edit-site-add-new-template__template-icon {
+ padding: $grid-unit-10;
+ background: rgba(var(--wp-admin-theme-color--rgb), 0.04);
+ border-radius: 100%;
+ max-height: $grid-unit-50;
+ max-width: $grid-unit-50;
+ }
}
.edit-site-custom-template-modal__contents,
.edit-site-add-new-template__template-list__contents {
> .components-button {
- padding: $grid-unit-30;
+ padding: $grid-unit-40;
border-radius: $radius-block-ui;
display: flex;
flex-direction: column;
border: $border-width solid $gray-300;
- min-height: $grid-unit-80 * 3;
+ justify-content: center;
// Show the boundary of the button, in High Contrast Mode.
outline: 1px solid transparent;
@@ -183,6 +205,12 @@
}
}
}
+
+ .edit-site-add-new-template__custom-template-button,
+ .edit-site-add-new-template__template-list__prompt {
+ grid-column-start: 1;
+ grid-column-end: 4;
+ }
}
.edit-site-add-new-template__template-list__contents {
diff --git a/packages/edit-site/src/components/create-pattern-modal/index.js b/packages/edit-site/src/components/create-pattern-modal/index.js
index d57e424ef73186..2cef6b21ebbbad 100644
--- a/packages/edit-site/src/components/create-pattern-modal/index.js
+++ b/packages/edit-site/src/components/create-pattern-modal/index.js
@@ -73,7 +73,7 @@ export default function CreatePatternModal( {
return (
diff --git a/packages/edit-site/src/components/create-template-part-modal/index.js b/packages/edit-site/src/components/create-template-part-modal/index.js
index 7deeeae23ab56e..a006ba6f2cb439 100644
--- a/packages/edit-site/src/components/create-template-part-modal/index.js
+++ b/packages/edit-site/src/components/create-template-part-modal/index.js
@@ -101,7 +101,7 @@ export default function CreateTemplatePartModal( {
return (
diff --git a/packages/edit-site/src/components/editor/index.js b/packages/edit-site/src/components/editor/index.js
index 24805014e3d695..238cad73870553 100644
--- a/packages/edit-site/src/components/editor/index.js
+++ b/packages/edit-site/src/components/editor/index.js
@@ -180,6 +180,7 @@ export default function Editor( { isLoading } ) {
{ isEditMode && }
-
- { ( { onClose } ) => (
-
- { hasRevisions && (
+ { canReset || hasRevisions ? (
+
+ { ( { onClose } ) => (
+
+ { hasRevisions && (
+
+ ) }
- ) }
-
-
- ) }
-
+
+ ) }
+
+ ) : (
+
+ ) }
);
}
diff --git a/packages/edit-site/src/components/header-edit-mode/index.js b/packages/edit-site/src/components/header-edit-mode/index.js
index 2b019223f5b189..415dfb1d67cb01 100644
--- a/packages/edit-site/src/components/header-edit-mode/index.js
+++ b/packages/edit-site/src/components/header-edit-mode/index.js
@@ -7,7 +7,7 @@ import classnames from 'classnames';
* WordPress dependencies
*/
import { useCallback, useRef } from '@wordpress/element';
-import { useViewportMatch } from '@wordpress/compose';
+import { useViewportMatch, useReducedMotion } from '@wordpress/compose';
import { store as coreStore } from '@wordpress/core-data';
import {
ToolSelector,
@@ -21,6 +21,7 @@ import { PinnedItems } from '@wordpress/interface';
import { _x, __ } from '@wordpress/i18n';
import { listView, plus, external, chevronUpDown } from '@wordpress/icons';
import {
+ __unstableMotion as motion,
Button,
ToolbarItem,
MenuGroup,
@@ -60,6 +61,7 @@ export default function HeaderEditMode() {
isListViewOpen,
listViewShortcut,
isVisualMode,
+ isDistractionFree,
blockEditorMode,
homeUrl,
showIconLabels,
@@ -99,6 +101,10 @@ export default function HeaderEditMode() {
editorCanvasView: unlock(
select( editSiteStore )
).getEditorCanvasContainerView(),
+ isDistractionFree: select( preferencesStore ).get(
+ 'core/edit-site',
+ 'distractionFree'
+ ),
};
}, [] );
@@ -108,6 +114,7 @@ export default function HeaderEditMode() {
setIsListViewOpened,
} = useDispatch( editSiteStore );
const { __unstableSetEditorMode } = useDispatch( blockEditorStore );
+ const disableMotion = useReducedMotion();
const isLargeViewport = useViewportMatch( 'medium' );
@@ -156,6 +163,19 @@ export default function HeaderEditMode() {
window?.__experimentalEnableZoomedOutView && isVisualMode;
const isZoomedOutView = blockEditorMode === 'zoom-out';
+ const toolbarVariants = {
+ isDistractionFree: { y: '-50px' },
+ isDistractionFreeHovering: { y: 0 },
+ view: { y: 0 },
+ edit: { y: 0 },
+ };
+
+ const toolbarTransition = {
+ type: 'tween',
+ duration: disableMotion ? 0 : 0.2,
+ ease: 'easeOut',
+ };
+
return (
{ hasDefaultEditorCanvasView && (
-
+ { ! isDistractionFree && (
+
+ ) }
{ isLargeViewport && (
<>
-
- { isZoomedOutViewExperimentEnabled && (
+ { ! isDistractionFree && (
{
- setPreviewDeviceType( 'desktop' );
- __unstableSetEditorMode(
- isZoomedOutView
- ? 'edit'
- : 'zoom-out'
- );
- } }
+ label={ __( 'List View' ) }
+ onClick={ toggleListView }
+ shortcut={ listViewShortcut }
+ showTooltip={ ! showIconLabels }
+ variant={
+ showIconLabels
+ ? 'tertiary'
+ : undefined
+ }
/>
) }
+ { isZoomedOutViewExperimentEnabled &&
+ ! isDistractionFree && (
+ {
+ setPreviewDeviceType(
+ 'desktop'
+ );
+ __unstableSetEditorMode(
+ isZoomedOutView
+ ? 'edit'
+ : 'zoom-out'
+ );
+ } }
+ />
+ ) }
>
) }
) }
-
- { ! hasDefaultEditorCanvasView ? (
- getEditorCanvasContainerTitle( editorCanvasView )
- ) : (
-
- ) }
-
+ { ! isDistractionFree && (
+
+ { ! hasDefaultEditorCanvasView ? (
+ getEditorCanvasContainerTitle( editorCanvasView )
+ ) : (
+
+ ) }
+
+ ) }
-
+
{ ! isFocusMode && hasDefaultEditorCanvasView && (
) }
-
+ { ! isDistractionFree && (
+
+ ) }
-
+
);
diff --git a/packages/edit-site/src/components/header-edit-mode/more-menu/index.js b/packages/edit-site/src/components/header-edit-mode/more-menu/index.js
index a7c9ea977db176..7fe63a343960ae 100644
--- a/packages/edit-site/src/components/header-edit-mode/more-menu/index.js
+++ b/packages/edit-site/src/components/header-edit-mode/more-menu/index.js
@@ -3,12 +3,16 @@
*/
import { __, _x } from '@wordpress/i18n';
import { useReducer } from '@wordpress/element';
+import { useSelect, useDispatch, useRegistry } from '@wordpress/data';
import { useShortcut } from '@wordpress/keyboard-shortcuts';
import { displayShortcut } from '@wordpress/keycodes';
import { external } from '@wordpress/icons';
import { MenuGroup, MenuItem, VisuallyHidden } from '@wordpress/components';
import { ActionItem, MoreMenuDropdown } from '@wordpress/interface';
-import { PreferenceToggleMenuItem } from '@wordpress/preferences';
+import {
+ PreferenceToggleMenuItem,
+ store as preferencesStore,
+} from '@wordpress/preferences';
/**
* Internal dependencies
@@ -20,6 +24,7 @@ import SiteExport from './site-export';
import WelcomeGuideMenuItem from './welcome-guide-menu-item';
import CopyContentMenuItem from './copy-content-menu-item';
import ModeSwitcher from '../mode-switcher';
+import { store as siteEditorStore } from '../../../store';
export default function MoreMenu( { showIconLabels } ) {
const [ isModalActive, toggleModal ] = useReducer(
@@ -32,6 +37,29 @@ export default function MoreMenu( { showIconLabels } ) {
false
);
+ const registry = useRegistry();
+ const isDistractionFree = useSelect(
+ ( select ) =>
+ select( preferencesStore ).get(
+ 'core/edit-site',
+ 'distractionFree'
+ ),
+ []
+ );
+
+ const { setIsInserterOpened, setIsListViewOpened, closeGeneralSidebar } =
+ useDispatch( siteEditorStore );
+ const { set: setPreference } = useDispatch( preferencesStore );
+
+ const toggleDistractionFree = () => {
+ registry.batch( () => {
+ setPreference( 'core/edit-site', 'fixedToolbar', false );
+ setIsInserterOpened( false );
+ setIsListViewOpened( false );
+ closeGeneralSidebar();
+ } );
+ };
+
useShortcut( 'core/edit-site/keyboard-shortcuts', toggleModal );
return (
@@ -48,6 +76,7 @@ export default function MoreMenu( { showIconLabels } ) {
-
-
+
+