@ledgerhq/lumen-ui-rnative 0.1.10 → 0.1.12

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 (233) hide show
  1. package/dist/module/i18n/locales/de.json +3 -0
  2. package/dist/module/i18n/locales/en.json +3 -0
  3. package/dist/module/i18n/locales/es.json +3 -0
  4. package/dist/module/i18n/locales/fr.json +3 -0
  5. package/dist/module/i18n/locales/ja.json +3 -0
  6. package/dist/module/i18n/locales/ko.json +3 -0
  7. package/dist/module/i18n/locales/pt.json +3 -0
  8. package/dist/module/i18n/locales/ru.json +3 -0
  9. package/dist/module/i18n/locales/th.json +3 -0
  10. package/dist/module/i18n/locales/tr.json +3 -0
  11. package/dist/module/i18n/locales/zh.json +3 -0
  12. package/dist/module/lib/Animations/Pulse/Pulse.js +1 -1
  13. package/dist/module/lib/Animations/Spin/Spin.js +1 -1
  14. package/dist/module/lib/Components/AmountDisplay/AmountDisplay.js +21 -21
  15. package/dist/module/lib/Components/AmountDisplay/AmountDisplay.js.map +1 -1
  16. package/dist/module/lib/Components/AmountInput/AmountInput.js +19 -13
  17. package/dist/module/lib/Components/AmountInput/AmountInput.js.map +1 -1
  18. package/dist/module/lib/Components/BaseInput/BaseInput.js +16 -9
  19. package/dist/module/lib/Components/BaseInput/BaseInput.js.map +1 -1
  20. package/dist/module/lib/Components/BottomSheet/BottomSheet.stories.js.map +1 -1
  21. package/dist/module/lib/Components/Button/BaseButton.js +8 -1
  22. package/dist/module/lib/Components/Button/BaseButton.js.map +1 -1
  23. package/dist/module/lib/Components/Card/Card.js +20 -14
  24. package/dist/module/lib/Components/Card/Card.js.map +1 -1
  25. package/dist/module/lib/Components/CardButton/CardButton.js +8 -1
  26. package/dist/module/lib/Components/CardButton/CardButton.js.map +1 -1
  27. package/dist/module/lib/Components/Checkbox/Checkbox.js +8 -1
  28. package/dist/module/lib/Components/Checkbox/Checkbox.js.map +1 -1
  29. package/dist/module/lib/Components/InteractiveIcon/InteractiveIcon.js +32 -5
  30. package/dist/module/lib/Components/InteractiveIcon/InteractiveIcon.js.map +1 -1
  31. package/dist/module/lib/Components/Label/Label.js +9 -2
  32. package/dist/module/lib/Components/Label/Label.js.map +1 -1
  33. package/dist/module/lib/Components/Link/Link.mdx +1 -0
  34. package/dist/module/lib/Components/ListItem/ListItem.js +14 -19
  35. package/dist/module/lib/Components/ListItem/ListItem.js.map +1 -1
  36. package/dist/module/lib/Components/MediaCard/MediaCard.js +183 -0
  37. package/dist/module/lib/Components/MediaCard/MediaCard.js.map +1 -0
  38. package/dist/module/lib/Components/MediaCard/MediaCard.mdx +111 -0
  39. package/dist/module/lib/Components/MediaCard/MediaCard.stories.js +199 -0
  40. package/dist/module/lib/Components/MediaCard/MediaCard.stories.js.map +1 -0
  41. package/dist/module/lib/Components/MediaCard/MediaCard.test.js +140 -0
  42. package/dist/module/lib/Components/MediaCard/MediaCard.test.js.map +1 -0
  43. package/dist/module/lib/Components/MediaCard/index.js +5 -0
  44. package/dist/module/lib/Components/MediaCard/index.js.map +1 -0
  45. package/dist/module/lib/Components/MediaCard/types.js +4 -0
  46. package/dist/module/lib/Components/MediaCard/types.js.map +1 -0
  47. package/dist/module/lib/Components/PageIndicator/PageIndicator.js +2 -2
  48. package/dist/module/lib/Components/SegmentedControl/SegmentedControl.js +8 -1
  49. package/dist/module/lib/Components/SegmentedControl/SegmentedControl.js.map +1 -1
  50. package/dist/module/lib/Components/SegmentedControl/usePillLayout.js +1 -1
  51. package/dist/module/lib/Components/Select/Select.js +8 -1
  52. package/dist/module/lib/Components/Select/Select.js.map +1 -1
  53. package/dist/module/lib/Components/Spot/Spot.js +4 -4
  54. package/dist/module/lib/Components/Spot/Spot.js.map +1 -1
  55. package/dist/module/lib/Components/Stepper/Stepper.js +10 -4
  56. package/dist/module/lib/Components/Stepper/Stepper.js.map +1 -1
  57. package/dist/module/lib/Components/Subheader/Subheader.js +1 -34
  58. package/dist/module/lib/Components/Subheader/Subheader.js.map +1 -1
  59. package/dist/module/lib/Components/Subheader/Subheader.mdx +26 -61
  60. package/dist/module/lib/Components/Subheader/Subheader.stories.js +23 -12
  61. package/dist/module/lib/Components/Subheader/Subheader.stories.js.map +1 -1
  62. package/dist/module/lib/Components/Subheader/Subheader.test.js +2 -26
  63. package/dist/module/lib/Components/Subheader/Subheader.test.js.map +1 -1
  64. package/dist/module/lib/Components/Subheader/index.js +1 -1
  65. package/dist/module/lib/Components/Subheader/index.js.map +1 -1
  66. package/dist/module/lib/Components/Switch/BaseSwitch.js +1 -1
  67. package/dist/module/lib/Components/Switch/Switch.js +8 -1
  68. package/dist/module/lib/Components/Switch/Switch.js.map +1 -1
  69. package/dist/module/lib/Components/TabBar/TabBar.js +8 -7
  70. package/dist/module/lib/Components/TabBar/TabBar.js.map +1 -1
  71. package/dist/module/lib/Components/Tag/Tag.js +9 -2
  72. package/dist/module/lib/Components/Tag/Tag.js.map +1 -1
  73. package/dist/module/lib/Components/ThemeProvider/ThemeProvider.test.js +22 -20
  74. package/dist/module/lib/Components/ThemeProvider/ThemeProvider.test.js.map +1 -1
  75. package/dist/module/lib/Components/Tile/Tile.js +27 -48
  76. package/dist/module/lib/Components/Tile/Tile.js.map +1 -1
  77. package/dist/module/lib/Components/Tile/Tile.mdx +34 -26
  78. package/dist/module/lib/Components/Tile/Tile.stories.js +31 -28
  79. package/dist/module/lib/Components/Tile/Tile.stories.js.map +1 -1
  80. package/dist/module/lib/Components/Tile/Tile.test.js +33 -188
  81. package/dist/module/lib/Components/Tile/Tile.test.js.map +1 -1
  82. package/dist/module/lib/Components/Tile/index.js +1 -1
  83. package/dist/module/lib/Components/Tile/index.js.map +1 -1
  84. package/dist/module/lib/Components/TileButton/TileButton.js +8 -2
  85. package/dist/module/lib/Components/TileButton/TileButton.js.map +1 -1
  86. package/dist/module/lib/Components/TriggerButton/TriggerButton.js +197 -0
  87. package/dist/module/lib/Components/TriggerButton/TriggerButton.js.map +1 -0
  88. package/dist/module/lib/Components/TriggerButton/TriggerButton.mdx +44 -0
  89. package/dist/module/lib/Components/TriggerButton/TriggerButton.stories.js +170 -0
  90. package/dist/module/lib/Components/TriggerButton/TriggerButton.stories.js.map +1 -0
  91. package/dist/module/lib/Components/TriggerButton/TriggerButton.test.js +146 -0
  92. package/dist/module/lib/Components/TriggerButton/TriggerButton.test.js.map +1 -0
  93. package/dist/module/lib/Components/TriggerButton/index.js +5 -0
  94. package/dist/module/lib/Components/TriggerButton/index.js.map +1 -0
  95. package/dist/module/lib/Components/TriggerButton/types.js +4 -0
  96. package/dist/module/lib/Components/TriggerButton/types.js.map +1 -0
  97. package/dist/module/lib/Components/Utility/Gradient/RadialGradient/RadialGradient.stories.js.map +1 -1
  98. package/dist/module/lib/Components/index.js +2 -0
  99. package/dist/module/lib/Components/index.js.map +1 -1
  100. package/dist/module/lib/Symbols/Icons/NanoGen5.js +49 -0
  101. package/dist/module/lib/Symbols/Icons/NanoGen5.js.map +1 -0
  102. package/dist/module/lib/Symbols/index.js +1 -0
  103. package/dist/module/lib/Symbols/index.js.map +1 -1
  104. package/dist/typescript/src/lib/Components/AmountInput/AmountInput.d.ts +1 -1
  105. package/dist/typescript/src/lib/Components/AmountInput/AmountInput.d.ts.map +1 -1
  106. package/dist/typescript/src/lib/Components/BaseInput/BaseInput.d.ts +1 -1
  107. package/dist/typescript/src/lib/Components/BaseInput/BaseInput.d.ts.map +1 -1
  108. package/dist/typescript/src/lib/Components/Button/BaseButton.d.ts +1 -1
  109. package/dist/typescript/src/lib/Components/Button/BaseButton.d.ts.map +1 -1
  110. package/dist/typescript/src/lib/Components/Card/Card.d.ts.map +1 -1
  111. package/dist/typescript/src/lib/Components/Card/types.d.ts +1 -3
  112. package/dist/typescript/src/lib/Components/Card/types.d.ts.map +1 -1
  113. package/dist/typescript/src/lib/Components/CardButton/CardButton.d.ts +1 -1
  114. package/dist/typescript/src/lib/Components/CardButton/CardButton.d.ts.map +1 -1
  115. package/dist/typescript/src/lib/Components/Checkbox/Checkbox.d.ts +1 -1
  116. package/dist/typescript/src/lib/Components/Checkbox/Checkbox.d.ts.map +1 -1
  117. package/dist/typescript/src/lib/Components/InteractiveIcon/InteractiveIcon.d.ts +1 -1
  118. package/dist/typescript/src/lib/Components/InteractiveIcon/InteractiveIcon.d.ts.map +1 -1
  119. package/dist/typescript/src/lib/Components/InteractiveIcon/types.d.ts +14 -1
  120. package/dist/typescript/src/lib/Components/InteractiveIcon/types.d.ts.map +1 -1
  121. package/dist/typescript/src/lib/Components/Label/Label.d.ts +1 -1
  122. package/dist/typescript/src/lib/Components/Label/Label.d.ts.map +1 -1
  123. package/dist/typescript/src/lib/Components/ListItem/ListItem.d.ts +1 -1
  124. package/dist/typescript/src/lib/Components/ListItem/ListItem.d.ts.map +1 -1
  125. package/dist/typescript/src/lib/Components/MediaCard/MediaCard.d.ts +32 -0
  126. package/dist/typescript/src/lib/Components/MediaCard/MediaCard.d.ts.map +1 -0
  127. package/dist/typescript/src/lib/Components/MediaCard/index.d.ts +3 -0
  128. package/dist/typescript/src/lib/Components/MediaCard/index.d.ts.map +1 -0
  129. package/dist/typescript/src/lib/Components/MediaCard/types.d.ts +38 -0
  130. package/dist/typescript/src/lib/Components/MediaCard/types.d.ts.map +1 -0
  131. package/dist/typescript/src/lib/Components/SegmentedControl/SegmentedControl.d.ts +1 -1
  132. package/dist/typescript/src/lib/Components/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  133. package/dist/typescript/src/lib/Components/SegmentedControl/SegmentedControlContext.d.ts +1 -1
  134. package/dist/typescript/src/lib/Components/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
  135. package/dist/typescript/src/lib/Components/Select/Select.d.ts +1 -1
  136. package/dist/typescript/src/lib/Components/Select/Select.d.ts.map +1 -1
  137. package/dist/typescript/src/lib/Components/Stepper/Stepper.d.ts +1 -1
  138. package/dist/typescript/src/lib/Components/Stepper/Stepper.d.ts.map +1 -1
  139. package/dist/typescript/src/lib/Components/Subheader/Subheader.d.ts +2 -7
  140. package/dist/typescript/src/lib/Components/Subheader/Subheader.d.ts.map +1 -1
  141. package/dist/typescript/src/lib/Components/Subheader/index.d.ts +1 -1
  142. package/dist/typescript/src/lib/Components/Subheader/index.d.ts.map +1 -1
  143. package/dist/typescript/src/lib/Components/Subheader/types.d.ts +1 -11
  144. package/dist/typescript/src/lib/Components/Subheader/types.d.ts.map +1 -1
  145. package/dist/typescript/src/lib/Components/Switch/Switch.d.ts +1 -1
  146. package/dist/typescript/src/lib/Components/Switch/Switch.d.ts.map +1 -1
  147. package/dist/typescript/src/lib/Components/TabBar/TabBar.d.ts.map +1 -1
  148. package/dist/typescript/src/lib/Components/Tag/Tag.d.ts +1 -1
  149. package/dist/typescript/src/lib/Components/Tag/Tag.d.ts.map +1 -1
  150. package/dist/typescript/src/lib/Components/Tile/Tile.d.ts +17 -23
  151. package/dist/typescript/src/lib/Components/Tile/Tile.d.ts.map +1 -1
  152. package/dist/typescript/src/lib/Components/Tile/index.d.ts +1 -1
  153. package/dist/typescript/src/lib/Components/Tile/index.d.ts.map +1 -1
  154. package/dist/typescript/src/lib/Components/Tile/types.d.ts +0 -9
  155. package/dist/typescript/src/lib/Components/Tile/types.d.ts.map +1 -1
  156. package/dist/typescript/src/lib/Components/TileButton/TileButton.d.ts +1 -1
  157. package/dist/typescript/src/lib/Components/TileButton/TileButton.d.ts.map +1 -1
  158. package/dist/typescript/src/lib/Components/TriggerButton/TriggerButton.d.ts +26 -0
  159. package/dist/typescript/src/lib/Components/TriggerButton/TriggerButton.d.ts.map +1 -0
  160. package/dist/typescript/src/lib/Components/TriggerButton/index.d.ts +3 -0
  161. package/dist/typescript/src/lib/Components/TriggerButton/index.d.ts.map +1 -0
  162. package/dist/typescript/src/lib/Components/TriggerButton/types.d.ts +38 -0
  163. package/dist/typescript/src/lib/Components/TriggerButton/types.d.ts.map +1 -0
  164. package/dist/typescript/src/lib/Components/index.d.ts +2 -0
  165. package/dist/typescript/src/lib/Components/index.d.ts.map +1 -1
  166. package/dist/typescript/src/lib/Symbols/Icons/NanoGen5.d.ts +35 -0
  167. package/dist/typescript/src/lib/Symbols/Icons/NanoGen5.d.ts.map +1 -0
  168. package/dist/typescript/src/lib/Symbols/index.d.ts +1 -0
  169. package/dist/typescript/src/lib/Symbols/index.d.ts.map +1 -1
  170. package/package.json +4 -4
  171. package/src/i18n/locales/de.json +3 -0
  172. package/src/i18n/locales/en.json +3 -0
  173. package/src/i18n/locales/es.json +3 -0
  174. package/src/i18n/locales/fr.json +3 -0
  175. package/src/i18n/locales/ja.json +3 -0
  176. package/src/i18n/locales/ko.json +3 -0
  177. package/src/i18n/locales/pt.json +3 -0
  178. package/src/i18n/locales/ru.json +3 -0
  179. package/src/i18n/locales/th.json +3 -0
  180. package/src/i18n/locales/tr.json +3 -0
  181. package/src/i18n/locales/zh.json +3 -0
  182. package/src/lib/Components/AmountDisplay/AmountDisplay.tsx +20 -20
  183. package/src/lib/Components/AmountInput/AmountInput.tsx +15 -7
  184. package/src/lib/Components/BaseInput/BaseInput.tsx +12 -7
  185. package/src/lib/Components/BottomSheet/BottomSheet.stories.tsx +9 -9
  186. package/src/lib/Components/Button/BaseButton.tsx +6 -1
  187. package/src/lib/Components/Card/Card.tsx +16 -16
  188. package/src/lib/Components/Card/types.ts +1 -4
  189. package/src/lib/Components/CardButton/CardButton.tsx +7 -1
  190. package/src/lib/Components/Checkbox/Checkbox.tsx +7 -1
  191. package/src/lib/Components/InteractiveIcon/InteractiveIcon.tsx +34 -7
  192. package/src/lib/Components/InteractiveIcon/types.ts +14 -1
  193. package/src/lib/Components/Label/Label.tsx +7 -2
  194. package/src/lib/Components/Link/Link.mdx +1 -0
  195. package/src/lib/Components/ListItem/ListItem.tsx +15 -12
  196. package/src/lib/Components/MediaCard/MediaCard.mdx +111 -0
  197. package/src/lib/Components/MediaCard/MediaCard.stories.tsx +190 -0
  198. package/src/lib/Components/MediaCard/MediaCard.test.tsx +125 -0
  199. package/src/lib/Components/MediaCard/MediaCard.tsx +203 -0
  200. package/src/lib/Components/MediaCard/index.ts +2 -0
  201. package/src/lib/Components/MediaCard/types.ts +39 -0
  202. package/src/lib/Components/SegmentedControl/SegmentedControl.tsx +6 -1
  203. package/src/lib/Components/SegmentedControl/SegmentedControlContext.tsx +1 -1
  204. package/src/lib/Components/Select/Select.tsx +6 -1
  205. package/src/lib/Components/Spot/Spot.tsx +4 -4
  206. package/src/lib/Components/Stepper/Stepper.tsx +9 -2
  207. package/src/lib/Components/Subheader/Subheader.mdx +26 -61
  208. package/src/lib/Components/Subheader/Subheader.stories.tsx +16 -10
  209. package/src/lib/Components/Subheader/Subheader.test.tsx +0 -22
  210. package/src/lib/Components/Subheader/Subheader.tsx +1 -42
  211. package/src/lib/Components/Subheader/index.ts +0 -1
  212. package/src/lib/Components/Subheader/types.ts +1 -16
  213. package/src/lib/Components/Switch/Switch.tsx +6 -1
  214. package/src/lib/Components/TabBar/TabBar.tsx +5 -2
  215. package/src/lib/Components/Tag/Tag.tsx +7 -2
  216. package/src/lib/Components/ThemeProvider/ThemeProvider.test.tsx +16 -18
  217. package/src/lib/Components/Tile/Tile.mdx +34 -26
  218. package/src/lib/Components/Tile/Tile.stories.tsx +26 -26
  219. package/src/lib/Components/Tile/Tile.test.tsx +17 -137
  220. package/src/lib/Components/Tile/Tile.tsx +28 -40
  221. package/src/lib/Components/Tile/index.ts +0 -1
  222. package/src/lib/Components/Tile/types.ts +0 -11
  223. package/src/lib/Components/TileButton/TileButton.tsx +9 -2
  224. package/src/lib/Components/TriggerButton/TriggerButton.mdx +44 -0
  225. package/src/lib/Components/TriggerButton/TriggerButton.stories.tsx +132 -0
  226. package/src/lib/Components/TriggerButton/TriggerButton.test.tsx +157 -0
  227. package/src/lib/Components/TriggerButton/TriggerButton.tsx +228 -0
  228. package/src/lib/Components/TriggerButton/index.ts +2 -0
  229. package/src/lib/Components/TriggerButton/types.ts +38 -0
  230. package/src/lib/Components/Utility/Gradient/RadialGradient/RadialGradient.stories.tsx +1 -1
  231. package/src/lib/Components/index.ts +2 -0
  232. package/src/lib/Symbols/Icons/NanoGen5.tsx +44 -0
  233. package/src/lib/Symbols/index.ts +1 -0
