@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.
Files changed (245) hide show
  1. package/dist/module/lib/Animations/Pulse/Pulse.mdx +1 -1
  2. package/dist/module/lib/Animations/Spin/Spin.mdx +1 -1
  3. package/dist/module/lib/Components/AddressInput/AddressInput.mdx +1 -1
  4. package/dist/module/lib/Components/AmountDisplay/AmountDisplay.js +68 -39
  5. package/dist/module/lib/Components/AmountDisplay/AmountDisplay.js.map +1 -1
  6. package/dist/module/lib/Components/AmountDisplay/AmountDisplay.mdx +7 -1
  7. package/dist/module/lib/Components/AmountDisplay/AmountDisplay.stories.js +24 -0
  8. package/dist/module/lib/Components/AmountDisplay/AmountDisplay.stories.js.map +1 -1
  9. package/dist/module/lib/Components/AmountDisplay/types.js.map +1 -1
  10. package/dist/module/lib/Components/AmountInput/AmountInput.js +109 -72
  11. package/dist/module/lib/Components/AmountInput/AmountInput.js.map +1 -1
  12. package/dist/module/lib/Components/AmountInput/AmountInput.mdx +13 -1
  13. package/dist/module/lib/Components/AmountInput/AmountInput.stories.js +53 -0
  14. package/dist/module/lib/Components/AmountInput/AmountInput.stories.js.map +1 -1
  15. package/dist/module/lib/Components/Avatar/Avatar.js +6 -5
  16. package/dist/module/lib/Components/Avatar/Avatar.js.map +1 -1
  17. package/dist/module/lib/Components/Avatar/Avatar.mdx +3 -1
  18. package/dist/module/lib/Components/Avatar/Avatar.test.js +10 -13
  19. package/dist/module/lib/Components/Avatar/Avatar.test.js.map +1 -1
  20. package/dist/module/lib/Components/Banner/Banner.mdx +1 -1
  21. package/dist/module/lib/Components/BottomSheet/BottomSheet.mdx +1 -1
  22. package/dist/module/lib/Components/Button/Button.mdx +1 -1
  23. package/dist/module/lib/Components/Card/Card.stories.js +4 -9
  24. package/dist/module/lib/Components/Card/Card.stories.js.map +1 -1
  25. package/dist/module/lib/Components/CardButton/CardButton.mdx +1 -1
  26. package/dist/module/lib/Components/Checkbox/Checkbox.mdx +1 -1
  27. package/dist/module/lib/Components/Divider/Divider.mdx +1 -1
  28. package/dist/module/lib/Components/DotIcon/DotIcon.js +51 -27
  29. package/dist/module/lib/Components/DotIcon/DotIcon.js.map +1 -1
  30. package/dist/module/lib/Components/DotIcon/DotIcon.mdx +92 -0
  31. package/dist/module/lib/Components/DotIcon/DotIcon.stories.js +57 -0
  32. package/dist/module/lib/Components/DotIcon/DotIcon.stories.js.map +1 -1
  33. package/dist/module/lib/Components/DotIndicator/DotIndicator.js +5 -5
  34. package/dist/module/lib/Components/DotIndicator/DotIndicator.js.map +1 -1
  35. package/dist/module/lib/Components/DotIndicator/DotIndicator.mdx +4 -4
  36. package/dist/module/lib/Components/DotIndicator/DotIndicator.stories.js +3 -3
  37. package/dist/module/lib/Components/DotIndicator/DotIndicator.test.js +12 -2
  38. package/dist/module/lib/Components/DotIndicator/DotIndicator.test.js.map +1 -1
  39. package/dist/module/lib/Components/DotSymbol/DotSymbol.js +59 -34
  40. package/dist/module/lib/Components/DotSymbol/DotSymbol.js.map +1 -1
  41. package/dist/module/lib/Components/DotSymbol/DotSymbol.mdx +79 -2
  42. package/dist/module/lib/Components/DotSymbol/DotSymbol.stories.js +60 -0
  43. package/dist/module/lib/Components/DotSymbol/DotSymbol.stories.js.map +1 -1
  44. package/dist/module/lib/Components/IconButton/IconButton.mdx +1 -1
  45. package/dist/module/lib/Components/InteractiveIcon/InteractiveIcon.mdx +1 -1
  46. package/dist/module/lib/Components/Label/Label.js +1 -1
  47. package/dist/module/lib/Components/Link/Link.mdx +1 -1
  48. package/dist/module/lib/Components/MediaBanner/MediaBanner.mdx +1 -1
  49. package/dist/module/lib/Components/MediaButton/MediaButton.js +19 -19
  50. package/dist/module/lib/Components/MediaButton/MediaButton.js.map +1 -1
  51. package/dist/module/lib/Components/MediaButton/MediaButton.mdx +5 -5
  52. package/dist/module/lib/Components/MediaButton/MediaButton.stories.js +17 -17
  53. package/dist/module/lib/Components/MediaButton/MediaButton.stories.js.map +1 -1
  54. package/dist/module/lib/Components/MediaButton/MediaButton.test.js +4 -4
  55. package/dist/module/lib/Components/MediaButton/MediaButton.test.js.map +1 -1
  56. package/dist/module/lib/Components/MediaImage/MediaImage.js +24 -6
  57. package/dist/module/lib/Components/MediaImage/MediaImage.js.map +1 -1
  58. package/dist/module/lib/Components/MediaImage/MediaImage.mdx +1 -1
  59. package/dist/module/lib/Components/MediaImage/MediaImage.stories.js +47 -0
  60. package/dist/module/lib/Components/MediaImage/MediaImage.stories.js.map +1 -1
  61. package/dist/module/lib/Components/NavBar/CoinCapsule.js +2 -2
  62. package/dist/module/lib/Components/NavBar/CoinCapsule.js.map +1 -1
  63. package/dist/module/lib/Components/NavBar/NavBar.js +2 -2
  64. package/dist/module/lib/Components/NavBar/NavBar.js.map +1 -1
  65. package/dist/module/lib/Components/NavBar/NavBar.mdx +2 -2
  66. package/dist/module/lib/Components/NavBar/NavBar.stories.js +1 -1
  67. package/dist/module/lib/Components/NavBar/NavBar.stories.js.map +1 -1
  68. package/dist/module/lib/Components/NavBar/NavBar.test.js +3 -3
  69. package/dist/module/lib/Components/NavBar/NavBar.test.js.map +1 -1
  70. package/dist/module/lib/Components/OptionList/OptionList.mdx +1 -1
  71. package/dist/module/lib/Components/OptionList/OptionList.stories.js +4 -4
  72. package/dist/module/lib/Components/OptionList/OptionList.stories.js.map +1 -1
  73. package/dist/module/lib/Components/PageIndicator/PageIndicator.js +13 -8
  74. package/dist/module/lib/Components/PageIndicator/PageIndicator.js.map +1 -1
  75. package/dist/module/lib/Components/PageIndicator/PageIndicator.test.js +58 -0
  76. package/dist/module/lib/Components/PageIndicator/PageIndicator.test.js.map +1 -1
  77. package/dist/module/lib/Components/SearchInput/SearchInput.mdx +1 -1
  78. package/dist/module/lib/Components/SegmentedControl/SegmentedControl.mdx +1 -1
  79. package/dist/module/lib/Components/Spinner/Spinner.mdx +1 -1
  80. package/dist/module/lib/Components/Spot/Spot.mdx +1 -1
  81. package/dist/module/lib/Components/Stepper/Stepper.mdx +1 -1
  82. package/dist/module/lib/Components/Subheader/Subheader.mdx +1 -1
  83. package/dist/module/lib/Components/Switch/Switch.mdx +1 -1
  84. package/dist/module/lib/Components/TabBar/TabBar.mdx +1 -1
  85. package/dist/module/lib/Components/TextInput/TextInput.mdx +1 -1
  86. package/dist/module/lib/Components/ThemeProvider/ThemeProvider.js +2 -5
  87. package/dist/module/lib/Components/ThemeProvider/ThemeProvider.js.map +1 -1
  88. package/dist/module/lib/Components/Tile/Tile.mdx +1 -1
  89. package/dist/module/lib/Components/Tooltip/Tooltip.mdx +1 -1
  90. package/dist/module/lib/Components/index.js +0 -1
  91. package/dist/module/lib/Components/index.js.map +1 -1
  92. package/dist/module/lib/Symbols/Icons/Lightbulb.js +3 -3
  93. package/dist/module/lib/Symbols/Icons/Lightbulb.js.map +1 -1
  94. package/dist/typescript/src/lib/Components/AmountDisplay/AmountDisplay.d.ts +1 -1
  95. package/dist/typescript/src/lib/Components/AmountDisplay/AmountDisplay.d.ts.map +1 -1
  96. package/dist/typescript/src/lib/Components/AmountDisplay/index.d.ts +1 -1
  97. package/dist/typescript/src/lib/Components/AmountDisplay/index.d.ts.map +1 -1
  98. package/dist/typescript/src/lib/Components/AmountDisplay/types.d.ts +10 -3
  99. package/dist/typescript/src/lib/Components/AmountDisplay/types.d.ts.map +1 -1
  100. package/dist/typescript/src/lib/Components/AmountInput/AmountInput.d.ts +1 -1
  101. package/dist/typescript/src/lib/Components/AmountInput/AmountInput.d.ts.map +1 -1
  102. package/dist/typescript/src/lib/Components/AmountInput/types.d.ts +12 -0
  103. package/dist/typescript/src/lib/Components/AmountInput/types.d.ts.map +1 -1
  104. package/dist/typescript/src/lib/Components/Avatar/Avatar.d.ts +1 -1
  105. package/dist/typescript/src/lib/Components/Avatar/Avatar.d.ts.map +1 -1
  106. package/dist/typescript/src/lib/Components/DotIcon/DotIcon.d.ts +3 -2
  107. package/dist/typescript/src/lib/Components/DotIcon/DotIcon.d.ts.map +1 -1
  108. package/dist/typescript/src/lib/Components/DotIcon/types.d.ts +7 -1
  109. package/dist/typescript/src/lib/Components/DotIcon/types.d.ts.map +1 -1
  110. package/dist/typescript/src/lib/Components/DotIndicator/types.d.ts +2 -2
  111. package/dist/typescript/src/lib/Components/DotSymbol/DotSymbol.d.ts +1 -1
  112. package/dist/typescript/src/lib/Components/DotSymbol/DotSymbol.d.ts.map +1 -1
  113. package/dist/typescript/src/lib/Components/DotSymbol/types.d.ts +7 -1
  114. package/dist/typescript/src/lib/Components/DotSymbol/types.d.ts.map +1 -1
  115. package/dist/typescript/src/lib/Components/Label/Label.d.ts +1 -1
  116. package/dist/typescript/src/lib/Components/MediaButton/MediaButton.d.ts +5 -5
  117. package/dist/typescript/src/lib/Components/MediaButton/MediaButton.d.ts.map +1 -1
  118. package/dist/typescript/src/lib/Components/MediaButton/types.d.ts +6 -6
  119. package/dist/typescript/src/lib/Components/MediaButton/types.d.ts.map +1 -1
  120. package/dist/typescript/src/lib/Components/MediaImage/MediaImage.d.ts +1 -1
  121. package/dist/typescript/src/lib/Components/MediaImage/MediaImage.d.ts.map +1 -1
  122. package/dist/typescript/src/lib/Components/MediaImage/types.d.ts +7 -1
  123. package/dist/typescript/src/lib/Components/MediaImage/types.d.ts.map +1 -1
  124. package/dist/typescript/src/lib/Components/NavBar/CoinCapsule.d.ts +1 -1
  125. package/dist/typescript/src/lib/Components/NavBar/CoinCapsule.d.ts.map +1 -1
  126. package/dist/typescript/src/lib/Components/NavBar/NavBar.d.ts +1 -1
  127. package/dist/typescript/src/lib/Components/NavBar/NavBar.d.ts.map +1 -1
  128. package/dist/typescript/src/lib/Components/NavBar/types.d.ts +3 -3
  129. package/dist/typescript/src/lib/Components/NavBar/types.d.ts.map +1 -1
  130. package/dist/typescript/src/lib/Components/PageIndicator/PageIndicator.d.ts.map +1 -1
  131. package/dist/typescript/src/lib/Components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  132. package/dist/typescript/src/lib/Components/index.d.ts +0 -1
  133. package/dist/typescript/src/lib/Components/index.d.ts.map +1 -1
  134. package/package.json +3 -3
  135. package/src/lib/Animations/Pulse/Pulse.mdx +1 -1
  136. package/src/lib/Animations/Spin/Spin.mdx +1 -1
  137. package/src/lib/Components/AddressInput/AddressInput.mdx +1 -1
  138. package/src/lib/Components/AmountDisplay/AmountDisplay.mdx +7 -1
  139. package/src/lib/Components/AmountDisplay/AmountDisplay.stories.tsx +18 -0
  140. package/src/lib/Components/AmountDisplay/AmountDisplay.tsx +71 -40
  141. package/src/lib/Components/AmountDisplay/index.ts +5 -1
  142. package/src/lib/Components/AmountDisplay/types.ts +12 -3
  143. package/src/lib/Components/AmountInput/AmountInput.mdx +13 -1
  144. package/src/lib/Components/AmountInput/AmountInput.stories.tsx +68 -1
  145. package/src/lib/Components/AmountInput/AmountInput.tsx +118 -75
  146. package/src/lib/Components/AmountInput/types.ts +14 -0
  147. package/src/lib/Components/Avatar/Avatar.mdx +3 -1
  148. package/src/lib/Components/Avatar/Avatar.test.tsx +16 -18
  149. package/src/lib/Components/Avatar/Avatar.tsx +9 -8
  150. package/src/lib/Components/Banner/Banner.mdx +1 -1
  151. package/src/lib/Components/BottomSheet/BottomSheet.mdx +1 -1
  152. package/src/lib/Components/Button/Button.mdx +1 -1
  153. package/src/lib/Components/Card/Card.stories.tsx +1 -3
  154. package/src/lib/Components/CardButton/CardButton.mdx +1 -1
  155. package/src/lib/Components/Checkbox/Checkbox.mdx +1 -1
  156. package/src/lib/Components/Divider/Divider.mdx +1 -1
  157. package/src/lib/Components/DotIcon/DotIcon.mdx +92 -0
  158. package/src/lib/Components/DotIcon/DotIcon.stories.tsx +43 -0
  159. package/src/lib/Components/DotIcon/DotIcon.tsx +35 -15
  160. package/src/lib/Components/DotIcon/types.ts +7 -1
  161. package/src/lib/Components/DotIndicator/DotIndicator.mdx +4 -4
  162. package/src/lib/Components/DotIndicator/DotIndicator.stories.tsx +2 -2
  163. package/src/lib/Components/DotIndicator/DotIndicator.test.tsx +12 -2
  164. package/src/lib/Components/DotIndicator/DotIndicator.tsx +5 -5
  165. package/src/lib/Components/DotIndicator/types.ts +2 -2
  166. package/src/lib/Components/DotSymbol/DotSymbol.mdx +79 -2
  167. package/src/lib/Components/DotSymbol/DotSymbol.stories.tsx +32 -0
  168. package/src/lib/Components/DotSymbol/DotSymbol.tsx +46 -25
  169. package/src/lib/Components/DotSymbol/types.ts +7 -1
  170. package/src/lib/Components/IconButton/IconButton.mdx +1 -1
  171. package/src/lib/Components/InteractiveIcon/InteractiveIcon.mdx +1 -1
  172. package/src/lib/Components/Label/Label.tsx +1 -1
  173. package/src/lib/Components/Link/Link.mdx +1 -1
  174. package/src/lib/Components/MediaBanner/MediaBanner.mdx +1 -1
  175. package/src/lib/Components/MediaButton/MediaButton.mdx +5 -5
  176. package/src/lib/Components/MediaButton/MediaButton.stories.tsx +29 -15
  177. package/src/lib/Components/MediaButton/MediaButton.test.tsx +4 -4
  178. package/src/lib/Components/MediaButton/MediaButton.tsx +35 -22
  179. package/src/lib/Components/MediaButton/types.ts +6 -6
  180. package/src/lib/Components/MediaImage/MediaImage.mdx +1 -1
  181. package/src/lib/Components/MediaImage/MediaImage.stories.tsx +21 -0
  182. package/src/lib/Components/MediaImage/MediaImage.tsx +14 -2
  183. package/src/lib/Components/MediaImage/types.ts +7 -1
  184. package/src/lib/Components/NavBar/CoinCapsule.tsx +2 -2
  185. package/src/lib/Components/NavBar/NavBar.mdx +2 -2
  186. package/src/lib/Components/NavBar/NavBar.stories.tsx +3 -1
  187. package/src/lib/Components/NavBar/NavBar.test.tsx +3 -3
  188. package/src/lib/Components/NavBar/NavBar.tsx +2 -2
  189. package/src/lib/Components/NavBar/types.ts +3 -3
  190. package/src/lib/Components/OptionList/OptionList.mdx +1 -1
  191. package/src/lib/Components/OptionList/OptionList.stories.tsx +4 -4
  192. package/src/lib/Components/PageIndicator/PageIndicator.test.tsx +78 -0
  193. package/src/lib/Components/PageIndicator/PageIndicator.tsx +15 -7
  194. package/src/lib/Components/SearchInput/SearchInput.mdx +1 -1
  195. package/src/lib/Components/SegmentedControl/SegmentedControl.mdx +1 -1
  196. package/src/lib/Components/Spinner/Spinner.mdx +1 -1
  197. package/src/lib/Components/Spot/Spot.mdx +1 -1
  198. package/src/lib/Components/Stepper/Stepper.mdx +1 -1
  199. package/src/lib/Components/Subheader/Subheader.mdx +1 -1
  200. package/src/lib/Components/Switch/Switch.mdx +1 -1
  201. package/src/lib/Components/TabBar/TabBar.mdx +1 -1
  202. package/src/lib/Components/TextInput/TextInput.mdx +1 -1
  203. package/src/lib/Components/ThemeProvider/ThemeProvider.tsx +1 -4
  204. package/src/lib/Components/Tile/Tile.mdx +1 -1
  205. package/src/lib/Components/Tooltip/Tooltip.mdx +1 -1
  206. package/src/lib/Components/index.ts +0 -1
  207. package/src/lib/Symbols/Icons/Lightbulb.tsx +3 -3
  208. package/dist/module/lib/Components/Select/GlobalSelectBottomSheet.js +0 -155
  209. package/dist/module/lib/Components/Select/GlobalSelectBottomSheet.js.map +0 -1
  210. package/dist/module/lib/Components/Select/GlobalSelectContext.js +0 -78
  211. package/dist/module/lib/Components/Select/GlobalSelectContext.js.map +0 -1
  212. package/dist/module/lib/Components/Select/Select.js +0 -366
  213. package/dist/module/lib/Components/Select/Select.js.map +0 -1
  214. package/dist/module/lib/Components/Select/Select.mdx +0 -596
  215. package/dist/module/lib/Components/Select/Select.stories.js +0 -304
  216. package/dist/module/lib/Components/Select/Select.stories.js.map +0 -1
  217. package/dist/module/lib/Components/Select/Select.test.js +0 -123
  218. package/dist/module/lib/Components/Select/Select.test.js.map +0 -1
  219. package/dist/module/lib/Components/Select/SelectContext.js +0 -38
  220. package/dist/module/lib/Components/Select/SelectContext.js.map +0 -1
  221. package/dist/module/lib/Components/Select/index.js +0 -6
  222. package/dist/module/lib/Components/Select/index.js.map +0 -1
  223. package/dist/module/lib/Components/Select/types.js +0 -4
  224. package/dist/module/lib/Components/Select/types.js.map +0 -1
  225. package/dist/typescript/src/lib/Components/Select/GlobalSelectBottomSheet.d.ts +0 -20
  226. package/dist/typescript/src/lib/Components/Select/GlobalSelectBottomSheet.d.ts.map +0 -1
  227. package/dist/typescript/src/lib/Components/Select/GlobalSelectContext.d.ts +0 -44
  228. package/dist/typescript/src/lib/Components/Select/GlobalSelectContext.d.ts.map +0 -1
  229. package/dist/typescript/src/lib/Components/Select/Select.d.ts +0 -52
  230. package/dist/typescript/src/lib/Components/Select/Select.d.ts.map +0 -1
  231. package/dist/typescript/src/lib/Components/Select/SelectContext.d.ts +0 -36
  232. package/dist/typescript/src/lib/Components/Select/SelectContext.d.ts.map +0 -1
  233. package/dist/typescript/src/lib/Components/Select/index.d.ts +0 -4
  234. package/dist/typescript/src/lib/Components/Select/index.d.ts.map +0 -1
  235. package/dist/typescript/src/lib/Components/Select/types.d.ts +0 -130
  236. package/dist/typescript/src/lib/Components/Select/types.d.ts.map +0 -1
  237. package/src/lib/Components/Select/GlobalSelectBottomSheet.tsx +0 -180
  238. package/src/lib/Components/Select/GlobalSelectContext.tsx +0 -103
  239. package/src/lib/Components/Select/Select.mdx +0 -596
  240. package/src/lib/Components/Select/Select.stories.tsx +0 -266
  241. package/src/lib/Components/Select/Select.test.tsx +0 -117
  242. package/src/lib/Components/Select/Select.tsx +0 -469
  243. package/src/lib/Components/Select/SelectContext.tsx +0 -68
  244. package/src/lib/Components/Select/index.ts +0 -3
  245. 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 { type AmountInputProps } from './types';
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
- <Pressable
168
- onPress={handlePress}
169
- style={styles.pressable}
170
- accessibilityLabel={props.accessibilityLabel || 'Amount input'}
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
- {inputValue || '0'}
180
- </Animated.Text>
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
- {/** custom caret */}
183
- <Animated.View style={[styles.caret, animatedCaretStyle]} />
193
+ {/** custom caret */}
194
+ <Animated.View style={[styles.caret, animatedCaretStyle]} />
184
195
 
