@telefonica/mistica 10.19.0 → 10.22.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 (62) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/button-layout.js +30 -17
  3. package/dist/button.js +24 -8
  4. package/dist/card.js +25 -28
  5. package/dist/chip.d.ts +9 -0
  6. package/dist/chip.js +111 -0
  7. package/dist/chip.js.flow +11 -0
  8. package/dist/form.js +1 -1
  9. package/dist/header.d.ts +2 -0
  10. package/dist/header.js.flow +5 -0
  11. package/dist/index.d.ts +2 -0
  12. package/dist/index.js +7 -0
  13. package/dist/index.js.flow +2 -0
  14. package/dist/package-version.js +1 -1
  15. package/dist/skins/blau.d.ts +6 -3
  16. package/dist/skins/blau.js +34 -5
  17. package/dist/skins/blau.js.flow +6 -3
  18. package/dist/skins/movistar.d.ts +21 -11
  19. package/dist/skins/movistar.js +76 -40
  20. package/dist/skins/movistar.js.flow +21 -11
  21. package/dist/skins/o2-classic.d.ts +21 -9
  22. package/dist/skins/o2-classic.js +64 -26
  23. package/dist/skins/o2-classic.js.flow +21 -9
  24. package/dist/skins/o2.d.ts +19 -17
  25. package/dist/skins/o2.js +68 -40
  26. package/dist/skins/o2.js.flow +19 -17
  27. package/dist/skins/telefonica.d.ts +18 -13
  28. package/dist/skins/telefonica.js +76 -45
  29. package/dist/skins/telefonica.js.flow +18 -13
  30. package/dist/skins/types.d.ts +12 -0
  31. package/dist/skins/types.js.flow +12 -0
  32. package/dist/skins/vivo.d.ts +9 -4
  33. package/dist/skins/vivo.js +37 -6
  34. package/dist/skins/vivo.js.flow +9 -4
  35. package/dist/tag.d.ts +6 -1
  36. package/dist/tag.js +133 -24
  37. package/dist/tag.js.flow +15 -1
  38. package/dist/text.d.ts +4 -0
  39. package/dist/text.js +13 -6
  40. package/dist/text.js.flow +10 -0
  41. package/dist/theme-context-provider.js +8 -2
  42. package/dist/theme.d.ts +2 -0
  43. package/dist/theme.js.flow +2 -0
  44. package/dist/touchable.js +3 -2
  45. package/dist-es/button-layout.js +30 -17
  46. package/dist-es/button.js +24 -8
  47. package/dist-es/card.js +26 -29
  48. package/dist-es/chip.js +100 -0
  49. package/dist-es/form.js +1 -1
  50. package/dist-es/index.js +1 -0
  51. package/dist-es/package-version.js +1 -1
  52. package/dist-es/skins/blau.js +36 -5
  53. package/dist-es/skins/movistar.js +78 -40
  54. package/dist-es/skins/o2-classic.js +66 -26
  55. package/dist-es/skins/o2.js +70 -40
  56. package/dist-es/skins/telefonica.js +78 -45
  57. package/dist-es/skins/vivo.js +39 -6
  58. package/dist-es/tag.js +130 -26
  59. package/dist-es/text.js +13 -6
  60. package/dist-es/theme-context-provider.js +8 -2
  61. package/dist-es/touchable.js +3 -2
  62. package/package.json +1 -1
