@kesha-antonov/react-native-chat 4.1.0 → 4.2.0
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 +85 -46
- package/lib/Bubble/index.d.ts.map +1 -1
- package/lib/Bubble/index.js +59 -19
- package/lib/Bubble/index.js.map +1 -1
- package/lib/Bubble/styles.d.ts +19 -0
- package/lib/Bubble/styles.d.ts.map +1 -1
- package/lib/Bubble/styles.js +23 -0
- package/lib/Bubble/styles.js.map +1 -1
- package/lib/Bubble/types.d.ts +10 -0
- package/lib/Bubble/types.d.ts.map +1 -1
- package/lib/Chat/ChatKeyboardAvoidingView.d.ts +16 -0
- package/lib/Chat/ChatKeyboardAvoidingView.d.ts.map +1 -0
- package/lib/Chat/ChatKeyboardAvoidingView.js +17 -0
- package/lib/Chat/ChatKeyboardAvoidingView.js.map +1 -0
- package/lib/Chat/index.d.ts.map +1 -1
- package/lib/Chat/index.js +20 -7
- package/lib/Chat/index.js.map +1 -1
- package/lib/Chat/types.d.ts +23 -3
- package/lib/Chat/types.d.ts.map +1 -1
- package/lib/Message/styles.d.ts +1 -4
- package/lib/Message/styles.d.ts.map +1 -1
- package/lib/Message/styles.js +4 -4
- package/lib/Message/styles.js.map +1 -1
- package/lib/MessagesContainer/FlashList.d.ts +9 -0
- package/lib/MessagesContainer/FlashList.d.ts.map +1 -0
- package/lib/MessagesContainer/FlashList.js +23 -0
- package/lib/MessagesContainer/FlashList.js.map +1 -0
- package/lib/MessagesContainer/index.d.ts.map +1 -1
- package/lib/MessagesContainer/index.js +113 -35
- package/lib/MessagesContainer/index.js.map +1 -1
- package/lib/MessagesContainer/styles.d.ts +0 -4
- package/lib/MessagesContainer/styles.d.ts.map +1 -1
- package/lib/MessagesContainer/styles.js +0 -4
- package/lib/MessagesContainer/styles.js.map +1 -1
- package/lib/MessagesContainer/types.d.ts +22 -2
- package/lib/MessagesContainer/types.d.ts.map +1 -1
- package/lib/hooks/useHasKeyboardProvider.d.ts +19 -0
- package/lib/hooks/useHasKeyboardProvider.d.ts.map +1 -0
- package/lib/hooks/useHasKeyboardProvider.js +31 -0
- package/lib/hooks/useHasKeyboardProvider.js.map +1 -0
- package/lib/hooks/useIsKeyboardVisible.d.ts +12 -0
- package/lib/hooks/useIsKeyboardVisible.d.ts.map +1 -0
- package/lib/hooks/useIsKeyboardVisible.js +31 -0
- package/lib/hooks/useIsKeyboardVisible.js.map +1 -0
- package/lib/hooks/useKeyboardVerticalOffset.d.ts +19 -0
- package/lib/hooks/useKeyboardVerticalOffset.d.ts.map +1 -0
- package/lib/hooks/useKeyboardVerticalOffset.js +22 -0
- package/lib/hooks/useKeyboardVerticalOffset.js.map +1 -0
- package/package.json +8 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/MessagesContainer/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EACL,aAAa,EACb,SAAS,EACT,SAAS,EACV,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACvD,OAAiB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAE/D,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AACjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAK/D;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAA2B,CAAC,QAAQ,EAC/D,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG;IAC/B,GAAG,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;CACpC,KACE,KAAK,CAAC,YAAY,CAAA;AAEvB,MAAM,MAAM,iBAAiB,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ,IAAI,OAAO,CAC3E,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,GAAG;IAC1C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;CACxC,CACF,CAAA;AAED,MAAM,MAAM,YAAY,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAEvD,MAAM,WAAW,sBAAsB,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ,CAC1E,SAAQ,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC;IAC3C,6CAA6C;IAC7C,UAAU,CAAC,EAAE,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC9C,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAA;IACrB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,uDAAuD;IACvD,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,oCAAoC;IACpC,SAAS,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACvC,0DAA0D;IAC1D,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/MessagesContainer/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a `KeyboardProvider` is already mounted above this component.
|
|
3
|
+
*
|
|
4
|
+
* Mounting a second one is not harmless. On Android every provider installs an
|
|
5
|
+
* `OnApplyWindowInsetsListener` on the *activity's* root view and rewrites the content
|
|
6
|
+
* view's margins from its own `statusBarTranslucent` / `navigationBarTranslucent` props,
|
|
7
|
+
* so a nested provider relayouts the whole host app - and it never restores the listener
|
|
8
|
+
* it replaced, leaving the app broken even after the chat screen is gone.
|
|
9
|
+
* See https://github.com/kesha-antonov/react-native-chat/issues/11
|
|
10
|
+
*
|
|
11
|
+
* Detection: with no provider above, `react-native-keyboard-controller` hands out a
|
|
12
|
+
* module-level fallback context. Two details give that fallback away, and neither can
|
|
13
|
+
* hold for a real provider (which creates one shared value per field): both fields point
|
|
14
|
+
* at the very same object, and that object is a hand-rolled stub rather than a Reanimated
|
|
15
|
+
* shared value. Requiring both keeps the failure mode safe - if either detail ever
|
|
16
|
+
* changes we simply mount our own provider, which is what we did before.
|
|
17
|
+
*/
|
|
18
|
+
export declare function useHasKeyboardProvider(): boolean;
|
|
19
|
+
//# sourceMappingURL=useHasKeyboardProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useHasKeyboardProvider.d.ts","sourceRoot":"","sources":["../../src/hooks/useHasKeyboardProvider.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,IAAK,OAAO,CAMjD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
import { KeyboardContext } from 'react-native-keyboard-controller';
|
|
3
|
+
// `react-native-keyboard-controller/jest` doesn't mock `KeyboardContext`, so fall back to
|
|
4
|
+
// an empty context to keep consumers' test suites running.
|
|
5
|
+
const Context = KeyboardContext ??
|
|
6
|
+
createContext(undefined);
|
|
7
|
+
const isReanimatedSharedValue = (value) => typeof value === 'object' && value !== null && '_isReanimatedSharedValue' in value;
|
|
8
|
+
/**
|
|
9
|
+
* Whether a `KeyboardProvider` is already mounted above this component.
|
|
10
|
+
*
|
|
11
|
+
* Mounting a second one is not harmless. On Android every provider installs an
|
|
12
|
+
* `OnApplyWindowInsetsListener` on the *activity's* root view and rewrites the content
|
|
13
|
+
* view's margins from its own `statusBarTranslucent` / `navigationBarTranslucent` props,
|
|
14
|
+
* so a nested provider relayouts the whole host app - and it never restores the listener
|
|
15
|
+
* it replaced, leaving the app broken even after the chat screen is gone.
|
|
16
|
+
* See https://github.com/kesha-antonov/react-native-chat/issues/11
|
|
17
|
+
*
|
|
18
|
+
* Detection: with no provider above, `react-native-keyboard-controller` hands out a
|
|
19
|
+
* module-level fallback context. Two details give that fallback away, and neither can
|
|
20
|
+
* hold for a real provider (which creates one shared value per field): both fields point
|
|
21
|
+
* at the very same object, and that object is a hand-rolled stub rather than a Reanimated
|
|
22
|
+
* shared value. Requiring both keeps the failure mode safe - if either detail ever
|
|
23
|
+
* changes we simply mount our own provider, which is what we did before.
|
|
24
|
+
*/
|
|
25
|
+
export function useHasKeyboardProvider() {
|
|
26
|
+
const context = useContext(Context);
|
|
27
|
+
const progress = context?.reanimated?.progress;
|
|
28
|
+
const height = context?.reanimated?.height;
|
|
29
|
+
return progress !== height && isReanimatedSharedValue(progress);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=useHasKeyboardProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useHasKeyboardProvider.js","sourceRoot":"","sources":["../../src/hooks/useHasKeyboardProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAMlE,0FAA0F;AAC1F,2DAA2D;AAC3D,MAAM,OAAO,GACV,eAAmF;IACpF,aAAa,CAA4B,SAAS,CAAC,CAAA;AAErD,MAAM,uBAAuB,GAAG,CAAC,KAAc,EAAE,EAAE,CACjD,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,0BAA0B,IAAI,KAAK,CAAA;AAEpF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;IACnC,MAAM,QAAQ,GAAG,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAA;IAC9C,MAAM,MAAM,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM,CAAA;IAE1C,OAAO,QAAQ,KAAK,MAAM,IAAI,uBAAuB,CAAC,QAAQ,CAAC,CAAA;AACjE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether the software keyboard is currently on screen.
|
|
3
|
+
*
|
|
4
|
+
* Tracks `keyboardWillShow` / `keyboardWillHide` rather than the `Did` events so layout
|
|
5
|
+
* reacts *with* the keyboard animation instead of a beat after it.
|
|
6
|
+
*
|
|
7
|
+
* `isEnabled` exists because this re-renders its consumer on every keyboard transition:
|
|
8
|
+
* pass `false` and no listener is registered at all, so features that don't need the
|
|
9
|
+
* keyboard state pay nothing for it.
|
|
10
|
+
*/
|
|
11
|
+
export declare function useIsKeyboardVisible(isEnabled?: boolean): boolean;
|
|
12
|
+
//# sourceMappingURL=useIsKeyboardVisible.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIsKeyboardVisible.d.ts","sourceRoot":"","sources":["../../src/hooks/useIsKeyboardVisible.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAE,SAAS,GAAE,OAAc,GAAG,OAAO,CAwBxE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import { KeyboardController, KeyboardEvents } from 'react-native-keyboard-controller';
|
|
3
|
+
/**
|
|
4
|
+
* Whether the software keyboard is currently on screen.
|
|
5
|
+
*
|
|
6
|
+
* Tracks `keyboardWillShow` / `keyboardWillHide` rather than the `Did` events so layout
|
|
7
|
+
* reacts *with* the keyboard animation instead of a beat after it.
|
|
8
|
+
*
|
|
9
|
+
* `isEnabled` exists because this re-renders its consumer on every keyboard transition:
|
|
10
|
+
* pass `false` and no listener is registered at all, so features that don't need the
|
|
11
|
+
* keyboard state pay nothing for it.
|
|
12
|
+
*/
|
|
13
|
+
export function useIsKeyboardVisible(isEnabled = true) {
|
|
14
|
+
const [isVisible, setIsVisible] = useState(() => isEnabled && (KeyboardController.isVisible?.() ?? false));
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
if (!isEnabled) {
|
|
17
|
+
setIsVisible(false);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
// The keyboard may already be up when this turns on (e.g. the prop flipped while the
|
|
21
|
+
// composer was focused), and it can also change between render and subscribing.
|
|
22
|
+
setIsVisible(KeyboardController.isVisible?.() ?? false);
|
|
23
|
+
const subscriptions = [
|
|
24
|
+
KeyboardEvents.addListener('keyboardWillShow', () => setIsVisible(true)),
|
|
25
|
+
KeyboardEvents.addListener('keyboardWillHide', () => setIsVisible(false)),
|
|
26
|
+
];
|
|
27
|
+
return () => subscriptions.forEach(subscription => subscription.remove());
|
|
28
|
+
}, [isEnabled]);
|
|
29
|
+
return isVisible;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=useIsKeyboardVisible.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIsKeyboardVisible.js","sourceRoot":"","sources":["../../src/hooks/useIsKeyboardVisible.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAErF;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAE,YAAqB,IAAI;IAC7D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CACxC,GAAG,EAAE,CAAC,SAAS,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,IAAI,KAAK,CAAC,CAC/D,CAAA;IAED,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,OAAM;QACR,CAAC;QAED,qFAAqF;QACrF,gFAAgF;QAChF,YAAY,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,IAAI,KAAK,CAAC,CAAA;QAEvD,MAAM,aAAa,GAAG;YACpB,cAAc,CAAC,WAAW,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACxE,cAAc,CAAC,WAAW,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;SAC1E,CAAA;QAED,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;IAC3E,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAEf,OAAO,SAAS,CAAA;AAClB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How far down the window the chat container starts - the value
|
|
3
|
+
* `KeyboardAvoidingView` needs to keep the input toolbar on top of the keyboard.
|
|
4
|
+
*
|
|
5
|
+
* It cannot come from insets: a navigation header draws above the chat and insets
|
|
6
|
+
* cannot see it, so `insets.top` (the old default) placed a chat below a header
|
|
7
|
+
* roughly a header-height too low, i.e. behind the keyboard.
|
|
8
|
+
* See https://github.com/kesha-antonov/react-native-chat/issues/11
|
|
9
|
+
*
|
|
10
|
+
* The `SafeAreaProvider` that `ChatWrapper` mounts right around us reports exactly
|
|
11
|
+
* this: its frame is measured natively against the root view
|
|
12
|
+
* (`offsetDescendantRectToMyCoords` on Android, `convertRect:toView:` on iOS) and
|
|
13
|
+
* refreshed on every layout change. That provider is what makes this work - it is
|
|
14
|
+
* mounted unconditionally on purpose, and every wrapper between it and the
|
|
15
|
+
* `KeyboardAvoidingView` is a zero-offset fill view so that its top edge and the
|
|
16
|
+
* chat's top edge are the same line.
|
|
17
|
+
*/
|
|
18
|
+
export declare function useKeyboardVerticalOffset(): number;
|
|
19
|
+
//# sourceMappingURL=useKeyboardVerticalOffset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useKeyboardVerticalOffset.d.ts","sourceRoot":"","sources":["../../src/hooks/useKeyboardVerticalOffset.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,yBAAyB,IAAK,MAAM,CAEnD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useSafeAreaFrame } from 'react-native-safe-area-context';
|
|
2
|
+
/**
|
|
3
|
+
* How far down the window the chat container starts - the value
|
|
4
|
+
* `KeyboardAvoidingView` needs to keep the input toolbar on top of the keyboard.
|
|
5
|
+
*
|
|
6
|
+
* It cannot come from insets: a navigation header draws above the chat and insets
|
|
7
|
+
* cannot see it, so `insets.top` (the old default) placed a chat below a header
|
|
8
|
+
* roughly a header-height too low, i.e. behind the keyboard.
|
|
9
|
+
* See https://github.com/kesha-antonov/react-native-chat/issues/11
|
|
10
|
+
*
|
|
11
|
+
* The `SafeAreaProvider` that `ChatWrapper` mounts right around us reports exactly
|
|
12
|
+
* this: its frame is measured natively against the root view
|
|
13
|
+
* (`offsetDescendantRectToMyCoords` on Android, `convertRect:toView:` on iOS) and
|
|
14
|
+
* refreshed on every layout change. That provider is what makes this work - it is
|
|
15
|
+
* mounted unconditionally on purpose, and every wrapper between it and the
|
|
16
|
+
* `KeyboardAvoidingView` is a zero-offset fill view so that its top edge and the
|
|
17
|
+
* chat's top edge are the same line.
|
|
18
|
+
*/
|
|
19
|
+
export function useKeyboardVerticalOffset() {
|
|
20
|
+
return useSafeAreaFrame().y;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=useKeyboardVerticalOffset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useKeyboardVerticalOffset.js","sourceRoot":"","sources":["../../src/hooks/useKeyboardVerticalOffset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAEjE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,yBAAyB;IACvC,OAAO,gBAAgB,EAAE,CAAC,CAAC,CAAA;AAC7B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kesha-antonov/react-native-chat",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.2.0",
|
|
4
4
|
"description": "The most complete chat UI for React Native",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"android",
|
|
@@ -70,6 +70,7 @@
|
|
|
70
70
|
"@react-native/eslint-config": "0.81.5",
|
|
71
71
|
"@react-native/metro-config": "0.81.5",
|
|
72
72
|
"@react-native/typescript-config": "0.81.5",
|
|
73
|
+
"@shopify/flash-list": "^2.3.2",
|
|
73
74
|
"@stylistic/eslint-plugin": "^3.1.0",
|
|
74
75
|
"@testing-library/dom": "^10.4.1",
|
|
75
76
|
"@testing-library/react": "^16.3.0",
|
|
@@ -105,6 +106,7 @@
|
|
|
105
106
|
"typescript": "^5.9.3"
|
|
106
107
|
},
|
|
107
108
|
"peerDependencies": {
|
|
109
|
+
"@shopify/flash-list": "*",
|
|
108
110
|
"react": ">=18.0.0",
|
|
109
111
|
"react-native": "*",
|
|
110
112
|
"react-native-gesture-handler": ">=2.0.0",
|
|
@@ -115,5 +117,10 @@
|
|
|
115
117
|
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e",
|
|
116
118
|
"engines": {
|
|
117
119
|
"node": ">=20"
|
|
120
|
+
},
|
|
121
|
+
"peerDependenciesMeta": {
|
|
122
|
+
"@shopify/flash-list": {
|
|
123
|
+
"optional": true
|
|
124
|
+
}
|
|
118
125
|
}
|
|
119
126
|
}
|