@ledgerhq/lumen-ui-rnative 0.1.35 → 0.1.37
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.js +2 -2
- package/dist/module/lib/Animations/Pulse/Pulse.js.map +1 -1
- 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.mdx +1 -1
- package/dist/module/lib/Components/Avatar/Avatar.mdx +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/DescriptionItem/DescriptionItem.js +184 -0
- package/dist/module/lib/Components/DescriptionItem/DescriptionItem.js.map +1 -0
- package/dist/module/lib/Components/DescriptionItem/DescriptionItem.mdx +139 -0
- package/dist/module/lib/Components/DescriptionItem/DescriptionItem.stories.js +258 -0
- package/dist/module/lib/Components/DescriptionItem/DescriptionItem.stories.js.map +1 -0
- package/dist/module/lib/Components/DescriptionItem/DescriptionItem.test.js +94 -0
- package/dist/module/lib/Components/DescriptionItem/DescriptionItem.test.js.map +1 -0
- package/dist/module/lib/Components/DescriptionItem/index.js +5 -0
- package/dist/module/lib/Components/DescriptionItem/index.js.map +1 -0
- package/dist/module/lib/Components/DescriptionItem/types.js +4 -0
- package/dist/module/lib/Components/DescriptionItem/types.js.map +1 -0
- package/dist/module/lib/Components/Divider/Divider.mdx +1 -1
- package/dist/module/lib/Components/DotIcon/DotIcon.js +44 -23
- 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 +47 -0
- package/dist/module/lib/Components/DotIcon/DotIcon.stories.js.map +1 -1
- package/dist/module/lib/Components/DotSymbol/DotSymbol.js +52 -30
- 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 +41 -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/Link/Link.mdx +1 -1
- package/dist/module/lib/Components/MediaBanner/MediaBanner.mdx +1 -1
- package/dist/module/lib/Components/MediaButton/MediaButton.js +17 -17
- package/dist/module/lib/Components/MediaButton/MediaButton.js.map +1 -1
- package/dist/module/lib/Components/MediaButton/MediaButton.mdx +3 -3
- 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 +20 -4
- package/dist/module/lib/Components/MediaImage/MediaImage.js.map +1 -1
- package/dist/module/lib/Components/MediaImage/MediaImage.stories.js +35 -0
- package/dist/module/lib/Components/MediaImage/MediaImage.stories.js.map +1 -1
- package/dist/module/lib/Components/NavBar/CoinCapsule.js +3 -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.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/Select/Select.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/Tile/Tile.mdx +1 -1
- package/dist/module/lib/Components/Tooltip/Tooltip.mdx +1 -1
- package/dist/module/lib/Components/index.js +1 -0
- package/dist/module/lib/Components/index.js.map +1 -1
- package/dist/typescript/src/lib/Animations/Pulse/Pulse.d.ts.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/DescriptionItem/DescriptionItem.d.ts +42 -0
- package/dist/typescript/src/lib/Components/DescriptionItem/DescriptionItem.d.ts.map +1 -0
- package/dist/typescript/src/lib/Components/DescriptionItem/index.d.ts +3 -0
- package/dist/typescript/src/lib/Components/DescriptionItem/index.d.ts.map +1 -0
- package/dist/typescript/src/lib/Components/DescriptionItem/types.d.ts +39 -0
- package/dist/typescript/src/lib/Components/DescriptionItem/types.d.ts.map +1 -0
- package/dist/typescript/src/lib/Components/DotIcon/DotIcon.d.ts +1 -1
- package/dist/typescript/src/lib/Components/DotIcon/DotIcon.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/DotIcon/types.d.ts +6 -0
- package/dist/typescript/src/lib/Components/DotIcon/types.d.ts.map +1 -1
- 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 +6 -0
- package/dist/typescript/src/lib/Components/DotSymbol/types.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/MediaButton/MediaButton.d.ts +3 -3
- 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 +6 -0
- 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/index.d.ts +1 -0
- 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/Pulse/Pulse.tsx +6 -3
- 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 +1 -1
- package/src/lib/Components/Avatar/Avatar.mdx +1 -1
- 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/DescriptionItem/DescriptionItem.mdx +139 -0
- package/src/lib/Components/DescriptionItem/DescriptionItem.stories.tsx +234 -0
- package/src/lib/Components/DescriptionItem/DescriptionItem.test.tsx +112 -0
- package/src/lib/Components/DescriptionItem/DescriptionItem.tsx +224 -0
- package/src/lib/Components/DescriptionItem/index.ts +2 -0
- package/src/lib/Components/DescriptionItem/types.ts +44 -0
- 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 +35 -0
- package/src/lib/Components/DotIcon/DotIcon.tsx +31 -14
- package/src/lib/Components/DotIcon/types.ts +6 -0
- package/src/lib/Components/DotSymbol/DotSymbol.mdx +79 -2
- package/src/lib/Components/DotSymbol/DotSymbol.stories.tsx +17 -0
- package/src/lib/Components/DotSymbol/DotSymbol.tsx +42 -24
- package/src/lib/Components/DotSymbol/types.ts +6 -0
- package/src/lib/Components/IconButton/IconButton.mdx +1 -1
- package/src/lib/Components/InteractiveIcon/InteractiveIcon.mdx +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 +3 -3
- 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 +33 -20
- package/src/lib/Components/MediaButton/types.ts +6 -6
- package/src/lib/Components/MediaImage/MediaImage.stories.tsx +18 -0
- package/src/lib/Components/MediaImage/MediaImage.tsx +12 -2
- package/src/lib/Components/MediaImage/types.ts +6 -0
- package/src/lib/Components/NavBar/CoinCapsule.tsx +3 -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.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/Select/Select.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/Tile/Tile.mdx +1 -1
- package/src/lib/Components/Tooltip/Tooltip.mdx +1 -1
- package/src/lib/Components/index.ts +1 -0
|
@@ -44,30 +44,40 @@ export const Base: Story = {
|
|
|
44
44
|
export const SizeShowcase: Story = {
|
|
45
45
|
render: () => (
|
|
46
46
|
<Box lx={{ flexDirection: 'row', alignItems: 'center', gap: 's16' }}>
|
|
47
|
-
<MediaButton
|
|
47
|
+
<MediaButton
|
|
48
|
+
size='sm'
|
|
49
|
+
leadingContent={<Star size={20} />}
|
|
50
|
+
leadingContentShape='flat'
|
|
51
|
+
>
|
|
48
52
|
Small
|
|
49
53
|
</MediaButton>
|
|
50
|
-
<MediaButton
|
|
54
|
+
<MediaButton
|
|
55
|
+
size='md'
|
|
56
|
+
leadingContent={<Star size={20} />}
|
|
57
|
+
leadingContentShape='flat'
|
|
58
|
+
>
|
|
51
59
|
Medium
|
|
52
60
|
</MediaButton>
|
|
53
61
|
</Box>
|
|
54
62
|
),
|
|
55
63
|
};
|
|
56
64
|
|
|
57
|
-
export const
|
|
65
|
+
export const LeadingContentShapeShowcase: Story = {
|
|
58
66
|
render: () => (
|
|
59
67
|
<Box lx={{ flexDirection: 'column', gap: 's16' }}>
|
|
60
68
|
<Box lx={{ flexDirection: 'row', alignItems: 'center', gap: 's16' }}>
|
|
61
69
|
<MediaButton
|
|
62
|
-
|
|
63
|
-
|
|
70
|
+
leadingContent={<Settings size={20} />}
|
|
71
|
+
leadingContentShape='flat'
|
|
64
72
|
appearance='gray'
|
|
65
73
|
>
|
|
66
74
|
Flat icon (md)
|
|
67
75
|
</MediaButton>
|
|
68
76
|
<MediaButton
|
|
69
|
-
|
|
70
|
-
|
|
77
|
+
leadingContent={
|
|
78
|
+
<CryptoIcon ledgerId='bitcoin' ticker='BTC' size={32} />
|
|
79
|
+
}
|
|
80
|
+
leadingContentShape='rounded'
|
|
71
81
|
appearance='gray'
|
|
72
82
|
>
|
|
73
83
|
Rounded icon (md)
|
|
@@ -76,16 +86,18 @@ export const IconTypeShowcase: Story = {
|
|
|
76
86
|
</Box>
|
|
77
87
|
<Box lx={{ flexDirection: 'row', alignItems: 'center', gap: 's16' }}>
|
|
78
88
|
<MediaButton
|
|
79
|
-
|
|
80
|
-
|
|
89
|
+
leadingContent={<Settings size={20} />}
|
|
90
|
+
leadingContentShape='flat'
|
|
81
91
|
appearance='gray'
|
|
82
92
|
size='sm'
|
|
83
93
|
>
|
|
84
94
|
Flat icon (sm)
|
|
85
95
|
</MediaButton>
|
|
86
96
|
<MediaButton
|
|
87
|
-
|
|
88
|
-
|
|
97
|
+
leadingContent={
|
|
98
|
+
<CryptoIcon ledgerId='bitcoin' ticker='BTC' size={24} />
|
|
99
|
+
}
|
|
100
|
+
leadingContentShape='rounded'
|
|
89
101
|
appearance='gray'
|
|
90
102
|
size='sm'
|
|
91
103
|
>
|
|
@@ -112,15 +124,17 @@ export const AppearanceShowcase: Story = {
|
|
|
112
124
|
<MediaButton appearance={appearance}>{appearance}</MediaButton>
|
|
113
125
|
<MediaButton
|
|
114
126
|
appearance={appearance}
|
|
115
|
-
|
|
116
|
-
|
|
127
|
+
leadingContent={<Settings size={20} />}
|
|
128
|
+
leadingContentShape='flat'
|
|
117
129
|
>
|
|
118
130
|
{appearance}
|
|
119
131
|
</MediaButton>
|
|
120
132
|
<MediaButton
|
|
121
133
|
appearance={appearance}
|
|
122
|
-
|
|
123
|
-
|
|
134
|
+
leadingContent={
|
|
135
|
+
<CryptoIcon ledgerId='bitcoin' ticker='BTC' size={32} />
|
|
136
|
+
}
|
|
137
|
+
leadingContentShape='rounded'
|
|
124
138
|
>
|
|
125
139
|
{appearance}
|
|
126
140
|
</MediaButton>
|
|
@@ -64,8 +64,8 @@ describe('MediaButton', () => {
|
|
|
64
64
|
renderWithProvider(
|
|
65
65
|
<MediaButton
|
|
66
66
|
testID='trigger'
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
leadingContent={<Settings size={20} testID='icon' />}
|
|
68
|
+
leadingContentShape='flat'
|
|
69
69
|
>
|
|
70
70
|
Network
|
|
71
71
|
</MediaButton>,
|
|
@@ -78,8 +78,8 @@ describe('MediaButton', () => {
|
|
|
78
78
|
renderWithProvider(
|
|
79
79
|
<MediaButton
|
|
80
80
|
testID='trigger'
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
leadingContent={<View testID='crypto-icon' />}
|
|
82
|
+
leadingContentShape='rounded'
|
|
83
83
|
>
|
|
84
84
|
Bitcoin
|
|
85
85
|
</MediaButton>,
|
|
@@ -7,20 +7,20 @@ import type { MediaButtonProps } from './types';
|
|
|
7
7
|
|
|
8
8
|
type Appearance = NonNullable<MediaButtonProps['appearance']>;
|
|
9
9
|
type Size = NonNullable<MediaButtonProps['size']>;
|
|
10
|
-
type
|
|
10
|
+
type LeadingContentShape = 'flat' | 'rounded' | 'none';
|
|
11
11
|
|
|
12
12
|
const useStyles = ({
|
|
13
13
|
appearance,
|
|
14
14
|
size,
|
|
15
15
|
disabled,
|
|
16
16
|
pressed,
|
|
17
|
-
|
|
17
|
+
leadingContentShape,
|
|
18
18
|
}: {
|
|
19
19
|
appearance: Appearance;
|
|
20
20
|
size: Size;
|
|
21
21
|
disabled: boolean;
|
|
22
22
|
pressed: boolean;
|
|
23
|
-
|
|
23
|
+
leadingContentShape: LeadingContentShape;
|
|
24
24
|
}) => {
|
|
25
25
|
return useStyleSheet(
|
|
26
26
|
(t) => {
|
|
@@ -45,7 +45,10 @@ const useStyles = ({
|
|
|
45
45
|
paddingRight: number;
|
|
46
46
|
};
|
|
47
47
|
|
|
48
|
-
const paddingMap: Record<
|
|
48
|
+
const paddingMap: Record<
|
|
49
|
+
Size,
|
|
50
|
+
Record<LeadingContentShape, PaddingStyle>
|
|
51
|
+
> = {
|
|
49
52
|
md: {
|
|
50
53
|
flat: {
|
|
51
54
|
paddingTop: t.spacings.s12,
|
|
@@ -97,7 +100,7 @@ const useStyles = ({
|
|
|
97
100
|
backgroundColor: bgColors[appearance],
|
|
98
101
|
gap: t.spacings.s8,
|
|
99
102
|
},
|
|
100
|
-
paddingMap[size][
|
|
103
|
+
paddingMap[size][leadingContentShape],
|
|
101
104
|
pressed && { backgroundColor: pressedBgColors[appearance] },
|
|
102
105
|
disabled && { backgroundColor: t.colors.bg.disabled },
|
|
103
106
|
appearance === 'no-background' &&
|
|
@@ -115,7 +118,7 @@ const useStyles = ({
|
|
|
115
118
|
alignItems: 'center',
|
|
116
119
|
gap: t.spacings.s2,
|
|
117
120
|
},
|
|
118
|
-
|
|
121
|
+
leadingContent: {
|
|
119
122
|
flexShrink: 0,
|
|
120
123
|
},
|
|
121
124
|
chevron: {
|
|
@@ -124,13 +127,13 @@ const useStyles = ({
|
|
|
124
127
|
},
|
|
125
128
|
};
|
|
126
129
|
},
|
|
127
|
-
[appearance, size, disabled, pressed,
|
|
130
|
+
[appearance, size, disabled, pressed, leadingContentShape],
|
|
128
131
|
);
|
|
129
132
|
};
|
|
130
133
|
|
|
131
134
|
/**
|
|
132
135
|
* Media button for select/dropdown components. Displays a label with an optional
|
|
133
|
-
* leading
|
|
136
|
+
* leading content and a trailing chevron indicator.
|
|
134
137
|
*
|
|
135
138
|
* This component is intended to be used exclusively as the trigger inside a Select or
|
|
136
139
|
* dropdown pattern. It should not be used as a standalone action button — use `Button`
|
|
@@ -142,7 +145,7 @@ const useStyles = ({
|
|
|
142
145
|
* import { MediaButton } from '@ledgerhq/lumen-ui-rnative';
|
|
143
146
|
* import { Settings } from '@ledgerhq/lumen-ui-rnative/symbols';
|
|
144
147
|
*
|
|
145
|
-
* <MediaButton
|
|
148
|
+
* <MediaButton leadingContent={<Settings size={20} />} leadingContentShape="flat">
|
|
146
149
|
* Network
|
|
147
150
|
* </MediaButton>
|
|
148
151
|
*
|
|
@@ -154,14 +157,16 @@ export const MediaButton = ({
|
|
|
154
157
|
appearance = 'gray',
|
|
155
158
|
size = 'md',
|
|
156
159
|
disabled = false,
|
|
157
|
-
|
|
158
|
-
|
|
160
|
+
leadingContent,
|
|
161
|
+
leadingContentShape = 'flat',
|
|
159
162
|
hideChevron = false,
|
|
160
163
|
children: label,
|
|
161
164
|
ref,
|
|
162
165
|
...props
|
|
163
166
|
}: MediaButtonProps) => {
|
|
164
|
-
const
|
|
167
|
+
const effectiveLeadingContentShape: LeadingContentShape = leadingContent
|
|
168
|
+
? leadingContentShape
|
|
169
|
+
: 'none';
|
|
165
170
|
|
|
166
171
|
return (
|
|
167
172
|
<Pressable
|
|
@@ -179,8 +184,8 @@ export const MediaButton = ({
|
|
|
179
184
|
size={size}
|
|
180
185
|
disabled={disabled}
|
|
181
186
|
pressed={pressed}
|
|
182
|
-
|
|
183
|
-
|
|
187
|
+
leadingContent={leadingContent}
|
|
188
|
+
leadingContentShape={effectiveLeadingContentShape}
|
|
184
189
|
hideChevron={hideChevron}
|
|
185
190
|
>
|
|
186
191
|
{label}
|
|
@@ -195,8 +200,8 @@ type MediaButtonContentProps = PropsWithChildren<{
|
|
|
195
200
|
size: Size;
|
|
196
201
|
disabled: boolean;
|
|
197
202
|
pressed: boolean;
|
|
198
|
-
|
|
199
|
-
|
|
203
|
+
leadingContent?: MediaButtonProps['leadingContent'];
|
|
204
|
+
leadingContentShape: LeadingContentShape;
|
|
200
205
|
hideChevron: boolean;
|
|
201
206
|
}>;
|
|
202
207
|
|
|
@@ -205,16 +210,24 @@ const MediaButtonContent = ({
|
|
|
205
210
|
size,
|
|
206
211
|
disabled,
|
|
207
212
|
pressed,
|
|
208
|
-
|
|
209
|
-
|
|
213
|
+
leadingContent,
|
|
214
|
+
leadingContentShape,
|
|
210
215
|
hideChevron,
|
|
211
216
|
children,
|
|
212
217
|
}: MediaButtonContentProps) => {
|
|
213
|
-
const styles = useStyles({
|
|
218
|
+
const styles = useStyles({
|
|
219
|
+
appearance,
|
|
220
|
+
size,
|
|
221
|
+
disabled,
|
|
222
|
+
pressed,
|
|
223
|
+
leadingContentShape,
|
|
224
|
+
});
|
|
214
225
|
|
|
215
226
|
return (
|
|
216
227
|
<View style={styles.container} testID='button-trigger-content'>
|
|
217
|
-
{
|
|
228
|
+
{leadingContent && (
|
|
229
|
+
<View style={styles.leadingContent}>{leadingContent}</View>
|
|
230
|
+
)}
|
|
218
231
|
<View style={styles.labelWrapper}>
|
|
219
232
|
<Text style={styles.label} numberOfLines={1} ellipsizeMode='tail'>
|
|
220
233
|
{children}
|
|
@@ -13,19 +13,19 @@ export type MediaButtonProps = {
|
|
|
13
13
|
*/
|
|
14
14
|
size?: 'sm' | 'md';
|
|
15
15
|
/**
|
|
16
|
-
* An optional pre-rendered icon
|
|
17
|
-
* Consumer is responsible for sizing the icon.
|
|
16
|
+
* An optional leading content, usually a pre-rendered icon.
|
|
17
|
+
* Consumer is responsible for sizing the icon (typically 20px).
|
|
18
18
|
*/
|
|
19
|
-
|
|
19
|
+
leadingContent?: ReactNode;
|
|
20
20
|
/**
|
|
21
|
-
* Determines the padding scheme when
|
|
21
|
+
* Determines the padding scheme when `leadingContent` is present.
|
|
22
22
|
* - `'flat'`: Standard padding for line/interface icons.
|
|
23
23
|
* - `'rounded'`: Tighter left padding for circular icons with their own background (e.g., crypto icons).
|
|
24
24
|
*
|
|
25
|
-
* Only relevant when `
|
|
25
|
+
* Only relevant when `leadingContent` is provided.
|
|
26
26
|
* @default 'flat'
|
|
27
27
|
*/
|
|
28
|
-
|
|
28
|
+
leadingContentShape?: 'flat' | 'rounded';
|
|
29
29
|
/**
|
|
30
30
|
* When true, hides the trailing chevron indicator.
|
|
31
31
|
* @default false
|
|
@@ -86,3 +86,21 @@ export const LoadingShowcase: Story = {
|
|
|
86
86
|
</Box>
|
|
87
87
|
),
|
|
88
88
|
};
|
|
89
|
+
|
|
90
|
+
export const DisabledShowcase: Story = {
|
|
91
|
+
render: () => (
|
|
92
|
+
<Box lx={{ flexDirection: 'row', alignItems: 'flex-end', gap: 's16' }}>
|
|
93
|
+
<MediaImage src={exampleSrc} alt='Cardano' size={32} disabled />
|
|
94
|
+
<MediaImage src={exampleSrc} alt='Cardano' size={48} disabled />
|
|
95
|
+
<MediaImage
|
|
96
|
+
src={exampleSrc}
|
|
97
|
+
alt='Cardano'
|
|
98
|
+
size={48}
|
|
99
|
+
shape='circle'
|
|
100
|
+
disabled
|
|
101
|
+
/>
|
|
102
|
+
<MediaImage fallback='Bitcoin' alt='Bitcoin' size={48} disabled />
|
|
103
|
+
<MediaImage alt='Empty' size={48} disabled />
|
|
104
|
+
</Box>
|
|
105
|
+
),
|
|
106
|
+
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { useDisabledContext } from '@ledgerhq/lumen-utils-shared';
|
|
1
2
|
import { useEffect, useState } from 'react';
|
|
2
3
|
import { Image, StyleSheet } from 'react-native';
|
|
3
4
|
import { useStyleSheet } from '../../../styles';
|
|
@@ -36,9 +37,11 @@ export const fontSizeMap: Record<MediaImageSize, number> = {
|
|
|
36
37
|
const useStyles = ({
|
|
37
38
|
size,
|
|
38
39
|
shape,
|
|
40
|
+
disabled,
|
|
39
41
|
}: {
|
|
40
42
|
size: MediaImageSize;
|
|
41
43
|
shape: MediaImageShape;
|
|
44
|
+
disabled: boolean;
|
|
42
45
|
}) => {
|
|
43
46
|
return useStyleSheet(
|
|
44
47
|
(t) => {
|
|
@@ -61,6 +64,7 @@ const useStyles = ({
|
|
|
61
64
|
outlineWidth: 1,
|
|
62
65
|
outlineOffset: -1,
|
|
63
66
|
outlineStyle: 'solid',
|
|
67
|
+
...(disabled && { opacity: 0.3 }),
|
|
64
68
|
},
|
|
65
69
|
image: {
|
|
66
70
|
width: '100%',
|
|
@@ -72,7 +76,7 @@ const useStyles = ({
|
|
|
72
76
|
},
|
|
73
77
|
};
|
|
74
78
|
},
|
|
75
|
-
[size, shape],
|
|
79
|
+
[size, shape, disabled],
|
|
76
80
|
);
|
|
77
81
|
};
|
|
78
82
|
|
|
@@ -99,6 +103,7 @@ export const MediaImage = ({
|
|
|
99
103
|
shape = 'square',
|
|
100
104
|
fallback,
|
|
101
105
|
loading = false,
|
|
106
|
+
disabled: disabledProp = false,
|
|
102
107
|
lx = {},
|
|
103
108
|
style,
|
|
104
109
|
ref,
|
|
@@ -106,7 +111,11 @@ export const MediaImage = ({
|
|
|
106
111
|
}: MediaImageProps) => {
|
|
107
112
|
const [error, setError] = useState(false);
|
|
108
113
|
const shouldFallback = !src || error;
|
|
109
|
-
const
|
|
114
|
+
const disabled = useDisabledContext({
|
|
115
|
+
consumerName: 'MediaImage',
|
|
116
|
+
mergeWith: { disabled: disabledProp },
|
|
117
|
+
});
|
|
118
|
+
const styles = useStyles({ size, shape, disabled });
|
|
110
119
|
|
|
111
120
|
useEffect(() => {
|
|
112
121
|
setError(false);
|
|
@@ -119,6 +128,7 @@ export const MediaImage = ({
|
|
|
119
128
|
style={StyleSheet.flatten([styles.root, style])}
|
|
120
129
|
accessibilityRole='image'
|
|
121
130
|
accessibilityLabel={alt}
|
|
131
|
+
accessibilityState={{ disabled }}
|
|
122
132
|
{...props}
|
|
123
133
|
>
|
|
124
134
|
{loading && <Skeleton style={styles.skeleton} />}
|
|
@@ -2,12 +2,12 @@ import { useStyleSheet } from '../../../styles';
|
|
|
2
2
|
import { Box, Text } from '../Utility';
|
|
3
3
|
import type { CoinCapsuleProps } from './types';
|
|
4
4
|
|
|
5
|
-
export function CoinCapsule({ ticker,
|
|
5
|
+
export function CoinCapsule({ ticker, leadingContent }: CoinCapsuleProps) {
|
|
6
6
|
const styles = useStyles();
|
|
7
7
|
|
|
8
8
|
return (
|
|
9
9
|
<Box style={styles.container}>
|
|
10
|
-
{
|
|
10
|
+
{leadingContent}
|
|
11
11
|
<Text style={styles.text}>{ticker}</Text>
|
|
12
12
|
</Box>
|
|
13
13
|
);
|
|
@@ -20,6 +20,7 @@ const useStyles = () =>
|
|
|
20
20
|
flexDirection: 'row',
|
|
21
21
|
gap: t.spacings.s8,
|
|
22
22
|
padding: t.spacings.s8,
|
|
23
|
+
paddingRight: t.spacings.s12,
|
|
23
24
|
justifyContent: 'center',
|
|
24
25
|
alignItems: 'center',
|
|
25
26
|
borderRadius: t.borderRadius.full,
|
|
@@ -7,7 +7,7 @@ import CommonRulesDoAndDont from '../../../../.storybook/components/DoVsDont/Com
|
|
|
7
7
|
|
|
8
8
|
<Meta title='Navigation/NavBar' of={NavBarStories} />
|
|
9
9
|
|
|
10
|
-
#
|
|
10
|
+
# NavBar
|
|
11
11
|
|
|
12
12
|
<CustomTabs>
|
|
13
13
|
<Tab label="Overview">
|
|
@@ -135,7 +135,7 @@ import { NavBarCoinCapsule } from '@ledgerhq/lumen-ui-rnative';
|
|
|
135
135
|
<NavBarContent>
|
|
136
136
|
<NavBarCoinCapsule
|
|
137
137
|
ticker='BTC'
|
|
138
|
-
|
|
138
|
+
leadingContent={<Icon ledgerId='bitcoin' ticker='BTC' size={24} />}
|
|
139
139
|
/>
|
|
140
140
|
<NavBarTitle>Bitcoin</NavBarTitle>
|
|
141
141
|
</NavBarContent>
|
|
@@ -111,7 +111,9 @@ export const WithCoinCapsule: Story = {
|
|
|
111
111
|
<NavBarContent>
|
|
112
112
|
<NavBarCoinCapsule
|
|
113
113
|
ticker='BTC'
|
|
114
|
-
|
|
114
|
+
leadingContent={
|
|
115
|
+
<CryptoIcon ledgerId='bitcoin' ticker='BTC' size={24} />
|
|
116
|
+
}
|
|
115
117
|
/>
|
|
116
118
|
</NavBarContent>
|
|
117
119
|
<NavBarTrailing>
|
|
@@ -69,7 +69,7 @@ describe('NavBar', () => {
|
|
|
69
69
|
renderWithProvider(
|
|
70
70
|
<NavBar testID='navbar' density='compact'>
|
|
71
71
|
<NavBarContent>
|
|
72
|
-
<NavBarCoinCapsule ticker='BTC'
|
|
72
|
+
<NavBarCoinCapsule ticker='BTC' leadingContent={<MockIcon />} />
|
|
73
73
|
</NavBarContent>
|
|
74
74
|
</NavBar>,
|
|
75
75
|
);
|
|
@@ -252,11 +252,11 @@ describe('NavBar', () => {
|
|
|
252
252
|
});
|
|
253
253
|
|
|
254
254
|
describe('NavBarCoinCapsule', () => {
|
|
255
|
-
it('should render ticker and
|
|
255
|
+
it('should render ticker and leading content', () => {
|
|
256
256
|
renderWithProvider(
|
|
257
257
|
<NavBar density='compact'>
|
|
258
258
|
<NavBarContent>
|
|
259
|
-
<NavBarCoinCapsule ticker='ETH'
|
|
259
|
+
<NavBarCoinCapsule ticker='ETH' leadingContent={<MockIcon />} />
|
|
260
260
|
</NavBarContent>
|
|
261
261
|
</NavBar>,
|
|
262
262
|
);
|
|
@@ -122,12 +122,12 @@ export function NavBarDescription({
|
|
|
122
122
|
|
|
123
123
|
export function NavBarCoinCapsule({
|
|
124
124
|
ticker,
|
|
125
|
-
|
|
125
|
+
leadingContent,
|
|
126
126
|
...props
|
|
127
127
|
}: NavBarCoinCapsuleProps) {
|
|
128
128
|
return (
|
|
129
129
|
<Box {...props}>
|
|
130
|
-
<CoinCapsule ticker={ticker}
|
|
130
|
+
<CoinCapsule ticker={ticker} leadingContent={leadingContent} />
|
|
131
131
|
</Box>
|
|
132
132
|
);
|
|
133
133
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Density } from '@ledgerhq/lumen-utils-shared';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
3
|
import type { StyledViewProps } from '../../../styles';
|
|
4
4
|
import type { IconButtonProps } from '../IconButton';
|
|
5
5
|
|
|
@@ -57,9 +57,9 @@ export type CoinCapsuleProps = {
|
|
|
57
57
|
*/
|
|
58
58
|
ticker: string;
|
|
59
59
|
/**
|
|
60
|
-
* The
|
|
60
|
+
* The leading content, typically a crypto coin icon.
|
|
61
61
|
*/
|
|
62
|
-
|
|
62
|
+
leadingContent: ReactNode;
|
|
63
63
|
} & Omit<StyledViewProps, 'children'>;
|
|
64
64
|
|
|
65
65
|
/**
|
|
@@ -865,8 +865,8 @@ export const TriggerShowcase: Story = {
|
|
|
865
865
|
<MediaButton
|
|
866
866
|
appearance='gray'
|
|
867
867
|
onPress={() => iconRef.current?.present()}
|
|
868
|
-
|
|
869
|
-
|
|
868
|
+
leadingContent={<Settings size={20} />}
|
|
869
|
+
leadingContentShape='flat'
|
|
870
870
|
>
|
|
871
871
|
{selectedIcon?.label ?? 'Settings'}
|
|
872
872
|
</MediaButton>
|
|
@@ -874,7 +874,7 @@ export const TriggerShowcase: Story = {
|
|
|
874
874
|
<MediaButton
|
|
875
875
|
appearance='gray'
|
|
876
876
|
onPress={() => cryptoRef.current?.present()}
|
|
877
|
-
|
|
877
|
+
leadingContent={
|
|
878
878
|
selectedCrypto?.meta ? (
|
|
879
879
|
<CryptoIcon
|
|
880
880
|
ledgerId={selectedCrypto.meta.ledgerId as string}
|
|
@@ -883,7 +883,7 @@ export const TriggerShowcase: Story = {
|
|
|
883
883
|
/>
|
|
884
884
|
) : undefined
|
|
885
885
|
}
|
|
886
|
-
|
|
886
|
+
leadingContentShape='rounded'
|
|
887
887
|
>
|
|
888
888
|
{selectedCrypto?.label ?? 'Network'}
|
|
889
889
|
</MediaButton>
|
|
@@ -15,6 +15,12 @@ const renderWithProvider = (component: React.ReactElement) => {
|
|
|
15
15
|
);
|
|
16
16
|
};
|
|
17
17
|
|
|
18
|
+
const wrapWithProvider = (component: React.ReactElement) => (
|
|
19
|
+
<ThemeProvider themes={ledgerLiveThemes} colorScheme='dark' locale='en'>
|
|
20
|
+
{component}
|
|
21
|
+
</ThemeProvider>
|
|
22
|
+
);
|
|
23
|
+
|
|
18
24
|
describe('PageIndicator Component', () => {
|
|
19
25
|
describe('Rendering', () => {
|
|
20
26
|
it('should render with required props', () => {
|
|
@@ -161,6 +167,78 @@ describe('PageIndicator Component', () => {
|
|
|
161
167
|
});
|
|
162
168
|
});
|
|
163
169
|
|
|
170
|
+
describe('Re-rendering', () => {
|
|
171
|
+
// Regression: dot/strip styles must update when currentPage changes.
|
|
172
|
+
// One bug has produced the same broken-on-update symptom:
|
|
173
|
+
// 1. Wrapping in Animated.createAnimatedComponent(Box) — Box flattens
|
|
174
|
+
// style arrays via StyleSheet.flatten, which snapshots reanimated
|
|
175
|
+
// animated styles and stops updates.
|
|
176
|
+
// Initial render looked correct in both cases — only re-render exposed
|
|
177
|
+
// the issue, which is what the tests below exercise.
|
|
178
|
+
it('updates the rendered tree when currentPage changes', () => {
|
|
179
|
+
const { rerender } = renderWithProvider(
|
|
180
|
+
<PageIndicator
|
|
181
|
+
testID='page-indicator'
|
|
182
|
+
currentPage={1}
|
|
183
|
+
totalPages={5}
|
|
184
|
+
/>,
|
|
185
|
+
);
|
|
186
|
+
const treeBefore = JSON.stringify(screen.toJSON());
|
|
187
|
+
|
|
188
|
+
rerender(
|
|
189
|
+
wrapWithProvider(
|
|
190
|
+
<PageIndicator
|
|
191
|
+
testID='page-indicator'
|
|
192
|
+
currentPage={3}
|
|
193
|
+
totalPages={5}
|
|
194
|
+
/>,
|
|
195
|
+
),
|
|
196
|
+
);
|
|
197
|
+
const treeAfter = JSON.stringify(screen.toJSON());
|
|
198
|
+
|
|
199
|
+
expect(treeAfter).not.toEqual(treeBefore);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
it('updates the active dot style when currentPage changes', () => {
|
|
203
|
+
type Node = {
|
|
204
|
+
type: string;
|
|
205
|
+
props: { style?: unknown };
|
|
206
|
+
children: Node[] | null;
|
|
207
|
+
};
|
|
208
|
+
const getDotStyles = (): unknown[] => {
|
|
209
|
+
const root = screen.toJSON() as Node | null;
|
|
210
|
+
if (!root?.children) throw new Error('Expected container children');
|
|
211
|
+
const viewport = root.children[0];
|
|
212
|
+
if (!viewport?.children) throw new Error('Expected viewport children');
|
|
213
|
+
const strip = viewport.children[0];
|
|
214
|
+
if (!strip?.children) throw new Error('Expected strip children');
|
|
215
|
+
return strip.children.map((dot) => dot.props.style);
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
const { rerender } = renderWithProvider(
|
|
219
|
+
<PageIndicator
|
|
220
|
+
testID='page-indicator'
|
|
221
|
+
currentPage={1}
|
|
222
|
+
totalPages={5}
|
|
223
|
+
/>,
|
|
224
|
+
);
|
|
225
|
+
const stylesBefore = JSON.stringify(getDotStyles());
|
|
226
|
+
|
|
227
|
+
rerender(
|
|
228
|
+
wrapWithProvider(
|
|
229
|
+
<PageIndicator
|
|
230
|
+
testID='page-indicator'
|
|
231
|
+
currentPage={3}
|
|
232
|
+
totalPages={5}
|
|
233
|
+
/>,
|
|
234
|
+
),
|
|
235
|
+
);
|
|
236
|
+
const stylesAfter = JSON.stringify(getDotStyles());
|
|
237
|
+
|
|
238
|
+
expect(stylesAfter).not.toEqual(stylesBefore);
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
|
|
164
242
|
describe('Props', () => {
|
|
165
243
|
it('should accept ref prop', () => {
|
|
166
244
|
const ref = createRef<ComponentRef<typeof PageIndicator>>();
|