@@ -14,16 +14,21 @@ var palette = {
14
14
  vivoPurpleLight20: '#E0CCEB',
15
15
  vivoPurpleLight10: '#EFE5F4',
16
16
  vivoGreen: '#99CC33',
17
- vivoGreenDark: '#33A14A',
18
- vivoGreenLight40: '#D6EAAD',
17
+ vivoGreenDark: '#225C3D',
18
+ vivoGreenLight30: '#91AE9E',
19
+ vivoGreenLight10: '#EDF8E8',
19
20
  vivoBlue: '#00ABDB',
20
21
  orange: '#FF9900',
21
- orangeDark: '#FA6324',
22
- orangeLight: '#FFD699',
22
+ orangeDark: '#972A1D',
23
+ orangeLight10: '#FFEFE1',
24
+ orangeLight40: '#FFB84C',
23
25
  pink: '#EB3D7D',
24
26
  pepper: '#CC1F59',
25
27
  pepperDark: '#B71D63',
28
+ pepperDark80: '#8F2052',
29
+ pepperLight40: '#DB628B',
26
30
  pepperLight30: '#F7B1CB',
31
+ pepperLight10: '#FCE4EF',
27
32
  grey1: '#F6F6F6',
28
33
  grey2: '#EEEEEE',
29
34
  grey3: '#DDDDDD',
@@ -127,7 +132,20 @@ var getVivoSkin = function getVivoSkin() {
127
132
  textNavigationSearchBarHint: palette.vivoPurpleLight50,
128
133
  textNavigationSearchBarText: palette.white,
129
134
  textAppBar: palette.grey4,
130
- textAppBarSelected: palette.vivoPurple
135
+ textAppBarSelected: palette.vivoPurple,
136
+ // TAGS
137
+ tagBackgroundSuccess: palette.vivoGreenLight10,
138
+ tagBackgroundWarning: palette.orangeLight10,
139
+ tagBackgroundError: palette.pepperLight10,
140
+ tagBackgroundPromo: palette.vivoPurpleLight10,
141
+ tagBackgroundActive: palette.vivoPurpleLight10,
142
+ tagBackgroundInactive: palette.grey1,
143
+ textTagSuccess: palette.vivoGreenDark,
144
+ textTagWarning: palette.orangeDark,
145
+ textTagError: palette.pepperDark80,
146
+ textTagPromo: palette.vivoPurple,
147
+ textTagActive: palette.vivoPurple,
148
+ textTagInactive: palette.grey5
131
149
  },
132
150
  darkModeColors: {
133
151
  appBarBackground: palette.darkModeGrey,
@@ -195,7 +213,20 @@ var getVivoSkin = function getVivoSkin() {
195
213
  textNavigationSearchBarHint: palette.grey4,
196
214
  textNavigationSearchBarText: palette.grey2,
197
215
  textAppBar: palette.grey5,
198
- textAppBarSelected: palette.grey2
216
+ textAppBarSelected: palette.grey2,
217
+ // TAGS
218
+ tagBackgroundSuccess: (0, _color).applyAlpha(palette.white, 0.05),
219
+ tagBackgroundWarning: (0, _color).applyAlpha(palette.white, 0.05),
220
+ tagBackgroundError: (0, _color).applyAlpha(palette.white, 0.05),
221
+ tagBackgroundPromo: (0, _color).applyAlpha(palette.white, 0.05),
222
+ tagBackgroundActive: (0, _color).applyAlpha(palette.white, 0.05),
223
+ tagBackgroundInactive: (0, _color).applyAlpha(palette.white, 0.05),
224
+ textTagSuccess: palette.vivoGreenLight30,
225
+ textTagWarning: palette.orangeLight40,
226
+ textTagError: palette.pepperLight40,
227
+ textTagPromo: palette.vivoPurpleLight50,
228
+ textTagActive: palette.vivoPurpleLight50,
229
+ textTagInactive: palette.grey4
199
230
  }
200
231
  };
201
232
  };