185
- {currencyPosition === 'right' && CurrencyText}
186
- </Pressable>
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
- container: {
203
- position: 'relative',
204
- },
205
- hiddenInput: {
206
- position: 'absolute',
207
- width: t.sizes.full,
208
- height: t.sizes.full,
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
- currency: StyleSheet.flatten([
235
- {
236
- color: t.colors.text.base,
237
- ...t.typographies.heading0SemiBold,
243
+ hiddenInput: {
244
+ position: 'absolute',
245
+ width: t.sizes.full,
246
+ height: t.sizes.full,
247
+ opacity: 0,
238
248
  },
239
- !hasValue && {
240
- color: t.colors.text.mutedSubtle,
249
+ alignRow: {
250
+ width: t.sizes.full,
251
+ flexDirection: 'row',
252
+ justifyContent: ALIGN_ROW_JUSTIFY[align],
241
253
  },
242
- !isEditable && {
243
- color: t.colors.text.disabled,
254
+ pressable: {
255
+ flexDirection: 'row',
256
+ alignItems: 'center',
244
257
  },
245
- isInvalid && {
246
- color: t.colors.text.error,
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
- caret: {
250
- marginHorizontal: t.spacings.s2,
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
- # 👤 Avatar
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: Record<
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: 'xs',
24
- md: 'sm',
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;
@@ -8,7 +8,7 @@ import CommonRulesDoAndDont from '../../../../.storybook/components/DoVsDont/Com
8
8
 
9
9
  <Meta title='Components/Banner' of={BannerStories} />
10
10
 
11
- # 🃏 Banner
11
+ # Banner
12
12
 
13
13
  <CustomTabs>
14
14
  <Tab label="Overview">
@@ -8,7 +8,7 @@ import { Box } from '../Utility';
8
8
 
9
9
  <Meta title="Components/BottomSheet" of={BottomSheetStories} />
10
10
 
11
- # 📋 BottomSheet
11
+ # BottomSheet
12
12
 
13
13
  <CustomTabs>
14
14
  <Tab label="Overview">
@@ -8,7 +8,7 @@ import { Box } from '../Utility';
8
8
 
9
9
  <Meta title='Action/Button' of={ButtonStories} />
10
10
 
11
- # 🔘 Button
11
+ # Button
12
12
 
13
13
  <CustomTabs>
14
14
  <Tab label="Overview ">
@@ -196,9 +196,7 @@ export const StatesShowcase: Story = {
196
196
  <Card {...args} lx={{ width: 's320' }} disabled>
197
197
  <CardHeader>
198
198
  <CardLeading>
199
- <Box lx={{ opacity: 0.3 }}>
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>
@@ -8,7 +8,7 @@ import { Box } from '../Utility';
8
8
 
9
9
  <Meta title='Action/CardButton' of={CardButtonStories} />
10
10
 
11
- # 🃏 CardButton
11
+ # CardButton
12
12
 
13
13
  <CustomTabs>
14
14
  <Tab label="Overview">
@@ -8,7 +8,7 @@ import CommonRulesDoAndDont from '../../../../.storybook/components/DoVsDont/Com
8
8
 
9
9
  <Meta title="Components/Checkbox" of={CheckboxStories} />
10
10
 
11
- # ☑️ Checkbox
11
+ # Checkbox
12
12
 
13
13
  <CustomTabs>
14
14
  <Tab label="Overview">
@@ -9,7 +9,7 @@ import CommonRulesDoAndDont from '../../../../.storybook/components/DoVsDont/Com
9
9
 
10
10
  <Meta title='Layout/Divider' of={DividerStories} />
11
11
 
12
- # Divider
12
+ # Divider
13
13
 
14
14
  <CustomTabs>
15
15
  <Tab label="Overview ">
@@ -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
  };