@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.
Files changed (191) hide show
  1. package/dist/module/lib/Animations/Pulse/Pulse.js +2 -2
  2. package/dist/module/lib/Animations/Pulse/Pulse.js.map +1 -1
  3. package/dist/module/lib/Animations/Pulse/Pulse.mdx +1 -1
  4. package/dist/module/lib/Animations/Spin/Spin.mdx +1 -1
  5. package/dist/module/lib/Components/AddressInput/AddressInput.mdx +1 -1
  6. package/dist/module/lib/Components/AmountDisplay/AmountDisplay.js +68 -39
  7. package/dist/module/lib/Components/AmountDisplay/AmountDisplay.js.map +1 -1
  8. package/dist/module/lib/Components/AmountDisplay/AmountDisplay.mdx +7 -1
  9. package/dist/module/lib/Components/AmountDisplay/AmountDisplay.stories.js +24 -0
  10. package/dist/module/lib/Components/AmountDisplay/AmountDisplay.stories.js.map +1 -1
  11. package/dist/module/lib/Components/AmountDisplay/types.js.map +1 -1
  12. package/dist/module/lib/Components/AmountInput/AmountInput.mdx +1 -1
  13. package/dist/module/lib/Components/Avatar/Avatar.mdx +1 -1
  14. package/dist/module/lib/Components/Banner/Banner.mdx +1 -1
  15. package/dist/module/lib/Components/BottomSheet/BottomSheet.mdx +1 -1
  16. package/dist/module/lib/Components/Button/Button.mdx +1 -1
  17. package/dist/module/lib/Components/Card/Card.stories.js +4 -9
  18. package/dist/module/lib/Components/Card/Card.stories.js.map +1 -1
  19. package/dist/module/lib/Components/CardButton/CardButton.mdx +1 -1
  20. package/dist/module/lib/Components/Checkbox/Checkbox.mdx +1 -1
  21. package/dist/module/lib/Components/DescriptionItem/DescriptionItem.js +184 -0
  22. package/dist/module/lib/Components/DescriptionItem/DescriptionItem.js.map +1 -0
  23. package/dist/module/lib/Components/DescriptionItem/DescriptionItem.mdx +139 -0
  24. package/dist/module/lib/Components/DescriptionItem/DescriptionItem.stories.js +258 -0
  25. package/dist/module/lib/Components/DescriptionItem/DescriptionItem.stories.js.map +1 -0
  26. package/dist/module/lib/Components/DescriptionItem/DescriptionItem.test.js +94 -0
  27. package/dist/module/lib/Components/DescriptionItem/DescriptionItem.test.js.map +1 -0
  28. package/dist/module/lib/Components/DescriptionItem/index.js +5 -0
  29. package/dist/module/lib/Components/DescriptionItem/index.js.map +1 -0
  30. package/dist/module/lib/Components/DescriptionItem/types.js +4 -0
  31. package/dist/module/lib/Components/DescriptionItem/types.js.map +1 -0
  32. package/dist/module/lib/Components/Divider/Divider.mdx +1 -1
  33. package/dist/module/lib/Components/DotIcon/DotIcon.js +44 -23
  34. package/dist/module/lib/Components/DotIcon/DotIcon.js.map +1 -1
  35. package/dist/module/lib/Components/DotIcon/DotIcon.mdx +92 -0
  36. package/dist/module/lib/Components/DotIcon/DotIcon.stories.js +47 -0
  37. package/dist/module/lib/Components/DotIcon/DotIcon.stories.js.map +1 -1
  38. package/dist/module/lib/Components/DotSymbol/DotSymbol.js +52 -30
  39. package/dist/module/lib/Components/DotSymbol/DotSymbol.js.map +1 -1
  40. package/dist/module/lib/Components/DotSymbol/DotSymbol.mdx +79 -2
  41. package/dist/module/lib/Components/DotSymbol/DotSymbol.stories.js +41 -0
  42. package/dist/module/lib/Components/DotSymbol/DotSymbol.stories.js.map +1 -1
  43. package/dist/module/lib/Components/IconButton/IconButton.mdx +1 -1
  44. package/dist/module/lib/Components/InteractiveIcon/InteractiveIcon.mdx +1 -1
  45. package/dist/module/lib/Components/Link/Link.mdx +1 -1
  46. package/dist/module/lib/Components/MediaBanner/MediaBanner.mdx +1 -1
  47. package/dist/module/lib/Components/MediaButton/MediaButton.js +17 -17
  48. package/dist/module/lib/Components/MediaButton/MediaButton.js.map +1 -1
  49. package/dist/module/lib/Components/MediaButton/MediaButton.mdx +3 -3
  50. package/dist/module/lib/Components/MediaButton/MediaButton.stories.js +17 -17
  51. package/dist/module/lib/Components/MediaButton/MediaButton.stories.js.map +1 -1
  52. package/dist/module/lib/Components/MediaButton/MediaButton.test.js +4 -4
  53. package/dist/module/lib/Components/MediaButton/MediaButton.test.js.map +1 -1
  54. package/dist/module/lib/Components/MediaImage/MediaImage.js +20 -4
  55. package/dist/module/lib/Components/MediaImage/MediaImage.js.map +1 -1
  56. package/dist/module/lib/Components/MediaImage/MediaImage.stories.js +35 -0
  57. package/dist/module/lib/Components/MediaImage/MediaImage.stories.js.map +1 -1
  58. package/dist/module/lib/Components/NavBar/CoinCapsule.js +3 -2
  59. package/dist/module/lib/Components/NavBar/CoinCapsule.js.map +1 -1
  60. package/dist/module/lib/Components/NavBar/NavBar.js +2 -2
  61. package/dist/module/lib/Components/NavBar/NavBar.js.map +1 -1
  62. package/dist/module/lib/Components/NavBar/NavBar.mdx +2 -2
  63. package/dist/module/lib/Components/NavBar/NavBar.stories.js +1 -1
  64. package/dist/module/lib/Components/NavBar/NavBar.stories.js.map +1 -1
  65. package/dist/module/lib/Components/NavBar/NavBar.test.js +3 -3
  66. package/dist/module/lib/Components/NavBar/NavBar.test.js.map +1 -1
  67. package/dist/module/lib/Components/OptionList/OptionList.stories.js +4 -4
  68. package/dist/module/lib/Components/OptionList/OptionList.stories.js.map +1 -1
  69. package/dist/module/lib/Components/PageIndicator/PageIndicator.js +13 -8
  70. package/dist/module/lib/Components/PageIndicator/PageIndicator.js.map +1 -1
  71. package/dist/module/lib/Components/PageIndicator/PageIndicator.test.js +58 -0
  72. package/dist/module/lib/Components/PageIndicator/PageIndicator.test.js.map +1 -1
  73. package/dist/module/lib/Components/SearchInput/SearchInput.mdx +1 -1
  74. package/dist/module/lib/Components/SegmentedControl/SegmentedControl.mdx +1 -1
  75. package/dist/module/lib/Components/Select/Select.mdx +1 -1
  76. package/dist/module/lib/Components/Spinner/Spinner.mdx +1 -1
  77. package/dist/module/lib/Components/Spot/Spot.mdx +1 -1
  78. package/dist/module/lib/Components/Stepper/Stepper.mdx +1 -1
  79. package/dist/module/lib/Components/Subheader/Subheader.mdx +1 -1
  80. package/dist/module/lib/Components/Switch/Switch.mdx +1 -1
  81. package/dist/module/lib/Components/TabBar/TabBar.mdx +1 -1
  82. package/dist/module/lib/Components/TextInput/TextInput.mdx +1 -1
  83. package/dist/module/lib/Components/Tile/Tile.mdx +1 -1
  84. package/dist/module/lib/Components/Tooltip/Tooltip.mdx +1 -1
  85. package/dist/module/lib/Components/index.js +1 -0
  86. package/dist/module/lib/Components/index.js.map +1 -1
  87. package/dist/typescript/src/lib/Animations/Pulse/Pulse.d.ts.map +1 -1
  88. package/dist/typescript/src/lib/Components/AmountDisplay/AmountDisplay.d.ts +1 -1
  89. package/dist/typescript/src/lib/Components/AmountDisplay/AmountDisplay.d.ts.map +1 -1
  90. package/dist/typescript/src/lib/Components/AmountDisplay/index.d.ts +1 -1
  91. package/dist/typescript/src/lib/Components/AmountDisplay/index.d.ts.map +1 -1
  92. package/dist/typescript/src/lib/Components/AmountDisplay/types.d.ts +10 -3
  93. package/dist/typescript/src/lib/Components/AmountDisplay/types.d.ts.map +1 -1
  94. package/dist/typescript/src/lib/Components/DescriptionItem/DescriptionItem.d.ts +42 -0
  95. package/dist/typescript/src/lib/Components/DescriptionItem/DescriptionItem.d.ts.map +1 -0
  96. package/dist/typescript/src/lib/Components/DescriptionItem/index.d.ts +3 -0
  97. package/dist/typescript/src/lib/Components/DescriptionItem/index.d.ts.map +1 -0
  98. package/dist/typescript/src/lib/Components/DescriptionItem/types.d.ts +39 -0
  99. package/dist/typescript/src/lib/Components/DescriptionItem/types.d.ts.map +1 -0
  100. package/dist/typescript/src/lib/Components/DotIcon/DotIcon.d.ts +1 -1
  101. package/dist/typescript/src/lib/Components/DotIcon/DotIcon.d.ts.map +1 -1
  102. package/dist/typescript/src/lib/Components/DotIcon/types.d.ts +6 -0
  103. package/dist/typescript/src/lib/Components/DotIcon/types.d.ts.map +1 -1
  104. package/dist/typescript/src/lib/Components/DotSymbol/DotSymbol.d.ts +1 -1
  105. package/dist/typescript/src/lib/Components/DotSymbol/DotSymbol.d.ts.map +1 -1
  106. package/dist/typescript/src/lib/Components/DotSymbol/types.d.ts +6 -0
  107. package/dist/typescript/src/lib/Components/DotSymbol/types.d.ts.map +1 -1
  108. package/dist/typescript/src/lib/Components/MediaButton/MediaButton.d.ts +3 -3
  109. package/dist/typescript/src/lib/Components/MediaButton/MediaButton.d.ts.map +1 -1
  110. package/dist/typescript/src/lib/Components/MediaButton/types.d.ts +6 -6
  111. package/dist/typescript/src/lib/Components/MediaButton/types.d.ts.map +1 -1
  112. package/dist/typescript/src/lib/Components/MediaImage/MediaImage.d.ts +1 -1
  113. package/dist/typescript/src/lib/Components/MediaImage/MediaImage.d.ts.map +1 -1
  114. package/dist/typescript/src/lib/Components/MediaImage/types.d.ts +6 -0
  115. package/dist/typescript/src/lib/Components/MediaImage/types.d.ts.map +1 -1
  116. package/dist/typescript/src/lib/Components/NavBar/CoinCapsule.d.ts +1 -1
  117. package/dist/typescript/src/lib/Components/NavBar/CoinCapsule.d.ts.map +1 -1
  118. package/dist/typescript/src/lib/Components/NavBar/NavBar.d.ts +1 -1
  119. package/dist/typescript/src/lib/Components/NavBar/NavBar.d.ts.map +1 -1
  120. package/dist/typescript/src/lib/Components/NavBar/types.d.ts +3 -3
  121. package/dist/typescript/src/lib/Components/NavBar/types.d.ts.map +1 -1
  122. package/dist/typescript/src/lib/Components/PageIndicator/PageIndicator.d.ts.map +1 -1
  123. package/dist/typescript/src/lib/Components/index.d.ts +1 -0
  124. package/dist/typescript/src/lib/Components/index.d.ts.map +1 -1
  125. package/package.json +3 -3
  126. package/src/lib/Animations/Pulse/Pulse.mdx +1 -1
  127. package/src/lib/Animations/Pulse/Pulse.tsx +6 -3
  128. package/src/lib/Animations/Spin/Spin.mdx +1 -1
  129. package/src/lib/Components/AddressInput/AddressInput.mdx +1 -1
  130. package/src/lib/Components/AmountDisplay/AmountDisplay.mdx +7 -1
  131. package/src/lib/Components/AmountDisplay/AmountDisplay.stories.tsx +18 -0
  132. package/src/lib/Components/AmountDisplay/AmountDisplay.tsx +71 -40
  133. package/src/lib/Components/AmountDisplay/index.ts +5 -1
  134. package/src/lib/Components/AmountDisplay/types.ts +12 -3
  135. package/src/lib/Components/AmountInput/AmountInput.mdx +1 -1
  136. package/src/lib/Components/Avatar/Avatar.mdx +1 -1
  137. package/src/lib/Components/Banner/Banner.mdx +1 -1
  138. package/src/lib/Components/BottomSheet/BottomSheet.mdx +1 -1
  139. package/src/lib/Components/Button/Button.mdx +1 -1
  140. package/src/lib/Components/Card/Card.stories.tsx +1 -3
  141. package/src/lib/Components/CardButton/CardButton.mdx +1 -1
  142. package/src/lib/Components/Checkbox/Checkbox.mdx +1 -1
  143. package/src/lib/Components/DescriptionItem/DescriptionItem.mdx +139 -0
  144. package/src/lib/Components/DescriptionItem/DescriptionItem.stories.tsx +234 -0
  145. package/src/lib/Components/DescriptionItem/DescriptionItem.test.tsx +112 -0
  146. package/src/lib/Components/DescriptionItem/DescriptionItem.tsx +224 -0
  147. package/src/lib/Components/DescriptionItem/index.ts +2 -0
  148. package/src/lib/Components/DescriptionItem/types.ts +44 -0
  149. package/src/lib/Components/Divider/Divider.mdx +1 -1
  150. package/src/lib/Components/DotIcon/DotIcon.mdx +92 -0
  151. package/src/lib/Components/DotIcon/DotIcon.stories.tsx +35 -0
  152. package/src/lib/Components/DotIcon/DotIcon.tsx +31 -14
  153. package/src/lib/Components/DotIcon/types.ts +6 -0
  154. package/src/lib/Components/DotSymbol/DotSymbol.mdx +79 -2
  155. package/src/lib/Components/DotSymbol/DotSymbol.stories.tsx +17 -0
  156. package/src/lib/Components/DotSymbol/DotSymbol.tsx +42 -24
  157. package/src/lib/Components/DotSymbol/types.ts +6 -0
  158. package/src/lib/Components/IconButton/IconButton.mdx +1 -1
  159. package/src/lib/Components/InteractiveIcon/InteractiveIcon.mdx +1 -1
  160. package/src/lib/Components/Link/Link.mdx +1 -1
  161. package/src/lib/Components/MediaBanner/MediaBanner.mdx +1 -1
  162. package/src/lib/Components/MediaButton/MediaButton.mdx +3 -3
  163. package/src/lib/Components/MediaButton/MediaButton.stories.tsx +29 -15
  164. package/src/lib/Components/MediaButton/MediaButton.test.tsx +4 -4
  165. package/src/lib/Components/MediaButton/MediaButton.tsx +33 -20
  166. package/src/lib/Components/MediaButton/types.ts +6 -6
  167. package/src/lib/Components/MediaImage/MediaImage.stories.tsx +18 -0
  168. package/src/lib/Components/MediaImage/MediaImage.tsx +12 -2
  169. package/src/lib/Components/MediaImage/types.ts +6 -0
  170. package/src/lib/Components/NavBar/CoinCapsule.tsx +3 -2
  171. package/src/lib/Components/NavBar/NavBar.mdx +2 -2
  172. package/src/lib/Components/NavBar/NavBar.stories.tsx +3 -1
  173. package/src/lib/Components/NavBar/NavBar.test.tsx +3 -3
  174. package/src/lib/Components/NavBar/NavBar.tsx +2 -2
  175. package/src/lib/Components/NavBar/types.ts +3 -3
  176. package/src/lib/Components/OptionList/OptionList.stories.tsx +4 -4
  177. package/src/lib/Components/PageIndicator/PageIndicator.test.tsx +78 -0
  178. package/src/lib/Components/PageIndicator/PageIndicator.tsx +15 -7
  179. package/src/lib/Components/SearchInput/SearchInput.mdx +1 -1
  180. package/src/lib/Components/SegmentedControl/SegmentedControl.mdx +1 -1
  181. package/src/lib/Components/Select/Select.mdx +1 -1
  182. package/src/lib/Components/Spinner/Spinner.mdx +1 -1
  183. package/src/lib/Components/Spot/Spot.mdx +1 -1
  184. package/src/lib/Components/Stepper/Stepper.mdx +1 -1
  185. package/src/lib/Components/Subheader/Subheader.mdx +1 -1
  186. package/src/lib/Components/Switch/Switch.mdx +1 -1
  187. package/src/lib/Components/TabBar/TabBar.mdx +1 -1
  188. package/src/lib/Components/TextInput/TextInput.mdx +1 -1
  189. package/src/lib/Components/Tile/Tile.mdx +1 -1
  190. package/src/lib/Components/Tooltip/Tooltip.mdx +1 -1
  191. 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 size='sm' icon={<Star size={20} />} iconType='flat'>
