@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.
- package/dist/module/i18n/locales/de.json +3 -0
- package/dist/module/i18n/locales/en.json +3 -0
- package/dist/module/i18n/locales/es.json +3 -0
- package/dist/module/i18n/locales/fr.json +3 -0
- package/dist/module/i18n/locales/ja.json +3 -0
- package/dist/module/i18n/locales/ko.json +3 -0
- package/dist/module/i18n/locales/pt.json +3 -0
- package/dist/module/i18n/locales/ru.json +3 -0
- package/dist/module/i18n/locales/th.json +3 -0
- package/dist/module/i18n/locales/tr.json +3 -0
- package/dist/module/i18n/locales/zh.json +3 -0
- package/dist/module/lib/Animations/Pulse/Pulse.js +1 -1
- package/dist/module/lib/Animations/Spin/Spin.js +1 -1
- package/dist/module/lib/Components/AmountDisplay/AmountDisplay.js +21 -21
- package/dist/module/lib/Components/AmountDisplay/AmountDisplay.js.map +1 -1
- package/dist/module/lib/Components/AmountInput/AmountInput.js +19 -13
- package/dist/module/lib/Components/AmountInput/AmountInput.js.map +1 -1
- package/dist/module/lib/Components/BaseInput/BaseInput.js +16 -9
- package/dist/module/lib/Components/BaseInput/BaseInput.js.map +1 -1
- package/dist/module/lib/Components/BottomSheet/BottomSheet.stories.js.map +1 -1
- package/dist/module/lib/Components/Button/BaseButton.js +8 -1
- package/dist/module/lib/Components/Button/BaseButton.js.map +1 -1
- package/dist/module/lib/Components/Card/Card.js +20 -14
- package/dist/module/lib/Components/Card/Card.js.map +1 -1
- package/dist/module/lib/Components/CardButton/CardButton.js +8 -1
- package/dist/module/lib/Components/CardButton/CardButton.js.map +1 -1
- package/dist/module/lib/Components/Checkbox/Checkbox.js +8 -1
- package/dist/module/lib/Components/Checkbox/Checkbox.js.map +1 -1
- package/dist/module/lib/Components/InteractiveIcon/InteractiveIcon.js +32 -5
- package/dist/module/lib/Components/InteractiveIcon/InteractiveIcon.js.map +1 -1
- package/dist/module/lib/Components/Label/Label.js +9 -2
- package/dist/module/lib/Components/Label/Label.js.map +1 -1
- package/dist/module/lib/Components/Link/Link.mdx +1 -0
- package/dist/module/lib/Components/ListItem/ListItem.js +14 -19
- package/dist/module/lib/Components/ListItem/ListItem.js.map +1 -1
- package/dist/module/lib/Components/MediaCard/MediaCard.js +183 -0
- package/dist/module/lib/Components/MediaCard/MediaCard.js.map +1 -0
- package/dist/module/lib/Components/MediaCard/MediaCard.mdx +111 -0
- package/dist/module/lib/Components/MediaCard/MediaCard.stories.js +199 -0
- package/dist/module/lib/Components/MediaCard/MediaCard.stories.js.map +1 -0
- package/dist/module/lib/Components/MediaCard/MediaCard.test.js +140 -0
- package/dist/module/lib/Components/MediaCard/MediaCard.test.js.map +1 -0
- package/dist/module/lib/Components/MediaCard/index.js +5 -0
- package/dist/module/lib/Components/MediaCard/index.js.map +1 -0
- package/dist/module/lib/Components/MediaCard/types.js +4 -0
- package/dist/module/lib/Components/MediaCard/types.js.map +1 -0
- package/dist/module/lib/Components/PageIndicator/PageIndicator.js +2 -2
- package/dist/module/lib/Components/SegmentedControl/SegmentedControl.js +8 -1
- package/dist/module/lib/Components/SegmentedControl/SegmentedControl.js.map +1 -1
- package/dist/module/lib/Components/SegmentedControl/usePillLayout.js +1 -1
- package/dist/module/lib/Components/Select/Select.js +8 -1
- package/dist/module/lib/Components/Select/Select.js.map +1 -1
- package/dist/module/lib/Components/Spot/Spot.js +4 -4
- package/dist/module/lib/Components/Spot/Spot.js.map +1 -1
- package/dist/module/lib/Components/Stepper/Stepper.js +10 -4
- package/dist/module/lib/Components/Stepper/Stepper.js.map +1 -1
- package/dist/module/lib/Components/Subheader/Subheader.js +1 -34
- package/dist/module/lib/Components/Subheader/Subheader.js.map +1 -1
- package/dist/module/lib/Components/Subheader/Subheader.mdx +26 -61
- package/dist/module/lib/Components/Subheader/Subheader.stories.js +23 -12
- package/dist/module/lib/Components/Subheader/Subheader.stories.js.map +1 -1
- package/dist/module/lib/Components/Subheader/Subheader.test.js +2 -26
- package/dist/module/lib/Components/Subheader/Subheader.test.js.map +1 -1
- package/dist/module/lib/Components/Subheader/index.js +1 -1
- package/dist/module/lib/Components/Subheader/index.js.map +1 -1
- package/dist/module/lib/Components/Switch/BaseSwitch.js +1 -1
- package/dist/module/lib/Components/Switch/Switch.js +8 -1
- package/dist/module/lib/Components/Switch/Switch.js.map +1 -1
- package/dist/module/lib/Components/TabBar/TabBar.js +8 -7
- package/dist/module/lib/Components/TabBar/TabBar.js.map +1 -1
- package/dist/module/lib/Components/Tag/Tag.js +9 -2
- package/dist/module/lib/Components/Tag/Tag.js.map +1 -1
- package/dist/module/lib/Components/ThemeProvider/ThemeProvider.test.js +22 -20
- package/dist/module/lib/Components/ThemeProvider/ThemeProvider.test.js.map +1 -1
- package/dist/module/lib/Components/Tile/Tile.js +27 -48
- package/dist/module/lib/Components/Tile/Tile.js.map +1 -1
- package/dist/module/lib/Components/Tile/Tile.mdx +34 -26
- package/dist/module/lib/Components/Tile/Tile.stories.js +31 -28
- package/dist/module/lib/Components/Tile/Tile.stories.js.map +1 -1
- package/dist/module/lib/Components/Tile/Tile.test.js +33 -188
- package/dist/module/lib/Components/Tile/Tile.test.js.map +1 -1
- package/dist/module/lib/Components/Tile/index.js +1 -1
- package/dist/module/lib/Components/Tile/index.js.map +1 -1
- package/dist/module/lib/Components/TileButton/TileButton.js +8 -2
- package/dist/module/lib/Components/TileButton/TileButton.js.map +1 -1
- package/dist/module/lib/Components/TriggerButton/TriggerButton.js +197 -0
- package/dist/module/lib/Components/TriggerButton/TriggerButton.js.map +1 -0
- package/dist/module/lib/Components/TriggerButton/TriggerButton.mdx +44 -0
- package/dist/module/lib/Components/TriggerButton/TriggerButton.stories.js +170 -0
- package/dist/module/lib/Components/TriggerButton/TriggerButton.stories.js.map +1 -0
- package/dist/module/lib/Components/TriggerButton/TriggerButton.test.js +146 -0
- package/dist/module/lib/Components/TriggerButton/TriggerButton.test.js.map +1 -0
- package/dist/module/lib/Components/TriggerButton/index.js +5 -0
- package/dist/module/lib/Components/TriggerButton/index.js.map +1 -0
- package/dist/module/lib/Components/TriggerButton/types.js +4 -0
- package/dist/module/lib/Components/TriggerButton/types.js.map +1 -0
- package/dist/module/lib/Components/Utility/Gradient/RadialGradient/RadialGradient.stories.js.map +1 -1
- package/dist/module/lib/Components/index.js +2 -0
- package/dist/module/lib/Components/index.js.map +1 -1
- package/dist/module/lib/Symbols/Icons/NanoGen5.js +49 -0
- package/dist/module/lib/Symbols/Icons/NanoGen5.js.map +1 -0
- package/dist/module/lib/Symbols/index.js +1 -0
- package/dist/module/lib/Symbols/index.js.map +1 -1
- package/dist/typescript/src/lib/Components/AmountInput/AmountInput.d.ts +1 -1
- package/dist/typescript/src/lib/Components/AmountInput/AmountInput.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/BaseInput/BaseInput.d.ts +1 -1
- package/dist/typescript/src/lib/Components/BaseInput/BaseInput.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/Button/BaseButton.d.ts +1 -1
- package/dist/typescript/src/lib/Components/Button/BaseButton.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/Card/Card.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/Card/types.d.ts +1 -3
- package/dist/typescript/src/lib/Components/Card/types.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/CardButton/CardButton.d.ts +1 -1
- package/dist/typescript/src/lib/Components/CardButton/CardButton.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/Checkbox/Checkbox.d.ts +1 -1
- package/dist/typescript/src/lib/Components/Checkbox/Checkbox.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/InteractiveIcon/InteractiveIcon.d.ts +1 -1
- package/dist/typescript/src/lib/Components/InteractiveIcon/InteractiveIcon.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/InteractiveIcon/types.d.ts +14 -1
- package/dist/typescript/src/lib/Components/InteractiveIcon/types.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/Label/Label.d.ts +1 -1
- package/dist/typescript/src/lib/Components/Label/Label.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/ListItem/ListItem.d.ts +1 -1
- package/dist/typescript/src/lib/Components/ListItem/ListItem.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/MediaCard/MediaCard.d.ts +32 -0
- package/dist/typescript/src/lib/Components/MediaCard/MediaCard.d.ts.map +1 -0
- package/dist/typescript/src/lib/Components/MediaCard/index.d.ts +3 -0
- package/dist/typescript/src/lib/Components/MediaCard/index.d.ts.map +1 -0
- package/dist/typescript/src/lib/Components/MediaCard/types.d.ts +38 -0
- package/dist/typescript/src/lib/Components/MediaCard/types.d.ts.map +1 -0
- package/dist/typescript/src/lib/Components/SegmentedControl/SegmentedControl.d.ts +1 -1
- package/dist/typescript/src/lib/Components/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/SegmentedControl/SegmentedControlContext.d.ts +1 -1
- package/dist/typescript/src/lib/Components/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/Select/Select.d.ts +1 -1
- package/dist/typescript/src/lib/Components/Select/Select.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/Stepper/Stepper.d.ts +1 -1
- package/dist/typescript/src/lib/Components/Stepper/Stepper.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/Subheader/Subheader.d.ts +2 -7
- package/dist/typescript/src/lib/Components/Subheader/Subheader.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/Subheader/index.d.ts +1 -1
- package/dist/typescript/src/lib/Components/Subheader/index.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/Subheader/types.d.ts +1 -11
- package/dist/typescript/src/lib/Components/Subheader/types.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/Switch/Switch.d.ts +1 -1
- package/dist/typescript/src/lib/Components/Switch/Switch.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/TabBar/TabBar.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/Tag/Tag.d.ts +1 -1
- package/dist/typescript/src/lib/Components/Tag/Tag.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/Tile/Tile.d.ts +17 -23
- package/dist/typescript/src/lib/Components/Tile/Tile.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/Tile/index.d.ts +1 -1
- package/dist/typescript/src/lib/Components/Tile/index.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/Tile/types.d.ts +0 -9
- package/dist/typescript/src/lib/Components/Tile/types.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/TileButton/TileButton.d.ts +1 -1
- package/dist/typescript/src/lib/Components/TileButton/TileButton.d.ts.map +1 -1
- package/dist/typescript/src/lib/Components/TriggerButton/TriggerButton.d.ts +26 -0
- package/dist/typescript/src/lib/Components/TriggerButton/TriggerButton.d.ts.map +1 -0
- package/dist/typescript/src/lib/Components/TriggerButton/index.d.ts +3 -0
- package/dist/typescript/src/lib/Components/TriggerButton/index.d.ts.map +1 -0
- package/dist/typescript/src/lib/Components/TriggerButton/types.d.ts +38 -0
- package/dist/typescript/src/lib/Components/TriggerButton/types.d.ts.map +1 -0
- package/dist/typescript/src/lib/Components/index.d.ts +2 -0
- package/dist/typescript/src/lib/Components/index.d.ts.map +1 -1
- package/dist/typescript/src/lib/Symbols/Icons/NanoGen5.d.ts +35 -0
- package/dist/typescript/src/lib/Symbols/Icons/NanoGen5.d.ts.map +1 -0
- package/dist/typescript/src/lib/Symbols/index.d.ts +1 -0
- package/dist/typescript/src/lib/Symbols/index.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/i18n/locales/de.json +3 -0
- package/src/i18n/locales/en.json +3 -0
- package/src/i18n/locales/es.json +3 -0
- package/src/i18n/locales/fr.json +3 -0
- package/src/i18n/locales/ja.json +3 -0
- package/src/i18n/locales/ko.json +3 -0
- package/src/i18n/locales/pt.json +3 -0
- package/src/i18n/locales/ru.json +3 -0
- package/src/i18n/locales/th.json +3 -0
- package/src/i18n/locales/tr.json +3 -0
- package/src/i18n/locales/zh.json +3 -0
- package/src/lib/Components/AmountDisplay/AmountDisplay.tsx +20 -20
- package/src/lib/Components/AmountInput/AmountInput.tsx +15 -7
- package/src/lib/Components/BaseInput/BaseInput.tsx +12 -7
- package/src/lib/Components/BottomSheet/BottomSheet.stories.tsx +9 -9
- package/src/lib/Components/Button/BaseButton.tsx +6 -1
- package/src/lib/Components/Card/Card.tsx +16 -16
- package/src/lib/Components/Card/types.ts +1 -4
- package/src/lib/Components/CardButton/CardButton.tsx +7 -1
- package/src/lib/Components/Checkbox/Checkbox.tsx +7 -1
- package/src/lib/Components/InteractiveIcon/InteractiveIcon.tsx +34 -7
- package/src/lib/Components/InteractiveIcon/types.ts +14 -1
- package/src/lib/Components/Label/Label.tsx +7 -2
- package/src/lib/Components/Link/Link.mdx +1 -0
- package/src/lib/Components/ListItem/ListItem.tsx +15 -12
- package/src/lib/Components/MediaCard/MediaCard.mdx +111 -0
- package/src/lib/Components/MediaCard/MediaCard.stories.tsx +190 -0
- package/src/lib/Components/MediaCard/MediaCard.test.tsx +125 -0
- package/src/lib/Components/MediaCard/MediaCard.tsx +203 -0
- package/src/lib/Components/MediaCard/index.ts +2 -0
- package/src/lib/Components/MediaCard/types.ts +39 -0
- package/src/lib/Components/SegmentedControl/SegmentedControl.tsx +6 -1
- package/src/lib/Components/SegmentedControl/SegmentedControlContext.tsx +1 -1
- package/src/lib/Components/Select/Select.tsx +6 -1
- package/src/lib/Components/Spot/Spot.tsx +4 -4
- package/src/lib/Components/Stepper/Stepper.tsx +9 -2
- package/src/lib/Components/Subheader/Subheader.mdx +26 -61
- package/src/lib/Components/Subheader/Subheader.stories.tsx +16 -10
- package/src/lib/Components/Subheader/Subheader.test.tsx +0 -22
- package/src/lib/Components/Subheader/Subheader.tsx +1 -42
- package/src/lib/Components/Subheader/index.ts +0 -1
- package/src/lib/Components/Subheader/types.ts +1 -16
- package/src/lib/Components/Switch/Switch.tsx +6 -1
- package/src/lib/Components/TabBar/TabBar.tsx +5 -2
- package/src/lib/Components/Tag/Tag.tsx +7 -2
- package/src/lib/Components/ThemeProvider/ThemeProvider.test.tsx +16 -18
- package/src/lib/Components/Tile/Tile.mdx +34 -26
- package/src/lib/Components/Tile/Tile.stories.tsx +26 -26
- package/src/lib/Components/Tile/Tile.test.tsx +17 -137
- package/src/lib/Components/Tile/Tile.tsx +28 -40
- package/src/lib/Components/Tile/index.ts +0 -1
- package/src/lib/Components/Tile/types.ts +0 -11
- package/src/lib/Components/TileButton/TileButton.tsx +9 -2
- package/src/lib/Components/TriggerButton/TriggerButton.mdx +44 -0
- package/src/lib/Components/TriggerButton/TriggerButton.stories.tsx +132 -0
- package/src/lib/Components/TriggerButton/TriggerButton.test.tsx +157 -0
- package/src/lib/Components/TriggerButton/TriggerButton.tsx +228 -0
- package/src/lib/Components/TriggerButton/index.ts +2 -0
- package/src/lib/Components/TriggerButton/types.ts +38 -0
- package/src/lib/Components/Utility/Gradient/RadialGradient/RadialGradient.stories.tsx +1 -1
- package/src/lib/Components/index.ts +2 -0
- package/src/lib/Symbols/Icons/NanoGen5.tsx +44 -0
- package/src/lib/Symbols/index.ts +1 -0
|
@@ -1,25 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
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
|
|
89
|
-
* import { Tile,
|
|
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
|
-
* <
|
|
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
|
|
102
|
-
* import { Tile,
|
|
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
|
-
* <
|
|
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
|
-
<
|
|
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
|
-
</
|
|
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
|
|
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>
|
|
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
|
|
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
|
|
311
|
+
const disabled = useDisabledContext({
|
|
324
312
|
consumerName: 'TileDescription',
|
|
325
313
|
contextRequired: true,
|
|
326
314
|
});
|
|
@@ -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 {
|
|
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
|
+
});
|