@integreat-app/react-sticky-headroom 1.1.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -27,16 +27,16 @@ render () {
27
27
 
28
28
  ## Demo
29
29
 
30
- Go to [https://integreat.github.io/react-sticky-headroom/](https://integreat.github.io/react-sticky-headroom/) to view a demo:
30
+ Go to [https://digitalfabrik.github.io/react-sticky-headroom/](https://digitalfabrik.github.io/react-sticky-headroom/) to view a demo:
31
31
 
32
- [![Demo](https://raw.githubusercontent.com/Integreat/react-sticky-headroom/main/demo.gif)](https://integreat.github.io/react-sticky-headroom/)
32
+ [![Demo](https://raw.githubusercontent.com/digitalfabrik/react-sticky-headroom/main/demo.gif)](https://digitalfabrik.github.io/react-sticky-headroom/)
33
33
 
34
34
 
35
35
  ## API
36
36
  You can pass the following props to ReactStickyHeadroom:
37
37
  * `children: React.Node` The header component, that should be hidden and revealed
38
38
  * `scrollHeight: number` The maximum amount of px the header should move up when scrolling
39
- * `pinStart: number` The minimum scrollTop position where the transform should start
39
+ * `pinStart: number` (Default: `0`) The minimum scrollTop position where the transform should start
40
40
  * `height?: number` (Optional) The height of the `children` node. Used for calculating the stickyTop position for a sticky ancestor in `onStickyTopChanged`
41
41
  * `onStickyTopChanged?: (number) => void` Fired, when Headroom changes its state and `height` is provided. Passes the calculated stickyTop position of an ancestor node.
42
42
  * `positionStickyDisabled?: boolean` (Optional, Default: `false`) If true, the header will stay static (e.g. for edge 16 support)
@@ -45,10 +45,6 @@ You can pass the following props to ReactStickyHeadroom:
45
45
  * `className?: string` (Optional) A classname for applying custom styles to the wrapper. Use at your own risk.
46
46
 
47
47
 
48
- Edge 16 has had issues with css property `position: sticky` together with `direction: rtl`.
49
- This has been fixed in Edge 17.
50
- If you need Edge 16 as well as right-to-left support, you should use `positionStickyDisabled: true`, when detecting Edge 16.
51
-
52
48
  ## Support
53
49
  The component generally supports:
54
50
  * Internet Explorer 11
@@ -61,4 +57,6 @@ For hiding and revealing the header, the browser needs to support the css-proper
61
57
  You can read about the browser support for that on [caniuse.com](https://caniuse.com/#feat=css-sticky).
62
58
  'Partial-Support' is enough for ReactStickyHeadroom to work in most cases.
63
59
 
60
+ ReactStickyHeadroom offers types for both TypeScript and FlowJS which should work out of the box.
61
+
64
62
  If there are any problems, please don't hesitate to open an issue on GitHub.
package/index.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ import React, { ReactNode } from 'react'
2
+
3
+ declare type PropsType = {
4
+ children: ReactNode,
5
+ scrollHeight: number,
6
+ pinStart?: number,
7
+ height?: number,
8
+ onStickyTopChanged?: (number) => void,
9
+ positionStickyDisabled?: boolean,
10
+ parent?: HTMLElement,
11
+ zIndex?: number,
12
+ className?: string
13
+ }
14
+
15
+ declare class Headroom extends React.Component<PropsType> {
16
+ }
17
+
18
+ export default Headroom
package/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
4
 
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
@@ -11,27 +11,27 @@ var React = _interopRequireWildcard(require("react"));
11
11
 
12
12
  var _styledComponents = _interopRequireWildcard(require("styled-components"));
13
13
 
14
- function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
14
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
15
15
 
16
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
16
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17
17
 
18
18
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
19
19
 
20
20
  function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
21
21
 
22
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
22
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
23
23
 
24
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
24
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
25
25
 
26
26
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
27
27
 
28
28
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
29
29
 
30
- function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
30
+ function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
31
31
 
32
32
  function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
33
33
 
34
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
34
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
35
35
 
36
36
  function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
37
37
 
@@ -134,11 +134,11 @@ var Headroom = /*#__PURE__*/function (_React$PureComponent) {
134
134
 
135
135
  _createClass(Headroom, [{
136
136
  key: "getScrollTop",
137
-
137
+ value:
138
138
  /**
139
139
  * @returns {number} the current scrollTop position of the window
140
140
  */
141
- value: function getScrollTop() {
141
+ function getScrollTop() {
142
142
  var parent = this.props.parent;
143
143
 
144
144
  if (parent && parent.scrollTop !== undefined && parent !== document.documentElement) {
package/index.js.flow CHANGED
@@ -20,7 +20,7 @@ type ModeType = 'pinned' | 'unpinned' | 'static'
20
20
  type DirectionType = 'up' | 'down'
21
21
  type TransitionType = 'none' | 'normal' | 'pinned-to-static'
22
22
 
23
- type PropsType = {|
23
+ type PropsType = $ReadOnly<{|
24
24
  /** The child node to be displayed as a header */
25
25
  children: Node,
26
26
  /** The maximum amount of px the header should move up when scrolling */
@@ -39,13 +39,13 @@ type PropsType = {|
39
39
  zIndex?: number,
40
40
  /** A classname for applying custom styles to the wrapper. Use at your own risk. */
41
41
  className?: string
42
- |}
42
+ |}>
43
43
 
44
- type StateType = {|
44
+ type StateType = $ReadOnly<{|
45
45
  mode: ModeType,
46
46
  transition: TransitionType,
47
47
  animateUpFrom: ?number
48
- |}
48
+ |}>
49
49
 
50
50
  const HeaderWrapper: StyledComponent<{|
51
51
  positionStickyDisabled: boolean,
@@ -61,10 +61,13 @@ const HeaderWrapper: StyledComponent<{|
61
61
  animation-duration: 0.2s;
62
62
  animation-timing-function: ease-out;
63
63
  ${props => props.transition === NORMAL_TRANSITION && !props.static
64
- ? 'transition: transform 0.2s ease-out;' : ''}
65
- ${props => props.transition === PINNED_TO_STATIC ? css`
64
+ ? 'transition: transform 0.2s ease-out;'
65
+ : ''}
66
+ ${props => props.transition === PINNED_TO_STATIC
67
+ ? css`
66
68
  animation-name: ${keyframesMoveUpFrom(props.animateUpFrom)};
67
- ` : ''}
69
+ `
70
+ : ''}
68
71
  ${props => props.static ? 'transition: none;' : ''}
69
72
  `
70
73
 
@@ -85,7 +88,11 @@ class Headroom extends React.PureComponent<PropsType, StateType> {
85
88
  parent: window.document.documentElement
86
89
  }
87
90
 
88
- state: StateType = { mode: STATIC, transition: NO_TRANSITION, animateUpFrom: null }
91
+ state: StateType = {
92
+ mode: STATIC,
93
+ transition: NO_TRANSITION,
94
+ animateUpFrom: null
95
+ }
89
96
 
90
97
  /** the very last scrollTop which we know about (to determine direction changes) */
91
98
  lastKnownScrollTop: number = 0
@@ -158,7 +165,7 @@ class Headroom extends React.PureComponent<PropsType, StateType> {
158
165
  */
159
166
  shouldSetStatic (scrollTop: number, direction: DirectionType): boolean {
160
167
  if (this.state.mode === STATIC || (this.state.mode === PINNED && direction ===
161
- DOWNWARDS)) {
168
+ DOWNWARDS)) {
162
169
  return this.props.pinStart + this.props.scrollHeight >= scrollTop
163
170
  } else {
164
171
  return this.props.pinStart >= scrollTop
@@ -182,8 +189,7 @@ class Headroom extends React.PureComponent<PropsType, StateType> {
182
189
  /**
183
190
  * @returns {TransitionType} determines the kind of transition
184
191
  */
185
- determineTransition (mode: ModeType,
186
- direction: DirectionType): TransitionType {
192
+ determineTransition (mode: ModeType, direction: DirectionType): TransitionType {
187
193
  // Handle special case: If we're pinned and going to static, we need a special transition using css animation
188
194
  if (this.state.mode === PINNED && mode === STATIC) {
189
195
  return PINNED_TO_STATIC
@@ -191,12 +197,14 @@ class Headroom extends React.PureComponent<PropsType, StateType> {
191
197
  // If mode is static, then no transition, because we're already in the right spot
192
198
  // (and want to change transform and top properties seamlessly)
193
199
  if (mode === STATIC) {
194
- return this.state.transition === NO_TRANSITION ? NO_TRANSITION
200
+ return this.state.transition === NO_TRANSITION
201
+ ? NO_TRANSITION
195
202
  : PINNED_TO_STATIC
196
203
  }
197
204
  // mode is not static, transition when moving upwards or when we've lastly did the transition
198
205
  return direction === UPWARDS || this.state.transition === NORMAL_TRANSITION
199
- ? NORMAL_TRANSITION : NO_TRANSITION
206
+ ? NORMAL_TRANSITION
207
+ : NO_TRANSITION
200
208
  }
201
209
 
202
210
  /**
@@ -208,12 +216,18 @@ class Headroom extends React.PureComponent<PropsType, StateType> {
208
216
  if (currentScrollTop === this.lastKnownScrollTop) {
209
217
  return
210
218
  }
211
- const direction = this.lastKnownScrollTop < currentScrollTop ? DOWNWARDS
219
+ const direction = this.lastKnownScrollTop < currentScrollTop
220
+ ? DOWNWARDS
212
221
  : UPWARDS
213
222
  newState.mode = this.determineMode(currentScrollTop, direction)
214
223
  newState.transition = this.determineTransition(newState.mode, direction)
215
224
 
216
- const { onStickyTopChanged, height, scrollHeight, pinStart } = this.props
225
+ const {
226
+ onStickyTopChanged,
227
+ height,
228
+ scrollHeight,
229
+ pinStart
230
+ } = this.props
217
231
  if (this.state.mode === PINNED && newState.mode === STATIC) {
218
232
  // animation in the special case from pinned to static
219
233
  newState.animateUpFrom = currentScrollTop - pinStart
@@ -245,7 +259,11 @@ class Headroom extends React.PureComponent<PropsType, StateType> {
245
259
  zIndex,
246
260
  className
247
261
  } = this.props
248
- const { mode, transition, animateUpFrom } = this.state
262
+ const {
263
+ mode,
264
+ transition,
265
+ animateUpFrom
266
+ } = this.state
249
267
  const transform = mode === UNPINNED ? -scrollHeight : 0
250
268
  const ownStickyTop = mode === STATIC ? -scrollHeight : 0
251
269
  return <HeaderWrapper
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integreat-app/react-sticky-headroom",
3
- "version": "1.1.0",
3
+ "version": "1.2.2",
4
4
  "engines": {
5
5
  "node": ">=6.9",
6
6
  "npm": ">=3.8"
@@ -18,7 +18,8 @@
18
18
  "repository": "https://github.com/integreat/react-sticky-headroom",
19
19
  "files": [
20
20
  "index.js",
21
- "index.js.flow"
21
+ "index.js.flow",
22
+ "index.d.ts"
22
23
  ],
23
24
  "publishConfig": {
24
25
  "access": "public"
@@ -29,7 +30,9 @@
29
30
  "react",
30
31
  "hide",
31
32
  "header",
32
- "styled-components"
33
+ "styled-components",
34
+ "typescript",
35
+ "flow"
33
36
  ],
34
37
  "module": "index.js",
35
38
  "scripts": {
@@ -48,60 +51,63 @@
48
51
  "prepublishOnly": "yarn build && yarn build:demo && yarn test && yarn lint && yarn flow:check-now"
49
52
  },
50
53
  "peerDependencies": {
51
- "react": "16.x.x || 17.x.x",
54
+ "react": "16.x.x || 17.x.x || 18.x.x",
52
55
  "styled-components": "4.x.x || 5.x.x"
53
56
  },
54
57
  "devDependencies": {
55
- "@babel/cli": "^7.8.4",
56
- "@babel/core": "^7.9.0",
57
- "@babel/plugin-proposal-class-properties": "^7.8.3",
58
- "@babel/plugin-proposal-do-expressions": "^7.8.3",
59
- "@babel/plugin-proposal-export-default-from": "^7.8.3",
60
- "@babel/plugin-proposal-export-namespace-from": "^7.8.3",
61
- "@babel/plugin-proposal-json-strings": "^7.8.3",
62
- "@babel/plugin-proposal-logical-assignment-operators": "^7.8.3",
63
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3",
64
- "@babel/plugin-proposal-numeric-separator": "^7.8.3",
65
- "@babel/plugin-proposal-optional-chaining": "^7.9.0",
66
- "@babel/plugin-proposal-pipeline-operator": "^7.8.3",
67
- "@babel/plugin-proposal-throw-expressions": "^7.8.3",
58
+ "@babel/cli": "^7.17.6",
59
+ "@babel/core": "^7.17.8",
60
+ "@babel/eslint-parser": "^7.17.0",
61
+ "@babel/plugin-proposal-class-properties": "^7.16.7",
62
+ "@babel/plugin-proposal-do-expressions": "^7.16.7",
63
+ "@babel/plugin-proposal-export-default-from": "^7.16.7",
64
+ "@babel/plugin-proposal-export-namespace-from": "^7.16.7",
65
+ "@babel/plugin-proposal-json-strings": "^7.16.7",
66
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7",
67
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
68
+ "@babel/plugin-proposal-numeric-separator": "^7.16.7",
69
+ "@babel/plugin-proposal-optional-chaining": "^7.16.7",
70
+ "@babel/plugin-proposal-pipeline-operator": "^7.17.6",
71
+ "@babel/plugin-proposal-throw-expressions": "^7.16.7",
68
72
  "@babel/plugin-syntax-dynamic-import": "^7.8.3",
69
- "@babel/plugin-syntax-import-meta": "^7.8.3",
70
- "@babel/plugin-transform-react-jsx": "^7.9.4",
71
- "@babel/plugin-transform-runtime": "^7.9.0",
72
- "@babel/preset-env": "^7.9.5",
73
- "@babel/preset-flow": "^7.9.0",
74
- "@babel/preset-react": "^7.9.4",
75
- "@babel/runtime": "^7.9.2",
76
- "@integreat-app/eslint-config-babel": "^0.6.0",
77
- "@integreat-app/eslint-config-flow": "^0.6.0",
78
- "@integreat-app/eslint-config-jest": "^0.6.0",
79
- "@integreat-app/eslint-config-node": "^0.6.0",
80
- "@integreat-app/eslint-config-react": "^0.6.1",
81
- "babel-core": "^7.0.0-bridge.0",
82
- "babel-eslint": "^10.1.0",
83
- "babel-jest": "^26.6.3",
84
- "babel-loader": "^8.1.0",
85
- "babel-plugin-styled-components": "^1.10.7",
73
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
74
+ "@babel/plugin-transform-react-jsx": "^7.17.3",
75
+ "@babel/plugin-transform-runtime": "^7.17.0",
76
+ "@babel/preset-env": "^7.16.11",
77
+ "@babel/preset-flow": "^7.16.7",
78
+ "@babel/preset-react": "^7.16.7",
79
+ "@babel/runtime": "^7.17.8",
80
+ "babel-jest": "^27.5.1",
81
+ "babel-loader": "^8.2.4",
82
+ "babel-plugin-styled-components": "^2.0.6",
83
+ "browserslist": "^4.20.2",
86
84
  "enzyme": "^3.11.0",
87
- "enzyme-adapter-react-16": "^1.15.2",
88
- "enzyme-to-json": "^3.4.4",
89
- "eslint": "^7.14.0",
90
- "flow-bin": "~0.134.0",
85
+ "enzyme-adapter-react-16": "^1.15.6",
86
+ "enzyme-to-json": "^3.6.2",
87
+ "eslint": "^8.11.0",
88
+ "eslint-config-standard": "^16.0.3",
89
+ "eslint-plugin-flowtype": "^8.0.3",
90
+ "eslint-plugin-import": "^2.25.4",
91
+ "eslint-plugin-jest": "^26.1.3",
92
+ "eslint-plugin-node": "^11.1.0",
93
+ "eslint-plugin-promise": "^6.0.0",
94
+ "eslint-plugin-react": "^7.29.4",
95
+ "flow-bin": "~0.174.1",
91
96
  "flow-copy-source": "^2.0.9",
92
- "flow-typed": "^3.2.1",
93
- "jest": "^26.6.3",
94
- "jest-junit": "^12.0.0",
95
- "jest-styled-components": "^7.0.3",
97
+ "flow-typed": "^3.7.0",
98
+ "jest": "^27.5.1",
99
+ "jest-junit": "^13.0.0",
100
+ "jest-styled-components": "^7.0.8",
96
101
  "raf": "^3.4.1",
97
- "react": "^16.13.1",
98
- "react-dom": "^16.13.1",
102
+ "react": "^16.14.0",
103
+ "react-dom": "^16.14.0",
99
104
  "rimraf": "^3.0.2",
100
- "styled-components": "^5.1.0",
101
- "stylelint": "^13.8.0",
102
- "stylelint-config-recommended": "^3.0.0",
105
+ "styled-components": "^5.3.3",
106
+ "stylelint": "^14.6.0",
107
+ "stylelint-config-recommended": "^7.0.0",
103
108
  "stylelint-config-styled-components": "^0.1.1",
104
109
  "stylelint-processor-styled-components": "^1.10.0",
105
- "webpack": "^5.9.0"
106
- }
110
+ "webpack": "^5.70.0"
111
+ },
112
+ "packageManager": "yarn@3.2.0"
107
113
  }