@@ -10,16 +10,21 @@ declare export var palette: {
10
10
  +vivoPurpleLight20: "#E0CCEB",
11
11
  +vivoPurpleLight10: "#EFE5F4",
12
12
  +vivoGreen: "#99CC33",
13
- +vivoGreenDark: "#33A14A",
14
- +vivoGreenLight40: "#D6EAAD",
13
+ +vivoGreenDark: "#225C3D",
14
+ +vivoGreenLight30: "#91AE9E",
15
+ +vivoGreenLight10: "#EDF8E8",
15
16
  +vivoBlue: "#00ABDB",
16
17
  +orange: "#FF9900",
17
- +orangeDark: "#FA6324",
18
- +orangeLight: "#FFD699",
18
+ +orangeDark: "#972A1D",
19
+ +orangeLight10: "#FFEFE1",
20
+ +orangeLight40: "#FFB84C",
19
21
  +pink: "#EB3D7D",
20
22
  +pepper: "#CC1F59",
21
23
  +pepperDark: "#B71D63",
24
+ +pepperDark80: "#8F2052",
25
+ +pepperLight40: "#DB628B",
22
26
  +pepperLight30: "#F7B1CB",
27
+ +pepperLight10: "#FCE4EF",
23
28
  +grey1: "#F6F6F6",
24
29
  +grey2: "#EEEEEE",
25
30
  +grey3: "#DDDDDD",
package/dist/tag.d.ts CHANGED
@@ -1,7 +1,12 @@
1
1
  import * as React from 'react';
2
+ import type { IconProps } from './utils/types';
3
+ export declare type TagType = 'promo' | 'active' | 'inactive' | 'success' | 'warning' | 'error';
2
4
  export declare type TagProps = {
5
+ type?: 'promo' | 'active' | 'inactive' | 'success' | 'warning' | 'error';
3
6
  children: string;
4
- color: string;
7
+ Icon?: React.FC<IconProps>;
8
+ /** @deprecated use type prop */
9
+ color?: string;
5
10
  };
6
11
  declare const Tag: React.FC<TagProps>;
7
12
  export default Tag;
package/dist/tag.js CHANGED
@@ -4,48 +4,157 @@ Object.defineProperty(exports, "__esModule", {
4
4
  });
5
5
  exports.default = void 0;
6
6
  var _jsxRuntime = require("react/jsx-runtime");
7
+ var _box = _interopRequireDefault(require("./box"));
7
8
  var _hooks = require("./hooks");
8
9
  var _jss = require("./jss");
9
10
  var _text = require("./text");
10
11
  var _themeVariantContext = require("./theme-variant-context");
12
+ var _css = require("./utils/css");
13
+ function _interopRequireDefault(obj) {
14
+ return obj && obj.__esModule ? obj : {
15
+ default: obj
16
+ };
17
+ }
18
+ function _arrayWithHoles(arr) {
19
+ if (Array.isArray(arr)) return arr;
20
+ }
21
+ function _iterableToArrayLimit(arr, i) {
22
+ var _arr = [];
23
+ var _n = true;
24
+ var _d = false;
25
+ var _e = undefined;
26
+ try {
27
+ for(var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true){
28
+ _arr.push(_s.value);
29
+ if (i && _arr.length === i) break;
30
+ }
31
+ } catch (err) {
32
+ _d = true;
33
+ _e = err;
34
+ } finally{
35
+ try {
36
+ if (!_n && _i["return"] != null) _i["return"]();
37
+ } finally{
38
+ if (_d) throw _e;
39
+ }
40
+ }
41
+ return _arr;
42
+ }
43
+ function _nonIterableRest() {
44
+ throw new TypeError("Invalid attempt to destructure non-iterable instance");
45
+ }
46
+ function _slicedToArray(arr, i) {
47
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
48
+ }
11
49
  var useStyles = (0, _jss).createUseStyles(function() {
12
50
  return {
13
51
  tag: {
14
- backgroundColor: function backgroundColor(param) {
15
- var color = param.color;
16
- return color;
17
- },
18
- padding: '2px 8px',
19
- borderRadius: 2,
20
- minWidth: 48,
21
52
  display: 'inline-flex',
53
+ flexDirection: 'row',
22
54
  alignItems: 'center',
23
- justifyContent: 'center'
55
+ borderRadius: 50,
56
+ justifyContent: 'center',
57
+ minWidth: 56,
58
+ padding: function padding(param) {
59
+ var hasIcon = param.hasIcon;
60
+ return "4px 12px 4px ".concat(hasIcon ? 8 : 12, "px");
61
+ },
62
+ // FIXME: remove this style and use an inline style for the icon once WEB-338 gets merged
63
+ '& svg': {
64
+ display: 'block'
65
+ }
24
66
  }
25
67
  };
26
68
  });
27
69
  var Tag = function Tag(param) {
28
- var children = param.children, color = param.color;
70
+ var Icon = param.Icon, children = param.children, _type = param.type, type = _type === void 0 ? 'promo' : _type, color = param.color;
29
71
  var classes = useStyles({
30
- color: color
72
+ hasIcon: !!Icon
31
73
  });
32
74
  var ref = (0, _hooks).useTheme(), colors = ref.colors, isDarkMode = ref.isDarkMode;
33
- // Hardcode black text in darkmode because there isn't a black text color constant that we can use in dark mode
34
- var blackText = isDarkMode ? '#313235' : colors.textPrimary;
35
- var textColor = color === colors.inverse ? blackText : colors.textPrimaryInverse;
36
- return(/*#__PURE__*/ (0, _jsxRuntime).jsx("span", {
37
- className: classes.tag,
38
- children: /*#__PURE__*/ (0, _jsxRuntime).jsx(_themeVariantContext.ThemeVariant, {
75
+ var isInverse = (0, _themeVariantContext).useIsInverseVariant();
76
+ if (!children) {
77
+ return null;
78
+ }
79
+ /**
80
+ * Legacy implementation
81
+ *
82
+ * @deprecated to be removed in the next major version
83
+ */ if (color) {
84
+ // Hardcode black text in darkmode because there isn't a black text color constant that we can use in dark mode
85
+ var blackText = isDarkMode ? '#313235' : colors.textPrimary;
86
+ var textColor = color === colors.inverse ? blackText : colors.textPrimaryInverse;
87
+ return(/*#__PURE__*/ (0, _jsxRuntime).jsx(_themeVariantContext.ThemeVariant, {
39
88
  isInverse: false,
40
- children: /*#__PURE__*/ (0, _jsxRuntime).jsx(_text.Text, {
41
- color: textColor,
42
- size: 12,
43
- lineHeight: 16,
44
- weight: "regular",
45
- uppercase: true,
46
- children: children
89
+ children: /*#__PURE__*/ (0, _jsxRuntime).jsx("span", {
90
+ className: classes.tag,
91
+ style: {
92
+ background: color
93
+ },
94
+ children: /*#__PURE__*/ (0, _jsxRuntime).jsx(_text.Text, {
95
+ color: textColor,
96
+ size: 14,
97
+ lineHeight: 20,
98
+ weight: "medium",
99
+ truncate: true,
100
+ children: children
101
+ })
102
+ })
103
+ }));
104
+ }
105
+ var tagTypeToColors = {
106
+ promo: [
107
+ colors.textTagPromo,
108
+ colors.tagBackgroundPromo
109
+ ],
110
+ active: [
111
+ colors.textTagActive,
112
+ colors.tagBackgroundActive
113
+ ],
114
+ inactive: [
115
+ colors.textTagInactive,
116
+ colors.tagBackgroundInactive
117
+ ],
118
+ success: [
119
+ colors.textTagSuccess,
120
+ colors.tagBackgroundSuccess
121
+ ],
122
+ warning: [
123
+ colors.textTagWarning,
124
+ colors.tagBackgroundWarning
125
+ ],
126
+ error: [
127
+ colors.textTagError,
128
+ colors.tagBackgroundError
129
+ ]
130
+ };
131
+ var _type1 = _slicedToArray(tagTypeToColors[type], 2), textColor = _type1[0], backgroundColor = _type1[1];
132
+ var shouldUseInverseBackground = isInverse && !isDarkMode;
133
+ return(/*#__PURE__*/ (0, _jsxRuntime).jsxs("span", {
134
+ className: classes.tag,
135
+ style: {
136
+ background: shouldUseInverseBackground ? colors.inverse : backgroundColor
137
+ },
138
+ children: [
139
+ Icon && /*#__PURE__*/ (0, _jsxRuntime).jsx(_box.default, {
140
+ paddingRight: 4,
141
+ children: /*#__PURE__*/ (0, _jsxRuntime).jsx(Icon, {
142
+ color: textColor,
143
+ size: (0, _css).pxToRem(16)
144
+ })
145
+ }),
146
+ /*#__PURE__*/ (0, _jsxRuntime).jsx(_themeVariantContext.ThemeVariant, {
147
+ isInverse: false,
148
+ children: /*#__PURE__*/ (0, _jsxRuntime).jsx(_text.Text, {
149
+ color: textColor,
150
+ size: 14,
151
+ lineHeight: 20,
152
+ weight: "medium",
153
+ truncate: true,
154
+ children: children
155
+ })
47
156
  })
48
- })
157
+ ]
49
158
  }));
50
159
  };
51
160
  var _default = Tag;
package/dist/tag.js.flow CHANGED
@@ -1,9 +1,23 @@
1
1
  // @flow
2
2
 
3
3
  import * as React from "react";
4
+ import type { IconProps } from "./utils/types";
5
+ export type TagType =
6
+ | "promo"
7
+ | "active"
8
+ | "inactive"
9
+ | "success"
10
+ | "warning"
11
+ | "error";
4
12
  export type TagProps = {
13
+ type?: "promo" | "active" | "inactive" | "success" | "warning" | "error",
5
14
  children: string,
6
- color: string,
15
+ Icon?: React.ComponentType<IconProps>,
16
+
17
+ /**
18
+ * @deprecated use type prop
19
+ */
20
+ color?: string,
7
21
  };
8
22
  declare var Tag: React.ComponentType<TagProps>;
9
23
  declare export default typeof Tag;
package/dist/text.d.ts CHANGED
@@ -2,9 +2,13 @@ import * as React from 'react';
2
2
  declare type FontWeight = 'light' | 'regular' | 'medium';
3
3
  export interface TextPresetProps {
4
4
  color?: string;
5
+ /** @deprecated use decoration prop */
5
6
  textDecoration?: 'underline' | 'line-through' | 'none';
7
+ decoration?: 'underline' | 'line-through' | 'inherit' | 'none';
8
+ transform?: 'uppercase' | 'capitalize' | 'lowercase' | 'inherit' | 'none';
6
9
  children?: React.ReactNode;
7
10
  truncate?: boolean | number;
11
+ /** @deprecated use transform */
8
12
  uppercase?: boolean;
9
13
  wordBreak?: boolean;
10
14
  id?: string;
package/dist/text.js CHANGED
@@ -86,7 +86,7 @@ var useStyles = (0, _jss).createUseStyles(function(theme) {
86
86
  }
87
87
  return 'initial';
88
88
  };
89
- var _color, _textDecoration;
89
+ var _color, _decoration;
90
90
  return {
91
91
  text: _defineProperty({
92
92
  lineHeight: function lineHeight(param) {
@@ -94,8 +94,14 @@ var useStyles = (0, _jss).createUseStyles(function(theme) {
94
94
  return (0, _css).pxToRem(desktopLineHeight);
95
95
  },
96
96
  textTransform: function textTransform(param) {
97
- var uppercase = param.uppercase;
98
- return uppercase ? 'uppercase' : 'inherit';
97
+ var uppercase = param.uppercase, transform = param.transform;
98
+ if (uppercase) {
99
+ return 'uppercase';
100
+ }
101
+ if (transform) {
102
+ return transform;
103
+ }
104
+ return 'inherit';
99
105
  },
100
106
  fontSize: function fontSize(param) {
101
107
  var desktopSize = param.desktopSize;
@@ -110,7 +116,7 @@ var useStyles = (0, _jss).createUseStyles(function(theme) {
110
116
  return isInverse ? (_color = inverseColorsMap[color1]) !== null && _color !== void 0 ? _color : color1 : color1;
111
117
  },
112
118
  textDecoration: function textDecoration(p) {
113
- return (_textDecoration = p.textDecoration) !== null && _textDecoration !== void 0 ? _textDecoration : 'inherit';
119
+ return (_decoration = p.decoration) !== null && _decoration !== void 0 ? _decoration : 'inherit';
114
120
  },
115
121
  letterSpacing: function letterSpacing(param) {
116
122
  var letterSpacing1 = param.letterSpacing;
@@ -146,7 +152,7 @@ var useStyles = (0, _jss).createUseStyles(function(theme) {
146
152
  };
147
153
  });
148
154
  var Text = function Text(param) {
149
- var weight = param.weight, color = param.color, textDecoration = param.textDecoration, truncate = param.truncate, uppercase = param.uppercase, wordBreak = param.wordBreak, _as = param.as, as = _as === void 0 ? 'span' : _as, children = param.children, size = param.size, _mobileSize = param.mobileSize, mobileSize = _mobileSize === void 0 ? size : _mobileSize, _desktopSize = param.desktopSize, desktopSize = _desktopSize === void 0 ? size : _desktopSize, lineHeight = param.lineHeight, _mobileLineHeight = param.mobileLineHeight, mobileLineHeight = _mobileLineHeight === void 0 ? lineHeight : _mobileLineHeight, _desktopLineHeight = param.desktopLineHeight, desktopLineHeight = _desktopLineHeight === void 0 ? lineHeight : _desktopLineHeight, letterSpacing = param.letterSpacing, id = param.id, role = param.role, ariaLevel = param['aria-level'];
155
+ var weight = param.weight, color = param.color, textDecoration = param.textDecoration, _decoration = param.decoration, decoration = _decoration === void 0 ? textDecoration : _decoration, truncate = param.truncate, uppercase = param.uppercase, transform = param.transform, wordBreak = param.wordBreak, _as = param.as, as = _as === void 0 ? 'span' : _as, children = param.children, size = param.size, _mobileSize = param.mobileSize, mobileSize = _mobileSize === void 0 ? size : _mobileSize, _desktopSize = param.desktopSize, desktopSize = _desktopSize === void 0 ? size : _desktopSize, lineHeight = param.lineHeight, _mobileLineHeight = param.mobileLineHeight, mobileLineHeight = _mobileLineHeight === void 0 ? lineHeight : _mobileLineHeight, _desktopLineHeight = param.desktopLineHeight, desktopLineHeight = _desktopLineHeight === void 0 ? lineHeight : _desktopLineHeight, letterSpacing = param.letterSpacing, id = param.id, role = param.role, ariaLevel = param['aria-level'];
150
156
  var isInverse = (0, _themeVariantContext).useIsInverseVariant();
151
157
  var classes = useStyles({
152
158
  isInverse: isInverse,
@@ -156,8 +162,9 @@ var Text = function Text(param) {
156
162
  desktopLineHeight: desktopLineHeight,
157
163
  weight: weight,
158
164
  color: color,
159
- textDecoration: textDecoration,
165
+ decoration: decoration,
160
166
  uppercase: uppercase,
167
+ transform: transform,
161
168
  wordBreak: wordBreak,
162
169
  letterSpacing: letterSpacing,
163
170
  truncate: truncate
package/dist/text.js.flow CHANGED
@@ -4,9 +4,19 @@ import * as React from "react";
4
4
  declare type FontWeight = "light" | "regular" | "medium";
5
5
  export type TextPresetProps = {
6
6
  color?: string,
7
+
8
+ /**
9
+ * @deprecated use decoration prop
10
+ */
7
11
  textDecoration?: "underline" | "line-through" | "none",
12
+ decoration?: "underline" | "line-through" | "inherit" | "none",
13
+ transform?: "uppercase" | "capitalize" | "lowercase" | "inherit" | "none",
8
14
  children?: React.Node,
9
15
  truncate?: boolean | number,
16
+
17
+ /**
18
+ * @deprecated use transform
19
+ */
10
20
  uppercase?: boolean,
11
21
  wordBreak?: boolean,
12
22
  id?: string,
@@ -148,6 +148,11 @@ var generateId = function() {
148
148
  // in frontend, use the same generator for all JssProvider renders, this way we avoid classname collisions
149
149
  return (0, _jss).createGenerateId();
150
150
  }();
151
+ var useDefaultHrefDecorator = function useDefaultHrefDecorator() {
152
+ return function(href) {
153
+ return href;
154
+ };
155
+ };
151
156
  var ThemeContextProvider = function ThemeContextProvider(param) {
152
157
  var theme = param.theme, children = param.children;
153
158
  var classNamePrefix = React.useMemo(// we'll have missmatches when rendering client side. The disadvantage of this is that we can only have one instance of
@@ -173,7 +178,7 @@ var ThemeContextProvider = function ThemeContextProvider(param) {
173
178
  platform: (0, _platform).getPlatform(),
174
179
  insideNovumNativeApp: (0, _platform).isInsideNovumNativeApp()
175
180
  }, theme.platformOverrides);
176
- var _mediaQueries1, _Link;
181
+ var _mediaQueries1, _Link, _useHrefDecorator;
177
182
  return {
178
183
  skinName: theme.skin.name,
179
184
  i18n: theme.i18n,
@@ -191,7 +196,8 @@ var ThemeContextProvider = function ThemeContextProvider(param) {
191
196
  colors: colors,
192
197
  Link: (_Link = theme.Link) !== null && _Link !== void 0 ? _Link : _theme.AnchorLink,
193
198
  isDarkMode: isDarkModeEnabled,
194
- isIos: (0, _platform).getPlatform(platformOverrides) === 'ios'
199
+ isIos: (0, _platform).getPlatform(platformOverrides) === 'ios',
200
+ useHrefDecorator: (_useHrefDecorator = theme.useHrefDecorator) !== null && _useHrefDecorator !== void 0 ? _useHrefDecorator : useDefaultHrefDecorator
195
201
  };
196
202
  }, [
197
203
  theme,
package/dist/theme.d.ts CHANGED
@@ -98,6 +98,7 @@ export declare type ThemeConfig = {
98
98
  desktopOrTabletMinHeight: number;
99
99
  };
100
100
  Link?: LinkComponent;
101
+ useHrefDecorator?: () => (href: string) => string;
101
102
  enableTabFocus?: boolean;
102
103
  };
103
104
  export declare type Theme = {
@@ -132,5 +133,6 @@ export declare type Theme = {
132
133
  Link: LinkComponent;
133
134
  isDarkMode: boolean;
134
135
  isIos: boolean;
136
+ useHrefDecorator: () => (href: string) => string;
135
137
  };
136
138
  export {};
@@ -102,6 +102,7 @@ export type ThemeConfig = {
102
102
  desktopOrTabletMinHeight: number,
103
103
  },
104
104
  Link?: LinkComponent,
105
+ useHrefDecorator?: () => (href: string) => string,
105
106
  enableTabFocus?: boolean,
106
107
  };
107
108
  export type Theme = {
@@ -136,6 +137,7 @@ export type Theme = {
136
137
  Link: LinkComponent,
137
138
  isDarkMode: boolean,
138
139
  isIos: boolean,
140
+ useHrefDecorator: () => (href: string) => string,
139
141
  };
140
142
  declare export {};
141
143
 
package/dist/touchable.js CHANGED
@@ -114,7 +114,8 @@ var useStyles = (0, _jss).createUseStyles(function() {
114
114
  };
115
115
  });
116
116
  var Touchable = /*#__PURE__*/ React.forwardRef(function(props, ref) {
117
- var ref1 = (0, _hooks).useTheme(), texts = ref1.texts, analytics = ref1.analytics, platformOverrides = ref1.platformOverrides, Link = ref1.Link;
117
+ var ref1 = (0, _hooks).useTheme(), texts = ref1.texts, analytics = ref1.analytics, platformOverrides = ref1.platformOverrides, Link = ref1.Link, useHrefDecorator = ref1.useHrefDecorator;
118
+ var hrefDecorator = useHrefDecorator();
118
119
  var classes = useStyles();
119
120
  var isClicked = React.useRef(false);
120
121
  var trackingEvents = [];
@@ -150,7 +151,7 @@ var Touchable = /*#__PURE__*/ React.forwardRef(function(props, ref) {
150
151
  };
151
152
  var getHref = function getHref() {
152
153
  if (props.href) {
153
- return props.href;
154
+ return hrefDecorator(props.href);
154
155
  }
155
156
  if (props.to && props.fullPageOnWebView) {
156
157
  if (typeof props.to === 'string') {
@@ -4,6 +4,7 @@ import { createUseStyles } from './jss';
4
4
  import { useScreenSize, useIsomorphicLayoutEffect } from './hooks';
5
5
  import { BUTTON_MIN_WIDTH, ButtonPrimary, ButtonSecondary, ButtonDanger } from './button';
6
6
  import classNames from 'classnames';
7
+ import debounce from 'lodash/debounce';
7
8
  function _arrayWithHoles(arr) {
8
9
  if (Array.isArray(arr)) return arr;
9
10
  }
@@ -174,28 +175,29 @@ var buttonsRange = [
174
175
  var ButtonLayout = function(param) {
175
176
  var children = param.children, _align = param.align, align = _align === void 0 ? 'full-width' : _align, link = param.link, _withMargins = param.withMargins, withMargins = _withMargins === void 0 ? false : _withMargins;
176
177
  var ref = useScreenSize(), isTabletOrSmaller = ref.isTabletOrSmaller;
177
- var ref1 = _slicedToArray(React.useState(true), 2), isMeasuring = ref1[0], setIsMeasuring = ref1[1];
178
178
  var childrenCount = React.Children.count(children);
179
- var ref2 = _slicedToArray(React.useState(0), 2), buttonWidth = ref2[0], setButtonWidth = ref2[1];
180
- var updateButtonWidth = function(buttonWidth) {
179
+ var ref1 = _slicedToArray(React.useState({
180
+ isMeasuring: true,
181
+ buttonWidth: 0
182
+ }), 2), buttonStatus = ref1[0], setButtonStatus = ref1[1];
183
+ var updateButtonStatus = function(param) {
184
+ var isMeasuring = param.isMeasuring, buttonWidth = param.buttonWidth;
181
185
  if (process.env.NODE_ENV !== 'test') {
182
- setButtonWidth(buttonWidth);
183
- }
184
- };
185
- var updateIsMeasuring = function(isMeasuring) {
186
- if (process.env.NODE_ENV !== 'test') {
187
- setIsMeasuring(isMeasuring);
186
+ setButtonStatus({
187
+ isMeasuring: isMeasuring,
188
+ buttonWidth: buttonWidth
189
+ });
188
190
  }
189
191
  };
190
192
  var classes = useStyles({
191
- buttonWidth: buttonWidth,
193
+ buttonWidth: buttonStatus.buttonWidth,
192
194
  isTabletOrSmaller: isTabletOrSmaller,
193
195
  align: align,
194
196
  childrenCount: childrenCount
195
197
  });
196
198
  var wrapperElRef = React.useRef(null);
197
199
  useIsomorphicLayoutEffect(function() {
198
- if (isMeasuring) {
200
+ if (buttonStatus.isMeasuring) {
199
201
  var req = window.requestAnimationFrame(function() {
200
202
  if (wrapperElRef.current) {
201
203
  var childrenWidths = Array.from(wrapperElRef.current.children).map(function(el) {
@@ -210,8 +212,10 @@ var ButtonLayout = function(param) {
210
212
  var maxChildWidth = Math.ceil((_Math = Math).max.apply(_Math, _toConsumableArray(childrenWidths).concat([
211
213
  BUTTON_MIN_WIDTH
212
214
  ])));
213
- updateButtonWidth(maxChildWidth);
214
- updateIsMeasuring(false);
215
+ updateButtonStatus({
216
+ isMeasuring: false,
217
+ buttonWidth: maxChildWidth
218
+ });
215
219
  }
216
220
  });
217
221
  return function() {
@@ -222,11 +226,20 @@ var ButtonLayout = function(param) {
222
226
  };
223
227
  }, [
224
228
  classes.link,
225
- isMeasuring
229
+ buttonStatus
226
230
  ]);
227
- var calcLayout = React.useCallback(function() {
228
- updateButtonWidth(0);
229
- updateIsMeasuring(true);
231
+ /**
232
+ * Multiple calls to calcLayout are debounced to workaround an issue that can be reproduced in chrome when pressing
233
+ * the button during a focus/visibility change. For example, pressing the button having the focus on the devTools.
234
+ */ var calcLayout = React.useMemo(function() {
235
+ return debounce(function() {
236
+ updateButtonStatus({
237
+ isMeasuring: true,
238
+ buttonWidth: 0
239
+ });
240
+ }, 5, {
241
+ maxWait: 50
242
+ });
230
243
  }, []);
231
244
  useOnChildrenChangeEffect(wrapperElRef.current, calcLayout);
232
245
  useOnFontsReadyEffect(calcLayout);
package/dist-es/button.js CHANGED
@@ -361,6 +361,11 @@ var Button = function(props) {
361
361
  disabled: props.disabled || showSpinner || isFormSending,
362
362
  role: 'button'
363
363
  };
364
+ if (process.env.NODE_ENV !== 'production') {
365
+ if (props.to === '' || props.href === '') {
366
+ throw Error('to or href props are empty strings');
367
+ }
368
+ }
364
369
  if (props.fake) {
365
370
  return(/*#__PURE__*/ _jsx(Touchable, _objectSpread({
366
371
  maybe: true
@@ -384,22 +389,25 @@ var Button = function(props) {
384
389
  onPress: props.onPress
385
390
  })));
386
391
  }
387
- if (props.to) {
392
+ if (props.to || props.to === '') {
388
393
  return(/*#__PURE__*/ _jsx(Touchable, _objectSpread({
389
394
  }, commonProps, {
390
395
  to: props.to,
391
396
  fullPageOnWebView: props.fullPageOnWebView
392
397
  })));
393
398
  }
394
- if (props.href) {
399
+ if (props.href || props.href === '') {
395
400
  return(/*#__PURE__*/ _jsx(Touchable, _objectSpread({
396
401
  }, commonProps, {
397
402
  href: props.href,
398
403
  newTab: props.newTab
399
404
  })));
400
405
  }
401
- // this cannot happen
402
- throw Error('Bad button props');
406
+ if (process.env.NODE_ENV !== 'production') {
407
+ // this cannot happen
408
+ throw Error('Bad button props');
409
+ }
410
+ return null;
403
411
  };
404
412
  var useButtonLinkStyles = createUseStyles(function(theme) {
405
413
  var padding = 6;
@@ -456,6 +464,11 @@ export var ButtonLink = /*#__PURE__*/ React.forwardRef(function(props, ref) {
456
464
  children: props.children
457
465
  })
458
466
  };
467
+ if (process.env.NODE_ENV !== 'production') {
468
+ if (props.to === '' || props.href === '') {
469
+ throw Error('to or href props are empty strings');
470
+ }
471
+ }
459
472
  if (props.onPress) {
460
473
  return(/*#__PURE__*/ _jsx(Touchable, _objectSpread({
461
474
  ref: ref
@@ -463,7 +476,7 @@ export var ButtonLink = /*#__PURE__*/ React.forwardRef(function(props, ref) {
463
476
  onPress: props.onPress
464
477
  })));
465
478
  }
466
- if (props.to) {
479
+ if (props.to || props.to === '') {
467
480
  return(/*#__PURE__*/ _jsx(Touchable, _objectSpread({
468
481
  ref: ref
469
482
  }, commonProps, {
@@ -471,7 +484,7 @@ export var ButtonLink = /*#__PURE__*/ React.forwardRef(function(props, ref) {
471
484
  fullPageOnWebView: props.fullPageOnWebView
472
485
  })));
473
486
  }
474
- if (props.href) {
487
+ if (props.href || props.href === '') {
475
488
  return(/*#__PURE__*/ _jsx(Touchable, _objectSpread({
476
489
  ref: ref
477
490
  }, commonProps, {
@@ -479,8 +492,11 @@ export var ButtonLink = /*#__PURE__*/ React.forwardRef(function(props, ref) {
479
492
  newTab: props.newTab
480
493
  })));
481
494
  }
482
- // this cannot happen
483
- throw Error('Bad button props');
495
+ if (process.env.NODE_ENV !== 'production') {
496
+ // this cannot happen
497
+ throw Error('Bad button props');
498
+ }
499
+ return null;
484
500
  });
485
501
  export var ButtonPrimary = function(props) {
486
502
  var classes = usePrimaryButtonStyles();