@shopgate/pwa-ui-shared 7.30.3 → 7.31.0-alpha.1

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 (326) hide show
  1. package/ActionButton/index.js +66 -67
  2. package/AddToCartButton/index.js +217 -185
  3. package/Availability/index.js +24 -6
  4. package/Button/index.js +105 -82
  5. package/Button/spec.js +3 -4
  6. package/Card/index.js +26 -7
  7. package/CardList/components/Item/index.js +15 -3
  8. package/CartTotalLine/components/Amount/index.js +13 -4
  9. package/CartTotalLine/components/Hint/index.js +13 -4
  10. package/CartTotalLine/components/Label/index.js +23 -10
  11. package/CartTotalLine/index.js +41 -7
  12. package/Checkbox/index.js +41 -17
  13. package/Chip/index.js +82 -7
  14. package/ContextMenu/components/Item/index.js +38 -20
  15. package/ContextMenu/components/Position/index.js +38 -56
  16. package/ContextMenu/index.js +64 -28
  17. package/Dialog/components/BasicDialog/index.js +1 -0
  18. package/Dialog/components/HtmlContentDialog/spec.js +39 -0
  19. package/Dialog/components/PipelineErrorDialog/index.js +108 -157
  20. package/Dialog/components/PipelineErrorDialog/spec.js +12 -18
  21. package/Dialog/components/TextMessageDialog/index.js +1 -1
  22. package/Dialog/components/VariantSelectModal/index.js +1 -1
  23. package/Dialog/index.js +1 -1
  24. package/DiscountBadge/index.js +48 -15
  25. package/FavoritesButton/index.js +95 -100
  26. package/FavoritesButton/spec.js +5 -2
  27. package/Form/Builder/classes/ActionListener/index.js +1 -0
  28. package/Form/Checkbox/index.js +64 -56
  29. package/Form/InfoField/index.js +18 -6
  30. package/Form/Password/index.js +39 -52
  31. package/Form/RadioGroup/components/Item/index.js +72 -56
  32. package/Form/RadioGroup/index.js +79 -90
  33. package/Form/Select/index.js +108 -130
  34. package/Form/SelectContextChoices/index.js +30 -8
  35. package/Form/TextField/index.js +106 -82
  36. package/Form/TextField/spec.js +4 -3
  37. package/FormElement/components/ErrorText/index.js +32 -14
  38. package/FormElement/components/Label/index.js +56 -6
  39. package/FormElement/components/Placeholder/index.js +44 -11
  40. package/FormElement/components/Underline/index.js +63 -12
  41. package/FormElement/index.js +62 -85
  42. package/Glow/index.js +73 -83
  43. package/IndicatorCircle/index.js +73 -17
  44. package/IndicatorCircle/spec.js +2 -5
  45. package/LoadingIndicator/index.js +34 -12
  46. package/Manufacturer/index.js +21 -10
  47. package/MessageBar/index.js +12 -38
  48. package/NoResults/components/Icon/index.js +30 -14
  49. package/NoResults/index.js +35 -7
  50. package/Placeholder/index.js +34 -23
  51. package/PlaceholderLabel/index.js +17 -3
  52. package/Price/index.js +34 -21
  53. package/PriceInfo/index.js +23 -9
  54. package/PriceStriked/index.js +67 -77
  55. package/ProgressBar/index.js +112 -77
  56. package/RadioButton/index.js +29 -11
  57. package/RatingStars/index.js +122 -137
  58. package/Ripple/components/RippleAnimation/index.js +13 -3
  59. package/Ripple/index.js +158 -212
  60. package/RippleButton/index.js +63 -60
  61. package/RippleButton/spec.js +15 -9
  62. package/ScannerOverlay/components/CameraOverlay/index.js +54 -10
  63. package/ScannerOverlay/components/ScannerBar/components/FlashlightButton/index.js +53 -27
  64. package/ScannerOverlay/components/ScannerBar/index.js +50 -26
  65. package/Sheet/components/Header/components/SearchBar/index.js +54 -10
  66. package/Sheet/components/Header/index.js +96 -76
  67. package/Sheet/index.js +295 -157
  68. package/Sheet/spec.js +8 -6
  69. package/TaxDisclaimer/index.js +17 -4
  70. package/TaxDisclaimer/spec.js +16 -5
  71. package/TextField/components/ErrorText/index.js +35 -14
  72. package/TextField/components/FormElement/index.js +29 -4
  73. package/TextField/components/Hint/index.js +39 -10
  74. package/TextField/components/Label/index.js +43 -6
  75. package/TextField/components/Underline/index.js +64 -13
  76. package/TextField/index.js +157 -171
  77. package/TextField/spec.js +5 -3
  78. package/icons/AccountBoxIcon.d.ts +7 -0
  79. package/icons/AccountBoxIcon.d.ts.map +1 -0
  80. package/icons/AccountBoxIcon.js +1 -4
  81. package/icons/AddMoreIcon.d.ts +7 -0
  82. package/icons/AddMoreIcon.d.ts.map +1 -0
  83. package/icons/AddMoreIcon.js +0 -3
  84. package/icons/ArrowDropIcon.d.ts +7 -0
  85. package/icons/ArrowDropIcon.d.ts.map +1 -0
  86. package/icons/ArrowDropIcon.js +0 -3
  87. package/icons/ArrowIcon.d.ts +10 -0
  88. package/icons/ArrowIcon.d.ts.map +1 -0
  89. package/icons/ArrowIcon.js +2 -11
  90. package/icons/BarcodeScannerIcon.d.ts +7 -0
  91. package/icons/BarcodeScannerIcon.d.ts.map +1 -0
  92. package/icons/BarcodeScannerIcon.js +0 -3
  93. package/icons/BoxIcon.d.ts +7 -0
  94. package/icons/BoxIcon.d.ts.map +1 -0
  95. package/icons/BoxIcon.js +0 -3
  96. package/icons/BrowseIcon.d.ts +7 -0
  97. package/icons/BrowseIcon.d.ts.map +1 -0
  98. package/icons/BrowseIcon.js +1 -3
  99. package/icons/BurgerIcon.d.ts +7 -0
  100. package/icons/BurgerIcon.d.ts.map +1 -0
  101. package/icons/BurgerIcon.js +0 -3
  102. package/icons/CalendarIcon.d.ts +7 -0
  103. package/icons/CalendarIcon.d.ts.map +1 -0
  104. package/icons/CalendarIcon.js +0 -2
  105. package/icons/CartCouponIcon.d.ts +7 -0
  106. package/icons/CartCouponIcon.d.ts.map +1 -0
  107. package/icons/CartCouponIcon.js +0 -2
  108. package/icons/CartIcon.d.ts +7 -0
  109. package/icons/CartIcon.d.ts.map +1 -0
  110. package/icons/CartIcon.js +0 -2
  111. package/icons/CartPlusIcon.d.ts +7 -0
  112. package/icons/CartPlusIcon.d.ts.map +1 -0
  113. package/icons/CartPlusIcon.js +0 -2
  114. package/icons/CheckIcon.d.ts +7 -0
  115. package/icons/CheckIcon.d.ts.map +1 -0
  116. package/icons/CheckIcon.js +0 -2
  117. package/icons/CheckedIcon.d.ts +7 -0
  118. package/icons/CheckedIcon.d.ts.map +1 -0
  119. package/icons/CheckedIcon.js +0 -3
  120. package/icons/ChevronIcon.d.ts +7 -0
  121. package/icons/ChevronIcon.d.ts.map +1 -0
  122. package/icons/ChevronIcon.js +0 -2
  123. package/icons/CreditCardIcon.d.ts +7 -0
  124. package/icons/CreditCardIcon.d.ts.map +1 -0
  125. package/icons/CreditCardIcon.js +0 -2
  126. package/icons/CrossIcon.d.ts +7 -0
  127. package/icons/CrossIcon.d.ts.map +1 -0
  128. package/icons/CrossIcon.js +0 -2
  129. package/icons/DescriptionIcon.d.ts +7 -0
  130. package/icons/DescriptionIcon.d.ts.map +1 -0
  131. package/icons/DescriptionIcon.js +0 -2
  132. package/icons/FilterIcon.d.ts +7 -0
  133. package/icons/FilterIcon.d.ts.map +1 -0
  134. package/icons/FilterIcon.js +0 -2
  135. package/icons/FlashDisabledIcon.d.ts +7 -0
  136. package/icons/FlashDisabledIcon.d.ts.map +1 -0
  137. package/icons/FlashDisabledIcon.js +0 -2
  138. package/icons/FlashEnabledIcon.d.ts +7 -0
  139. package/icons/FlashEnabledIcon.d.ts.map +1 -0
  140. package/icons/FlashEnabledIcon.js +0 -2
  141. package/icons/GridIcon.d.ts +7 -0
  142. package/icons/GridIcon.d.ts.map +1 -0
  143. package/icons/GridIcon.js +1 -3
  144. package/icons/HeartIcon.d.ts +7 -0
  145. package/icons/HeartIcon.d.ts.map +1 -0
  146. package/icons/HeartIcon.js +0 -2
  147. package/icons/HeartOutlineIcon.d.ts +7 -0
  148. package/icons/HeartOutlineIcon.d.ts.map +1 -0
  149. package/icons/HeartOutlineIcon.js +1 -3
  150. package/icons/HeartPlusIcon.d.ts +7 -0
  151. package/icons/HeartPlusIcon.d.ts.map +1 -0
  152. package/icons/HeartPlusIcon.js +1 -3
  153. package/icons/HeartPlusOutlineIcon.d.ts +7 -0
  154. package/icons/HeartPlusOutlineIcon.d.ts.map +1 -0
  155. package/icons/HeartPlusOutlineIcon.js +1 -3
  156. package/icons/HomeIcon.d.ts +7 -0
  157. package/icons/HomeIcon.d.ts.map +1 -0
  158. package/icons/HomeIcon.js +0 -2
  159. package/icons/InfoIcon.d.ts +7 -0
  160. package/icons/InfoIcon.d.ts.map +1 -0
  161. package/icons/InfoIcon.js +0 -2
  162. package/icons/InfoOutlineIcon.d.ts +7 -0
  163. package/icons/InfoOutlineIcon.d.ts.map +1 -0
  164. package/icons/InfoOutlineIcon.js +0 -2
  165. package/icons/ListIcon.d.ts +7 -0
  166. package/icons/ListIcon.d.ts.map +1 -0
  167. package/icons/ListIcon.js +0 -2
  168. package/icons/LocalShippingIcon.d.ts +7 -0
  169. package/icons/LocalShippingIcon.d.ts.map +1 -0
  170. package/icons/LocalShippingIcon.js +0 -2
  171. package/icons/LocationIcon.d.ts +7 -0
  172. package/icons/LocationIcon.d.ts.map +1 -0
  173. package/icons/LocationIcon.js +1 -4
  174. package/icons/LocatorIcon.d.ts +7 -0
  175. package/icons/LocatorIcon.d.ts.map +1 -0
  176. package/icons/LocatorIcon.js +1 -3
  177. package/icons/LockIcon.d.ts +9 -0
  178. package/icons/LockIcon.d.ts.map +1 -0
  179. package/icons/LockIcon.js +1 -2
  180. package/icons/LogoutIcon.d.ts +7 -0
  181. package/icons/LogoutIcon.d.ts.map +1 -0
  182. package/icons/LogoutIcon.js +0 -2
  183. package/icons/MagnifierIcon.d.ts +7 -0
  184. package/icons/MagnifierIcon.d.ts.map +1 -0
  185. package/icons/MagnifierIcon.js +0 -2
  186. package/icons/MapMarkerIcon.d.ts +7 -0
  187. package/icons/MapMarkerIcon.d.ts.map +1 -0
  188. package/icons/MapMarkerIcon.js +1 -3
  189. package/icons/MoreIcon.d.ts +7 -0
  190. package/icons/MoreIcon.d.ts.map +1 -0
  191. package/icons/MoreIcon.js +1 -3
  192. package/icons/MoreVertIcon.d.ts +7 -0
  193. package/icons/MoreVertIcon.d.ts.map +1 -0
  194. package/icons/MoreVertIcon.js +1 -3
  195. package/icons/NotificationIcon.d.ts +7 -0
  196. package/icons/NotificationIcon.d.ts.map +1 -0
  197. package/icons/NotificationIcon.js +1 -3
  198. package/icons/PersonIcon.d.ts +9 -0
  199. package/icons/PersonIcon.d.ts.map +1 -0
  200. package/icons/PersonIcon.js +0 -3
  201. package/icons/PhoneIcon.d.ts +7 -0
  202. package/icons/PhoneIcon.d.ts.map +1 -0
  203. package/icons/PhoneIcon.js +1 -4
  204. package/icons/PlaceholderIcon.d.ts +7 -0
  205. package/icons/PlaceholderIcon.d.ts.map +1 -0
  206. package/icons/PlaceholderIcon.js +0 -2
  207. package/icons/RadioCheckedIcon.d.ts +10 -0
  208. package/icons/RadioCheckedIcon.d.ts.map +1 -0
  209. package/icons/RadioCheckedIcon.js +0 -2
  210. package/icons/RadioUncheckedIcon.d.ts +10 -0
  211. package/icons/RadioUncheckedIcon.d.ts.map +1 -0
  212. package/icons/RadioUncheckedIcon.js +0 -2
  213. package/icons/SecurityIcon.d.ts +7 -0
  214. package/icons/SecurityIcon.d.ts.map +1 -0
  215. package/icons/SecurityIcon.js +0 -2
  216. package/icons/ShippingMethodIcon.d.ts +7 -0
  217. package/icons/ShippingMethodIcon.d.ts.map +1 -0
  218. package/icons/ShippingMethodIcon.js +0 -2
  219. package/icons/ShoppingCartIcon.d.ts +7 -0
  220. package/icons/ShoppingCartIcon.d.ts.map +1 -0
  221. package/icons/ShoppingCartIcon.js +0 -2
  222. package/icons/SortIcon.d.ts +7 -0
  223. package/icons/SortIcon.d.ts.map +1 -0
  224. package/icons/SortIcon.js +0 -2
  225. package/icons/StarHalfIcon.d.ts +7 -0
  226. package/icons/StarHalfIcon.d.ts.map +1 -0
  227. package/icons/StarHalfIcon.js +0 -9
  228. package/icons/StarIcon.d.ts +7 -0
  229. package/icons/StarIcon.d.ts.map +1 -0
  230. package/icons/StarIcon.js +0 -9
  231. package/icons/StarOutlineIcon.d.ts +7 -0
  232. package/icons/StarOutlineIcon.d.ts.map +1 -0
  233. package/icons/StarOutlineIcon.js +0 -2
  234. package/icons/StopIcon.d.ts +7 -0
  235. package/icons/StopIcon.d.ts.map +1 -0
  236. package/icons/StopIcon.js +0 -2
  237. package/icons/TickIcon.d.ts +7 -0
  238. package/icons/TickIcon.d.ts.map +1 -0
  239. package/icons/TickIcon.js +0 -2
  240. package/icons/TimeIcon.d.ts +7 -0
  241. package/icons/TimeIcon.d.ts.map +1 -0
  242. package/icons/TimeIcon.js +0 -2
  243. package/icons/TrashIcon.d.ts +7 -0
  244. package/icons/TrashIcon.d.ts.map +1 -0
  245. package/icons/TrashIcon.js +0 -3
  246. package/icons/TrashOutlineIcon.d.ts +8 -0
  247. package/icons/TrashOutlineIcon.d.ts.map +1 -0
  248. package/icons/TrashOutlineIcon.js +0 -2
  249. package/icons/UncheckedIcon.d.ts +7 -0
  250. package/icons/UncheckedIcon.d.ts.map +1 -0
  251. package/icons/UncheckedIcon.js +0 -2
  252. package/icons/ViewListIcon.d.ts +7 -0
  253. package/icons/ViewListIcon.d.ts.map +1 -0
  254. package/icons/ViewListIcon.js +0 -2
  255. package/icons/VisibilityIcon.d.ts +8 -0
  256. package/icons/VisibilityIcon.d.ts.map +1 -0
  257. package/icons/VisibilityIcon.js +2 -4
  258. package/icons/VisibilityOffIcon.d.ts +8 -0
  259. package/icons/VisibilityOffIcon.d.ts.map +1 -0
  260. package/icons/VisibilityOffIcon.js +2 -4
  261. package/icons/WarningIcon.d.ts +7 -0
  262. package/icons/WarningIcon.d.ts.map +1 -0
  263. package/icons/WarningIcon.js +1 -3
  264. package/package.json +5 -5
  265. package/tsconfig.build.json +16 -0
  266. package/tsconfig.json +3 -0
  267. package/ActionButton/style.js +0 -22
  268. package/AddToCartButton/style.js +0 -148
  269. package/Availability/style.js +0 -19
  270. package/Button/style.js +0 -155
  271. package/Card/style.js +0 -11
  272. package/CardList/components/Item/style.js +0 -7
  273. package/CartTotalLine/components/Amount/style.js +0 -8
  274. package/CartTotalLine/components/Hint/style.js +0 -12
  275. package/CartTotalLine/components/Label/style.js +0 -17
  276. package/CartTotalLine/style.js +0 -31
  277. package/Checkbox/style.js +0 -18
  278. package/Chip/style.js +0 -78
  279. package/ContextMenu/components/Item/style.js +0 -34
  280. package/ContextMenu/components/Position/style.js +0 -11
  281. package/ContextMenu/style.js +0 -45
  282. package/DiscountBadge/style.js +0 -36
  283. package/FavoritesButton/style.js +0 -26
  284. package/Form/Checkbox/style.js +0 -25
  285. package/Form/InfoField/style.js +0 -11
  286. package/Form/Password/style.js +0 -11
  287. package/Form/RadioGroup/components/Item/style.js +0 -32
  288. package/Form/RadioGroup/style.js +0 -20
  289. package/Form/Select/style.js +0 -27
  290. package/Form/SelectContextChoices/style.js +0 -23
  291. package/Form/TextField/style.js +0 -70
  292. package/FormElement/components/ErrorText/style.js +0 -13
  293. package/FormElement/components/Label/style.js +0 -89
  294. package/FormElement/components/Placeholder/style.js +0 -56
  295. package/FormElement/components/Underline/style.js +0 -60
  296. package/FormElement/style.js +0 -14
  297. package/Glow/style.js +0 -18
  298. package/IndicatorCircle/style.js +0 -65
  299. package/LoadingIndicator/style.js +0 -20
  300. package/Manufacturer/style.js +0 -5
  301. package/MessageBar/spec.js +0 -80
  302. package/MessageBar/style.js +0 -38
  303. package/NoResults/components/Icon/style.js +0 -17
  304. package/NoResults/style.js +0 -31
  305. package/Placeholder/style.js +0 -11
  306. package/PlaceholderLabel/style.js +0 -12
  307. package/Price/style.js +0 -22
  308. package/PriceInfo/style.js +0 -5
  309. package/PriceStriked/style.js +0 -36
  310. package/ProgressBar/style.js +0 -85
  311. package/RadioButton/style.js +0 -21
  312. package/RatingStars/style.js +0 -53
  313. package/Ripple/style.js +0 -18
  314. package/ScannerOverlay/components/CameraOverlay/style.js +0 -40
  315. package/ScannerOverlay/components/ScannerBar/components/FlashlightButton/style.js +0 -28
  316. package/ScannerOverlay/components/ScannerBar/style.js +0 -20
  317. package/Sheet/components/Header/components/SearchBar/style.js +0 -47
  318. package/Sheet/components/Header/style.js +0 -50
  319. package/Sheet/style.js +0 -143
  320. package/TaxDisclaimer/style.js +0 -9
  321. package/TextField/components/ErrorText/style.js +0 -27
  322. package/TextField/components/FormElement/style.js +0 -34
  323. package/TextField/components/Hint/style.js +0 -46
  324. package/TextField/components/Label/style.js +0 -80
  325. package/TextField/components/Underline/style.js +0 -60
  326. package/TextField/style.js +0 -35
