@telus-uds/components-base 0.0.2-prerelease.7 → 0.0.2-prerelease.8

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 (349) hide show
  1. package/.ultra.cache.json +1 -1
  2. package/CHANGELOG.md +27 -0
  3. package/__fixtures__/Accessible.js +33 -0
  4. package/__fixtures__/Accessible.native.js +32 -0
  5. package/__fixtures__/testTheme.js +429 -29
  6. package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +1 -1
  7. package/__tests__/Button/ButtonGroup.test.jsx +2 -2
  8. package/__tests__/Checkbox/CheckboxGroup.test.jsx +247 -0
  9. package/__tests__/Icon/Icon.test.jsx +3 -3
  10. package/__tests__/Modal/Modal.test.jsx +47 -0
  11. package/__tests__/Notification/Notification.test.jsx +20 -0
  12. package/__tests__/Pagination/Pagination.test.jsx +2 -2
  13. package/__tests__/Progress/Progress.test.jsx +79 -0
  14. package/__tests__/Radio/RadioGroup.test.jsx +221 -0
  15. package/__tests__/RadioCard/RadioCard.test.jsx +87 -0
  16. package/__tests__/RadioCard/RadioCardGroup.test.jsx +247 -0
  17. package/__tests__/Search/Search.test.jsx +72 -0
  18. package/__tests__/Skeleton/Skeleton.test.jsx +1 -1
  19. package/__tests__/StepTracker/StepTracker.test.jsx +94 -0
  20. package/__tests__/Tabs/Tabs.test.jsx +200 -0
  21. package/__tests__/Tags/Tags.test.jsx +1 -1
  22. package/__tests__/utils/input.test.js +58 -0
  23. package/__tests__/utils/useCopy.test.js +14 -3
  24. package/babel.config.js +20 -0
  25. package/jest.config.js +1 -1
  26. package/lib/A11yInfoProvider/index.js +54 -26
  27. package/lib/A11yText/index.js +37 -14
  28. package/lib/ActivityIndicator/Spinner.js +78 -0
  29. package/lib/ActivityIndicator/Spinner.native.js +121 -87
  30. package/lib/ActivityIndicator/index.js +28 -12
  31. package/lib/ActivityIndicator/shared.js +27 -12
  32. package/lib/BaseProvider/index.js +34 -11
  33. package/lib/Box/Box.js +54 -31
  34. package/lib/Box/index.js +13 -2
  35. package/lib/Button/Button.js +32 -11
  36. package/lib/Button/ButtonBase.js +85 -78
  37. package/lib/Button/ButtonGroup.js +94 -70
  38. package/lib/Button/ButtonLink.js +38 -15
  39. package/lib/Button/index.js +31 -4
  40. package/lib/Button/propTypes.js +32 -9
  41. package/lib/Card/Card.js +36 -41
  42. package/lib/Card/CardBase.js +78 -0
  43. package/lib/Card/PressableCardBase.js +137 -0
  44. package/lib/Card/index.js +40 -2
  45. package/lib/Checkbox/Checkbox.js +139 -103
  46. package/lib/Checkbox/CheckboxGroup.js +231 -0
  47. package/lib/Checkbox/CheckboxInput.js +74 -0
  48. package/lib/Checkbox/CheckboxInput.native.js +9 -1
  49. package/lib/Checkbox/index.js +21 -2
  50. package/lib/Divider/Divider.js +50 -24
  51. package/lib/Divider/index.js +13 -2
  52. package/lib/ExpandCollapse/Accordion.js +20 -7
  53. package/lib/ExpandCollapse/Control.js +50 -27
  54. package/lib/ExpandCollapse/ExpandCollapse.js +41 -24
  55. package/lib/ExpandCollapse/Panel.js +75 -37
  56. package/lib/ExpandCollapse/index.js +25 -7
  57. package/lib/Feedback/Feedback.js +69 -40
  58. package/lib/Feedback/index.js +13 -2
  59. package/lib/Fieldset/Fieldset.js +160 -0
  60. package/lib/Fieldset/FieldsetContainer.js +41 -0
  61. package/lib/Fieldset/FieldsetContainer.native.js +33 -0
  62. package/lib/Fieldset/Legend.js +33 -0
  63. package/lib/Fieldset/Legend.native.js +43 -0
  64. package/lib/Fieldset/cssReset.js +21 -0
  65. package/lib/Fieldset/index.js +13 -0
  66. package/lib/FlexGrid/Col/Col.js +67 -38
  67. package/lib/FlexGrid/Col/index.js +13 -2
  68. package/lib/FlexGrid/FlexGrid.js +70 -45
  69. package/lib/FlexGrid/Row/Row.js +48 -27
  70. package/lib/FlexGrid/Row/index.js +13 -2
  71. package/lib/FlexGrid/helpers/index.js +9 -1
  72. package/lib/FlexGrid/index.js +13 -2
  73. package/lib/FlexGrid/providers/GutterContext.js +15 -3
  74. package/lib/Icon/Icon.js +46 -44
  75. package/lib/Icon/IconText.js +49 -21
  76. package/lib/Icon/index.js +31 -4
  77. package/lib/InputLabel/InputLabel.js +70 -36
  78. package/lib/InputLabel/LabelContent.js +31 -0
  79. package/lib/InputLabel/LabelContent.native.js +9 -1
  80. package/lib/InputLabel/index.js +13 -2
  81. package/lib/InputSupports/InputSupports.js +62 -48
  82. package/lib/InputSupports/index.js +13 -2
  83. package/lib/InputSupports/propTypes.js +19 -8
  84. package/lib/InputSupports/useInputSupports.js +41 -0
  85. package/lib/Link/ChevronLink.js +33 -16
  86. package/lib/Link/InlinePressable.js +50 -0
  87. package/lib/Link/InlinePressable.native.js +34 -11
  88. package/lib/Link/Link.js +25 -9
  89. package/lib/Link/LinkBase.js +87 -57
  90. package/lib/Link/TextButton.js +32 -13
  91. package/lib/Link/index.js +39 -5
  92. package/lib/List/List.js +51 -23
  93. package/lib/List/ListItem.js +70 -40
  94. package/lib/List/index.js +13 -2
  95. package/lib/Modal/Modal.js +226 -0
  96. package/lib/Modal/dictionary.js +16 -0
  97. package/lib/Modal/index.js +13 -0
  98. package/lib/Notification/Notification.js +200 -0
  99. package/lib/Notification/dictionary.js +15 -0
  100. package/lib/Notification/index.js +13 -0
  101. package/lib/Pagination/PageButton.js +47 -25
  102. package/lib/Pagination/Pagination.js +70 -40
  103. package/lib/Pagination/SideButton.js +63 -37
  104. package/lib/Pagination/dictionary.js +9 -2
  105. package/lib/Pagination/index.js +13 -2
  106. package/lib/Pagination/usePagination.js +12 -2
  107. package/lib/Progress/Progress.js +99 -0
  108. package/lib/Progress/ProgressBar.js +146 -0
  109. package/lib/Progress/ProgressBarBackground.js +57 -0
  110. package/lib/Progress/index.js +16 -0
  111. package/lib/Radio/Radio.js +110 -109
  112. package/lib/Radio/RadioButton.js +141 -0
  113. package/lib/Radio/RadioGroup.js +233 -0
  114. package/lib/Radio/RadioInput.js +76 -0
  115. package/lib/Radio/RadioInput.native.js +9 -1
  116. package/lib/Radio/index.js +21 -2
  117. package/lib/RadioCard/RadioCard.js +240 -0
  118. package/lib/RadioCard/RadioCardGroup.js +251 -0
  119. package/lib/RadioCard/index.js +21 -0
  120. package/lib/Search/Search.js +243 -0
  121. package/lib/Search/dictionary.js +19 -0
  122. package/lib/Search/index.js +13 -0
  123. package/lib/Select/Group.js +33 -0
  124. package/lib/Select/Group.native.js +16 -5
  125. package/lib/Select/Item.js +29 -0
  126. package/lib/Select/Item.native.js +14 -4
  127. package/lib/Select/Picker.js +79 -0
  128. package/lib/Select/Picker.native.js +52 -24
  129. package/lib/Select/Select.js +110 -82
  130. package/lib/Select/index.js +19 -6
  131. package/lib/SideNav/Item.js +54 -33
  132. package/lib/SideNav/ItemContent.js +41 -15
  133. package/lib/SideNav/ItemsGroup.js +46 -27
  134. package/lib/SideNav/SideNav.js +92 -69
  135. package/lib/SideNav/index.js +15 -1
  136. package/lib/Skeleton/Skeleton.js +55 -37
  137. package/lib/Skeleton/index.js +13 -2
  138. package/lib/Skeleton/skeleton.constant.js +12 -0
  139. package/lib/Skeleton/skeletonWebAnimation.js +27 -0
  140. package/lib/Skeleton/useSkeletonNativeAnimation.js +37 -0
  141. package/lib/Spacer/Spacer.js +31 -12
  142. package/lib/Spacer/index.js +13 -2
  143. package/lib/StackView/StackView.js +49 -27
  144. package/lib/StackView/StackWrap.js +33 -10
  145. package/lib/StackView/StackWrap.native.js +13 -2
  146. package/lib/StackView/StackWrapBox.js +46 -24
  147. package/lib/StackView/StackWrapGap.js +43 -22
  148. package/lib/StackView/common.js +19 -4
  149. package/lib/StackView/getStackedContent.js +49 -19
  150. package/lib/StackView/index.js +29 -5
  151. package/lib/StepTracker/Step.js +245 -0
  152. package/lib/StepTracker/StepTracker.js +197 -0
  153. package/lib/StepTracker/dictionary.js +17 -0
  154. package/lib/StepTracker/index.js +13 -0
  155. package/lib/Tabs/HorizontalScroll.js +199 -0
  156. package/lib/Tabs/ScrollViewEnd.js +66 -0
  157. package/lib/Tabs/ScrollViewEnd.native.js +41 -0
  158. package/lib/Tabs/Tabs.js +117 -0
  159. package/lib/Tabs/TabsItem.js +234 -0
  160. package/lib/Tabs/TabsScrollButton.js +121 -0
  161. package/lib/Tabs/dictionary.js +18 -0
  162. package/lib/Tabs/index.js +13 -0
  163. package/lib/Tabs/itemPositions.js +128 -0
  164. package/lib/Tags/Tags.js +130 -97
  165. package/lib/Tags/index.js +13 -2
  166. package/lib/TextInput/TextArea.js +51 -24
  167. package/lib/TextInput/TextInput.js +40 -19
  168. package/lib/TextInput/TextInputBase.js +78 -55
  169. package/lib/TextInput/index.js +23 -3
  170. package/lib/TextInput/propTypes.js +18 -7
  171. package/lib/ThemeProvider/ThemeProvider.js +38 -14
  172. package/lib/ThemeProvider/index.js +61 -6
  173. package/lib/ThemeProvider/useSetTheme.js +14 -5
  174. package/lib/ThemeProvider/useTheme.js +13 -4
  175. package/lib/ThemeProvider/useThemeTokens.js +32 -16
  176. package/lib/ThemeProvider/utils/index.js +31 -2
  177. package/lib/ThemeProvider/utils/styles.js +52 -16
  178. package/lib/ThemeProvider/utils/theme-tokens.js +94 -16
  179. package/lib/ToggleSwitch/ToggleSwitch.js +75 -51
  180. package/lib/ToggleSwitch/index.js +13 -2
  181. package/lib/Tooltip/{Backdrop.web.js → Backdrop.js} +22 -18
  182. package/lib/Tooltip/Backdrop.native.js +39 -15
  183. package/lib/Tooltip/Tooltip.js +112 -70
  184. package/lib/Tooltip/dictionary.js +9 -2
  185. package/lib/Tooltip/getTooltipPosition.js +9 -1
  186. package/lib/Tooltip/index.js +13 -2
  187. package/lib/TooltipButton/TooltipButton.js +57 -38
  188. package/lib/TooltipButton/index.js +13 -2
  189. package/lib/Typography/Typography.js +57 -27
  190. package/lib/Typography/index.js +13 -2
  191. package/lib/ViewportProvider/ViewportProvider.js +34 -13
  192. package/lib/ViewportProvider/index.js +28 -3
  193. package/lib/ViewportProvider/useViewport.js +15 -3
  194. package/lib/ViewportProvider/useViewportListener.js +24 -10
  195. package/lib/index.js +509 -33
  196. package/lib/utils/a11y/index.js +18 -1
  197. package/lib/utils/a11y/textSize.js +23 -7
  198. package/lib/utils/animation/index.js +15 -2
  199. package/lib/utils/animation/useVerticalExpandAnimation.js +28 -11
  200. package/lib/utils/children.js +87 -0
  201. package/lib/utils/index.js +163 -10
  202. package/lib/utils/info/index.js +18 -6
  203. package/lib/utils/info/platform/index.js +19 -7
  204. package/lib/utils/info/platform/platform.android.js +8 -1
  205. package/lib/utils/info/platform/platform.ios.js +8 -1
  206. package/lib/utils/info/platform/platform.js +8 -0
  207. package/lib/utils/info/platform/platform.native.js +8 -1
  208. package/lib/utils/info/versions.js +15 -4
  209. package/lib/utils/input.js +51 -33
  210. package/lib/utils/pressability.js +38 -10
  211. package/lib/utils/propTypes.js +217 -125
  212. package/lib/utils/useCopy.js +40 -5
  213. package/lib/utils/useHash.js +48 -0
  214. package/lib/utils/useHash.native.js +15 -0
  215. package/lib/utils/useResponsiveProp.js +21 -9
  216. package/lib/utils/useSpacingScale.js +21 -9
  217. package/lib/utils/useUniqueId.js +13 -4
  218. package/package.json +7 -6
  219. package/release-context.json +4 -4
  220. package/src/ActivityIndicator/{Spinner.web.jsx → Spinner.jsx} +0 -0
  221. package/src/Box/Box.jsx +11 -4
  222. package/src/Button/Button.jsx +3 -2
  223. package/src/Button/ButtonBase.jsx +27 -36
  224. package/src/Button/ButtonGroup.jsx +2 -2
  225. package/src/Button/ButtonLink.jsx +3 -2
  226. package/src/Button/propTypes.js +12 -2
  227. package/src/Card/Card.jsx +4 -30
  228. package/src/Card/CardBase.jsx +57 -0
  229. package/src/Card/PressableCardBase.jsx +112 -0
  230. package/src/Card/index.js +3 -0
  231. package/src/Checkbox/Checkbox.jsx +10 -11
  232. package/src/Checkbox/CheckboxGroup.jsx +196 -0
  233. package/src/Checkbox/{CheckboxInput.web.jsx → CheckboxInput.jsx} +0 -0
  234. package/src/Checkbox/index.js +2 -0
  235. package/src/ExpandCollapse/Control.jsx +1 -1
  236. package/src/Feedback/Feedback.jsx +1 -1
  237. package/src/Fieldset/Fieldset.jsx +129 -0
  238. package/src/Fieldset/FieldsetContainer.jsx +22 -0
  239. package/src/Fieldset/FieldsetContainer.native.jsx +16 -0
  240. package/src/Fieldset/Legend.jsx +16 -0
  241. package/src/Fieldset/Legend.native.jsx +22 -0
  242. package/src/Fieldset/cssReset.js +14 -0
  243. package/src/Fieldset/index.js +3 -0
  244. package/src/Icon/Icon.jsx +14 -23
  245. package/src/Icon/IconText.jsx +2 -2
  246. package/src/Icon/index.js +2 -2
  247. package/src/InputLabel/InputLabel.jsx +9 -2
  248. package/src/InputLabel/{LabelContent.web.jsx → LabelContent.jsx} +0 -0
  249. package/src/InputSupports/InputSupports.jsx +7 -18
  250. package/src/InputSupports/useInputSupports.js +30 -0
  251. package/src/Link/{InlinePressable.web.jsx → InlinePressable.jsx} +0 -0
  252. package/src/Link/LinkBase.jsx +14 -12
  253. package/src/Modal/Modal.jsx +185 -0
  254. package/src/Modal/dictionary.js +9 -0
  255. package/src/Modal/index.js +3 -0
  256. package/src/Notification/Notification.jsx +149 -0
  257. package/src/Notification/dictionary.js +8 -0
  258. package/src/Notification/index.js +3 -0
  259. package/src/Progress/Progress.jsx +77 -0
  260. package/src/Progress/ProgressBar.jsx +110 -0
  261. package/src/Progress/ProgressBarBackground.jsx +34 -0
  262. package/src/Progress/index.js +6 -0
  263. package/src/Radio/Radio.jsx +19 -56
  264. package/src/Radio/RadioButton.jsx +131 -0
  265. package/src/Radio/RadioGroup.jsx +198 -0
  266. package/src/Radio/{RadioInput.web.jsx → RadioInput.jsx} +0 -0
  267. package/src/Radio/index.js +2 -0
  268. package/src/RadioCard/RadioCard.jsx +191 -0
  269. package/src/RadioCard/RadioCardGroup.jsx +211 -0
  270. package/src/RadioCard/index.js +5 -0
  271. package/src/Search/Search.jsx +204 -0
  272. package/src/Search/dictionary.js +12 -0
  273. package/src/Search/index.js +3 -0
  274. package/src/Select/{Group.web.jsx → Group.jsx} +0 -0
  275. package/src/Select/{Item.web.jsx → Item.jsx} +0 -0
  276. package/src/Select/{Picker.web.jsx → Picker.jsx} +0 -0
  277. package/src/Select/Select.jsx +12 -22
  278. package/src/SideNav/Item.jsx +2 -2
  279. package/src/Skeleton/Skeleton.jsx +17 -20
  280. package/src/Skeleton/skeleton.constant.js +3 -0
  281. package/src/Skeleton/skeletonWebAnimation.js +13 -0
  282. package/src/Skeleton/useSkeletonNativeAnimation.js +27 -0
  283. package/src/StackView/StackView.jsx +10 -3
  284. package/src/StackView/StackWrap.jsx +9 -1
  285. package/src/StackView/StackWrapBox.jsx +4 -3
  286. package/src/StackView/StackWrapGap.jsx +3 -3
  287. package/src/StackView/getStackedContent.jsx +8 -2
  288. package/src/StepTracker/Step.jsx +202 -0
  289. package/src/StepTracker/StepTracker.jsx +163 -0
  290. package/src/StepTracker/dictionary.js +10 -0
  291. package/src/StepTracker/index.js +3 -0
  292. package/src/Tabs/HorizontalScroll.jsx +165 -0
  293. package/src/Tabs/ScrollViewEnd.jsx +53 -0
  294. package/src/Tabs/ScrollViewEnd.native.jsx +24 -0
  295. package/src/Tabs/Tabs.jsx +89 -0
  296. package/src/Tabs/TabsItem.jsx +204 -0
  297. package/src/Tabs/TabsScrollButton.jsx +100 -0
  298. package/src/Tabs/dictionary.js +11 -0
  299. package/src/Tabs/index.js +3 -0
  300. package/src/Tabs/itemPositions.js +101 -0
  301. package/src/Tags/Tags.jsx +2 -1
  302. package/src/TextInput/TextInputBase.jsx +12 -22
  303. package/src/ThemeProvider/useThemeTokens.js +2 -2
  304. package/src/ThemeProvider/utils/styles.js +18 -5
  305. package/src/ThemeProvider/utils/theme-tokens.js +46 -5
  306. package/src/ToggleSwitch/ToggleSwitch.jsx +2 -3
  307. package/src/Tooltip/{Backdrop.web.jsx → Backdrop.jsx} +0 -0
  308. package/src/Tooltip/Tooltip.jsx +1 -1
  309. package/src/TooltipButton/TooltipButton.jsx +23 -27
  310. package/src/Typography/Typography.jsx +6 -5
  311. package/src/index.js +20 -2
  312. package/src/utils/children.jsx +66 -0
  313. package/src/utils/index.js +3 -0
  314. package/src/utils/info/platform/platform.js +1 -0
  315. package/src/utils/info/versions.js +2 -2
  316. package/src/utils/input.js +20 -12
  317. package/src/utils/pressability.js +4 -0
  318. package/src/utils/propTypes.js +98 -34
  319. package/src/utils/useCopy.js +30 -4
  320. package/src/utils/useHash.js +34 -0
  321. package/src/utils/useHash.native.js +6 -0
  322. package/stories/A11yText/A11yText.stories.jsx +4 -8
  323. package/stories/Checkbox/Checkbox.stories.jsx +24 -1
  324. package/stories/Icon/Icon.stories.jsx +6 -5
  325. package/stories/Modal/Modal.stories.jsx +29 -0
  326. package/stories/Notification/Notification.stories.jsx +82 -0
  327. package/stories/Progress/Progress.stories.jsx +93 -0
  328. package/stories/Radio/Radio.stories.jsx +23 -36
  329. package/stories/RadioCard/RadioCard.stories.jsx +98 -0
  330. package/stories/Search/Search.stories.jsx +16 -0
  331. package/stories/StepTracker/StepTracker.stories.jsx +71 -0
  332. package/stories/Tabs/Tabs.stories.jsx +97 -0
  333. package/stories/{platform-supports.web.jsx → platform-supports.jsx} +0 -0
  334. package/__fixtures__/accessible.icon.svg +0 -6
  335. package/babel.config.json +0 -8
  336. package/lib/ActivityIndicator/Spinner.web.js +0 -55
  337. package/lib/Checkbox/CheckboxInput.web.js +0 -57
  338. package/lib/InputLabel/LabelContent.web.js +0 -17
  339. package/lib/Link/InlinePressable.web.js +0 -32
  340. package/lib/Radio/RadioInput.web.js +0 -59
  341. package/lib/Select/Group.web.js +0 -18
  342. package/lib/Select/Item.web.js +0 -15
  343. package/lib/Select/Picker.web.js +0 -63
  344. package/lib/config/svgr-icons-web.js +0 -9
  345. package/lib/config/svgr-icons.js +0 -52
  346. package/lib/utils/info/platform/platform.web.js +0 -1
  347. package/src/config/svgr-icons-web.js +0 -11
  348. package/src/config/svgr-icons.js +0 -46
  349. package/src/utils/info/platform/platform.web.js +0 -1
