@ledgerhq/lumen-ui-rnative 0.1.36 → 0.1.38
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/dist/module/lib/Animations/Pulse/Pulse.mdx +1 -1
- package/dist/module/lib/Animations/Spin/Spin.mdx +1 -1
- package/dist/module/lib/Components/AddressInput/AddressInput.mdx +1 -1
- package/dist/module/lib/Components/AmountDisplay/AmountDisplay.js +68 -39
- package/dist/module/lib/Components/AmountDisplay/AmountDisplay.js.map +1 -1
- package/dist/module/lib/Components/AmountDisplay/AmountDisplay.mdx +7 -1
- package/dist/module/lib/Components/AmountDisplay/AmountDisplay.stories.js +24 -0
- package/dist/module/lib/Components/AmountDisplay/AmountDisplay.stories.js.map +1 -1
- package/dist/module/lib/Components/AmountDisplay/types.js.map +1 -1
- package/dist/module/lib/Components/AmountInput/AmountInput.js +109 -72
- package/dist/module/lib/Components/AmountInput/AmountInput.js.map +1 -1
- package/dist/module/lib/Components/AmountInput/AmountInput.mdx +13 -1
- package/dist/module/lib/Components/AmountInput/AmountInput.stories.js +53 -0
- package/dist/module/lib/Components/AmountInput/AmountInput.stories.js.map +1 -1
- package/dist/module/lib/Components/Avatar/Avatar.js +6 -5
- package/dist/module/lib/Components/Avatar/Avatar.js.map +1 -1
- package/dist/module/lib/Components/Avatar/Avatar.mdx +3 -1
- package/dist/module/lib/Components/Avatar/Avatar.test.js +10 -13
- package/dist/module/lib/Components/Avatar/Avatar.test.js.map +1 -1
- package/dist/module/lib/Components/Banner/Banner.mdx +1 -1
- package/dist/module/lib/Components/BottomSheet/BottomSheet.mdx +1 -1
- package/dist/module/lib/Components/Button/Button.mdx +1 -1
- package/dist/module/lib/Components/Card/Card.stories.js +4 -9
- package/dist/module/lib/Components/Card/Card.stories.js.map +1 -1
- package/dist/module/lib/Components/CardButton/CardButton.mdx +1 -1
- package/dist/module/lib/Components/Checkbox/Checkbox.mdx +1 -1
- package/dist/module/lib/Components/Divider/Divider.mdx +1 -1
- package/dist/module/lib/Components/DotIcon/DotIcon.js +51 -27
- package/dist/module/lib/Components/DotIcon/DotIcon.js.map +1 -1
- package/dist/module/lib/Components/DotIcon/DotIcon.mdx +92 -0
- package/dist/module/lib/Components/DotIcon/DotIcon.stories.js +57 -0
- package/dist/module/lib/Components/DotIcon/DotIcon.stories.js.map +1 -1
- package/dist/module/lib/Components/DotIndicator/DotIndicator.js +5 -5
- package/dist/module/lib/Components/DotIndicator/DotIndicator.js.map +1 -1
- package/dist/module/lib/Components/DotIndicator/DotIndicator.mdx +4 -4
- package/dist/module/lib/Components/DotIndicator/DotIndicator.stories.js +3 -3
- package/dist/module/lib/Components/DotIndicator/DotIndicator.test.js +12 -2
- package/dist/module/lib/Components/DotIndicator/DotIndicator.test.js.map +1 -1
- package/dist/module/lib/Components/DotSymbol/DotSymbol.js +59 -34
- package/dist/module/lib/Components/DotSymbol/DotSymbol.js.map +1 -1
- package/dist/module/lib/Components/DotSymbol/DotSymbol.mdx +79 -2
- package/dist/module/lib/Components/DotSymbol/DotSymbol.stories.js +60 -0
- package/dist/module/lib/Components/DotSymbol/DotSymbol.stories.js.map +1 -1
- package/dist/module/lib/Components/IconButton/IconButton.mdx +1 -1
- package/dist/module/lib/Components/InteractiveIcon/InteractiveIcon.mdx +1 -1
- package/dist/module/lib/Components/Label/Label.js +1 -1
- package/dist/module/lib/Components/Link/Link.mdx +1 -1
- package/dist/module/lib/Components/MediaBanner/MediaBanner.mdx +1 -1
- package/dist/module/lib/Components/MediaButton/MediaButton.js +19 -19
- package/dist/module/lib/Components/MediaButton/MediaButton.js.map +1 -1
- package/dist/module/lib/Components/MediaButton/MediaButton.mdx +5 -5
- package/dist/module/lib/Components/MediaButton/MediaButton.stories.js +17 -17
- package/dist/module/lib/Components/MediaButton/MediaButton.stories.js.map +1 -1
- package/dist/module/lib/Components/MediaButton/MediaButton.test.js +4 -4
- package/dist/module/lib/Components/MediaButton/MediaButton.test.js.map +1 -1
- package/dist/module/lib/Components/MediaImage/MediaImage.js +24 -6
- package/dist/module/lib/Components/MediaImage/MediaImage.js.map +1 -1
- package/dist/module/lib/Components/MediaImage/MediaImage.mdx +1 -1
- package/dist/module/lib/Components/MediaImage/MediaImage.stories.js +47 -0
- package/dist/module/lib/Components/MediaImage/MediaImage.stories.js.map +1 -1
- package/dist/module/lib/Components/NavBar/CoinCapsule.js +2 -2
- package/dist/module/lib/Components/NavBar/CoinCapsule.js.map +1 -1
- package/dist/module/lib/Components/NavBar/NavBar.js +2 -2
- package/dist/module/lib/Components/NavBar/NavBar.js.map +1 -1
- package/dist/module/lib/Components/NavBar/NavBar.mdx +2 -2
- package/dist/module/lib/Components/NavBar/NavBar.stories.js +1 -1
- package/dist/module/lib/Components/NavBar/NavBar.stories.js.map +1 -1
- package/dist/module/lib/Components/NavBar/NavBar.test.js +3 -3
- package/dist/module/lib/Components/NavBar/NavBar.test.js.map +1 -1
- package/dist/module/lib/Components/OptionList/OptionList.mdx +1 -1
- package/dist/module/lib/Components/OptionList/OptionList.stories.js +4 -4
- package/dist/module/lib/Components/OptionList/OptionList.stories.js.map +1 -1
- package/dist/module/lib/Components/PageIndicator/PageIndicator.js +13 -8
- package/dist/module/lib/Components/PageIndicator/PageIndicator.js.map +1 -1
- package/dist/module/lib/Components/PageIndicator/PageIndicator.test.js +58 -0
- package/dist/module/lib/Components/PageIndicator/PageIndicator.test.js.map +1 -1
- package/dist/module/lib/Components/SearchInput/SearchInput.mdx +1 -1
- package/dist/module/lib/Components/SegmentedControl/SegmentedControl.mdx +1 -1
- package/dist/module/lib/Components/Spinner/Spinner.mdx +1 -1
- package/dist/module/lib/Components/Spot/Spot.mdx +1 -1
- package/dist/module/lib/Components/Stepper/Stepper.mdx +1 -1
- package/dist/module/lib/Components/Subheader/Subheader.mdx +1 -1
- package/dist/module/lib/Components/Switch/Switch.mdx +1 -1
- package/dist/module/lib/Components/TabBar/TabBar.mdx +1 -1
- package/dist/module/lib/Components/TextInput/TextInput.mdx +1 -1
- package/dist/module/lib/Components/ThemeProvider/ThemeProvider.js +2 -5
- package/dist/module/lib/Components/ThemeProvider/ThemeProvider.js.map +1 -1
- package/dist/module/lib/Components/Tile/Tile.mdx +1 -1
- package/dist/module/lib/Components/Tooltip/Tooltip.mdx +1 -1
- package/dist/module/lib/Components/index.js +0 -1
- package/dist/module/lib/Components/index.js.map +1 -1
- package/dist/module/lib/Symbols/Icons/Lightbulb.js +3 -3
- package/dist/module/lib/Symbols/Icons/Lightbulb.js.map +1 -1
- package/dist/typescript/src/lib/Components/AmountDisplay/AmountDisplay.d.ts +1 -1
- package/dist/typescript/src/lib/Components/AmountDisplay/AmountDisplay.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/AmountDisplay/index.d.ts +1 -1
- package/dist/typescript/src/lib/Components/AmountDisplay/index.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/AmountDisplay/types.d.ts +10 -3
- package/dist/typescript/src/lib/Components/AmountDisplay/types.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/AmountInput/AmountInput.d.ts +1 -1
- package/dist/typescript/src/lib/Components/AmountInput/AmountInput.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/AmountInput/types.d.ts +12 -0
- package/dist/typescript/src/lib/Components/AmountInput/types.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/Avatar/Avatar.d.ts +1 -1
- package/dist/typescript/src/lib/Components/Avatar/Avatar.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/DotIcon/DotIcon.d.ts +3 -2
- package/dist/typescript/src/lib/Components/DotIcon/DotIcon.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/DotIcon/types.d.ts +7 -1
- package/dist/typescript/src/lib/Components/DotIcon/types.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/DotIndicator/types.d.ts +2 -2
- package/dist/typescript/src/lib/Components/DotSymbol/DotSymbol.d.ts +1 -1
- package/dist/typescript/src/lib/Components/DotSymbol/DotSymbol.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/DotSymbol/types.d.ts +7 -1
- package/dist/typescript/src/lib/Components/DotSymbol/types.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/Label/Label.d.ts +1 -1
- package/dist/typescript/src/lib/Components/MediaButton/MediaButton.d.ts +5 -5
- package/dist/typescript/src/lib/Components/MediaButton/MediaButton.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/MediaButton/types.d.ts +6 -6
- package/dist/typescript/src/lib/Components/MediaButton/types.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/MediaImage/MediaImage.d.ts +1 -1
- package/dist/typescript/src/lib/Components/MediaImage/MediaImage.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/MediaImage/types.d.ts +7 -1
- package/dist/typescript/src/lib/Components/MediaImage/types.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/NavBar/CoinCapsule.d.ts +1 -1
- package/dist/typescript/src/lib/Components/NavBar/CoinCapsule.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/NavBar/NavBar.d.ts +1 -1
- package/dist/typescript/src/lib/Components/NavBar/NavBar.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/NavBar/types.d.ts +3 -3
- package/dist/typescript/src/lib/Components/NavBar/types.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/PageIndicator/PageIndicator.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/index.d.ts +0 -1
- package/dist/typescript/src/lib/Components/index.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/lib/Animations/Pulse/Pulse.mdx +1 -1
- package/src/lib/Animations/Spin/Spin.mdx +1 -1
- package/src/lib/Components/AddressInput/AddressInput.mdx +1 -1
- package/src/lib/Components/AmountDisplay/AmountDisplay.mdx +7 -1
- package/src/lib/Components/AmountDisplay/AmountDisplay.stories.tsx +18 -0
- package/src/lib/Components/AmountDisplay/AmountDisplay.tsx +71 -40
- package/src/lib/Components/AmountDisplay/index.ts +5 -1
- package/src/lib/Components/AmountDisplay/types.ts +12 -3
- package/src/lib/Components/AmountInput/AmountInput.mdx +13 -1
- package/src/lib/Components/AmountInput/AmountInput.stories.tsx +68 -1
- package/src/lib/Components/AmountInput/AmountInput.tsx +118 -75
- package/src/lib/Components/AmountInput/types.ts +14 -0
- package/src/lib/Components/Avatar/Avatar.mdx +3 -1
- package/src/lib/Components/Avatar/Avatar.test.tsx +16 -18
- package/src/lib/Components/Avatar/Avatar.tsx +9 -8
- package/src/lib/Components/Banner/Banner.mdx +1 -1
- package/src/lib/Components/BottomSheet/BottomSheet.mdx +1 -1
- package/src/lib/Components/Button/Button.mdx +1 -1
- package/src/lib/Components/Card/Card.stories.tsx +1 -3
- package/src/lib/Components/CardButton/CardButton.mdx +1 -1
- package/src/lib/Components/Checkbox/Checkbox.mdx +1 -1
- package/src/lib/Components/Divider/Divider.mdx +1 -1
- package/src/lib/Components/DotIcon/DotIcon.mdx +92 -0
- package/src/lib/Components/DotIcon/DotIcon.stories.tsx +43 -0
- package/src/lib/Components/DotIcon/DotIcon.tsx +35 -15
- package/src/lib/Components/DotIcon/types.ts +7 -1
- package/src/lib/Components/DotIndicator/DotIndicator.mdx +4 -4
- package/src/lib/Components/DotIndicator/DotIndicator.stories.tsx +2 -2
- package/src/lib/Components/DotIndicator/DotIndicator.test.tsx +12 -2
- package/src/lib/Components/DotIndicator/DotIndicator.tsx +5 -5
- package/src/lib/Components/DotIndicator/types.ts +2 -2
- package/src/lib/Components/DotSymbol/DotSymbol.mdx +79 -2
- package/src/lib/Components/DotSymbol/DotSymbol.stories.tsx +32 -0
- package/src/lib/Components/DotSymbol/DotSymbol.tsx +46 -25
- package/src/lib/Components/DotSymbol/types.ts +7 -1
- package/src/lib/Components/IconButton/IconButton.mdx +1 -1
- package/src/lib/Components/InteractiveIcon/InteractiveIcon.mdx +1 -1
- package/src/lib/Components/Label/Label.tsx +1 -1
- package/src/lib/Components/Link/Link.mdx +1 -1
- package/src/lib/Components/MediaBanner/MediaBanner.mdx +1 -1
- package/src/lib/Components/MediaButton/MediaButton.mdx +5 -5
- package/src/lib/Components/MediaButton/MediaButton.stories.tsx +29 -15
- package/src/lib/Components/MediaButton/MediaButton.test.tsx +4 -4
- package/src/lib/Components/MediaButton/MediaButton.tsx +35 -22
- package/src/lib/Components/MediaButton/types.ts +6 -6
- package/src/lib/Components/MediaImage/MediaImage.mdx +1 -1
- package/src/lib/Components/MediaImage/MediaImage.stories.tsx +21 -0
- package/src/lib/Components/MediaImage/MediaImage.tsx +14 -2
- package/src/lib/Components/MediaImage/types.ts +7 -1
- package/src/lib/Components/NavBar/CoinCapsule.tsx +2 -2
- package/src/lib/Components/NavBar/NavBar.mdx +2 -2
- package/src/lib/Components/NavBar/NavBar.stories.tsx +3 -1
- package/src/lib/Components/NavBar/NavBar.test.tsx +3 -3
- package/src/lib/Components/NavBar/NavBar.tsx +2 -2
- package/src/lib/Components/NavBar/types.ts +3 -3
- package/src/lib/Components/OptionList/OptionList.mdx +1 -1
- package/src/lib/Components/OptionList/OptionList.stories.tsx +4 -4
- package/src/lib/Components/PageIndicator/PageIndicator.test.tsx +78 -0
- package/src/lib/Components/PageIndicator/PageIndicator.tsx +15 -7
- package/src/lib/Components/SearchInput/SearchInput.mdx +1 -1
- package/src/lib/Components/SegmentedControl/SegmentedControl.mdx +1 -1
- package/src/lib/Components/Spinner/Spinner.mdx +1 -1
- package/src/lib/Components/Spot/Spot.mdx +1 -1
- package/src/lib/Components/Stepper/Stepper.mdx +1 -1
- package/src/lib/Components/Subheader/Subheader.mdx +1 -1
- package/src/lib/Components/Switch/Switch.mdx +1 -1
- package/src/lib/Components/TabBar/TabBar.mdx +1 -1
- package/src/lib/Components/TextInput/TextInput.mdx +1 -1
- package/src/lib/Components/ThemeProvider/ThemeProvider.tsx +1 -4
- package/src/lib/Components/Tile/Tile.mdx +1 -1
- package/src/lib/Components/Tooltip/Tooltip.mdx +1 -1
- package/src/lib/Components/index.ts +0 -1
- package/src/lib/Symbols/Icons/Lightbulb.tsx +3 -3
- package/dist/module/lib/Components/Select/GlobalSelectBottomSheet.js +0 -155
- package/dist/module/lib/Components/Select/GlobalSelectBottomSheet.js.map +0 -1
- package/dist/module/lib/Components/Select/GlobalSelectContext.js +0 -78
- package/dist/module/lib/Components/Select/GlobalSelectContext.js.map +0 -1
- package/dist/module/lib/Components/Select/Select.js +0 -366
- package/dist/module/lib/Components/Select/Select.js.map +0 -1
- package/dist/module/lib/Components/Select/Select.mdx +0 -596
- package/dist/module/lib/Components/Select/Select.stories.js +0 -304
- package/dist/module/lib/Components/Select/Select.stories.js.map +0 -1
- package/dist/module/lib/Components/Select/Select.test.js +0 -123
- package/dist/module/lib/Components/Select/Select.test.js.map +0 -1
- package/dist/module/lib/Components/Select/SelectContext.js +0 -38
- package/dist/module/lib/Components/Select/SelectContext.js.map +0 -1
- package/dist/module/lib/Components/Select/index.js +0 -6
- package/dist/module/lib/Components/Select/index.js.map +0 -1
- package/dist/module/lib/Components/Select/types.js +0 -4
- package/dist/module/lib/Components/Select/types.js.map +0 -1
- package/dist/typescript/src/lib/Components/Select/GlobalSelectBottomSheet.d.ts +0 -20
- package/dist/typescript/src/lib/Components/Select/GlobalSelectBottomSheet.d.ts.map +0 -1
- package/dist/typescript/src/lib/Components/Select/GlobalSelectContext.d.ts +0 -44
- package/dist/typescript/src/lib/Components/Select/GlobalSelectContext.d.ts.map +0 -1
- package/dist/typescript/src/lib/Components/Select/Select.d.ts +0 -52
- package/dist/typescript/src/lib/Components/Select/Select.d.ts.map +0 -1
- package/dist/typescript/src/lib/Components/Select/SelectContext.d.ts +0 -36
- package/dist/typescript/src/lib/Components/Select/SelectContext.d.ts.map +0 -1
- package/dist/typescript/src/lib/Components/Select/index.d.ts +0 -4
- package/dist/typescript/src/lib/Components/Select/index.d.ts.map +0 -1
- package/dist/typescript/src/lib/Components/Select/types.d.ts +0 -130
- package/dist/typescript/src/lib/Components/Select/types.d.ts.map +0 -1
- package/src/lib/Components/Select/GlobalSelectBottomSheet.tsx +0 -180
- package/src/lib/Components/Select/GlobalSelectContext.tsx +0 -103
- package/src/lib/Components/Select/Select.mdx +0 -596
- package/src/lib/Components/Select/Select.stories.tsx +0 -266
- package/src/lib/Components/Select/Select.test.tsx +0 -117
- package/src/lib/Components/Select/Select.tsx +0 -469
- package/src/lib/Components/Select/SelectContext.tsx +0 -68
- package/src/lib/Components/Select/index.ts +0 -3
- package/src/lib/Components/Select/types.ts +0 -149
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
useDisabledContext,
|
|
5
5
|
} from '@ledgerhq/lumen-utils-shared';
|
|
6
6
|
import { useEffect, useImperativeHandle, useRef, useState } from 'react';
|
|
7
|
-
import { Pressable, StyleSheet, TextInput } from 'react-native';
|
|
7
|
+
import { Pressable, StyleSheet, TextInput, View } from 'react-native';
|
|
8
8
|
import Animated, {
|
|
9
9
|
Easing,
|
|
10
10
|
useAnimatedStyle,
|
|
@@ -13,9 +13,13 @@ import Animated, {
|
|
|
13
13
|
withSequence,
|
|
14
14
|
withTiming,
|
|
15
15
|
} from 'react-native-reanimated';
|
|
16
|
-
import { useStyleSheet } from '../../../styles';
|
|
16
|
+
import { useStyleSheet, useTheme } from '../../../styles';
|
|
17
17
|
import { Box } from '../Utility';
|
|
18
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
type AmountInputAlign,
|
|
20
|
+
type AmountInputProps,
|
|
21
|
+
type AmountInputSize,
|
|
22
|
+
} from './types';
|
|
19
23
|
|
|
20
24
|
/**
|
|
21
25
|
* AmountInput component for handling numeric input with currency display.
|
|
@@ -25,6 +29,8 @@ import { type AmountInputProps } from './types';
|
|
|
25
29
|
export const AmountInput = ({
|
|
26
30
|
lx = {},
|
|
27
31
|
style,
|
|
32
|
+
size = 'md',
|
|
33
|
+
align = 'center',
|
|
28
34
|
currencyText,
|
|
29
35
|
currencyPosition = 'left',
|
|
30
36
|
editable,
|
|
@@ -48,16 +54,20 @@ export const AmountInput = ({
|
|
|
48
54
|
});
|
|
49
55
|
|
|
50
56
|
const translateX = useSharedValue(0);
|
|
51
|
-
const animatedFontSize = useSharedValue(getFontSize(inputValue));
|
|
57
|
+
const animatedFontSize = useSharedValue(getFontSize(inputValue, size));
|
|
52
58
|
const caretOpacity = useSharedValue(0);
|
|
53
59
|
|
|
54
60
|
useImperativeHandle(ref, () => inputRef.current as TextInput, []);
|
|
55
61
|
|
|
62
|
+
const { theme } = useTheme();
|
|
56
63
|
const styles = useStyles({
|
|
64
|
+
size,
|
|
65
|
+
align,
|
|
57
66
|
hasValue: !!inputValue,
|
|
58
67
|
isEditable: !disabled,
|
|
59
68
|
isInvalid,
|
|
60
69
|
});
|
|
70
|
+
const caretFixedHeight = size === 'sm' ? theme.sizes.s28 : 0;
|
|
61
71
|
|
|
62
72
|
const animatedInputStyle = useAnimatedStyle(
|
|
63
73
|
() => ({
|
|
@@ -79,13 +89,13 @@ export const AmountInput = ({
|
|
|
79
89
|
const animatedCaretStyle = useAnimatedStyle(
|
|
80
90
|
() => ({
|
|
81
91
|
opacity: caretOpacity.value,
|
|
82
|
-
height: animatedFontSize.value,
|
|
92
|
+
height: size === 'sm' ? caretFixedHeight : animatedFontSize.value,
|
|
83
93
|
}),
|
|
84
|
-
[caretOpacity, animatedFontSize],
|
|
94
|
+
[caretOpacity, animatedFontSize, size, caretFixedHeight],
|
|
85
95
|
);
|
|
86
96
|
|
|
87
97
|
useEffect(() => {
|
|
88
|
-
const newSize = getFontSize(inputValue);
|
|
98
|
+
const newSize = getFontSize(inputValue, size);
|
|
89
99
|
|
|
90
100
|
translateX.value = withSequence(
|
|
91
101
|
withTiming(4, { duration: 0 }),
|
|
@@ -99,7 +109,7 @@ export const AmountInput = ({
|
|
|
99
109
|
duration: 250,
|
|
100
110
|
easing: Easing.bezier(0.4, 0, 0.2, 1),
|
|
101
111
|
});
|
|
102
|
-
}, [inputValue, animatedFontSize, translateX]);
|
|
112
|
+
}, [inputValue, size, animatedFontSize, translateX]);
|
|
103
113
|
|
|
104
114
|
useEffect(() => {
|
|
105
115
|
if (isFocused && !disabled) {
|
|
@@ -164,94 +174,127 @@ export const AmountInput = ({
|
|
|
164
174
|
style={styles.hiddenInput}
|
|
165
175
|
{...props}
|
|
166
176
|
/>
|
|
167
|
-
<
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
{currencyPosition === 'left' && CurrencyText}
|
|
173
|
-
|
|
174
|
-
{/** display text that mirrors the hidden input's value */}
|
|
175
|
-
<Animated.Text
|
|
176
|
-
style={[styles.displayText, animatedInputStyle, style]}
|
|
177
|
-
allowFontScaling={false}
|
|
177
|
+
<View style={styles.alignRow}>
|
|
178
|
+
<Pressable
|
|
179
|
+
onPress={handlePress}
|
|
180
|
+
style={styles.pressable}
|
|
181
|
+
accessibilityLabel={props.accessibilityLabel || 'Amount input'}
|
|
178
182
|
>
|
|
179
|
-
{
|
|
180
|
-
|
|
183
|
+
{currencyPosition === 'left' && CurrencyText}
|
|
184
|
+
|
|
185
|
+
{/** display text that mirrors the hidden input's value */}
|
|
186
|
+
<Animated.Text
|
|
187
|
+
style={[styles.displayText, animatedInputStyle, style]}
|
|
188
|
+
allowFontScaling={false}
|
|
189
|
+
>
|
|
190
|
+
{inputValue || '0'}
|
|
191
|
+
</Animated.Text>
|
|
181
192
|
|
|
182
|
-
|
|
183
|
-
|
|
193
|
+
{/** custom caret */}
|
|
194
|
+
<Animated.View style={[styles.caret, animatedCaretStyle]} />
|
|
184
195
|
|
|
185
|
-
|
|
186
|
-
|
|
196
|
+
{currencyPosition === 'right' && CurrencyText}
|
|
197
|
+
</Pressable>
|
|
198
|
+
</View>
|
|
187
199
|
</Box>
|
|
188
200
|
);
|
|
189
201
|
};
|
|
190
202
|
|
|
203
|
+
const SIZE_TYPOGRAPHY = {
|
|
204
|
+
md: 'heading0SemiBold',
|
|
205
|
+
sm: 'heading2SemiBold',
|
|
206
|
+
} as const satisfies Record<
|
|
207
|
+
AmountInputSize,
|
|
208
|
+
'heading0SemiBold' | 'heading2SemiBold'
|
|
209
|
+
>;
|
|
210
|
+
|
|
211
|
+
const ALIGN_ROW_JUSTIFY = {
|
|
212
|
+
center: 'center',
|
|
213
|
+
start: 'flex-start',
|
|
214
|
+
end: 'flex-end',
|
|
215
|
+
} as const satisfies Record<
|
|
216
|
+
AmountInputAlign,
|
|
217
|
+
'center' | 'flex-start' | 'flex-end'
|
|
218
|
+
>;
|
|
219
|
+
|
|
191
220
|
const useStyles = ({
|
|
221
|
+
size,
|
|
222
|
+
align,
|
|
192
223
|
hasValue,
|
|
193
224
|
isEditable,
|
|
194
225
|
isInvalid,
|
|
195
226
|
}: {
|
|
227
|
+
size: AmountInputSize;
|
|
228
|
+
align: AmountInputAlign;
|
|
196
229
|
hasValue: boolean;
|
|
197
230
|
isEditable: boolean;
|
|
198
231
|
isInvalid: boolean;
|
|
199
232
|
}) => {
|
|
200
233
|
return useStyleSheet(
|
|
201
|
-
(t) =>
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
opacity: 0,
|
|
210
|
-
},
|
|
211
|
-
pressable: {
|
|
212
|
-
flexDirection: 'row',
|
|
213
|
-
alignItems: 'center',
|
|
214
|
-
justifyContent: 'center',
|
|
215
|
-
},
|
|
216
|
-
displayText: StyleSheet.flatten([
|
|
217
|
-
{
|
|
218
|
-
height: t.sizes.s56,
|
|
219
|
-
backgroundColor: 'transparent',
|
|
220
|
-
color: t.colors.text.base,
|
|
221
|
-
alignItems: 'flex-start',
|
|
222
|
-
...t.typographies.heading0SemiBold,
|
|
223
|
-
},
|
|
224
|
-
!hasValue && {
|
|
225
|
-
color: t.colors.text.mutedSubtle,
|
|
226
|
-
},
|
|
227
|
-
!isEditable && {
|
|
228
|
-
color: t.colors.text.disabled,
|
|
229
|
-
},
|
|
230
|
-
isInvalid && {
|
|
231
|
-
color: t.colors.text.error,
|
|
234
|
+
(t) => {
|
|
235
|
+
const typography = t.typographies[SIZE_TYPOGRAPHY[size]];
|
|
236
|
+
const displayHeight = size === 'md' ? t.sizes.s56 : t.sizes.s36;
|
|
237
|
+
|
|
238
|
+
return {
|
|
239
|
+
container: {
|
|
240
|
+
position: 'relative',
|
|
241
|
+
width: t.sizes.full,
|
|
232
242
|
},
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
243
|
+
hiddenInput: {
|
|
244
|
+
position: 'absolute',
|
|
245
|
+
width: t.sizes.full,
|
|
246
|
+
height: t.sizes.full,
|
|
247
|
+
opacity: 0,
|
|
238
248
|
},
|
|
239
|
-
|
|
240
|
-
|
|
249
|
+
alignRow: {
|
|
250
|
+
width: t.sizes.full,
|
|
251
|
+
flexDirection: 'row',
|
|
252
|
+
justifyContent: ALIGN_ROW_JUSTIFY[align],
|
|
241
253
|
},
|
|
242
|
-
|
|
243
|
-
|
|
254
|
+
pressable: {
|
|
255
|
+
flexDirection: 'row',
|
|
256
|
+
alignItems: 'center',
|
|
244
257
|
},
|
|
245
|
-
|
|
246
|
-
|
|
258
|
+
displayText: StyleSheet.flatten([
|
|
259
|
+
{
|
|
260
|
+
height: displayHeight,
|
|
261
|
+
backgroundColor: 'transparent',
|
|
262
|
+
color: t.colors.text.base,
|
|
263
|
+
alignItems: 'flex-start',
|
|
264
|
+
...typography,
|
|
265
|
+
},
|
|
266
|
+
!hasValue && {
|
|
267
|
+
color: t.colors.text.mutedSubtle,
|
|
268
|
+
},
|
|
269
|
+
!isEditable && {
|
|
270
|
+
color: t.colors.text.disabled,
|
|
271
|
+
},
|
|
272
|
+
isInvalid && {
|
|
273
|
+
color: t.colors.text.error,
|
|
274
|
+
},
|
|
275
|
+
]),
|
|
276
|
+
currency: StyleSheet.flatten([
|
|
277
|
+
{
|
|
278
|
+
color: t.colors.text.base,
|
|
279
|
+
...typography,
|
|
280
|
+
},
|
|
281
|
+
!hasValue && {
|
|
282
|
+
color: t.colors.text.mutedSubtle,
|
|
283
|
+
},
|
|
284
|
+
!isEditable && {
|
|
285
|
+
color: t.colors.text.disabled,
|
|
286
|
+
},
|
|
287
|
+
isInvalid && {
|
|
288
|
+
color: t.colors.text.error,
|
|
289
|
+
},
|
|
290
|
+
]),
|
|
291
|
+
caret: {
|
|
292
|
+
marginHorizontal: t.spacings.s2,
|
|
293
|
+
width: t.sizes.s2,
|
|
294
|
+
backgroundColor: t.colors.text.active,
|
|
247
295
|
},
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
width: t.sizes.s2,
|
|
252
|
-
backgroundColor: t.colors.text.active,
|
|
253
|
-
},
|
|
254
|
-
}),
|
|
255
|
-
[hasValue, isEditable, isInvalid],
|
|
296
|
+
};
|
|
297
|
+
},
|
|
298
|
+
[size, align, hasValue, isEditable, isInvalid],
|
|
256
299
|
);
|
|
257
300
|
};
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { TextInputProps, ViewStyle } from 'react-native';
|
|
2
2
|
import type { BoxProps } from '../Utility';
|
|
3
3
|
|
|
4
|
+
export type AmountInputSize = 'md' | 'sm';
|
|
5
|
+
|
|
6
|
+
export type AmountInputAlign = 'center' | 'start' | 'end';
|
|
7
|
+
|
|
4
8
|
export type AmountInputProps = Omit<
|
|
5
9
|
TextInputProps,
|
|
6
10
|
'value' | 'onChangeText'
|
|
@@ -15,6 +19,16 @@ export type AmountInputProps = Omit<
|
|
|
15
19
|
* @required
|
|
16
20
|
*/
|
|
17
21
|
onChangeText: (text: string) => void;
|
|
22
|
+
/**
|
|
23
|
+
* Visual size of the amount input.
|
|
24
|
+
* @default 'md'
|
|
25
|
+
*/
|
|
26
|
+
size?: AmountInputSize;
|
|
27
|
+
/**
|
|
28
|
+
* Horizontal alignment of the amount and currency.
|
|
29
|
+
* @default 'center'
|
|
30
|
+
*/
|
|
31
|
+
align?: AmountInputAlign;
|
|
18
32
|
/**
|
|
19
33
|
* The currency text (e.g. USD, EUR)
|
|
20
34
|
*/
|
|
@@ -8,7 +8,7 @@ import { Box } from '../Utility';
|
|
|
8
8
|
|
|
9
9
|
<Meta title='Communication/Avatar' of={AvatarStories} />
|
|
10
10
|
|
|
11
|
-
#
|
|
11
|
+
# Avatar
|
|
12
12
|
|
|
13
13
|
<CustomTabs>
|
|
14
14
|
<Tab label="Overview">
|
|
@@ -55,6 +55,8 @@ An optional notification indicator can be displayed to show status or alerts:
|
|
|
55
55
|
|
|
56
56
|
- **showNotification**: Boolean prop to toggle the notification dot (default: false)
|
|
57
57
|
|
|
58
|
+
> The notification dot is only rendered on the `sm` and `md` sizes. It is suppressed on `lg` and `xl` even when `showNotification` is `true`.
|
|
59
|
+
|
|
58
60
|
<Canvas of={AvatarStories.NotificationShowcase} />
|
|
59
61
|
|
|
60
62
|
### As Interactive Trigger
|
|
@@ -195,26 +195,24 @@ describe('Avatar Component', () => {
|
|
|
195
195
|
|
|
196
196
|
dot = toJSON().children[0];
|
|
197
197
|
expect(dot.props.style.height).toBe(sizes.s12);
|
|
198
|
-
|
|
199
|
-
rerender(
|
|
200
|
-
<TestWrapper>
|
|
201
|
-
<Avatar testID='avatar-id' size='lg' showNotification />
|
|
202
|
-
</TestWrapper>,
|
|
203
|
-
);
|
|
204
|
-
|
|
205
|
-
dot = toJSON().children[0];
|
|
206
|
-
expect(dot.props.style.height).toBe(sizes.s14);
|
|
207
|
-
|
|
208
|
-
rerender(
|
|
209
|
-
<TestWrapper>
|
|
210
|
-
<Avatar testID='avatar-id' size='xl' showNotification />
|
|
211
|
-
</TestWrapper>,
|
|
212
|
-
);
|
|
213
|
-
|
|
214
|
-
dot = toJSON().children[0];
|
|
215
|
-
expect(dot.props.style.height).toBe(sizes.s16);
|
|
216
198
|
});
|
|
217
199
|
|
|
200
|
+
it.each(['lg', 'xl'] as const)(
|
|
201
|
+
'should not render the notification indicator on size=%s even when showNotification is true',
|
|
202
|
+
(size) => {
|
|
203
|
+
const { toJSON } = render(
|
|
204
|
+
<TestWrapper>
|
|
205
|
+
<Avatar testID='avatar-id' size={size} showNotification />
|
|
206
|
+
</TestWrapper>,
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
const tree = toJSON();
|
|
210
|
+
expect(tree.props.testID).toBe('avatar-id');
|
|
211
|
+
expect(tree.props.accessibilityRole).toBe('image');
|
|
212
|
+
expect(tree.props.accessibilityLabel).toBe('avatar');
|
|
213
|
+
},
|
|
214
|
+
);
|
|
215
|
+
|
|
218
216
|
it('should apply custom styles', () => {
|
|
219
217
|
const customStyle = { borderWidth: 2 };
|
|
220
218
|
const { getByTestId } = render(
|
|
@@ -16,14 +16,11 @@ const fallbackSizes = {
|
|
|
16
16
|
xl: 40,
|
|
17
17
|
} as const;
|
|
18
18
|
|
|
19
|
-
const dotSizeMap:
|
|
20
|
-
Size,
|
|
21
|
-
NonNullable<React.ComponentProps<typeof DotIndicator>['size']>
|
|
19
|
+
const dotSizeMap: Partial<
|
|
20
|
+
Record<Size, NonNullable<React.ComponentProps<typeof DotIndicator>['size']>>
|
|
22
21
|
> = {
|
|
23
|
-
sm: '
|
|
24
|
-
md: '
|
|
25
|
-
lg: 'md',
|
|
26
|
-
xl: 'lg',
|
|
22
|
+
sm: 'lg',
|
|
23
|
+
md: 'xl',
|
|
27
24
|
};
|
|
28
25
|
|
|
29
26
|
const useStyles = ({ size }: { size: Size }) => {
|
|
@@ -81,7 +78,7 @@ export const Avatar = ({
|
|
|
81
78
|
src,
|
|
82
79
|
alt = 'avatar',
|
|
83
80
|
size = 'md',
|
|
84
|
-
showNotification = false,
|
|
81
|
+
showNotification: showNotificationProp = false,
|
|
85
82
|
testID,
|
|
86
83
|
ref,
|
|
87
84
|
...props
|
|
@@ -93,6 +90,10 @@ export const Avatar = ({
|
|
|
93
90
|
|
|
94
91
|
const resolvedAlt = alt || t('components.avatar.defaultAlt');
|
|
95
92
|
|
|
93
|
+
// dot indicator is not visible on larger sizes, regardless of the `showNotification` prop
|
|
94
|
+
const showNotification =
|
|
95
|
+
showNotificationProp && (size === 'sm' || size === 'md');
|
|
96
|
+
|
|
96
97
|
const accessibilityLabel = showNotification
|
|
97
98
|
? `${resolvedAlt}, ${t('components.avatar.notificationAriaLabel')}`
|
|
98
99
|
: resolvedAlt;
|
|
@@ -196,9 +196,7 @@ export const StatesShowcase: Story = {
|
|
|
196
196
|
<Card {...args} lx={{ width: 's320' }} disabled>
|
|
197
197
|
<CardHeader>
|
|
198
198
|
<CardLeading>
|
|
199
|
-
<
|
|
200
|
-
<CryptoIcon ledgerId='bitcoin' ticker='BTC' size={48} />
|
|
201
|
-
</Box>
|
|
199
|
+
<CryptoIcon ledgerId='bitcoin' ticker='BTC' size={48} />
|
|
202
200
|
<CardContent>
|
|
203
201
|
<CardContentTitle>Disabled</CardContentTitle>
|
|
204
202
|
<CardContentDescription>Non-interactive</CardContentDescription>
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import { Meta, Canvas, Controls } from '@storybook/addon-docs/blocks';
|
|
2
2
|
import * as DotIconStories from './DotIcon.stories';
|
|
3
|
+
import { CustomTabs, Tab } from '../../../../.storybook/components';
|
|
3
4
|
|
|
4
5
|
<Meta title='Communication/DotIcon' of={DotIconStories} />
|
|
5
6
|
|
|
6
7
|
# DotIcon
|
|
7
8
|
|
|
9
|
+
<CustomTabs>
|
|
10
|
+
<Tab label="Overview">
|
|
11
|
+
|
|
8
12
|
## Introduction
|
|
9
13
|
|
|
10
14
|
DotIcon positions a small icon indicator at a configurable corner of a child element such as MediaImage or Spot. The dot background uses a semantic color (`success`, `muted`, or `error`) to convey meaning at a glance.
|
|
15
|
+
|
|
11
16
|
> View in [Figma](https://www.figma.com/design/zSkvGGiqcnhywp2l3HTHxA/1.-Symbol-Library?node-id=6159-1866).
|
|
12
17
|
|
|
13
18
|
## Anatomy
|
|
@@ -50,7 +55,94 @@ The dot size is driven by the parent MediaImage or Spot size via the mapping hel
|
|
|
50
55
|
|
|
51
56
|
<Canvas of={DotIconStories.SizeShowcase} />
|
|
52
57
|
|
|
58
|
+
### Disabled
|
|
59
|
+
|
|
60
|
+
Only set `disabled` on `DotIcon`. The state is propagated to the child via context. Passing it to both stacks the opacity overlay.
|
|
61
|
+
|
|
62
|
+
<Canvas of={DotIconStories.DisabledShowcase} />
|
|
63
|
+
|
|
53
64
|
## Accessibility
|
|
54
65
|
|
|
55
66
|
- The icon is purely decorative; the child element should carry its own accessibility label.
|
|
56
67
|
- Pair semantic appearances with meaningful icons so the state can be understood without relying on color alone.
|
|
68
|
+
|
|
69
|
+
</Tab>
|
|
70
|
+
<Tab label="Implementation">
|
|
71
|
+
|
|
72
|
+
## Setup
|
|
73
|
+
|
|
74
|
+
Install and set up the library with our [Setup Guide →](?path=/docs/getting-started-setup--docs).
|
|
75
|
+
|
|
76
|
+
### Basic Usage
|
|
77
|
+
|
|
78
|
+
```tsx
|
|
79
|
+
import { DotIcon, MediaImage } from '@ledgerhq/lumen-ui-rnative';
|
|
80
|
+
import { ArrowDown } from '@ledgerhq/lumen-ui-rnative/symbols';
|
|
81
|
+
|
|
82
|
+
function MyComponent() {
|
|
83
|
+
return (
|
|
84
|
+
<DotIcon appearance='success' icon={ArrowDown}>
|
|
85
|
+
<MediaImage src='https://example.com/ada.png' alt='Cardano' size={48} />
|
|
86
|
+
</DotIcon>
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Pin Placement
|
|
92
|
+
|
|
93
|
+
Position the dot at any of the four corners of the child:
|
|
94
|
+
|
|
95
|
+
```tsx
|
|
96
|
+
<DotIcon appearance='success' icon={ArrowDown} pin='top-end'>
|
|
97
|
+
<MediaImage src='https://example.com/ada.png' alt='Cardano' size={48} />
|
|
98
|
+
</DotIcon>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Shapes
|
|
102
|
+
|
|
103
|
+
Use `shape='square'` to match a square child element:
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
<DotIcon appearance='muted' icon={ArrowDown} shape='square'>
|
|
107
|
+
<MediaImage src='https://example.com/ada.png' alt='Cardano' size={48} shape='square' />
|
|
108
|
+
</DotIcon>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Appearances
|
|
112
|
+
|
|
113
|
+
Pick a semantic color via `appearance`:
|
|
114
|
+
|
|
115
|
+
```tsx
|
|
116
|
+
<DotIcon appearance='success' icon={ArrowDown}>...</DotIcon>
|
|
117
|
+
<DotIcon appearance='muted' icon={ArrowUp}>...</DotIcon>
|
|
118
|
+
<DotIcon appearance='error' icon={Close}>...</DotIcon>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Sizing
|
|
122
|
+
|
|
123
|
+
The dot size is driven by the parent's size via the mapping helpers:
|
|
124
|
+
|
|
125
|
+
```tsx
|
|
126
|
+
import { DotIcon, mediaImageDotIconSizeMap, MediaImage } from '@ledgerhq/lumen-ui-rnative';
|
|
127
|
+
|
|
128
|
+
<DotIcon
|
|
129
|
+
appearance='success'
|
|
130
|
+
icon={ArrowDown}
|
|
131
|
+
size={mediaImageDotIconSizeMap[48]}
|
|
132
|
+
>
|
|
133
|
+
<MediaImage src='https://example.com/ada.png' alt='Cardano' size={48} />
|
|
134
|
+
</DotIcon>;
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Disabled State
|
|
138
|
+
|
|
139
|
+
Only set `disabled` on `DotIcon`. The state is propagated to the child via context. Passing it to both stacks the opacity overlay.
|
|
140
|
+
|
|
141
|
+
```tsx
|
|
142
|
+
<DotIcon appearance='success' icon={ArrowDown} disabled>
|
|
143
|
+
<MediaImage src='https://example.com/ada.png' alt='Cardano' size={48} />
|
|
144
|
+
</DotIcon>
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
</Tab>
|
|
148
|
+
</CustomTabs>
|
|
@@ -113,6 +113,41 @@ export const AppearanceShowcase: Story = {
|
|
|
113
113
|
),
|
|
114
114
|
};
|
|
115
115
|
|
|
116
|
+
export const DisabledShowcase: Story = {
|
|
117
|
+
args: { appearance: 'success', icon: ArrowDown },
|
|
118
|
+
render: () => (
|
|
119
|
+
<Box lx={{ flexDirection: 'row', alignItems: 'center', gap: 's32' }}>
|
|
120
|
+
<DotIcon
|
|
121
|
+
appearance='success'
|
|
122
|
+
icon={ArrowDown}
|
|
123
|
+
size={mediaImageDotIconSizeMap[48]}
|
|
124
|
+
pin='bottom-end'
|
|
125
|
+
disabled
|
|
126
|
+
>
|
|
127
|
+
<MediaImage src={parentSrc} size={48} shape='circle' />
|
|
128
|
+
</DotIcon>
|
|
129
|
+
<DotIcon
|
|
130
|
+
appearance='muted'
|
|
131
|
+
icon={ArrowUp}
|
|
132
|
+
size={mediaImageDotIconSizeMap[48]}
|
|
133
|
+
pin='bottom-end'
|
|
134
|
+
disabled
|
|
135
|
+
>
|
|
136
|
+
<MediaImage src={parentSrc} size={48} shape='circle' />
|
|
137
|
+
</DotIcon>
|
|
138
|
+
<DotIcon
|
|
139
|
+
appearance='error'
|
|
140
|
+
icon={Close}
|
|
141
|
+
size={mediaImageDotIconSizeMap[48]}
|
|
142
|
+
pin='bottom-end'
|
|
143
|
+
disabled
|
|
144
|
+
>
|
|
145
|
+
<MediaImage src={parentSrc} size={48} shape='circle' />
|
|
146
|
+
</DotIcon>
|
|
147
|
+
</Box>
|
|
148
|
+
),
|
|
149
|
+
};
|
|
150
|
+
|
|
116
151
|
export const SizeShowcase: Story = {
|
|
117
152
|
args: { appearance: 'muted', icon: Link },
|
|
118
153
|
render: () => (
|
|
@@ -149,6 +184,14 @@ export const SizeShowcase: Story = {
|
|
|
149
184
|
>
|
|
150
185
|
<MediaImage src={parentSrc} size={64} shape='circle' />
|
|
151
186
|
</DotIcon>
|
|
187
|
+
<DotIcon
|
|
188
|
+
appearance='muted'
|
|
189
|
+
icon={Spinner}
|
|
190
|
+
size={mediaImageDotIconSizeMap[72]}
|
|
191
|
+
pin='bottom-end'
|
|
192
|
+
>
|
|
193
|
+
<MediaImage src={parentSrc} size={72} shape='circle' />
|
|
194
|
+
</DotIcon>
|
|
152
195
|
</Box>
|
|
153
196
|
),
|
|
154
197
|
};
|