@@ -1,25 +1,20 @@
1
1
  import {
2
- createSafeContext,
2
+ DisabledProvider,
3
3
  isTextChildren,
4
+ useDisabledContext,
4
5
  } from '@ledgerhq/lumen-utils-shared';
5
6
  import { ReactNode } from 'react';
6
7
  import { StyleSheet, View } from 'react-native';
7
8
  import { useStyleSheet } from '../../../styles';
8
- import { Spot } from '../Spot';
9
9
  import { Box, Pressable, Text } from '../Utility';
10
10
  import {
11
11
  TileContentProps,
12
- TileContextValue,
13
12
  TileDescriptionProps,
14
13
  TileProps,
15
- TileSpotProps,
16
14
  TileTitleProps,
17
15
  TileTrailingContentProps,
18
16
  } from './types';
19
17
 
20
- const [TileProvider, useTileContext] =
21
- createSafeContext<TileContextValue>('Tile');
22
-
23
18
  type Appearance = NonNullable<TileProps['appearance']>;
24
19
 
25
20
  const useRootStyles = ({
@@ -85,12 +80,13 @@ const useRootStyles = ({
85
80
  * Do not use it to modify the tile's core appearance (colors, padding, etc). Use the `appearance` prop instead.
86
81
  *
87
82
  * @example
88
- * // Basic tile with spot and content
89
- * import { Tile, TileSpot, TileContent, TileTitle, TileDescription } from '@ledgerhq/lumen-ui-rnative';
83
+ * // Basic tile with icon and content
84
+ * import { Tile, TileContent, TileTitle, TileDescription } from '@ledgerhq/lumen-ui-rnative';
85
+ * import { Spot } from '@ledgerhq/lumen-ui-rnative';
90
86
  * import { Wallet } from '@ledgerhq/lumen-ui-rnative/symbols';
91
87
  *
92
88
  * <Tile appearance="card" onPress={() => console.log('Pressed!')}>
93
- * <TileSpot appearance="icon" icon={Wallet} />
89
+ * <Spot appearance="icon" icon={Wallet} />
94
90
  * <TileContent>
95
91
  * <TileTitle>My Wallet</TileTitle>
96
92
  * <TileDescription>Description</TileDescription>
@@ -98,30 +94,37 @@ const useRootStyles = ({
98
94
  * </Tile>
99
95
  *
100
96
  * @example
101
- * // With custom content and long press
102
- * import { Tile, TileSpot, TileContent, TileTitle, Tag } from '@ledgerhq/lumen-ui-rnative';
97
+ * // With trailing content (Tags)
98
+ * import { Tile, TileContent, TileTitle, TileTrailingContent, Tag } from '@ledgerhq/lumen-ui-rnative';
103
99
  * import { Bitcoin } from '@ledgerhq/lumen-ui-rnative/symbols';
104
100
  *
105
101
  * <Tile appearance="card" onLongPress={() => console.log('Long pressed')}>
106
- * <TileSpot appearance="icon" icon={Bitcoin} />
102
+ * <Spot appearance="icon" icon={Bitcoin} />
107
103
  * <TileContent>
108
104
  * <TileTitle>Bitcoin</TileTitle>
105
+ * <TileTrailingContent>
106
+ * <Tag label="Active" />
107
+ * </TileTrailingContent>
109
108
  * </TileContent>
110
- * <Tag label="Active" />
111
109
  * </Tile>
112
110
  */
113
111
  export const Tile = ({
114
112
  lx = {},
115
113
  style,
116
114
  appearance = 'no-background',
117
- disabled = false,
115
+ disabled: disabledProp = false,
118
116
  centered = false,
119
117
  children,
120
118
  ref,
121
119
  ...props
122
120
  }: TileProps) => {
121
+ const disabled = useDisabledContext({
122
+ consumerName: 'Tile',
123
+ mergeWith: { disabled: disabledProp },
124
+ });
125
+
123
126
  return (
124
- <TileProvider value={{ disabled }}>
127
+ <DisabledProvider value={{ disabled }}>
125
128
  <Pressable
126
129
  ref={ref}
127
130
  lx={lx}
@@ -137,7 +140,7 @@ export const Tile = ({
137
140
  {({ pressed }) => (
138
141
  <TilePressableContent
139
142
  appearance={appearance}
140
- disabled={disabled}
143
+ disabled={!!disabled}
141
144
  pressed={pressed}
142
145
  centered={centered}
143
146
  >
@@ -145,7 +148,7 @@ export const Tile = ({
145
148
  </TilePressableContent>
146
149
  )}
147
150
  </Pressable>
148
- </TileProvider>
151
+ </DisabledProvider>
149
152
  );
150
153
  };
151
154
 
@@ -168,22 +171,6 @@ const TilePressableContent = ({
168
171
  return <View style={styles.container}>{children}</View>;
169
172
  };
170
173
 
171
- /**
172
- * A spot adapter for use within Tile. Automatically inherits the disabled state from the parent Tile.
173
- *
174
- * @example
175
- * <Tile>
176
- * <TileSpot appearance="icon" icon={Settings} />
177
- * </Tile>
178
- */
179
- export const TileSpot = ({ size = 48, ...props }: TileSpotProps) => {
180
- const { disabled } = useTileContext({
181
- consumerName: 'TileSpot',
182
- contextRequired: true,
183
- });
184
- return <Spot {...props} size={size} disabled={disabled} />;
185
- };
186
-
187
174
  const useContentStyles = () => {
188
175
  return useStyleSheet(
189
176
  (t) => ({
@@ -195,17 +182,18 @@ const useContentStyles = () => {
195
182
  [],
196
183
  );
197
184
  };
198
- TileSpot.displayName = 'TileSpot';
199
-
200
185
  /**
201
- * A container for grouping TileTitle and TileDescription with consistent spacing.
186
+ * A container for grouping TileTitle, TileDescription and TileTrailingContent with consistent spacing.
202
187
  * Use this to wrap text content within a Tile.
203
188
  *
204
189
  * @example
205
190
  * <Tile>
206
191
  * <TileContent>
207
192
  * <TileTitle>My Title</TileTitle>
208
- * <TileDescription>My Description</TileDescription>
193
+ * <TileDescription>Description</TileDescription>
194
+ * <TileTrailingContent>
195
+ * <Tag label="Active" />
196
+ * </TileTrailingContent>
209
197
  * </TileContent>
210
198
  * </Tile>
211
199
  */
@@ -250,7 +238,7 @@ const useTitleStyles = ({ disabled }: { disabled: boolean }) => {
250
238
  * If children is a string, it will be automatically wrapped in a Text component.
251
239
  */
252
240
  export const TileTitle = ({ children, lx, style }: TileTitleProps) => {
253
- const { disabled } = useTileContext({
241
+ const disabled = useDisabledContext({
254
242
  consumerName: 'TileTitle',
255
243
  contextRequired: true,
256
244
  });
@@ -320,7 +308,7 @@ export const TileDescription = ({
320
308
  lx,
321
309
  style,
322
310
  }: TileDescriptionProps) => {
323
- const { disabled } = useTileContext({
311
+ const disabled = useDisabledContext({
324
312
  consumerName: 'TileDescription',
325
313
  contextRequired: true,
326
314
  });
@@ -1,6 +1,5 @@
1
1
  export {
2
2
  Tile,
3
- TileSpot,
4
3
  TileContent,
5
4
  TileTitle,
6
5
  TileDescription,
@@ -4,14 +4,11 @@ import {
4
4
  StyledTextProps,
5
5
  StyledViewProps,
6
6
  } from '../../../styles';
7
- import { DiscriminatedSpotProps, SpotSize } from '../Spot/types';
8
7
 
9
8
  export type TileContextValue = {
10
9
  disabled: boolean;
11
10
  };
12
11
 
13
- export type TileSpotSize = Extract<SpotSize, 40 | 48>;
14
-
15
12
  export type TileProps = {
16
13
  /**
17
14
  * The visual style of the tile.
@@ -47,14 +44,6 @@ export type TileProps = {
47
44
  children: ReactNode;
48
45
  } & Omit<StyledPressableProps, 'onPress' | 'onLongPress' | 'disabled'>;
49
46
 
50
- export type TileSpotProps = {
51
- /**
52
- * The size of the spot.
53
- * @default 48
54
- */
55
- size?: 40 | 48;
56
- } & DiscriminatedSpotProps;
57
-
58
47
  export type TileContentProps = {
59
48
  /**
60
49
  * The children to display inside the tile content area.
@@ -1,4 +1,7 @@
1
- import { isTextChildren } from '@ledgerhq/lumen-utils-shared';
1
+ import {
2
+ isTextChildren,
3
+ useDisabledContext,
4
+ } from '@ledgerhq/lumen-utils-shared';
2
5
  import { FC, PropsWithChildren } from 'react';
3
6
  import { StyleSheet, View } from 'react-native';
4
7
  import { useStyleSheet } from '../../../styles';
@@ -79,11 +82,15 @@ export const TileButton = ({
79
82
  style,
80
83
  icon: IconProp,
81
84
  children,
82
- disabled = false,
85
+ disabled: disabledProp = false,
83
86
  isFull = false,
84
87
  numberOfLines = 2,
85
88
  ...props
86
89
  }: TileButtonProps) => {
90
+ const disabled = useDisabledContext({
91
+ consumerName: 'TileButton',
92
+ mergeWith: { disabled: disabledProp },
93
+ });
87
94
  const rootStyles = useRootStyles({ isFull });
88
95
 
89
96
  return (
@@ -0,0 +1,44 @@
1
+ import { CustomTabs, Tab } from '../../../../.storybook/components';
2
+ import { Meta, Canvas, Controls } from '@storybook/addon-docs/blocks';
3
+ import * as TriggerButtonStories from './TriggerButton.stories';
4
+
5
+ <Meta title='Action/TriggerButton' of={TriggerButtonStories} />
6
+
7
+ <CustomTabs>
8
+ <Tab label="Overview ">
9
+
10
+ # TriggerButton
11
+
12
+ ## Introduction
13
+
14
+ A specialized trigger button designed exclusively for select and dropdown patterns. It displays a label with an optional leading icon and a permanent trailing chevron indicator.
15
+
16
+ > View in [Figma](https://www.figma.com/design/JxaLVMTWirCpU0rsbZ30k7/2.-Components-Library?node-id=6389-45680&m=dev).
17
+
18
+ > **Important**: This component should only be used as a trigger inside a Select or dropdown. For standalone actions, use [Button](/docs/action-button--docs) or [IconButton](/docs/action-iconbutton--docs) instead.
19
+
20
+ ## Properties
21
+
22
+ <Canvas of={TriggerButtonStories.Base} />
23
+ <Controls of={TriggerButtonStories.Base} />
24
+
25
+ ## Appearance
26
+
27
+ Three appearances are available: `gray` (default), `transparent`, and `no-background`.
28
+
29
+ <Canvas of={TriggerButtonStories.AppearanceShowcase} />
30
+
31
+ ## Sizes
32
+
33
+ <Canvas of={TriggerButtonStories.SizeShowcase} />
34
+
35
+ ## Icon Types
36
+
37
+ The `iconType` prop controls the padding scheme based on the leading icon's shape:
38
+
39
+ - **`flat`**: Standard padding for interface icons (line icons without background).
40
+ - **`rounded`**: Tighter left padding for circular icons with their own background (e.g., crypto icons).
41
+
42
+ <Canvas of={TriggerButtonStories.IconTypeShowcase} />
43
+ </Tab>
44
+ </CustomTabs>
@@ -0,0 +1,132 @@
1
+ import { CryptoIcon } from '@ledgerhq/crypto-icons';
2
+ import type { Meta, StoryObj } from '@storybook/react-native-web-vite';
3
+ import { Settings, Star } from '../../Symbols';
4
+ import { Box } from '../Utility';
5
+ import { TriggerButton } from './TriggerButton';
6
+
7
+ const meta: Meta<typeof TriggerButton> = {
8
+ component: TriggerButton,
9
+ title: 'Action/TriggerButton',
10
+ parameters: {
11
+ layout: 'centered',
12
+ docs: {
13
+ source: {
14
+ language: 'tsx',
15
+ format: true,
16
+ type: 'code',
17
+ },
18
+ },
19
+ },
20
+ };
21
+
22
+ export default meta;
23
+ type Story = StoryObj<typeof TriggerButton>;
24
+
25
+ export const Base: Story = {
26
+ args: {
27
+ children: 'All accounts',
28
+ appearance: 'gray',
29
+ },
30
+ render: (args) => <TriggerButton {...args} />,
31
+ parameters: {
32
+ docs: {
33
+ source: {
34
+ code: `
35
+ <TriggerButton appearance="gray">
36
+ All accounts
37
+ </TriggerButton>
38
+ `,
39
+ },
40
+ },
41
+ },
42
+ };
43
+
44
+ export const SizeShowcase: Story = {
45
+ render: () => (
46
+ <Box lx={{ flexDirection: 'row', alignItems: 'center', gap: 's16' }}>
47
+ <TriggerButton size='sm' icon={<Star size={20} />} iconType='flat'>
48
+ Small
49
+ </TriggerButton>
50
+ <TriggerButton size='md' icon={<Star size={20} />} iconType='flat'>
51
+ Medium
52
+ </TriggerButton>
53
+ </Box>
54
+ ),
55
+ };
56
+
57
+ export const IconTypeShowcase: Story = {
58
+ render: () => (
59
+ <Box lx={{ flexDirection: 'column', gap: 's16' }}>
60
+ <Box lx={{ flexDirection: 'row', alignItems: 'center', gap: 's16' }}>
61
+ <TriggerButton
62
+ icon={<Settings size={20} />}
63
+ iconType='flat'
64
+ appearance='gray'
65
+ >
66
+ Flat icon (md)
67
+ </TriggerButton>
68
+ <TriggerButton
69
+ icon={<CryptoIcon ledgerId='bitcoin' ticker='BTC' size='32px' />}
70
+ iconType='rounded'
71
+ appearance='gray'
72
+ >
73
+ Rounded icon (md)
74
+ </TriggerButton>
75
+ <TriggerButton appearance='gray'>No icon (md)</TriggerButton>
76
+ </Box>
77
+ <Box lx={{ flexDirection: 'row', alignItems: 'center', gap: 's16' }}>
78
+ <TriggerButton
79
+ icon={<Settings size={20} />}
80
+ iconType='flat'
81
+ appearance='gray'
82
+ size='sm'
83
+ >
84
+ Flat icon (sm)
85
+ </TriggerButton>
86
+ <TriggerButton
87
+ icon={<CryptoIcon ledgerId='bitcoin' ticker='BTC' size='24px' />}
88
+ iconType='rounded'
89
+ appearance='gray'
90
+ size='sm'
91
+ >
92
+ Rounded icon (sm)
93
+ </TriggerButton>
94
+ <TriggerButton appearance='gray' size='sm'>
95
+ No icon (sm)
96
+ </TriggerButton>
97
+ </Box>
98
+ </Box>
99
+ ),
100
+ };
101
+
102
+ export const AppearanceShowcase: Story = {
103
+ render: () => {
104
+ const appearances = ['gray', 'transparent', 'no-background'] as const;
105
+ return (
106
+ <Box lx={{ flexDirection: 'column', gap: 's16', padding: 's16' }}>
107
+ {appearances.map((appearance) => (
108
+ <Box
109
+ key={appearance}
110
+ lx={{ flexDirection: 'row', alignItems: 'center', gap: 's16' }}
111
+ >
112
+ <TriggerButton appearance={appearance}>{appearance}</TriggerButton>
113
+ <TriggerButton
114
+ appearance={appearance}
115
+ icon={<Settings size={20} />}
116
+ iconType='flat'
117
+ >
118
+ {appearance}
119
+ </TriggerButton>
120
+ <TriggerButton
121
+ appearance={appearance}
122
+ icon={<CryptoIcon ledgerId='bitcoin' ticker='BTC' size='32px' />}
123
+ iconType='rounded'
124
+ >
125
+ {appearance}
126
+ </TriggerButton>
127
+ </Box>
128
+ ))}
129
+ </Box>
130
+ );
131
+ },
132
+ };
@@ -0,0 +1,157 @@
1
+ import { describe, it, expect, jest } from '@jest/globals';
2
+ import { ledgerLiveThemes } from '@ledgerhq/lumen-design-core';
3
+ import { render, screen, fireEvent } from '@testing-library/react-native';
4
+ import React, { createRef } from 'react';
5
+ import { View, ViewStyle } from 'react-native';
6
+
7
+ import { Settings } from '../../Symbols';
8
+ import { ThemeProvider } from '../ThemeProvider/ThemeProvider';
9
+ import { TriggerButton } from './TriggerButton';
10
+
11
+ const renderWithProvider = (component: React.ReactElement) => {
12
+ return render(
13
+ <ThemeProvider themes={ledgerLiveThemes} colorScheme='dark' locale='en'>
14
+ {component}
15
+ </ThemeProvider>,
16
+ );
17
+ };
18
+
19
+ describe('TriggerButton', () => {
20
+ describe('Rendering', () => {
21
+ it('should render with label text and correct accessibility role', () => {
22
+ renderWithProvider(
23
+ <TriggerButton testID='trigger'>All accounts</TriggerButton>,
24
+ );
25
+ const trigger = screen.getByTestId('trigger');
26
+ expect(trigger).toBeTruthy();
27
+ expect(screen.getByText('All accounts')).toBeTruthy();
28
+ expect(trigger.props.accessibilityRole).toBe('button');
29
+ });
30
+
31
+ it('should always render a chevron icon', () => {
32
+ renderWithProvider(<TriggerButton testID='trigger'>Label</TriggerButton>);
33
+ expect(screen.getByTestId('button-trigger-chevron')).toBeTruthy();
34
+ });
35
+
36
+ it.each(['gray', 'transparent', 'no-background'] as const)(
37
+ 'should render without errors for appearance "%s"',
38
+ (appearance) => {
39
+ renderWithProvider(
40
+ <TriggerButton testID='trigger' appearance={appearance}>
41
+ Label
42
+ </TriggerButton>,
43
+ );
44
+ expect(screen.getByTestId('trigger')).toBeTruthy();
45
+ },
46
+ );
47
+
48
+ it.each(['sm', 'md'] as const)(
49
+ 'should render without errors for size "%s"',
50
+ (size) => {
51
+ renderWithProvider(
52
+ <TriggerButton testID='trigger' size={size}>
53
+ Label
54
+ </TriggerButton>,
55
+ );
56
+ expect(screen.getByTestId('trigger')).toBeTruthy();
57
+ },
58
+ );
59
+ });
60
+
61
+ describe('Icons', () => {
62
+ it('should render with a flat interface icon', () => {
63
+ renderWithProvider(
64
+ <TriggerButton
65
+ testID='trigger'
66
+ icon={<Settings size={20} testID='icon' />}
67
+ iconType='flat'
68
+ >
69
+ Network
70
+ </TriggerButton>,
71
+ );
72
+ expect(screen.getByTestId('icon')).toBeTruthy();
73
+ expect(screen.getByText('Network')).toBeTruthy();
74
+ });
75
+
76
+ it('should render with a rounded icon', () => {
77
+ renderWithProvider(
78
+ <TriggerButton
79
+ testID='trigger'
80
+ icon={<View testID='crypto-icon' />}
81
+ iconType='rounded'
82
+ >
83
+ Bitcoin
84
+ </TriggerButton>,
85
+ );
86
+ expect(screen.getByTestId('crypto-icon')).toBeTruthy();
87
+ expect(screen.getByText('Bitcoin')).toBeTruthy();
88
+ });
89
+ });
90
+
91
+ describe('States', () => {
92
+ it('should be disabled when disabled prop is true', () => {
93
+ renderWithProvider(
94
+ <TriggerButton testID='trigger' disabled>
95
+ Label
96
+ </TriggerButton>,
97
+ );
98
+ const trigger = screen.getByTestId('trigger');
99
+ expect(trigger.props.accessibilityState.disabled).toBe(true);
100
+ });
101
+ });
102
+
103
+ describe('Interactions', () => {
104
+ it('should call onPress when pressed', () => {
105
+ const handlePress = jest.fn();
106
+ renderWithProvider(
107
+ <TriggerButton testID='trigger' onPress={handlePress}>
108
+ Press me
109
+ </TriggerButton>,
110
+ );
111
+
112
+ fireEvent.press(screen.getByTestId('trigger'));
113
+ expect(handlePress).toHaveBeenCalledTimes(1);
114
+ });
115
+
116
+ it('should not call onPress when disabled', () => {
117
+ const handlePress = jest.fn();
118
+ renderWithProvider(
119
+ <TriggerButton testID='trigger' onPress={handlePress} disabled>
120
+ Disabled
121
+ </TriggerButton>,
122
+ );
123
+
124
+ fireEvent.press(screen.getByTestId('trigger'));
125
+ expect(handlePress).not.toHaveBeenCalled();
126
+ });
127
+ });
128
+
129
+ describe('Ref Forwarding', () => {
130
+ it('should forward ref', () => {
131
+ const ref = createRef<View>();
132
+ renderWithProvider(
133
+ <TriggerButton ref={ref} testID='trigger'>
134
+ Label
135
+ </TriggerButton>,
136
+ );
137
+ expect(ref.current).toBeTruthy();
138
+ });
139
+ });
140
+
141
+ describe('Styling', () => {
142
+ it('should apply custom style and lx props', () => {
143
+ const customStyle: ViewStyle = { marginTop: 16 };
144
+ renderWithProvider(
145
+ <TriggerButton
146
+ testID='trigger'
147
+ style={customStyle}
148
+ lx={{ padding: 's8' }}
149
+ >
150
+ Styled
151
+ </TriggerButton>,
152
+ );
153
+ const trigger = screen.getByTestId('trigger');
154
+ expect(trigger.props.style).toBeDefined();
155
+ });
156
+ });
157
+ });