@@ -58,7 +58,7 @@ const Item = ({
58
58
  accessibilityRole,
59
59
  href,
60
60
  onPress: handlePress,
61
- ...hrefAttrsProp.spread(hrefAttrs),
61
+ hrefAttrs,
62
62
  ...rest
63
63
  })
64
64
 
@@ -105,7 +105,7 @@ Item.propTypes = {
105
105
  href: PropTypes.string,
106
106
  /**
107
107
  * On Web if href is passed, React Native Web maps this object's props to
108
- * `rel`, `target` and (>= RNW 0.15.0) `download` attrs.
108
+ * `rel`, `target` and `download` attrs.
109
109
  */
110
110
  hrefAttrs: PropTypes.shape(hrefAttrsProp.types),
111
111
  /**
@@ -1,14 +1,16 @@
1
- import React, { useEffect, useRef } from 'react'
1
+ import React from 'react'
2
2
  import { Animated, Platform } from 'react-native'
3
3
  import propTypes from 'prop-types'
4
4
  import StackView from '../StackView'
5
5
  import { useThemeTokens } from '../ThemeProvider'
6
6
  import { getTokensPropType, useSpacingScale, variantProp } from '../utils'
7
+ import useSkeletonNativeAnimation from './useSkeletonNativeAnimation'
8
+ import skeletonWebAnimation from './skeletonWebAnimation'
7
9
 
8
10
  const selectSkeletonStyles = ({ color, radius, fadeAnimation }) => ({
9
11
  backgroundColor: color,
10
12
  borderRadius: radius,
11
- opacity: fadeAnimation
13
+ ...fadeAnimation
12
14
  })
13
15
 
14
16
  const selectLineStyles = ({ skeletonHeight, lineWidth }) => ({
@@ -28,7 +30,15 @@ const selectSquareStyles = ({ radius }) => ({
28
30
  const Skeleton = ({ tokens, variant, size, characters, lines, shape = 'line' }) => {
29
31
  const themeTokens = useThemeTokens('Skeleton', tokens, variant)
30
32
  const skeletonHeight = useSpacingScale(size || themeTokens.size)
31
- const fadeAnimation = useRef(new Animated.Value(0)).current
33
+ const nativeAnimation = useSkeletonNativeAnimation()
34
+
35
+ const getAnimationBaseOnPlatform = () => {
36
+ if (Platform.OS !== 'web') {
37
+ return nativeAnimation
38
+ }
39
+
40
+ return skeletonWebAnimation
41
+ }
32
42
 
33
43
  const getLineWidth = () => {
34
44
  if (characters) {
@@ -38,22 +48,6 @@ const Skeleton = ({ tokens, variant, size, characters, lines, shape = 'line' })
38
48
  return themeTokens.characters * themeTokens.baseWidth
39
49
  }
40
50
 
41
- useEffect(() => {
42
- const fade = Animated.sequence([
43
- Animated.timing(fadeAnimation, {
44
- toValue: 1,
45
- duration: 1000,
46
- useNativeDriver: Platform.OS !== 'web'
47
- }),
48
- Animated.timing(fadeAnimation, {
49
- toValue: 0,
50
- duration: 1000,
51
- useNativeDriver: Platform.OS !== 'web'
52
- })
53
- ])
54
- Animated.loop(fade).start()
55
- }, [fadeAnimation])
56
-
57
51
  const getStyledBasedOnShape = () => {
58
52
  if (shape === 'circle') {
59
53
  return selectShapeStyles({ skeletonHeight })
@@ -73,7 +67,10 @@ const Skeleton = ({ tokens, variant, size, characters, lines, shape = 'line' })
73
67
  <Animated.View
74
68
  testID="skeleton"
75
69
  key={`skeleton-${index + 1}`}
76
- style={[selectSkeletonStyles({ ...themeTokens, fadeAnimation }), getStyledBasedOnShape()]}
70
+ style={[
71
+ selectSkeletonStyles({ ...themeTokens, fadeAnimation: getAnimationBaseOnPlatform() }),
72
+ getStyledBasedOnShape()
73
+ ]}
77
74
  />
78
75
  )
79
76
 
@@ -0,0 +1,3 @@
1
+ export const DEFAULT_OPACITY = 1
2
+ export const OPACITY_STOP = 0.4
3
+ export const ANIMATION_DURATION = 1500
@@ -0,0 +1,13 @@
1
+ import { ANIMATION_DURATION, DEFAULT_OPACITY, OPACITY_STOP } from './skeleton.constant'
2
+
3
+ export default {
4
+ animationDuration: `${ANIMATION_DURATION}ms`,
5
+ animationTimingFunction: 'ease-in-out',
6
+ animationDelay: '0.5s',
7
+ animationIterationCount: 'infinite',
8
+ animationKeyframes: {
9
+ '0%': { opacity: DEFAULT_OPACITY },
10
+ '50%': { opacity: OPACITY_STOP },
11
+ '100%': { opacity: DEFAULT_OPACITY }
12
+ }
13
+ }
@@ -0,0 +1,27 @@
1
+ import { useEffect, useRef } from 'react'
2
+ import { Animated } from 'react-native'
3
+ import { ANIMATION_DURATION, DEFAULT_OPACITY, OPACITY_STOP } from './skeleton.constant'
4
+
5
+ const useSkeletonNativeAnimation = () => {
6
+ const fadeAnimation = useRef(new Animated.Value(DEFAULT_OPACITY)).current
7
+
8
+ useEffect(() => {
9
+ const fade = Animated.sequence([
10
+ Animated.timing(fadeAnimation, {
11
+ toValue: OPACITY_STOP,
12
+ duration: ANIMATION_DURATION,
13
+ useNativeDriver: true
14
+ }),
15
+ Animated.timing(fadeAnimation, {
16
+ toValue: DEFAULT_OPACITY,
17
+ duration: ANIMATION_DURATION,
18
+ useNativeDriver: true
19
+ })
20
+ ])
21
+ Animated.loop(fade).start()
22
+ }, [fadeAnimation])
23
+
24
+ return { opacity: fadeAnimation }
25
+ }
26
+
27
+ export default useSkeletonNativeAnimation
@@ -3,7 +3,14 @@ import PropTypes from 'prop-types'
3
3
  import { View } from 'react-native'
4
4
 
5
5
  import Divider from '../Divider'
6
- import { spacingProps, a11yProps, responsiveProps, variantProp, useResponsiveProp } from '../utils'
6
+ import {
7
+ spacingProps,
8
+ a11yProps,
9
+ responsiveProps,
10
+ variantProp,
11
+ viewProps,
12
+ useResponsiveProp
13
+ } from '../utils'
7
14
  import { useThemeTokens } from '../ThemeProvider'
8
15
  import { useViewport } from '../ViewportProvider'
9
16
  import getStackedContent from './getStackedContent'
@@ -62,13 +69,13 @@ const StackView = ({
62
69
  }) => {
63
70
  const viewport = useViewport()
64
71
  const direction = useResponsiveProp(directionProp, 'column')
65
- const a11y = a11yProps.select({ ...rest })
72
+ const props = { ...a11yProps.select(rest), ...viewProps.select(rest) }
66
73
  const content = getStackedContent(children, { direction, divider, space })
67
74
  const themeTokens = useThemeTokens('StackView', tokens, variant, { viewport })
68
75
  const flexStyles = selectFlexStyles(themeTokens)
69
76
 
70
77
  return (
71
- <View {...a11y} style={[flexStyles, staticStyles[direction]]}>
78
+ <View {...props} style={[flexStyles, staticStyles[direction]]}>
72
79
  {content}
73
80
  </View>
74
81
  )
@@ -1,4 +1,5 @@
1
1
  import React from 'react'
2
+ import { Platform } from 'react-native'
2
3
 
3
4
  import StackWrapBox from './StackWrapBox'
4
5
  import StackWrapGap from './StackWrapGap'
@@ -20,7 +21,14 @@ const StackWrap = (props) => {
20
21
  // eslint-disable-next-line react/destructuring-assignment
21
22
  const gap = props.gap ?? space
22
23
 
23
- return gap === space && CSS?.supports('gap', exampleGapValue) ? (
24
+ const canUseCSSGap =
25
+ Platform.OS === 'web' &&
26
+ gap === space &&
27
+ // In Jest/CI, global CSS isn't always available and doesn't always have .supports method
28
+ typeof CSS?.supports === 'function' &&
29
+ CSS.supports('gap', exampleGapValue)
30
+
31
+ return canUseCSSGap ? (
24
32
  // If possible, use the cleaner implementation that applies CSS `gap` styles to the container.
25
33
  <StackWrapGap {...props} />
26
34
  ) : (
@@ -7,7 +7,8 @@ import {
7
7
  a11yProps,
8
8
  responsiveProps,
9
9
  useSpacingScale,
10
- useResponsiveProp
10
+ useResponsiveProp,
11
+ viewProps
11
12
  } from '../utils'
12
13
  import { useThemeTokens } from '../ThemeProvider'
13
14
  import { useViewport } from '../ViewportProvider'
@@ -54,7 +55,7 @@ const StackWrapBox = ({
54
55
  const direction = useResponsiveProp(directionProp, 'row')
55
56
  const themeTokens = useThemeTokens('StackView', tokens, variant, { viewport })
56
57
  const flexStyles = selectFlexStyles(themeTokens)
57
- const a11y = a11yProps.select({ ...rest })
58
+ const props = { ...a11yProps.select(rest), ...viewProps.select(rest) }
58
59
 
59
60
  // Mimic CSS `gap` using box spacing on the side after a wrapped row then offsetting it on the last row.
60
61
  const gapSize = useSpacingScale(gap)
@@ -63,7 +64,7 @@ const StackWrapBox = ({
63
64
  const content = getStackedContent(children, { direction, space: 0, box: boxProps })
64
65
 
65
66
  return (
66
- <View {...a11y} style={[flexStyles, staticStyles.wrap, staticStyles[direction], offsetStyle]}>
67
+ <View {...props} style={[flexStyles, staticStyles.wrap, staticStyles[direction], offsetStyle]}>
67
68
  {content}
68
69
  </View>
69
70
  )
@@ -2,7 +2,7 @@ import React from 'react'
2
2
  import { View } from 'react-native'
3
3
 
4
4
  import StackWrapBox from './StackWrapBox'
5
- import { a11yProps, useSpacingScale, useResponsiveProp } from '../utils'
5
+ import { a11yProps, useSpacingScale, useResponsiveProp, viewProps } from '../utils'
6
6
  import { useThemeTokens } from '../ThemeProvider'
7
7
  import { useViewport } from '../ViewportProvider'
8
8
  import getStackedContent from './getStackedContent'
@@ -30,7 +30,7 @@ const StackWrapGap = ({
30
30
  const direction = useResponsiveProp(directionProp, 'row')
31
31
  const themeTokens = useThemeTokens('StackView', tokens, variant, { viewport })
32
32
  const flexStyles = selectFlexStyles(themeTokens)
33
- const a11y = a11yProps.select({ ...rest })
33
+ const props = { ...a11yProps.select(rest), ...viewProps.select(rest) }
34
34
 
35
35
  const size = useSpacingScale(space)
36
36
  const gapStyle = { gap: size }
@@ -38,7 +38,7 @@ const StackWrapGap = ({
38
38
  const content = getStackedContent(children, { direction, space: 0 })
39
39
 
40
40
  return (
41
- <View {...a11y} style={[flexStyles, staticStyles.wrap, staticStyles[direction], gapStyle]}>
41
+ <View {...props} style={[flexStyles, staticStyles.wrap, staticStyles[direction], gapStyle]}>
42
42
  {content}
43
43
  </View>
44
44
  )
@@ -23,17 +23,23 @@ import Spacer from '../Spacer'
23
23
  * - `direction`: if 'row' or 'row-reverse', applies space horizontally, if 'column' or 'column-reverse', applies space vertically
24
24
  * - `box`: if truthy, wraps each valid child in a Box component; if an object, passes it to Box as props
25
25
  * - `divider`: if truthy, inserts Divider components; if an object, passes it to Divider as props
26
+ * - `preserveFragments`: if true, adds no space between top-level elements that were passed inside a nested fragment
26
27
  * @param {SpacingValue} [options.space]
27
28
  * @param {boolean | object} [options.divider]
28
29
  * @param {"row" | "column" | "row-reverse" | "column-reverse"} [options.direction]
30
+ * @param {boolean} [options.preserveFragments]
29
31
  * @returns {ReactElement[]}
30
32
  */
31
- const getStackedContent = (children, { divider, space, direction = 'column', box }) => {
33
+ const getStackedContent = (
34
+ children,
35
+ { divider, space, direction = 'column', box, preserveFragments = false }
36
+ ) => {
32
37
  const boxProps = box && typeof box === 'object' ? box : { space }
33
38
  const dividerProps = divider && typeof divider === 'object' ? divider : {}
34
39
 
35
40
  // Avoid surprises if children contains comments, nulls, or is a variable wrapped as a fragment
36
- const validChildren = Children.toArray(unpackFragment(children)).filter(Boolean)
41
+ const topLevelChildren = preserveFragments ? children : unpackFragment(children)
42
+ const validChildren = Children.toArray(topLevelChildren).filter(Boolean)
37
43
  const content = validChildren.reduce((newChildren, child, index) => {
38
44
  const boxID = `Stack-Box-${index}`
39
45
  const item = box ? (
@@ -0,0 +1,202 @@
1
+ import React from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import { StyleSheet, Text, View } from 'react-native'
4
+
5
+ import StackView from '../StackView'
6
+ import Icon from '../Icon'
7
+ import { getTokensPropType, variantProp } from '../utils'
8
+ import { applyTextStyles } from '../ThemeProvider'
9
+
10
+ const selectCompletedIconTokens = ({ completedIconColor, completedIconSize }) => ({
11
+ size: completedIconSize,
12
+ color: completedIconColor
13
+ })
14
+ const selectConnectorStyles = (
15
+ {
16
+ connectorColor,
17
+ connectorHeight,
18
+ connectorMinWidth,
19
+ connectorCompletedHeight,
20
+ connectorCompletedColor
21
+ },
22
+ isCompleted
23
+ ) => ({
24
+ backgroundColor: connectorColor,
25
+ height: connectorHeight,
26
+ minWidth: connectorMinWidth,
27
+ ...(isCompleted && { height: connectorCompletedHeight, backgroundColor: connectorCompletedColor })
28
+ })
29
+ const selectCurrentInnerStyles = ({ knobCurrentInnerColor, knobCurrentInnerSize }) => ({
30
+ backgroundColor: knobCurrentInnerColor,
31
+ borderRadius: knobCurrentInnerSize / 2,
32
+ height: knobCurrentInnerSize,
33
+ width: knobCurrentInnerSize
34
+ })
35
+ const selectKnobStyles = (
36
+ {
37
+ knobBackgroundColor,
38
+ knobBorderColor,
39
+ knobBorderWidth,
40
+ knobCompletedBackgroundColor,
41
+ knobCompletedBorderColor,
42
+ knobCompletedPaddingLeft,
43
+ knobCompletedPaddingTop,
44
+ knobCurrentBackgroundColor,
45
+ knobCurrentBorderColor,
46
+ knobCurrentBorderWidth,
47
+ knobCurrentPaddingLeft,
48
+ knobCurrentPaddingTop,
49
+ knobSize
50
+ },
51
+ isCompleted,
52
+ isCurrent
53
+ ) => ({
54
+ backgroundColor: knobBackgroundColor,
55
+ borderColor: knobBorderColor,
56
+ borderRadius: knobSize / 2,
57
+ borderWidth: knobBorderWidth,
58
+ height: knobSize,
59
+ width: knobSize,
60
+ ...(isCompleted && {
61
+ backgroundColor: knobCompletedBackgroundColor,
62
+ borderColor: knobCompletedBorderColor,
63
+ paddingLeft: knobCompletedPaddingLeft,
64
+ paddingTop: knobCompletedPaddingTop
65
+ }),
66
+ ...(isCurrent && {
67
+ backgroundColor: knobCurrentBackgroundColor,
68
+ borderColor: knobCurrentBorderColor,
69
+ borderWidth: knobCurrentBorderWidth,
70
+ paddingLeft: knobCurrentPaddingLeft,
71
+ paddingTop: knobCurrentPaddingTop
72
+ })
73
+ })
74
+ const selectLabelContainerStyles = ({
75
+ labelDirection,
76
+ labelGap,
77
+ labelMarginTop,
78
+ labelPaddingLeft,
79
+ labelPaddingRight
80
+ }) => ({
81
+ marginTop: labelMarginTop,
82
+ paddingLeft: labelPaddingLeft,
83
+ paddingRight: labelPaddingRight,
84
+ flexDirection: labelDirection,
85
+ gap: labelGap
86
+ })
87
+ const selectLabelStyles = (
88
+ {
89
+ labelColor,
90
+ labelCurrentColor,
91
+ labelCurrentFontWeight,
92
+ labelFontSize,
93
+ labelFontWeight,
94
+ labelFontName,
95
+ labelLineHeight
96
+ },
97
+ isCurrent
98
+ ) =>
99
+ applyTextStyles({
100
+ color: isCurrent ? labelCurrentColor : labelColor,
101
+ fontSize: labelFontSize,
102
+ lineHeight: labelLineHeight,
103
+ fontWeight: isCurrent ? labelCurrentFontWeight : labelFontWeight,
104
+ fontName: labelFontName
105
+ })
106
+ const getStepTestID = (isCompleted, isCurrent) => {
107
+ let testID = 'StepTracker-Step'
108
+ if (isCompleted) {
109
+ testID += '-Completed'
110
+ } else if (isCurrent) {
111
+ testID += '-Current'
112
+ }
113
+
114
+ return testID
115
+ }
116
+
117
+ /**
118
+ * A single step of a StepTracker.
119
+ */
120
+ const Step = ({ label, name, status = 0, stepCount = 0, stepIndex = 0, tokens }) => {
121
+ const { completedIcon, showStepLabel, showStepName, ...themeTokens } = tokens
122
+ const isFirst = stepIndex === 0
123
+ const isLast = stepIndex === stepCount - 1
124
+ const isCompleted = status > stepIndex
125
+ const isCurrent = status === stepIndex
126
+ const isActive = isCompleted || isCurrent
127
+
128
+ return (
129
+ <StackView
130
+ space={0}
131
+ tokens={{ alignItems: 'stretch', flexGrow: 1 }}
132
+ accessibilityLabel={label}
133
+ accessibilityLevel={2}
134
+ accessibilityCurrent={status === stepIndex ? 'true' : 'false'}
135
+ >
136
+ <StackView direction="row" space={0} tokens={{ alignItems: 'center', flexGrow: 0 }}>
137
+ <View
138
+ style={[staticStyles.connector, !isFirst && selectConnectorStyles(themeTokens, isActive)]}
139
+ />
140
+ <View
141
+ style={[staticStyles.knob, selectKnobStyles(themeTokens, isCompleted, isCurrent)]}
142
+ testID={getStepTestID(isCompleted, isCurrent)}
143
+ >
144
+ {isCompleted && completedIcon && (
145
+ <Icon icon={completedIcon} tokens={selectCompletedIconTokens(themeTokens)} />
146
+ )}
147
+ {isCurrent && <View style={selectCurrentInnerStyles(themeTokens)} />}
148
+ </View>
149
+ <View
150
+ style={[
151
+ staticStyles.connector,
152
+ !isLast && selectConnectorStyles(themeTokens, isCompleted)
153
+ ]}
154
+ />
155
+ </StackView>
156
+ {showStepLabel && (
157
+ <View style={[staticStyles.stepLabelContainer, selectLabelContainerStyles(tokens)]}>
158
+ {showStepName && (
159
+ <Text style={[staticStyles.centeredText, selectLabelStyles(tokens, isCurrent)]}>
160
+ {name}
161
+ </Text>
162
+ )}
163
+ <StackView direction="row">
164
+ <Text
165
+ style={[
166
+ staticStyles.centeredText,
167
+ tokens.labelDirection === 'column' && staticStyles.wrappingLabel,
168
+ selectLabelStyles(tokens, isCurrent)
169
+ ]}
170
+ >
171
+ {label}
172
+ </Text>
173
+ </StackView>
174
+ </View>
175
+ )}
176
+ </StackView>
177
+ )
178
+ }
179
+
180
+ Step.propTypes = {
181
+ label: PropTypes.string.isRequired,
182
+ name: PropTypes.string.isRequired,
183
+ status: PropTypes.number.isRequired,
184
+ stepCount: PropTypes.number.isRequired,
185
+ stepIndex: PropTypes.number.isRequired,
186
+ tokens: getTokensPropType('StepTracker'),
187
+ variant: variantProp.propType
188
+ }
189
+
190
+ export default Step
191
+
192
+ const staticStyles = StyleSheet.create({
193
+ centeredText: { textAlign: 'center' },
194
+ connector: { flex: 1, height: 1 },
195
+ completedKnob: {
196
+ backgroundColor: 'transparent',
197
+ textAlign: 'center'
198
+ },
199
+ knob: { borderWidth: 1 },
200
+ stepLabelContainer: { justifyContent: 'center' },
201
+ wrappingLabel: { width: 0, flex: 1 }
202
+ })
@@ -0,0 +1,163 @@
1
+ import React from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import { StyleSheet, Text, View } from 'react-native'
4
+
5
+ import StackView from '../StackView'
6
+ import { applyTextStyles, useThemeTokens } from '../ThemeProvider'
7
+ import { getTokensPropType, variantProp } from '../utils'
8
+ import { a11yProps } from '../utils/propTypes'
9
+ import { useViewport } from '../ViewportProvider'
10
+ import useCopy from '../utils/useCopy'
11
+
12
+ import Step from './Step'
13
+ import defaultDictionary from './dictionary'
14
+
15
+ const selectContainerStyles = ({
16
+ containerPaddingBottom,
17
+ containerPaddingLeft,
18
+ containerPaddingRight,
19
+ containerPaddingTop
20
+ }) => ({
21
+ paddingBottom: containerPaddingBottom,
22
+ paddingLeft: containerPaddingLeft,
23
+ paddingRight: containerPaddingRight,
24
+ paddingTop: containerPaddingTop
25
+ })
26
+ const selectStepTrackerLabelContainerStyles = ({ labelMarginTop }) => ({
27
+ marginTop: labelMarginTop
28
+ })
29
+ const selectStepTrackerLabelStyles = ({
30
+ labelColor,
31
+ labelFontSize,
32
+ labelFontWeight,
33
+ labelFontName,
34
+ labelLineHeight
35
+ }) =>
36
+ applyTextStyles({
37
+ color: labelColor,
38
+ fontSize: labelFontSize,
39
+ lineHeight: labelLineHeight,
40
+ fontWeight: labelFontWeight,
41
+ fontName: labelFontName
42
+ })
43
+
44
+ /**
45
+ * StepTracker component shows the current position in a sequence of steps.
46
+ *
47
+ * ## Component API
48
+ *
49
+ * - `current` prop allows to control the current step, 0-based number;
50
+ * - use `copy` and `dictionary` props to internationalize the labels;
51
+ * - `steps` is and array of strings defining step titles;
52
+ * - tokens and variant props define the appearance of the `StepTracker`:
53
+ *
54
+ * ## Usability and A11y guidelines
55
+ *
56
+ * Keep in mind that in its current implementation this is not an interactive
57
+ * component and can’t be used to navigate between steps. The application
58
+ * must provide its own navigation mechanism and state control. That is the
59
+ * main reason the component assumes the `progressbar` role in terms of
60
+ * accessibility. This also makes it extremely important to make sure you
61
+ * set a11y on controls used to modify the state of the step tracker.
62
+ *
63
+ * You can pass standard a11y props to the `StepTracker` component, including
64
+ * the ones that are specific to the `progressbar` role. By default the
65
+ * following props are used:
66
+ *
67
+ * - `accessibilityRole` (`role`): `progressbar`,
68
+ * - `accessibilityLabel` (`aria-label`): `Step I of N: <Current Step Label>`,
69
+ * - `accessibilityLevel` (`aria-level`): 1,
70
+ * - `accessibilityValue.min` (`aria-valuemin`): `0`,
71
+ * - `accessibilityValue.max` (`aria-valuemax`): `steps.length - 1`,
72
+ * - `accessibilityValue.now` (`aria-valuenow`): `current`,
73
+ * - `accessibilityValue.text` (`aria-valuetext`): `<Current Step Label>`,
74
+ *
75
+ */
76
+ const StepTracker = ({
77
+ current = 0,
78
+ copy = 'en',
79
+ dictionary = defaultDictionary,
80
+ steps = [],
81
+ tokens,
82
+ variant,
83
+ ...rest
84
+ }) => {
85
+ const viewport = useViewport()
86
+ const { showStepTrackerLabel, ...themeTokens } = useThemeTokens('StepTracker', tokens, variant, {
87
+ viewport
88
+ })
89
+ const getCopy = useCopy({ dictionary, copy })
90
+ const stepTrackerLabel = getCopy('stepTrackerLabel')
91
+ .replace('%{stepNumber}', current < steps.length ? current + 1 : steps.length)
92
+ .replace('%{stepCount}', steps.length)
93
+ .replace('%{stepLabel}', current < steps.length ? steps[current] : steps[steps.length - 1])
94
+ if (!steps.length) return null
95
+ const accessibilityProps = {
96
+ accessibilityLabel: stepTrackerLabel,
97
+ accessibilityLevel: 1,
98
+ accessibilityRole: 'progressbar',
99
+ accessibilityValue: {
100
+ min: 0,
101
+ max: steps.length - 1,
102
+ now: current,
103
+ text: steps[current]
104
+ },
105
+ ...a11yProps.select(rest)
106
+ }
107
+
108
+ return (
109
+ <View style={selectContainerStyles(themeTokens)} {...accessibilityProps}>
110
+ <StackView space={0}>
111
+ <View style={staticStyles.stepsContainer}>
112
+ {steps.map((label, index) => {
113
+ return (
114
+ <Step
115
+ status={current}
116
+ key={label}
117
+ label={label}
118
+ name={getCopy('stepLabel').replace('%{stepNumber}', index + 1)}
119
+ stepIndex={index}
120
+ stepCount={steps.length}
121
+ tokens={themeTokens}
122
+ />
123
+ )
124
+ })}
125
+ </View>
126
+ {showStepTrackerLabel && (
127
+ <View
128
+ style={[
129
+ staticStyles.stepTrackerLabelContainer,
130
+ selectStepTrackerLabelContainerStyles(themeTokens)
131
+ ]}
132
+ >
133
+ <Text style={selectStepTrackerLabelStyles(themeTokens)}>{stepTrackerLabel}</Text>
134
+ </View>
135
+ )}
136
+ </StackView>
137
+ </View>
138
+ )
139
+ }
140
+
141
+ StepTracker.propTypes = {
142
+ current: PropTypes.number,
143
+ copy: PropTypes.oneOf(['en', 'fr']),
144
+ dictionary: PropTypes.shape({
145
+ en: PropTypes.shape({ stepLabel: PropTypes.string, stepTrackerLabel: PropTypes.string }),
146
+ fr: PropTypes.shape({ stepLabel: PropTypes.string, stepTrackerLabel: PropTypes.string })
147
+ }),
148
+ steps: PropTypes.arrayOf(PropTypes.string),
149
+ tokens: getTokensPropType('StepTracker'),
150
+ variant: variantProp.propType
151
+ }
152
+
153
+ export default StepTracker
154
+
155
+ const staticStyles = StyleSheet.create({
156
+ stepsContainer: {
157
+ alignItems: 'flex-start',
158
+ flexDirection: 'row',
159
+ justifyContent: 'space-evenly',
160
+ flexGrow: 1
161
+ },
162
+ stepTrackerLabelContainer: { textAlign: 'center', flexDirection: 'row', justifyContent: 'center' }
163
+ })
@@ -0,0 +1,10 @@
1
+ export default {
2
+ en: {
3
+ stepLabel: 'Step %{stepNumber}',
4
+ stepTrackerLabel: 'Step %{stepNumber} of %{stepCount}: %{stepLabel}'
5
+ },
6
+ fr: {
7
+ stepLabel: 'Étape %{stepNumber}',
8
+ stepTrackerLabel: 'Étape %{stepNumber} sur %{stepCount}: %{stepLabel}'
9
+ }
10
+ }
@@ -0,0 +1,3 @@
1
+ import StepTracker from './StepTracker'
2
+
3
+ export default StepTracker