@utilitywarehouse/hearth-react-native 0.6.0 → 0.8.0

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 (258) hide show
  1. package/.storybook/main.ts +12 -6
  2. package/.turbo/turbo-build.log +1 -1
  3. package/.turbo/turbo-lint.log +1 -1
  4. package/CHANGELOG.md +18 -0
  5. package/build/components/Banner/Banner.d.ts +6 -0
  6. package/build/components/Banner/Banner.js +161 -0
  7. package/build/components/Banner/Banner.props.d.ts +82 -0
  8. package/build/components/Banner/Banner.props.js +1 -0
  9. package/build/components/Banner/index.d.ts +2 -0
  10. package/build/components/Banner/index.js +1 -0
  11. package/build/components/BottomSheet/BottomSheetBackdrop.js +1 -5
  12. package/build/components/BottomSheet/BottomSheetFlatList.js +1 -5
  13. package/build/components/BottomSheet/BottomSheetHandle.js +1 -5
  14. package/build/components/BottomSheet/useBottomSheetLogic.d.ts +1 -1
  15. package/build/components/Button/ButtonIcon.js +2 -1
  16. package/build/components/Button/ButtonRoot.js +2 -6
  17. package/build/components/Button/ButtonText.js +4 -1
  18. package/build/components/Card/Card.context.d.ts +7 -0
  19. package/build/components/Card/CardAction/CardAction.context.d.ts +9 -0
  20. package/build/components/Card/{CardAction.context.js → CardAction/CardAction.context.js} +7 -1
  21. package/build/components/Card/CardAction/CardAction.d.ts +18 -0
  22. package/build/components/Card/CardAction/CardAction.js +7 -0
  23. package/build/components/Card/CardAction/CardAction.props.d.ts +63 -0
  24. package/build/components/Card/CardAction/CardAction.props.js +1 -0
  25. package/build/components/Card/CardAction/CardActionContent.d.ts +6 -0
  26. package/build/components/Card/CardAction/CardActionContent.js +13 -0
  27. package/build/components/Card/CardAction/CardActionHelperText.d.ts +6 -0
  28. package/build/components/Card/CardAction/CardActionHelperText.js +13 -0
  29. package/build/components/Card/CardAction/CardActionIcon.d.ts +9 -0
  30. package/build/components/Card/CardAction/CardActionIcon.js +19 -0
  31. package/build/components/Card/CardAction/CardActionLeadingContent.d.ts +6 -0
  32. package/build/components/Card/CardAction/CardActionLeadingContent.js +5 -0
  33. package/build/components/Card/CardAction/CardActionRoot.d.ts +12 -0
  34. package/build/components/Card/CardAction/CardActionRoot.js +155 -0
  35. package/build/components/Card/CardAction/CardActionText.d.ts +6 -0
  36. package/build/components/Card/CardAction/CardActionText.js +9 -0
  37. package/build/components/Card/CardAction/CardActionTrailingContent.d.ts +6 -0
  38. package/build/components/Card/CardAction/CardActionTrailingContent.js +5 -0
  39. package/build/components/Card/CardAction/CardActionTrailingIcon.d.ts +9 -0
  40. package/build/components/Card/CardAction/CardActionTrailingIcon.js +19 -0
  41. package/build/components/Card/CardAction/index.d.ts +10 -0
  42. package/build/components/Card/CardAction/index.js +9 -0
  43. package/build/components/Card/CardContent.d.ts +6 -0
  44. package/build/components/Card/CardContent.js +33 -0
  45. package/build/components/Card/CardPressHandler.context.d.ts +6 -0
  46. package/build/components/Card/CardPressHandler.context.js +6 -0
  47. package/build/components/Card/{CardAction.d.ts → CardPressHandler.d.ts} +3 -3
  48. package/build/components/Card/CardPressHandler.js +13 -0
  49. package/build/components/Card/CardRoot.js +103 -11
  50. package/build/components/Card/index.d.ts +3 -2
  51. package/build/components/Card/index.js +3 -2
  52. package/build/components/Checkbox/CheckboxIcon.js +2 -1
  53. package/build/components/Container/Container.js +3 -3
  54. package/build/components/CurrencyInput/CurrencyInput.js +1 -1
  55. package/build/components/Expandable/Expandable.d.ts +6 -0
  56. package/build/components/Expandable/Expandable.js +44 -0
  57. package/build/components/Expandable/Expandable.props.d.ts +38 -0
  58. package/build/components/Expandable/Expandable.props.js +1 -0
  59. package/build/components/Expandable/index.d.ts +2 -0
  60. package/build/components/Expandable/index.js +1 -0
  61. package/build/components/ExpandableCard/ExpandableCard.d.ts +6 -0
  62. package/build/components/ExpandableCard/ExpandableCard.js +23 -0
  63. package/build/components/ExpandableCard/ExpandableCard.props.d.ts +69 -0
  64. package/build/components/ExpandableCard/ExpandableCard.props.js +1 -0
  65. package/build/components/ExpandableCard/ExpandableCardContent.d.ts +6 -0
  66. package/build/components/ExpandableCard/ExpandableCardContent.js +14 -0
  67. package/build/components/ExpandableCard/ExpandableCardExpandedContent.d.ts +11 -0
  68. package/build/components/ExpandableCard/ExpandableCardExpandedContent.js +18 -0
  69. package/build/components/ExpandableCard/ExpandableCardGroup.d.ts +6 -0
  70. package/build/components/ExpandableCard/ExpandableCardGroup.js +17 -0
  71. package/build/components/ExpandableCard/ExpandableCardGroup.props.d.ts +25 -0
  72. package/build/components/ExpandableCard/ExpandableCardGroup.props.js +1 -0
  73. package/build/components/ExpandableCard/ExpandableCardHelperText.d.ts +6 -0
  74. package/build/components/ExpandableCard/ExpandableCardHelperText.js +13 -0
  75. package/build/components/ExpandableCard/ExpandableCardIcon.d.ts +9 -0
  76. package/build/components/ExpandableCard/ExpandableCardIcon.js +19 -0
  77. package/build/components/ExpandableCard/ExpandableCardLeadingContent.d.ts +6 -0
  78. package/build/components/ExpandableCard/ExpandableCardLeadingContent.js +5 -0
  79. package/build/components/ExpandableCard/ExpandableCardText.d.ts +6 -0
  80. package/build/components/ExpandableCard/ExpandableCardText.js +7 -0
  81. package/build/components/ExpandableCard/ExpandableCardTrailingContent.d.ts +6 -0
  82. package/build/components/ExpandableCard/ExpandableCardTrailingContent.js +5 -0
  83. package/build/components/ExpandableCard/ExpandableCardTrailingIcon.d.ts +9 -0
  84. package/build/components/ExpandableCard/ExpandableCardTrailingIcon.js +17 -0
  85. package/build/components/ExpandableCard/ExpandableCardTrigger.d.ts +17 -0
  86. package/build/components/ExpandableCard/ExpandableCardTrigger.js +7 -0
  87. package/build/components/ExpandableCard/ExpandableCardTrigger.props.d.ts +44 -0
  88. package/build/components/ExpandableCard/ExpandableCardTrigger.props.js +1 -0
  89. package/build/components/ExpandableCard/ExpandableCardTriggerRoot.d.ts +11 -0
  90. package/build/components/ExpandableCard/ExpandableCardTriggerRoot.js +91 -0
  91. package/build/components/ExpandableCard/index.d.ts +14 -0
  92. package/build/components/ExpandableCard/index.js +11 -0
  93. package/build/components/Helper/HelperIcon.js +2 -1
  94. package/build/components/HighlightBanner/HighlightBanner.d.ts +6 -0
  95. package/build/components/HighlightBanner/HighlightBanner.js +86 -0
  96. package/build/components/HighlightBanner/HighlightBanner.props.d.ts +14 -0
  97. package/build/components/HighlightBanner/HighlightBanner.props.js +1 -0
  98. package/build/components/HighlightBanner/index.d.ts +2 -0
  99. package/build/components/HighlightBanner/index.js +1 -0
  100. package/build/components/Icon/Icon.d.ts +2 -6
  101. package/build/components/IconButton/IconButtonIcon.js +2 -1
  102. package/build/components/IconContainer/IconContainer.d.ts +4 -3
  103. package/build/components/IconContainer/IconContainer.js +3 -3
  104. package/build/components/Input/InputField.js +4 -2
  105. package/build/components/Input/InputIcon.js +2 -1
  106. package/build/components/Link/LinkIcon.js +3 -2
  107. package/build/components/List/ListAction/ListActionTrailingIcon.js +2 -1
  108. package/build/components/List/ListItem/ListItemIcon.js +2 -1
  109. package/build/components/List/ListItem/ListItemTrailingIcon.js +2 -3
  110. package/build/components/Radio/RadioIcon.js +7 -2
  111. package/build/components/RadioCard/RadioCardIcon.js +3 -2
  112. package/build/components/Spinner/Spinner.web.d.ts +2 -1
  113. package/build/components/Switch/Switch.js +5 -3
  114. package/build/components/Textarea/TextareaField.js +1 -1
  115. package/build/components/ToggleButton/ToggleButtonIcon.js +2 -1
  116. package/build/components/ToggleButton/ToggleButtonRoot.js +2 -2
  117. package/build/components/UnstyledIconButton/UnstyledIconButtonIcon.js +2 -1
  118. package/build/components/index.d.ts +5 -1
  119. package/build/components/index.js +5 -1
  120. package/build/core/index.d.ts +3 -3
  121. package/build/core/index.js +3 -3
  122. package/build/core/themes.d.ts +24 -12
  123. package/build/hooks/useColorMode.d.ts +1 -1
  124. package/build/hooks/useColorMode.js +7 -8
  125. package/build/tokens/components/dark/banner.d.ts +19 -0
  126. package/build/tokens/components/dark/banner.js +19 -0
  127. package/build/tokens/components/dark/card-action.d.ts +11 -0
  128. package/build/tokens/components/dark/card-action.js +10 -0
  129. package/build/tokens/components/dark/card-content.d.ts +25 -0
  130. package/build/tokens/components/dark/card-content.js +24 -0
  131. package/build/tokens/components/dark/drawer.d.ts +29 -0
  132. package/build/tokens/components/dark/drawer.js +28 -0
  133. package/build/tokens/components/dark/illustrations.d.ts +0 -1
  134. package/build/tokens/components/dark/illustrations.js +0 -1
  135. package/build/tokens/components/dark/index.d.ts +3 -0
  136. package/build/tokens/components/dark/index.js +3 -0
  137. package/build/tokens/components/light/banner.d.ts +19 -0
  138. package/build/tokens/components/light/banner.js +19 -0
  139. package/build/tokens/components/light/card-action.d.ts +11 -0
  140. package/build/tokens/components/light/card-action.js +10 -0
  141. package/build/tokens/components/light/card-content.d.ts +25 -0
  142. package/build/tokens/components/light/card-content.js +24 -0
  143. package/build/tokens/components/light/drawer.d.ts +29 -0
  144. package/build/tokens/components/light/drawer.js +28 -0
  145. package/build/tokens/components/light/illustrations.d.ts +0 -1
  146. package/build/tokens/components/light/illustrations.js +0 -1
  147. package/build/tokens/components/light/index.d.ts +3 -0
  148. package/build/tokens/components/light/index.js +3 -0
  149. package/build/tokens/layout.d.ts +6 -6
  150. package/build/tokens/layout.js +3 -3
  151. package/build/tokens/typography.d.ts +6 -0
  152. package/build/tokens/typography.js +3 -0
  153. package/docs/components/AllComponents.web.tsx +75 -4
  154. package/docs/components/NextPrevPage.tsx +5 -5
  155. package/docs/components/VariantTitle.tsx +17 -7
  156. package/package.json +16 -14
  157. package/src/components/Banner/Banner.docs.mdx +402 -0
  158. package/src/components/Banner/Banner.props.ts +106 -0
  159. package/src/components/Banner/Banner.stories.tsx +494 -0
  160. package/src/components/Banner/Banner.tsx +264 -0
  161. package/src/components/Banner/index.ts +2 -0
  162. package/src/components/BottomSheet/BottomSheetBackdrop.tsx +1 -2
  163. package/src/components/BottomSheet/BottomSheetFlatList.tsx +1 -3
  164. package/src/components/BottomSheet/BottomSheetHandle.tsx +0 -1
  165. package/src/components/Button/ButtonIcon.tsx +2 -1
  166. package/src/components/Button/ButtonRoot.tsx +2 -6
  167. package/src/components/Button/ButtonText.tsx +4 -1
  168. package/src/components/Card/Card.context.ts +7 -0
  169. package/src/components/Card/Card.docs.mdx +221 -15
  170. package/src/components/Card/Card.stories.tsx +50 -3
  171. package/src/components/Card/CardAction/CardAction.context.ts +22 -0
  172. package/src/components/Card/CardAction/CardAction.props.ts +87 -0
  173. package/src/components/Card/CardAction/CardAction.stories.tsx +265 -0
  174. package/src/components/Card/CardAction/CardAction.tsx +10 -0
  175. package/src/components/Card/CardAction/CardActionContent.tsx +20 -0
  176. package/src/components/Card/CardAction/CardActionHelperText.tsx +21 -0
  177. package/src/components/Card/CardAction/CardActionIcon.tsx +32 -0
  178. package/src/components/Card/CardAction/CardActionLeadingContent.tsx +9 -0
  179. package/src/components/Card/CardAction/CardActionRoot.tsx +258 -0
  180. package/src/components/Card/CardAction/CardActionText.tsx +17 -0
  181. package/src/components/Card/CardAction/CardActionTrailingContent.tsx +9 -0
  182. package/src/components/Card/CardAction/CardActionTrailingIcon.tsx +32 -0
  183. package/src/components/Card/CardAction/index.ts +10 -0
  184. package/src/components/Card/CardContent.tsx +40 -0
  185. package/src/components/Card/CardPressHandler.context.ts +12 -0
  186. package/src/components/Card/CardPressHandler.tsx +20 -0
  187. package/src/components/Card/CardRoot.tsx +128 -13
  188. package/src/components/Card/index.ts +3 -2
  189. package/src/components/Checkbox/CheckboxIcon.tsx +2 -1
  190. package/src/components/Container/Container.tsx +3 -3
  191. package/src/components/CurrencyInput/CurrencyInput.tsx +1 -1
  192. package/src/components/Expandable/Expandable.docs.mdx +201 -0
  193. package/src/components/Expandable/Expandable.props.ts +46 -0
  194. package/src/components/Expandable/Expandable.stories.tsx +284 -0
  195. package/src/components/Expandable/Expandable.tsx +92 -0
  196. package/src/components/Expandable/index.ts +2 -0
  197. package/src/components/ExpandableCard/ExpandableCard.docs.mdx +312 -0
  198. package/src/components/ExpandableCard/ExpandableCard.props.ts +85 -0
  199. package/src/components/ExpandableCard/ExpandableCard.stories.tsx +326 -0
  200. package/src/components/ExpandableCard/ExpandableCard.tsx +76 -0
  201. package/src/components/ExpandableCard/ExpandableCardContent.tsx +21 -0
  202. package/src/components/ExpandableCard/ExpandableCardExpandedContent.tsx +42 -0
  203. package/src/components/ExpandableCard/ExpandableCardGroup.props.ts +31 -0
  204. package/src/components/ExpandableCard/ExpandableCardGroup.tsx +40 -0
  205. package/src/components/ExpandableCard/ExpandableCardHelperText.tsx +21 -0
  206. package/src/components/ExpandableCard/ExpandableCardIcon.tsx +32 -0
  207. package/src/components/ExpandableCard/ExpandableCardLeadingContent.tsx +9 -0
  208. package/src/components/ExpandableCard/ExpandableCardText.tsx +14 -0
  209. package/src/components/ExpandableCard/ExpandableCardTrailingContent.tsx +9 -0
  210. package/src/components/ExpandableCard/ExpandableCardTrailingIcon.tsx +30 -0
  211. package/src/components/ExpandableCard/ExpandableCardTrigger.props.ts +47 -0
  212. package/src/components/ExpandableCard/ExpandableCardTrigger.tsx +10 -0
  213. package/src/components/ExpandableCard/ExpandableCardTriggerRoot.tsx +154 -0
  214. package/src/components/ExpandableCard/index.ts +14 -0
  215. package/src/components/Helper/HelperIcon.tsx +2 -1
  216. package/src/components/HighlightBanner/HighlightBanner.docs.mdx +277 -0
  217. package/src/components/HighlightBanner/HighlightBanner.props.ts +29 -0
  218. package/src/components/HighlightBanner/HighlightBanner.stories.tsx +259 -0
  219. package/src/components/HighlightBanner/HighlightBanner.tsx +122 -0
  220. package/src/components/HighlightBanner/index.ts +2 -0
  221. package/src/components/Icon/Icon.tsx +4 -3
  222. package/src/components/IconButton/IconButtonIcon.tsx +2 -1
  223. package/src/components/IconContainer/IconContainer.tsx +17 -19
  224. package/src/components/Input/InputField.tsx +2 -1
  225. package/src/components/Input/InputIcon.tsx +2 -1
  226. package/src/components/Link/LinkIcon.tsx +3 -2
  227. package/src/components/List/ListAction/ListActionTrailingIcon.tsx +2 -1
  228. package/src/components/List/ListItem/ListItemIcon.tsx +2 -1
  229. package/src/components/List/ListItem/ListItemTrailingIcon.tsx +2 -3
  230. package/src/components/Radio/RadioIcon.tsx +8 -3
  231. package/src/components/RadioCard/RadioCardIcon.tsx +4 -3
  232. package/src/components/Switch/Switch.tsx +10 -5
  233. package/src/components/Switch/Switch.web.tsx +1 -0
  234. package/src/components/Textarea/TextareaField.tsx +1 -1
  235. package/src/components/ToggleButton/ToggleButtonIcon.tsx +2 -1
  236. package/src/components/ToggleButton/ToggleButtonRoot.tsx +2 -2
  237. package/src/components/UnstyledIconButton/UnstyledIconButtonIcon.tsx +2 -1
  238. package/src/components/index.ts +5 -9
  239. package/src/core/index.ts +14 -11
  240. package/src/hooks/useColorMode.ts +9 -12
  241. package/src/tokens/components/dark/banner.ts +19 -0
  242. package/src/tokens/components/dark/card-action.ts +11 -0
  243. package/src/tokens/components/dark/card-content.ts +25 -0
  244. package/src/tokens/components/dark/drawer.ts +29 -0
  245. package/src/tokens/components/dark/illustrations.ts +0 -1
  246. package/src/tokens/components/dark/index.ts +3 -0
  247. package/src/tokens/components/light/banner.ts +19 -0
  248. package/src/tokens/components/light/card-action.ts +11 -0
  249. package/src/tokens/components/light/card-content.ts +25 -0
  250. package/src/tokens/components/light/drawer.ts +29 -0
  251. package/src/tokens/components/light/illustrations.ts +0 -1
  252. package/src/tokens/components/light/index.ts +3 -0
  253. package/src/tokens/layout.ts +3 -3
  254. package/src/tokens/typography.ts +3 -0
  255. package/build/components/Card/CardAction.context.d.ts +0 -6
  256. package/build/components/Card/CardAction.js +0 -13
  257. package/src/components/Card/CardAction.context.ts +0 -12
  258. package/src/components/Card/CardAction.tsx +0 -18