@@ -1,19 +1,44 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import Input from '@shopgate/pwa-common/components/Input';
4
- import styles from "./style";
4
+ import { makeStyles } from '@shopgate/engage/styles';
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ const useStyles = makeStyles()({
7
+ input: {
8
+ position: 'relative',
9
+ padding: 0,
10
+ width: '100%',
11
+ marginTop: 24,
12
+ outline: 0,
13
+ fontSize: 16,
14
+ lineHeight: '19px'
15
+ },
16
+ multiLine: {
17
+ position: 'relative',
18
+ marginTop: 24,
19
+ marginBottom: 3,
20
+ padding: 0,
21
+ width: '100%',
22
+ outline: 0,
23
+ height: 19,
24
+ minHeight: 19,
25
+ lineHeight: '19px',
26
+ verticalAlign: 'top'
27
+ }
28
+ });
5
29
 
6
30
  /**
7
31
  * Creates an input or a multiLine based on the type prop.
8
32
  * @param {Object} props The props.
9
33
  * @returns {JSX.Element}
10
34
  */
11
- import { jsx as _jsx } from "react/jsx-runtime";
12
35
  const FormElement = props => {
13
- const styleType = props.multiLine ? 'multiLine' : 'input';
36
+ const {
37
+ classes
38
+ } = useStyles();
14
39
  return /*#__PURE__*/_jsx(Input, {
15
40
  ...props,
16
- className: styles[styleType],
41
+ className: props.multiLine ? classes.multiLine : classes.input,
17
42
  validateOnBlur: true
18
43
  });
19
44
  };