47
+ <MediaButton
48
+ size='sm'
49
+ leadingContent={<Star size={20} />}
50
+ leadingContentShape='flat'
51
+ >
48
52
  Small
49
53
  </MediaButton>
50
- <MediaButton size='md' icon={<Star size={20} />} iconType='flat'>
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 IconTypeShowcase: Story = {
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
- icon={<Settings size={20} />}
63
- iconType='flat'
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
- icon={<CryptoIcon ledgerId='bitcoin' ticker='BTC' size={32} />}
70
- iconType='rounded'
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
- icon={<Settings size={20} />}
80
- iconType='flat'
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
- icon={<CryptoIcon ledgerId='bitcoin' ticker='BTC' size={24} />}
88
- iconType='rounded'
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
- icon={<Settings size={20} />}
116
- iconType='flat'
127
+ leadingContent={<Settings size={20} />}
128
+ leadingContentShape='flat'
117
129
  >
118
130
  {appearance}
119
131
  </MediaButton>
120
132
  <MediaButton
121
133
  appearance={appearance}
122
- icon={<CryptoIcon ledgerId='bitcoin' ticker='BTC' size={32} />}
123
- iconType='rounded'
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
- icon={<Settings size={20} testID='icon' />}
68
- iconType='flat'
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
- icon={<View testID='crypto-icon' />}
82
- iconType='rounded'
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 IconType = 'flat' | 'rounded' | 'none';
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
- iconType,
17
+ leadingContentShape,
18
18
  }: {
19
19
  appearance: Appearance;
20
20
  size: Size;
21
21
  disabled: boolean;
22
22
  pressed: boolean;
23
- iconType: IconType;
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<Size, Record<IconType, PaddingStyle>> = {
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][iconType],
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
- icon: {
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, iconType],
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 icon and a trailing chevron indicator.
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 icon={<Settings size={20} />} iconType="flat">
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
- icon,
158
- iconType = 'flat',
160
+ leadingContent,
161
+ leadingContentShape = 'flat',
159
162
  hideChevron = false,
160
163
  children: label,
161
164
  ref,
162
165
  ...props
163
166
  }: MediaButtonProps) => {
164
- const effectiveIconType: IconType = icon ? iconType : 'none';
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
- iconType={effectiveIconType}
183
- icon={icon}
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
- iconType: IconType;
199
- icon?: MediaButtonProps['icon'];
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
- iconType,
209
- icon,
213
+ leadingContent,
214
+ leadingContentShape,
210
215
  hideChevron,
211
216
  children,
212
217
  }: MediaButtonContentProps) => {
213
- const styles = useStyles({ appearance, size, disabled, pressed, iconType });
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
- {icon && <View style={styles.icon}>{icon}</View>}
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 element to display as leading content.
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
- icon?: ReactNode;
19
+ leadingContent?: ReactNode;
20
20
  /**
21
- * Determines the padding scheme when an icon is present.
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 `icon` is provided.
25
+ * Only relevant when `leadingContent` is provided.
26
26
  * @default 'flat'
27
27
  */
28
- iconType?: 'flat' | 'rounded';
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 styles = useStyles({ size, shape });
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} />}
@@ -36,4 +36,10 @@ export type MediaImageProps = {
36
36
  * @default false
37
37
  */
38
38
  loading?: boolean;
39
+ /**
40
+ * Shows a disabled appearance.
41
+ * @optional
42
+ * @default false
43
+ */
44
+ disabled?: boolean;
39
45
  } & Omit<StyledViewProps, 'children'>;