@@ -1,5 +1,6 @@
1
1
  import { Meta, StoryObj } from '@storybook/react-vite';
2
- import { Card, CardAction } from '.';
2
+ import { BellMediumIcon } from '@utilitywarehouse/hearth-react-native-icons';
3
+ import { Card, CardAction, CardPressHandler } from '.';
3
4
  import { VariantTitle } from '../../../docs/components';
4
5
  import { BodyText } from '../BodyText';
5
6
  import { Button } from '../Button';
@@ -59,6 +60,52 @@ export const Playground: Story = {
59
60
  },
60
61
  };
61
62
 
63
+ export const WithActions: Story = {
64
+ render: ({ children, ...props }) => {
65
+ return (
66
+ <Card {...props} flexDirection="column" alignItems="stretch" space="md" variant="emphasis">
67
+ <BodyText>{children as string}</BodyText>
68
+ <CardAction
69
+ onPress={() => console.log('Card action pressed')}
70
+ heading="Card Action Head"
71
+ helperText="Some helper text"
72
+ leadingIcon={BellMediumIcon}
73
+ />
74
+ <CardAction
75
+ onPress={() => console.log('Card action pressed')}
76
+ heading="Card Action Head"
77
+ leadingIcon={BellMediumIcon}
78
+ />
79
+ <CardAction
80
+ onPress={() => console.log('Card action pressed')}
81
+ heading="Card Action Head"
82
+ helperText="Testing"
83
+ leadingIcon={BellMediumIcon}
84
+ iconContainer={false}
85
+ />
86
+ </Card>
87
+ );
88
+ },
89
+ };
90
+
91
+ export const WithOnlyAction: Story = {
92
+ args: {
93
+ variant: 'emphasis',
94
+ },
95
+ render: ({ children, ...props }) => {
96
+ return (
97
+ <Card {...props} flexDirection="column" alignItems="stretch" space="md">
98
+ <CardAction
99
+ onPress={() => console.log('Card action pressed')}
100
+ heading="Card Action Head"
101
+ helperText="Some helper text"
102
+ leadingIcon={BellMediumIcon}
103
+ />
104
+ </Card>
105
+ );
106
+ },
107
+ };
108
+
62
109
  export const Variants: Story = {
63
110
  parameters: {
64
111
  controls: { exclude: ['variant', 'colorScheme'] },
@@ -224,9 +271,9 @@ export const Interactive: Story = {
224
271
  >
225
272
  <Heading size="md">Heading</Heading>
226
273
  <BodyText>{children as string}</BodyText>
227
- <CardAction>
274
+ <CardPressHandler>
228
275
  <Button onPress={() => console.log('pressed')}>Press me</Button>
229
- </CardAction>
276
+ </CardPressHandler>
230
277
  </Card>
231
278
  </VariantTitle>
232
279
  </Flex>
@@ -0,0 +1,22 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ export interface ICardActionContext {
4
+ showPressed: boolean;
5
+ active?: boolean;
6
+ loading: boolean;
7
+ disabled: boolean;
8
+ size: 'md' | 'lg';
9
+ }
10
+
11
+ export const CardActionContext = createContext<ICardActionContext>({
12
+ showPressed: false,
13
+ active: false,
14
+ loading: false,
15
+ disabled: false,
16
+ size: 'md',
17
+ });
18
+
19
+ export const useCardActionContext = () => {
20
+ const context = useContext(CardActionContext);
21
+ return context;
22
+ };
@@ -0,0 +1,87 @@
1
+ import { ComponentType } from 'react';
2
+ import type { PressableProps, ViewProps } from 'react-native';
3
+ import BadgeProps from '../../Badge/Badge.props';
4
+ import { IconContainerProps } from '../../IconContainer';
5
+
6
+ interface CardActionBaseProps extends Omit<PressableProps, 'children'> {
7
+ loading?: boolean;
8
+ disabled?: boolean;
9
+ size?: 'md' | 'lg';
10
+ }
11
+
12
+ interface CardActionContentProps {
13
+ heading: string;
14
+ helperText?: string;
15
+ badge?: BadgeProps;
16
+ badgePosition?: 'bottom' | 'middle' | 'right' | 'top';
17
+ iconContainer?: boolean;
18
+ iconContainerVariant?: IconContainerProps['variant'];
19
+ iconContainerColor?: IconContainerProps['color'];
20
+ }
21
+
22
+ export interface CardActionWithChildren extends CardActionBaseProps {
23
+ children: ViewProps['children'];
24
+ heading?: never;
25
+ helperText?: never;
26
+ leadingContent?: never;
27
+ leadingIcon?: never;
28
+ trailingContent?: never;
29
+ trailingIcon?: never;
30
+ badge?: never;
31
+ badgePosition?: never;
32
+ iconContainer?: never;
33
+ iconContainerVariant?: never;
34
+ iconContainerColor?: never;
35
+ }
36
+
37
+ // Leading content variants
38
+ type CardActionWithLeadingContent = CardActionBaseProps &
39
+ CardActionContentProps & {
40
+ children?: never;
41
+ leadingContent: ViewProps['children'];
42
+ leadingIcon?: never;
43
+ };
44
+
45
+ type CardActionWithLeadingIcon = CardActionBaseProps &
46
+ CardActionContentProps & {
47
+ children?: never;
48
+ leadingContent?: never;
49
+ leadingIcon: ComponentType;
50
+ };
51
+
52
+ type CardActionWithNoLeading = CardActionBaseProps &
53
+ CardActionContentProps & {
54
+ children?: never;
55
+ leadingContent?: never;
56
+ leadingIcon?: never;
57
+ };
58
+
59
+ type CardActionLeadingVariants =
60
+ | CardActionWithLeadingContent
61
+ | CardActionWithLeadingIcon
62
+ | CardActionWithNoLeading;
63
+
64
+ // Trailing content combined with leading variants
65
+ type CardActionWithTrailingContent = CardActionLeadingVariants & {
66
+ trailingContent: ViewProps['children'];
67
+ trailingIcon?: never;
68
+ };
69
+
70
+ type CardActionWithTrailingIcon = CardActionLeadingVariants & {
71
+ trailingContent?: never;
72
+ trailingIcon: ComponentType;
73
+ };
74
+
75
+ type CardActionWithNoTrailing = CardActionLeadingVariants & {
76
+ trailingContent?: never;
77
+ trailingIcon?: never;
78
+ };
79
+
80
+ type CardActionWithoutChildren =
81
+ | CardActionWithTrailingContent
82
+ | CardActionWithTrailingIcon
83
+ | CardActionWithNoTrailing;
84
+
85
+ type CardActionProps = CardActionWithChildren | CardActionWithoutChildren;
86
+
87
+ export default CardActionProps;
@@ -0,0 +1,265 @@
1
+ import { Meta, StoryObj } from '@storybook/react';
2
+ import * as Icons from '@utilitywarehouse/hearth-react-native-icons';
3
+ import { ElectricityMediumIcon, GasMediumIcon } from '@utilitywarehouse/hearth-react-native-icons';
4
+ import { View } from 'react-native';
5
+ import { Flex } from '../../Flex';
6
+ import Card from '../Card';
7
+ import CardAction from './CardAction';
8
+
9
+ const meta: Meta<typeof CardAction> = {
10
+ title: 'Stories / CardAction',
11
+ component: CardAction,
12
+ argTypes: {
13
+ heading: { control: 'text' },
14
+ helperText: { control: 'text' },
15
+ disabled: { control: 'boolean' },
16
+ loading: { control: 'boolean' },
17
+ size: {
18
+ control: 'select',
19
+ options: ['md', 'lg'],
20
+ },
21
+ badge: { control: 'object' },
22
+ badgePosition: {
23
+ control: 'select',
24
+ options: ['bottom', 'middle', 'right'],
25
+ },
26
+ leadingIcon: {
27
+ options: [
28
+ 'none',
29
+ ...Object.keys(Icons).filter(icon => icon.includes('Small') || icon.includes('Medium')),
30
+ ],
31
+ control: 'select',
32
+ description: 'The leading icon.',
33
+ },
34
+ trailingIcon: {
35
+ options: [
36
+ 'none',
37
+ ...Object.keys(Icons).filter(icon => icon.includes('Small') || icon.includes('Medium')),
38
+ ],
39
+ control: 'select',
40
+ description: 'The trailing icon.',
41
+ },
42
+ iconContainer: { control: 'boolean' },
43
+ iconContainerVariant: {
44
+ control: 'select',
45
+ options: ['subtle', 'emphasis'],
46
+ },
47
+ iconContainerColor: {
48
+ control: 'select',
49
+ options: ['pig', 'energy', 'broadband', 'mobile', 'insurance', 'cashback', 'highlight'],
50
+ },
51
+ },
52
+ args: {
53
+ heading: 'Card Action',
54
+ helperText: 'This is a card action component',
55
+ size: 'md',
56
+ loading: false,
57
+ disabled: false,
58
+ iconContainer: true,
59
+ },
60
+ };
61
+
62
+ export default meta;
63
+
64
+ type Story = StoryObj<typeof CardAction>;
65
+
66
+ export const Playground: Story = {
67
+ args: {
68
+ onPress: () => console.log('pressed'),
69
+ },
70
+ render: (args: any) => {
71
+ // @ts-expect-error - This is a playground
72
+ const leadingIcon = args.leadingIcon === 'none' ? undefined : Icons[args.leadingIcon];
73
+ // @ts-expect-error - This is a playground
74
+ const trailingIcon = args.trailingIcon === 'none' ? undefined : Icons[args.trailingIcon];
75
+ return (
76
+ <View style={{ width: '100%', maxWidth: 400 }}>
77
+ <Card variant="emphasis">
78
+ <CardAction {...args} leadingIcon={leadingIcon} trailingIcon={trailingIcon} />
79
+ </Card>
80
+ </View>
81
+ );
82
+ },
83
+ };
84
+
85
+ export const WithLeadingIcon: Story = {
86
+ parameters: {
87
+ controls: { include: [] },
88
+ },
89
+ render: () => (
90
+ <View style={{ width: '100%', maxWidth: 400 }}>
91
+ <Card variant="emphasis">
92
+ <CardAction
93
+ heading="Bills"
94
+ helperText="View your bills"
95
+ leadingIcon={ElectricityMediumIcon}
96
+ onPress={() => console.log('pressed')}
97
+ />
98
+ </Card>
99
+ </View>
100
+ ),
101
+ };
102
+
103
+ export const WithTrailingIcon: Story = {
104
+ parameters: {
105
+ controls: { include: [] },
106
+ },
107
+ render: () => (
108
+ <View style={{ width: '100%', maxWidth: 400 }}>
109
+ <Card variant="emphasis">
110
+ <CardAction
111
+ heading="Bills"
112
+ helperText="View your bills"
113
+ trailingIcon={ElectricityMediumIcon}
114
+ onPress={() => console.log('pressed')}
115
+ />
116
+ </Card>
117
+ </View>
118
+ ),
119
+ };
120
+
121
+ export const WithIconContainer: Story = {
122
+ args: {},
123
+ parameters: {
124
+ controls: { include: [] },
125
+ },
126
+ render: () => (
127
+ <View style={{ width: '100%', maxWidth: 400 }}>
128
+ <Card variant="emphasis">
129
+ <CardAction
130
+ heading="Electricity"
131
+ helperText="Last reading 23/03/24"
132
+ leadingIcon={ElectricityMediumIcon}
133
+ iconContainer
134
+ iconContainerVariant="emphasis"
135
+ iconContainerColor="energy"
136
+ onPress={() => console.log('pressed')}
137
+ />
138
+ <CardAction
139
+ heading="Gas"
140
+ helperText="Last reading 23/03/24"
141
+ leadingIcon={GasMediumIcon}
142
+ iconContainer
143
+ iconContainerVariant="emphasis"
144
+ iconContainerColor="energy"
145
+ onPress={() => console.log('pressed')}
146
+ />
147
+ <CardAction
148
+ heading="Gas"
149
+ helperText="Last reading 23/03/24"
150
+ leadingIcon={GasMediumIcon}
151
+ iconContainer
152
+ iconContainerVariant="emphasis"
153
+ iconContainerColor="energy"
154
+ onPress={() => console.log('pressed')}
155
+ />
156
+ </Card>
157
+ </View>
158
+ ),
159
+ };
160
+
161
+ export const WithBadge: Story = {
162
+ parameters: {
163
+ controls: { include: [] },
164
+ },
165
+ render: () => (
166
+ <Flex direction="column" space="md" style={{ width: '100%', maxWidth: 400 }}>
167
+ <Card variant="emphasis">
168
+ <CardAction
169
+ heading="Badge at bottom"
170
+ helperText="Badge positioned below text"
171
+ leadingIcon={ElectricityMediumIcon}
172
+ badge={{ text: 'New' }}
173
+ badgePosition="bottom"
174
+ onPress={() => console.log('pressed')}
175
+ />
176
+ </Card>
177
+ <Card variant="emphasis">
178
+ <CardAction
179
+ heading="Badge at middle"
180
+ helperText="Badge positioned between heading and helper text"
181
+ leadingIcon={ElectricityMediumIcon}
182
+ badge={{ text: 'New' }}
183
+ badgePosition="middle"
184
+ onPress={() => console.log('pressed')}
185
+ />
186
+ </Card>
187
+ <Card variant="emphasis">
188
+ <CardAction
189
+ heading="Badge at right"
190
+ helperText="Badge positioned on the right side"
191
+ leadingIcon={ElectricityMediumIcon}
192
+ badge={{ text: 'New' }}
193
+ badgePosition="right"
194
+ onPress={() => console.log('pressed')}
195
+ />
196
+ </Card>
197
+ </Flex>
198
+ ),
199
+ };
200
+
201
+ export const Sizes: Story = {
202
+ parameters: {
203
+ controls: { include: [] },
204
+ },
205
+ render: () => (
206
+ <Flex direction="column" space="md" style={{ width: '100%', maxWidth: 400 }}>
207
+ <Card variant="emphasis">
208
+ <CardAction
209
+ heading="Medium size (default)"
210
+ helperText="Heading size is md"
211
+ size="md"
212
+ leadingIcon={ElectricityMediumIcon}
213
+ onPress={() => console.log('pressed')}
214
+ />
215
+ </Card>
216
+ <Card variant="emphasis">
217
+ <CardAction
218
+ heading="Large size"
219
+ helperText="Heading size is lg"
220
+ size="lg"
221
+ leadingIcon={ElectricityMediumIcon}
222
+ onPress={() => console.log('pressed')}
223
+ />
224
+ </Card>
225
+ </Flex>
226
+ ),
227
+ };
228
+
229
+ export const Loading: Story = {
230
+ parameters: {
231
+ controls: { include: [] },
232
+ },
233
+ render: () => (
234
+ <View style={{ width: '100%', maxWidth: 400 }}>
235
+ <Card variant="emphasis">
236
+ <CardAction
237
+ heading="Loading"
238
+ helperText="This is loading"
239
+ loading
240
+ leadingIcon={ElectricityMediumIcon}
241
+ onPress={() => console.log('pressed')}
242
+ />
243
+ </Card>
244
+ </View>
245
+ ),
246
+ };
247
+
248
+ export const Disabled: Story = {
249
+ parameters: {
250
+ controls: { include: [] },
251
+ },
252
+ render: () => (
253
+ <View style={{ width: '100%', maxWidth: 400 }}>
254
+ <Card variant="emphasis">
255
+ <CardAction
256
+ heading="Disabled"
257
+ helperText="This is disabled"
258
+ disabled
259
+ leadingIcon={ElectricityMediumIcon}
260
+ onPress={() => console.log('pressed')}
261
+ />
262
+ </Card>
263
+ </View>
264
+ ),
265
+ };
@@ -0,0 +1,10 @@
1
+ import { createPressable } from '@gluestack-ui/pressable';
2
+ import CardActionRoot from './CardActionRoot';
3
+
4
+ const CardAction = createPressable({
5
+ Root: CardActionRoot,
6
+ });
7
+
8
+ CardAction.displayName = 'CardAction';
9
+
10
+ export default CardAction;
@@ -0,0 +1,20 @@
1
+ import { View, type ViewProps } from 'react-native';
2
+ import { StyleSheet } from 'react-native-unistyles';
3
+
4
+ const CardActionContent = ({ children, ...props }: ViewProps) => {
5
+ return (
6
+ <View {...props} style={[styles.container, props.style]}>
7
+ {children}
8
+ </View>
9
+ );
10
+ };
11
+
12
+ CardActionContent.displayName = 'CardActionContent';
13
+
14
+ const styles = StyleSheet.create({
15
+ container: {
16
+ flex: 1,
17
+ },
18
+ });
19
+
20
+ export default CardActionContent;
@@ -0,0 +1,21 @@
1
+ import { TextProps } from 'react-native';
2
+ import { StyleSheet } from 'react-native-unistyles';
3
+ import { BodyText } from '../../BodyText';
4
+
5
+ const CardActionHelperText = ({ children, ...props }: TextProps) => {
6
+ return (
7
+ <BodyText size="md" {...props} style={[styles.text, props.style]}>
8
+ {children}
9
+ </BodyText>
10
+ );
11
+ };
12
+
13
+ CardActionHelperText.displayName = 'CardActionHelperText';
14
+
15
+ const styles = StyleSheet.create(theme => ({
16
+ text: {
17
+ color: theme.color.text.secondary,
18
+ },
19
+ }));
20
+
21
+ export default CardActionHelperText;
@@ -0,0 +1,32 @@
1
+ import { ComponentType } from 'react';
2
+ import { Platform, type StyleProp, type ViewStyle } from 'react-native';
3
+ import { StyleSheet } from 'react-native-unistyles';
4
+ import { Icon, IconProps } from '../../Icon';
5
+
6
+ const CardActionIcon = ({ children, ...props }: IconProps & { as?: ComponentType }) => {
7
+ return (
8
+ <Icon
9
+ {...props}
10
+ style={
11
+ Platform.OS === 'web'
12
+ ? // @ts-expect-error - style prop type issue
13
+ { ...(styles.icon as StyleProp<ViewStyle>), ...props.style }
14
+ : ([styles.icon as StyleProp<ViewStyle>, props.style] as any)
15
+ }
16
+ >
17
+ {children}
18
+ </Icon>
19
+ );
20
+ };
21
+
22
+ CardActionIcon.displayName = 'CardActionIcon';
23
+
24
+ const styles = StyleSheet.create(theme => ({
25
+ icon: {
26
+ color: theme.color.icon.primary,
27
+ width: 24,
28
+ height: 24,
29
+ },
30
+ }));
31
+
32
+ export default CardActionIcon;
@@ -0,0 +1,9 @@
1
+ import { View, type ViewProps } from 'react-native';
2
+
3
+ const CardActionLeadingContent = ({ children, ...props }: ViewProps) => (
4
+ <View {...props}>{children}</View>
5
+ );
6
+
7
+ CardActionLeadingContent.displayName = 'CardActionLeadingContent';
8
+
9
+ export default CardActionLeadingContent;