@@ -1,8 +1,30 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import classNames from 'classnames';
4
- import I18n from '@shopgate/pwa-common/components/I18n';
5
- import styles from "./style";
3
+ import { I18n } from '@shopgate/engage/components';
4
+ import { themeConfig } from '@shopgate/pwa-common/helpers/config';
5
+ import { makeStyles } from '@shopgate/engage/styles';
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ const easing = '450ms cubic-bezier(0.23, 1, 0.32, 1)';
8
+ const ellipsisLine = {
9
+ overflow: 'hidden',
10
+ width: '100%',
11
+ whiteSpace: 'nowrap',
12
+ textOverflow: 'ellipsis'
13
+ };
14
+ const useStyles = makeStyles()({
15
+ hint: {
16
+ position: 'absolute',
17
+ pointerEvents: 'none',
18
+ bottom: 12,
19
+ color: themeConfig.colors.shade4,
20
+ willChange: 'transform',
21
+ transition: `opacity ${easing}`,
22
+ ...ellipsisLine
23
+ },
24
+ hintInactive: {
25
+ opacity: 0
26
+ }
27
+ });
6
28
 
7
29
  /**
8
30
  * The form element hint component.
@@ -10,16 +32,23 @@ import styles from "./style";
10
32
  * @param {boolean} visible Sets the hint visibility.
11
33
  * @return {JSX}
12
34
  */