@@ -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, icon }: CoinCapsuleProps) {
5
+ export function CoinCapsule({ ticker, leadingContent }: CoinCapsuleProps) {
6
6
  const styles = useStyles();
7
7
 
8
8
  return (
9
9
  <Box style={styles.container}>
10
- {icon}
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
- # 🧭 NavBar
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
- icon={<Icon ledgerId='bitcoin' ticker='BTC' size={24} />}
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
- icon={<CryptoIcon ledgerId='bitcoin' ticker='BTC' size={24} />}
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' icon={<MockIcon />} />
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 icon', () => {
255
+ it('should render ticker and leading content', () => {
256
256
  renderWithProvider(
257
257
  <NavBar density='compact'>
258
258
  <NavBarContent>
259
- <NavBarCoinCapsule ticker='ETH' icon={<MockIcon />} />
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
- icon,
125
+ leadingContent,
126
126
  ...props
127
127
  }: NavBarCoinCapsuleProps) {
128
128
  return (
129
129
  <Box {...props}>
130
- <CoinCapsule ticker={ticker} icon={icon} />
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 { ReactElement, ReactNode } from 'react';
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 icon element to display (typically a crypto coin icon).
60
+ * The leading content, typically a crypto coin icon.
61
61
  */
62
- icon: ReactElement;
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
- icon={<Settings size={20} />}
869
- iconType='flat'
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
- icon={
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
- iconType='rounded'
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>>();