13
- import { jsx as _jsx } from "react/jsx-runtime";
14
35
  const Hint = ({
15
36
  hintText,
16
37
  visible
17
- }) => /*#__PURE__*/_jsx("div", {
18
- className: classNames(styles.hintStyles(visible), 'hint'),
19
- children: /*#__PURE__*/_jsx(I18n.Text, {
20
- string: hintText
21
- })
22
- });
38
+ }) => {
39
+ const {
40
+ classes,
41
+ cx
42
+ } = useStyles();
43
+ return /*#__PURE__*/_jsx("div", {
44
+ className: cx(classes.hint, {
45
+ [classes.hintInactive]: !visible
46
+ }, 'hint'),
47
+ children: /*#__PURE__*/_jsx(I18n.Text, {
48
+ string: hintText
49
+ })
50
+ });
51
+ };
23
52
  Hint.defaultProps = {
24
53
  hintText: '',
25
54
  visible: false
@@ -1,24 +1,61 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import classNames from 'classnames';
4
- import I18n from '@shopgate/pwa-common/components/I18n';
5
- import styles from "./style";
3
+ import { I18n } from '@shopgate/engage/components';
4
+ import { makeStyles } from '@shopgate/engage/styles';
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ const easing = '450ms cubic-bezier(0.23, 1, 0.32, 1)';
7
+ const ellipsisLine = {
8
+ overflow: 'hidden',
9
+ width: '100%',
10
+ whiteSpace: 'nowrap',
11
+ textOverflow: 'ellipsis'
12
+ };
13
+ const useStyles = makeStyles()(theme => ({
14
+ label: {
15
+ position: 'absolute',
16
+ left: 0,
17
+ top: 24,
18
+ lineHeight: '19px',
19
+ pointerEvents: 'none',
20
+ userSelect: 'none',
21
+ color: 'var(--color-text-medium-emphasis)',
22
+ transformOrigin: 'left top 0px',
23
+ willChange: 'transform, color',
24
+ transition: `transform ${easing}, color ${easing}`,
25
+ ...ellipsisLine
26
+ },
27
+ labelFloating: {
28
+ transform: 'translate3d(0, -22px, 0) scale3d(0.75, 0.75, 0.75)'
29
+ },
30
+ labelRegular: {
31
+ color: 'var(--color-text-medium-emphasis)'
32
+ },
33
+ labelError: {
34
+ color: theme.palette.error.main
35
+ }
36
+ }));
6
37
 
7
38
  /**
8
39
  * Renders the label element.
9
40
  * @param {Object} props The component props.
10
41
  * @return {JSX}
11
42
  */
12
- import { jsx as _jsx } from "react/jsx-runtime";
13
43
  const Label = props => {
14
- const labelStyles = styles.labelStyles(props.isFocused, props.isFloating, props.hasErrorMessage);
44
+ const {
45
+ classes,
46
+ cx
47
+ } = useStyles();
15
48
  return (
16
49
  /*#__PURE__*/
17
50
  // eslint-disable-next-line jsx-a11y/label-has-associated-control
18
51
  _jsx("label", {
19
52
  htmlFor: props.name,
20
53
  "aria-hidden": true,
21
- className: classNames(labelStyles, 'label', {
54
+ className: cx(classes.label, {
55
+ [classes.labelFloating]: props.isFloating,
56
+ [classes.labelRegular]: !props.isFocused,
57
+ [classes.labelError]: props.hasErrorMessage && props.isFocused
58
+ }, 'label', {
22
59
  floating: props.isFloating
23
60
  }),
24
61
  children: /*#__PURE__*/_jsx(I18n.Text, {
@@ -1,22 +1,73 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import classNames from 'classnames';
4
- import styles from "./style";
3
+ import color from 'color';
4
+ import { getCSSCustomProp, makeStyles, useTheme } from '@shopgate/engage/styles';
5
+ import { themeConfig } from '@shopgate/pwa-common/helpers/config';
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ const {
8
+ colors
9
+ } = themeConfig;
10
+ const easing = '450ms cubic-bezier(0.23, 1, 0.32, 1)';
11
+ const useStyles = makeStyles()({
12
+ underlineWrapper: {
13
+ position: 'relative',
14
+ width: '100%',
15
+ borderBottom: `1px solid ${colors.shade12}`,
16
+ marginTop: 2,
17
+ marginBottom: 7
18
+ },
19
+ underline: {
20
+ position: 'relative',
21
+ width: '100%',
22
+ top: 1,
23
+ borderBottomWidth: 2,
24
+ borderBottomStyle: 'solid',
25
+ willChange: 'transform',
26
+ transition: `transform ${easing}`
27
+ }
28
+ });
5
29
 
6
30
  /**
7
- * Renders the label element.
8
- * @param {Object} props The component props.
31
+ * Returns the underline inline style.
32
+ * @param {boolean} focused Is focused set or not.
33
+ * @param {boolean} hasError Has error set or not.
34
+ * @param {string} errorColor Theme error main color.
35
+ * @return {Object} style
36
+ */
37
+ const getUnderlineStyle = (focused, hasError, errorColor) => {
38
+ const primaryColor = getCSSCustomProp('--color-primary') || colors.primary;
39
+ let focusColor = '--color-primary';
40
+ if (color(primaryColor).luminosity() >= 0.8) {
41
+ focusColor = '--color-secondary';
42
+ }
43
+ return {
44
+ borderBottomColor: hasError ? errorColor : `var(${focusColor}, ${colors.focus})`,
45
+ ...(!focused && !hasError && {
46
+ transform: 'scale3d(0,1,1)'
47
+ })
48
+ };
49
+ };
50
+
51
+ /**
52
+ * Renders the underline element.
53
+ * @param {Object} props The component props.
9
54
  * @return {JSX}
10
55
  */
11
- import { jsx as _jsx } from "react/jsx-runtime";
12
- const Underline = props => /*#__PURE__*/_jsx("div", {
13
- className: classNames(styles.underlineWrapper, 'underline'),
14
- "aria-hidden": true,
15
- children: /*#__PURE__*/_jsx("div", {
16
- className: styles.underline,
17
- style: styles.underlineStyle(props.isFocused, props.hasErrorMessage)
18
- })
19
- });
56
+ const Underline = props => {
57
+ const theme = useTheme();
58
+ const {
59
+ classes,
60
+ cx
61
+ } = useStyles();
62
+ return /*#__PURE__*/_jsx("div", {
63
+ className: cx(classes.underlineWrapper, 'underline'),
64
+ "aria-hidden": true,
65
+ children: /*#__PURE__*/_jsx("div", {
66
+ className: classes.underline,
67
+ style: getUnderlineStyle(props.isFocused, props.hasErrorMessage, theme.palette.error.main)
68
+ })
69
+ });
70
+ };
20
71
  Underline.defaultProps = {
21
72
  isFocused: false,
22
73
  hasErrorMessage: false
@@ -1,196 +1,182 @@
1
- import _createClass from "@babel/runtime/helpers/createClass";
2
- import _inheritsLoose from "@babel/runtime/helpers/inheritsLoose";
3
- import React, { Component } from 'react';
1
+ import "core-js/modules/es.array.includes.js";
2
+ import React, { useState, useCallback, useMemo, useRef } from 'react';
4
3
  import PropTypes from 'prop-types';
5
- import classNames from 'classnames';
4
+ import { makeStyles } from '@shopgate/engage/styles';
6
5
  import Label from "./components/Label";
7
6
  import Underline from "./components/Underline";
8
7
  import ErrorText from "./components/ErrorText";
9
8
  import Hint from "./components/Hint";
10
- import styles from "./style";
11
9
  import FormElement from "./components/FormElement/index";
10
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
+ const bluredDateSelector = 'input[type="date"]:in-range:not(:focus)';
12
+ const webkitDateFields = ['::-webkit-datetime-edit-year-field', '::-webkit-datetime-edit-month-field', '::-webkit-datetime-edit-day-field', '::-webkit-datetime-edit-text'].map(suffix => `${bluredDateSelector}${suffix}`).join(', ');
13
+ const useStyles = makeStyles()(theme => ({
14
+ input: {
15
+ position: 'relative',
16
+ paddingBottom: theme.spacing(2),
17
+ width: '100%',
18
+ '& input[type="date"]': {
19
+ minHeight: '1.3rem',
20
+ appearance: 'none',
21
+ paddingLeft: 0,
22
+ marginLeft: 0
23
+ },
24
+ [`& ${webkitDateFields}`]: {
25
+ padding: 0,
26
+ color: 'transparent'
27
+ }
28
+ },
29
+ multiLine: {
30
+ position: 'relative',
31
+ width: '100%'
32
+ }
33
+ }));
12
34
 
13
35
  /**
14
36
  * A component that provides a styled text field for user input in material design.
37
+ * @param {Object} props Props.
38
+ * @returns {JSX.Element}
15
39
  */
16
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
17
- let TextField = /*#__PURE__*/function (_Component) {
40
+ const TextField = ({
41
+ name,
42
+ className,
43
+ disabled,
44
+ errorText,
45
+ hintText,
46
+ inputComponent,
47
+ isControlled,
48
+ label,
49
+ multiLine,
50
+ onChange,
51
+ onFocusChange,
52
+ onSanitize,
53
+ onValidate,
54
+ password,
55
+ required,
56
+ setRef,
57
+ showErrorText,
58
+ translateErrorText,
59
+ type,
60
+ value
61
+ }) => {
62
+ const {
63
+ classes,
64
+ cx
65
+ } = useStyles();
66
+ const [isFocused, setIsFocused] = useState(false);
67
+ const [validationError, setValidationError] = useState(null);
18
68
  /**
19
- * Creates a new text field component.
20
- * @param {Object} props The component properties.
69
+ * Mirrors validation errors set during initial validate (Input constructor) without setState,
70
+ * so Underline / ErrorText (rendered after FormElement) still see the message in the same pass.
21
71
  */
22
- function TextField(props) {
23
- var _this;
24
- _this = _Component.call(this, props) || this;
25
- /**
26
- * Internal focus event handler.
27
- * @param {boolean} isFocused Whether the input component is focused.
28
- */
29
- _this.handleFocusChange = isFocused => {
30
- _this.setState({
31
- isFocused
32
- });
33
- _this.props.onFocusChange(isFocused);
34
- };
35
- /**
36
- * Updates the state if the input value has been changed.
37
- * @param {string} value The entered text.
38
- * @param {Object} event The original event object.
39
- */
40
- _this.handleChange = (value, event) => {
41
- _this.props.onChange(value, event);
42
- };
43
- /**
44
- * Updates the validation error text if required.
45
- * @param {string} value The entered text.
46
- * @param {boolean} isInitial Whether this is the initial value of the input field.
47
- * @return {boolean} Whether the validation was successful.
48
- */
49
- _this.handleValidate = (value, isInitial) => {
50
- const validationError = _this.props.onValidate(value);
51
- if (validationError !== true && validationError) {
52
- /**
53
- * An error message was returned by the validation callback. Update the state.
54
- * Because the validation is performed when the component is constructed, we need to make
55
- * sure we're not calling setState() in this situation.
56
- */
57
- if (!isInitial) {
58
- _this.setState({
59
- validationError
60
- });
61
- } else {
62
- _this.state.validationError = validationError;
63
- }
64
- } else if (_this.state.validationError) {
65
- // There was no error, clear the state variable.
66
- _this.setState({
67
- validationError: null
68
- });
69
- }
70
-
71
- // Forward the boolean result to the input field.
72
- return validationError === true;
73
- };
74
- _this.state = {
75
- isFocused: false,
76
- validationError: null
77
- };
78
- return _this;
79
- }
72
+ const syncValidationErrorRef = useRef(null);
80
73
 
81
74
  /**
82
- * @returns {boolean} Whether the text field is currently focused.
75
+ * Internal focus event handler.
76
+ * @param {boolean} focused Whether the input component is focused.
83
77
  */
84
- _inheritsLoose(TextField, _Component);
85
- var _proto = TextField.prototype;
78
+ const handleFocusChange = useCallback(focused => {
79
+ setIsFocused(focused);
80
+ onFocusChange(focused);
81
+ }, [onFocusChange]);
82
+
86
83
  /**
87
- * Renders the text field.
88
- * @return {JSX.Element}
84
+ * Updates the state if the input value has been changed.
85
+ * @param {string} v The entered text.
86
+ * @param {Object} event The original event object.
89
87
  */
90
- _proto.render = function render() {
91
- const styleType = this.props.multiLine ? 'multiLine' : 'input';
92
- const style = styles.container[styleType];
93
- const {
94
- multiLine,
95
- className,
96
- disabled,
97
- hintText,
98
- name,
99
- label,
100
- setRef,
101
- onSanitize,
102
- password,
103
- type,
104
- value,
105
- isControlled,
106
- inputComponent,
107
- showErrorText,
108
- errorText,
109
- translateErrorText,
110
- required
111
- } = this.props;
112
- return /*#__PURE__*/_jsxs("div", {
113
- className: classNames(style, className, 'textField', 'ui-shared__text-field', {
114
- disabled
115
- }),
116
- children: [/*#__PURE__*/_jsx(Hint, {
117
- visible: this.isHintVisible,
118
- hintText: hintText
119
- }), /*#__PURE__*/_jsx(Label, {
120
- name: name,
121
- label: label,
122
- isFocused: this.isFocused,
123
- isFloating: this.isLabelFloating,
124
- hasErrorMessage: this.hasErrorMessage
125
- }), /*#__PURE__*/_jsx(FormElement, {
126
- id: name,
127
- multiLine: multiLine,
128
- name: name,
129
- setRef: setRef,
130
- onFocusChange: this.handleFocusChange,
131
- onChange: this.handleChange,
132
- onSanitize: onSanitize,
133
- onValidate: this.handleValidate,
134
- password: password,
135
- type: type,
136
- value: value,
137
- isControlled: isControlled,
138
- inputComponent: inputComponent,
139
- disabled: disabled,
140
- required: required,
141
- attributes: {
142
- 'aria-invalid': !!errorText,
143
- 'aria-describedby': this.hasErrorMessage ? `ariaError-${name}` : null
144
- }
145
- }), /*#__PURE__*/_jsx(Underline, {
146
- isFocused: this.isFocused,
147
- hasErrorMessage: this.hasErrorMessage
148
- }), showErrorText && /*#__PURE__*/_jsx(ErrorText, {
149
- validationError: this.state.validationError,
150
- errorText: errorText,
151
- translate: translateErrorText,
152
- elementName: name
153
- })]
154
- });
155
- };
156
- return _createClass(TextField, [{
157
- key: "isFocused",
158
- get: function () {
159
- return this.state.isFocused;
160
- }
88
+ const handleChange = useCallback((v, event) => {
89
+ onChange(v, event);
90
+ }, [onChange]);
161
91
 
162
- /**
163
- * @returns {boolean} Whether the label is currently floating.
164
- */
165
- }, {
166
- key: "isLabelFloating",
167
- get: function () {
168
- // On Firefox empty date inputs always show a placeholder with date pattern
169
- if (navigator.userAgent.includes('Firefox') && this.props.type === 'date') {
170
- return true;
92
+ /**
93
+ * Updates the validation error text if required.
94
+ * @param {string} enteredValue The entered text.
95
+ * @param {boolean} isInitial Whether this is the initial value of the input field.
96
+ * @returns {boolean} Whether the validation was successful.
97
+ */
98
+ const handleValidate = useCallback((enteredValue, isInitial) => {
99
+ const validationErr = onValidate(enteredValue);
100
+ if (validationErr !== true && validationErr) {
101
+ syncValidationErrorRef.current = validationErr;
102
+ /**
103
+ * An error message was returned by the validation callback. Update the state.
104
+ * Because the validation is performed when the component is constructed, we need to make
105
+ * sure we're not calling setState() in this situation.
106
+ */
107
+ if (!isInitial) {
108
+ setValidationError(validationErr);
171
109
  }
172
- return this.isFocused || !!this.props.value;
173
- }
174
-
175
- /**
176
- * @returns {boolean} Whether the hint text is currently visible.
177
- */
178
- }, {
179
- key: "isHintVisible",
180
- get: function () {
181
- return this.isFocused && !this.props.value;
110
+ } else {
111
+ // There was no error, clear the state variable.
112
+ setValidationError(prev => {
113
+ const hadSyncError = syncValidationErrorRef.current !== null;
114
+ if (prev !== null || hadSyncError) {
115
+ syncValidationErrorRef.current = null;
116
+ return null;
117
+ }
118
+ return prev;
119
+ });
182
120
  }
183
121
 
184
- /**
185
- * @return {boolean} Whether the error message is set.
186
- */
187
- }, {
188
- key: "hasErrorMessage",
189
- get: function () {
190
- return !!(this.state.validationError || this.props.errorText);
122
+ // Forward the boolean result to the input field.
123
+ return validationErr === true;
124
+ }, [onValidate]);
125
+ const isLabelFloating = useMemo(() => {
126
+ // On Firefox empty date inputs always show a placeholder with date pattern
127
+ if (typeof navigator !== 'undefined' && navigator.userAgent.includes('Firefox') && type === 'date') {
128
+ return true;
191
129
  }
192
- }]);
193
- }(Component);
130
+ return isFocused || !!value;
131
+ }, [isFocused, value, type]);
132
+ const isHintVisible = isFocused && !value;
133
+ const displayValidationError = validationError || syncValidationErrorRef.current;
134
+ const hasErrorMessage = !!(displayValidationError || errorText);
135
+ const containerClass = multiLine ? classes.multiLine : classes.input;
136
+ return /*#__PURE__*/_jsxs("div", {
137
+ className: cx(containerClass, className, 'textField', 'ui-shared__text-field', {
138
+ disabled
139
+ }),
140
+ children: [/*#__PURE__*/_jsx(Hint, {
141
+ visible: isHintVisible,
142
+ hintText: hintText
143
+ }), /*#__PURE__*/_jsx(Label, {
144
+ name: name,
145
+ label: label,
146
+ isFocused: isFocused,
147
+ isFloating: isLabelFloating,
148
+ hasErrorMessage: hasErrorMessage
149
+ }), /*#__PURE__*/_jsx(FormElement, {
150
+ id: name,
151
+ multiLine: multiLine,
152
+ name: name,
153
+ setRef: setRef,
154
+ onFocusChange: handleFocusChange,
155
+ onChange: handleChange,
156
+ onSanitize: onSanitize,
157
+ onValidate: handleValidate,
158
+ password: password,
159
+ type: type,
160
+ value: value,
161
+ isControlled: isControlled,
162
+ inputComponent: inputComponent,
163
+ disabled: disabled,
164
+ required: required,
165
+ attributes: {
166
+ 'aria-invalid': !!errorText,
167
+ 'aria-describedby': hasErrorMessage ? `ariaError-${name}` : null
168
+ }
169
+ }), /*#__PURE__*/_jsx(Underline, {
170
+ isFocused: isFocused,
171
+ hasErrorMessage: hasErrorMessage
172
+ }), showErrorText && /*#__PURE__*/_jsx(ErrorText, {
173
+ validationError: displayValidationError,
174
+ errorText: errorText,
175
+ translate: translateErrorText,
176
+ elementName: name
177
+ })]
178
+ });
179
+ };
194
180
  TextField.defaultProps = {
195
181
  className: '',
196
182
  errorText: '',
package/TextField/spec.js CHANGED
@@ -87,11 +87,13 @@ describe('<TextField />', () => {
87
87
  }));
88
88
  const input = wrapper.find('input');
89
89
  expect(wrapper).toMatchSnapshot();
90
- expect(wrapper.instance().isFocused).toBe(false);
90
+ expect(onFocusMock).toHaveBeenCalledTimes(0);
91
91
  input.simulate('focus');
92
- expect(wrapper.instance().isFocused).toBe(true);
92
+ expect(onFocusMock).toHaveBeenCalledTimes(1);
93
+ expect(onFocusMock).toHaveBeenCalledWith(true);
93
94
  input.simulate('blur');
94
- expect(wrapper.instance().isFocused).toBe(false);
95
+ expect(onFocusMock).toHaveBeenCalledTimes(2);
96
+ expect(onFocusMock).toHaveBeenCalledWith(false);
95
97
  });
96
98
  it('should show the error message', () => {
97
99
  const errorText = 'This is an error here';
@@ -0,0 +1,7 @@
1
+ import type { IconProps } from '@shopgate/pwa-common/components/Icon';
2
+ /**
3
+ * The account box icon component.
4
+ */
5
+ declare const AccountBox: (props: Omit<IconProps, "content">) => import("react/jsx-runtime").JSX.Element;
6
+ export default AccountBox;
7
+ //# sourceMappingURL=AccountBoxIcon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccountBoxIcon.d.ts","sourceRoot":"","sources":["../../icons/AccountBoxIcon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAItE;;GAEG;AACH,QAAA,MAAM,UAAU,GAAI,OAAO,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,4CACQ,CAAC;AAE9D,eAAe,UAAU,CAAC"}
@@ -1,11 +1,8 @@
1
- import React from 'react';
2
1
  import Icon from '@shopgate/pwa-common/components/Icon';
3
2
  import { themeConfig } from '@shopgate/pwa-common/helpers/config';
4
3
 
5
4
  /**
6
- * The description icon component.
7
- * @param {Object} props The icon component properties.
8
- * @returns {JSX}
5
+ * The account box icon component.
9
6
  */
10
7
  import { jsx as _jsx } from "react/jsx-runtime";
11
8
  const AccountBox = props => /*#__PURE__*/_jsx(Icon, {
@@ -0,0 +1,7 @@
1
+ import type { IconProps } from '@shopgate/pwa-common/components/Icon';
2
+ /**
3
+ * The add more icon component.
4
+ */
5
+ declare const AddMore: (props: Omit<IconProps, "content">) => import("react/jsx-runtime").JSX.Element;
6
+ export default AddMore;
7
+ //# sourceMappingURL=AddMoreIcon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddMoreIcon.d.ts","sourceRoot":"","sources":["../../icons/AddMoreIcon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAItE;;GAEG;AACH,QAAA,MAAM,OAAO,GAAI,OAAO,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,4CACQ,CAAC;AAE3D,eAAe,OAAO,CAAC"}