@telefonica/mistica 11.10.1 → 11.11.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.
@@ -9,12 +9,10 @@ var _jss = require("./jss");
9
9
  var _themeVariantContext = require("./theme-variant-context");
10
10
  var _box = _interopRequireDefault(require("./box"));
11
11
  var _touchable = _interopRequireDefault(require("./touchable"));
12
- var _iconCloseRegular = _interopRequireDefault(require("./generated/mistica-icons/icon-close-regular"));
13
- var _color = require("./utils/color");
14
12
  var _hooks = require("./hooks");
15
13
  var _text = require("./text");
16
- var _iconButton = _interopRequireDefault(require("./icon-button"));
17
14
  var _boxed = require("./boxed");
15
+ var _maybeDismissable = _interopRequireWildcard(require("./maybe-dismissable"));
18
16
  function _interopRequireDefault(obj) {
19
17
  return obj && obj.__esModule ? obj : {
20
18
  default: obj
@@ -117,35 +115,6 @@ var useStyles = (0, _jss).createUseStyles(function(theme) {
117
115
  minWidth: 100,
118
116
  height: "inherit"
119
117
  },
120
- dismissableContainer: {
121
- position: "relative",
122
- display: "flex",
123
- flexShrink: 0,
124
- width: function width(param) {
125
- var width2 = param.width;
126
- return width2 || "100%";
127
- }
128
- },
129
- dismissableButton: {
130
- position: "absolute",
131
- top: 0,
132
- right: 0,
133
- width: 48,
134
- height: 48,
135
- display: "flex",
136
- alignItems: "center",
137
- justifyContent: "center"
138
- },
139
- dismissableCircleContainer: {
140
- display: "flex",
141
- alignItems: "center",
142
- justifyContent: "center",
143
- width: 24,
144
- height: 24,
145
- margin: "0 0 8px 8px",
146
- borderRadius: "50%",
147
- backgroundColor: (0, _color).applyAlpha(theme.colors.background, 0.7)
148
- },
149
118
  textContainer: (_obj = {
150
119
  paddingLeft: 16,
151
120
  paddingTop: 24,
@@ -165,43 +134,12 @@ var useStyles = (0, _jss).createUseStyles(function(theme) {
165
134
  display: "flex",
166
135
  flexShrink: 0,
167
136
  width: function width(param) {
168
- var width3 = param.width;
169
- return width3 || "100%";
137
+ var width2 = param.width;
138
+ return width2 || "100%";
170
139
  }
171
140
  }
172
141
  };
173
142
  });
174
- var Dismissable = function Dismissable(param) {
175
- var children = param.children, width = param.width, _onClose = param.onClose, onClose = _onClose === void 0 ? function onClose() {} : _onClose;
176
- var isInverse = (0, _themeVariantContext).useIsInverseVariant();
177
- var classes = useStyles({
178
- isInverse: isInverse,
179
- width: width
180
- });
181
- var ref = (0, _hooks).useTheme(), colors = ref.colors, texts = ref.texts;
182
- return /*#__PURE__*/ (0, _jsxRuntime).jsxs("section", {
183
- className: classes.dismissableContainer,
184
- children: [
185
- children,
186
- /*#__PURE__*/ (0, _jsxRuntime).jsx(_iconButton.default, {
187
- className: classes.dismissableButton,
188
- onPress: onClose,
189
- "aria-label": texts.closeButtonLabel,
190
- style: {
191
- display: "flex",
192
- width: 48,
193
- height: 48
194
- },
195
- children: /*#__PURE__*/ (0, _jsxRuntime).jsx("div", {
196
- className: classes.dismissableCircleContainer,
197
- children: /*#__PURE__*/ (0, _jsxRuntime).jsx(_iconCloseRegular.default, {
198
- color: colors.neutralHigh
199
- })
200
- })
201
- })
202
- ]
203
- });
204
- };
205
143
  var Content = function Content(props) {
206
144
  var title = props.title, description = props.description, imageUrl = props.imageUrl, imageFit = props.imageFit;
207
145
  var isInverseOutside = (0, _themeVariantContext).useIsInverseVariant();
@@ -213,18 +151,24 @@ var Content = function Content(props) {
213
151
  width: props.width
214
152
  });
215
153
  var theme = (0, _hooks).useTheme();
154
+ var isDismissable = (0, _maybeDismissable).useIsDismissable();
216
155
  var content = /*#__PURE__*/ (0, _jsxRuntime).jsxs(_boxed.Boxed, {
217
156
  isInverse: isInverse,
218
157
  className: classes.container,
158
+ dataAttributes: props.dataAttributes,
219
159
  children: [
220
160
  /*#__PURE__*/ (0, _jsxRuntime).jsxs("div", {
221
161
  // don't create another region when the Content is inside a Dismissable wrapper
222
- role: props["aria-label"] ? "region" : undefined,
162
+ role: !isDismissable ? "region" : undefined,
223
163
  className: classes.textContainer,
224
- "aria-label": props["aria-label"],
164
+ // aria-label is already in Dismisable wrapper
165
+ "aria-label": !isDismissable ? props["aria-label"] : undefined,
225
166
  children: [
226
167
  /*#__PURE__*/ (0, _jsxRuntime).jsx(_text.Text4, {
168
+ as: "h1",
227
169
  regular: true,
170
+ wordBreak: true,
171
+ truncate: props.titleLinesMax,
228
172
  children: title
229
173
  }),
230
174
  /*#__PURE__*/ (0, _jsxRuntime).jsx(_box.default, {
@@ -232,6 +176,9 @@ var Content = function Content(props) {
232
176
  children: /*#__PURE__*/ (0, _jsxRuntime).jsx(_text.Text2, {
233
177
  regular: true,
234
178
  color: theme.colors.textSecondary,
179
+ wordBreak: true,
180
+ truncate: props.descriptionLinesMax,
181
+ as: "p",
235
182
  children: description
236
183
  })
237
184
  }),
@@ -294,14 +241,14 @@ var HighlightedCard = function HighlightedCard(_param) {
294
241
  "aria-label"
295
242
  ]);
296
243
  var label = ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : props.title;
297
- return props.onClose ? /*#__PURE__*/ (0, _jsxRuntime).jsx(Dismissable, {
244
+ return /*#__PURE__*/ (0, _jsxRuntime).jsx(_maybeDismissable.default, {
298
245
  onClose: props.onClose,
299
246
  "aria-label": label,
300
247
  width: props.width,
301
- children: /*#__PURE__*/ (0, _jsxRuntime).jsx(Content, _objectSpread({}, props))
302
- }) : /*#__PURE__*/ (0, _jsxRuntime).jsx(Content, _objectSpread({}, props, {
303
- "aria-label": label
304
- }));
248
+ children: /*#__PURE__*/ (0, _jsxRuntime).jsx(Content, _objectSpread({}, props, {
249
+ "aria-label": label
250
+ }))
251
+ });
305
252
  };
306
253
  var _default = HighlightedCard;
307
254
  exports.default = _default;
@@ -2,19 +2,25 @@
2
2
 
3
3
  import * as React from "react";
4
4
  import { ButtonLink } from "./button";
5
- import type { RendersNullableElement, TrackingEvent } from "./utils/types";
5
+ import type {
6
+ DataAttributes,
7
+ RendersNullableElement,
8
+ TrackingEvent,
9
+ } from "./utils/types";
6
10
  import type { NullableButtonElement } from "./button";
7
11
  declare type CommonProps = {
8
12
  title: string,
13
+ titleLinesMax?: number,
9
14
  description: string,
15
+ descriptionLinesMax?: number,
10
16
  imageUrl?: string,
11
17
  imageFit?: "fit" | "fill",
12
- backgroundImageUrl?: string,
13
18
  onClose?: () => void,
14
19
  trackingEvent?: TrackingEvent | $ReadOnlyArray<TrackingEvent>,
15
20
  isInverse?: boolean,
16
21
  "aria-label"?: string,
17
22
  width?: string | number,
23
+ dataAttributes?: DataAttributes,
18
24
  };
19
25
  declare type BasicProps = { ...$Exact<CommonProps> };
20
26
  declare type ButtonProps = {
package/dist/index.d.ts CHANGED
@@ -49,7 +49,7 @@ export { default as Inline } from './inline';
49
49
  export { default as HighlightedCard } from './highlighted-card';
50
50
  export { default as Stepper } from './stepper';
51
51
  export { default as ProgressBar } from './progress-bar';
52
- export { MediaCard, DataCard } from './card';
52
+ export { MediaCard, DataCard, SnapCard } from './card';
53
53
  export { default as Divider } from './divider';
54
54
  export { default as Menu } from './menu';
55
55
  export { default as EmptyState } from './empty-state';
package/dist/index.js CHANGED
@@ -488,6 +488,12 @@ Object.defineProperty(exports, "DataCard", {
488
488
  return _card.DataCard;
489
489
  }
490
490
  });
491
+ Object.defineProperty(exports, "SnapCard", {
492
+ enumerable: true,
493
+ get: function() {
494
+ return _card.SnapCard;
495
+ }
496
+ });
491
497
  Object.defineProperty(exports, "Divider", {
492
498
  enumerable: true,
493
499
  get: function() {
@@ -85,7 +85,7 @@ declare export { default as Inline } from "./inline";
85
85
  declare export { default as HighlightedCard } from "./highlighted-card";
86
86
  declare export { default as Stepper } from "./stepper";
87
87
  declare export { default as ProgressBar } from "./progress-bar";
88
- declare export { MediaCard, DataCard } from "./card";
88
+ declare export { MediaCard, DataCard, SnapCard } from "./card";
89
89
  declare export { default as Divider } from "./divider";
90
90
  declare export { default as Menu } from "./menu";
91
91
  declare export { default as EmptyState } from "./empty-state";
@@ -0,0 +1,10 @@
1
+ import * as React from 'react';
2
+ export declare const useIsDismissable: () => boolean;
3
+ declare type MaybeDismissableProps = {
4
+ children: React.ReactNode;
5
+ onClose?: () => void;
6
+ width?: string | number;
7
+ 'aria-label'?: string;
8
+ };
9
+ declare const MaybeDismissable: ({ children, width, onClose, "aria-label": ariaLabel, }: MaybeDismissableProps) => JSX.Element;
10
+ export default MaybeDismissable;
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ exports.default = exports.useIsDismissable = void 0;
6
+ var _jsxRuntime = require("react/jsx-runtime");
7
+ var React = _interopRequireWildcard(require("react"));
8
+ var _jss = require("./jss");
9
+ var _iconCloseRegular = _interopRequireDefault(require("./generated/mistica-icons/icon-close-regular"));
10
+ var _hooks = require("./hooks");
11
+ var _iconButton = _interopRequireDefault(require("./icon-button"));
12
+ var _themeVariantContext = require("./theme-variant-context");
13
+ var _color = require("./utils/color");
14
+ function _interopRequireDefault(obj) {
15
+ return obj && obj.__esModule ? obj : {
16
+ default: obj
17
+ };
18
+ }
19
+ function _interopRequireWildcard(obj) {
20
+ if (obj && obj.__esModule) {
21
+ return obj;
22
+ } else {
23
+ var newObj = {};
24
+ if (obj != null) {
25
+ for(var key in obj){
26
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
27
+ var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
28
+ if (desc.get || desc.set) {
29
+ Object.defineProperty(newObj, key, desc);
30
+ } else {
31
+ newObj[key] = obj[key];
32
+ }
33
+ }
34
+ }
35
+ }
36
+ newObj.default = obj;
37
+ return newObj;
38
+ }
39
+ }
40
+ var DismissableContext = /*#__PURE__*/ React.createContext(false);
41
+ var useIsDismissable = function useIsDismissable() {
42
+ return React.useContext(DismissableContext);
43
+ };
44
+ exports.useIsDismissable = useIsDismissable;
45
+ var useStyles = (0, _jss).createUseStyles(function(theme) {
46
+ return {
47
+ dismissableContainer: {
48
+ position: "relative",
49
+ display: "flex",
50
+ flexShrink: 0,
51
+ width: function width(param) {
52
+ var width1 = param.width;
53
+ return width1 || "100%";
54
+ }
55
+ },
56
+ dismissableButton: {
57
+ position: "absolute",
58
+ top: 0,
59
+ right: 0,
60
+ width: 48,
61
+ height: 48,
62
+ display: "flex",
63
+ alignItems: "center",
64
+ justifyContent: "center"
65
+ },
66
+ dismissableCircleContainer: {
67
+ display: "flex",
68
+ alignItems: "center",
69
+ justifyContent: "center",
70
+ width: 24,
71
+ height: 24,
72
+ margin: "0 0 8px 8px",
73
+ borderRadius: "50%",
74
+ backgroundColor: (0, _color).applyAlpha(theme.colors.background, 0.7)
75
+ }
76
+ };
77
+ });
78
+ var MaybeDismissable = function MaybeDismissable(param) {
79
+ var children = param.children, width = param.width, onClose = param.onClose, ariaLabel = param["aria-label"];
80
+ var isInverse = (0, _themeVariantContext).useIsInverseVariant();
81
+ var classes = useStyles({
82
+ isInverse: isInverse,
83
+ width: width
84
+ });
85
+ var ref = (0, _hooks).useTheme(), colors = ref.colors, texts = ref.texts;
86
+ if (!onClose) {
87
+ return /*#__PURE__*/ (0, _jsxRuntime).jsx(_jsxRuntime.Fragment, {
88
+ children: children
89
+ });
90
+ }
91
+ return /*#__PURE__*/ (0, _jsxRuntime).jsxs("section", {
92
+ className: classes.dismissableContainer,
93
+ "aria-label": ariaLabel,
94
+ children: [
95
+ /*#__PURE__*/ (0, _jsxRuntime).jsx(DismissableContext.Provider, {
96
+ value: true,
97
+ children: children
98
+ }),
99
+ /*#__PURE__*/ (0, _jsxRuntime).jsx(_iconButton.default, {
100
+ className: classes.dismissableButton,
101
+ onPress: onClose,
102
+ "aria-label": texts.closeButtonLabel,
103
+ style: {
104
+ display: "flex",
105
+ width: 48,
106
+ height: 48
107
+ },
108
+ children: /*#__PURE__*/ (0, _jsxRuntime).jsx("div", {
109
+ className: classes.dismissableCircleContainer,
110
+ children: /*#__PURE__*/ (0, _jsxRuntime).jsx(_iconCloseRegular.default, {
111
+ color: colors.neutralHigh
112
+ })
113
+ })
114
+ })
115
+ ]
116
+ });
117
+ };
118
+ var _default = MaybeDismissable;
119
+ exports.default = _default;
@@ -0,0 +1,12 @@
1
+ // @flow
2
+
3
+ import * as React from "react";
4
+ declare export var useIsDismissable: () => boolean;
5
+ declare type MaybeDismissableProps = {
6
+ children: React.Node,
7
+ onClose?: () => void,
8
+ width?: string | number,
9
+ "aria-label"?: string,
10
+ };
11
+ declare var MaybeDismissable: (x: MaybeDismissableProps) => React.Node;
12
+ declare export default typeof MaybeDismissable;
@@ -3,5 +3,5 @@ Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
5
  exports.PACKAGE_VERSION = void 0;
6
- var PACKAGE_VERSION = "11.10.1";
6
+ var PACKAGE_VERSION = "11.11.1";
7
7
  exports.PACKAGE_VERSION = PACKAGE_VERSION;
package/dist/select.js CHANGED
@@ -232,7 +232,7 @@ var useStyles = (0, _jss).createUseStyles(function(theme) {
232
232
  },
233
233
  menuItem: (_obj1 = {
234
234
  color: theme.colors.textPrimary,
235
- padding: "6px 16px",
235
+ padding: "8px 16px",
236
236
  height: 48,
237
237
  transition: "background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms"
238
238
  }, _defineProperty(_obj1, theme.mq.supportsHover, {
package/dist/text.js CHANGED
@@ -120,7 +120,7 @@ var useStyles = (0, _jss).createUseStyles(function(theme) {
120
120
  "@supports not (overflow-wrap: anywhere)": {
121
121
  wordBreak: function wordBreak(param) {
122
122
  var wordBreak1 = param.wordBreak;
123
- return wordBreak1 ? "break-all" : "normal";
123
+ return wordBreak1 ? "break-all" : "inherit";
124
124
  }
125
125
  },
126
126
  // Needed to reset the default browser margin that adds to p, h1, h2... elements.
@@ -148,7 +148,7 @@ var useStyles = (0, _jss).createUseStyles(function(theme) {
148
148
  return truncate === 1 || truncate === true ? "break-all" : "normal";
149
149
  }
150
150
  },
151
- display: "box",
151
+ display: "-webkit-box",
152
152
  boxOrient: "vertical",
153
153
  overflow: "hidden"
154
154
  }
package/dist/theme.d.ts CHANGED
@@ -3,6 +3,7 @@ import type { RegionCode } from './utils/region-code';
3
3
  import type { Locale } from './utils/locale';
4
4
  import type { Skin, Colors, SkinName } from './skins/types';
5
5
  import type { TrackingEvent } from './utils/types';
6
+ import type { MediaQueries } from './utils/media-queries';
6
7
  export declare type ThemeTexts = typeof TEXTS_ES;
7
8
  declare const TEXTS_ES: {
8
9
  expirationDatePlaceholder: string;
@@ -124,16 +125,7 @@ export declare type Theme = {
124
125
  dimensions: {
125
126
  headerMobileHeight: number;
126
127
  };
127
- mq: {
128
- mobile: string;
129
- tablet: string;
130
- desktop: string;
131
- largeDesktop: string;
132
- tabletOrBigger: string;
133
- tabletOrSmaller: string;
134
- desktopOrBigger: string;
135
- supportsHover: string;
136
- };
128
+ mq: MediaQueries;
137
129
  colors: Colors;
138
130
  Link: LinkComponent;
139
131
  isDarkMode: boolean;
@@ -5,6 +5,7 @@ import type { RegionCode } from "./utils/region-code";
5
5
  import type { Locale } from "./utils/locale";
6
6
  import type { Skin, Colors, SkinName } from "./skins/types";
7
7
  import type { TrackingEvent } from "./utils/types";
8
+ import type { MediaQueries } from "./utils/media-queries";
8
9
  export type ThemeTexts = typeof TEXTS_ES;
9
10
  declare var TEXTS_ES: {
10
11
  expirationDatePlaceholder: string,
@@ -128,16 +129,7 @@ export type Theme = {
128
129
  dimensions: {
129
130
  headerMobileHeight: number,
130
131
  },
131
- mq: {
132
- mobile: string,
133
- tablet: string,
134
- desktop: string,
135
- largeDesktop: string,
136
- tabletOrBigger: string,
137
- tabletOrSmaller: string,
138
- desktopOrBigger: string,
139
- supportsHover: string,
140
- },
132
+ mq: MediaQueries,
141
133
  colors: Colors,
142
134
  Link: LinkComponent,
143
135
  isDarkMode: boolean,
@@ -1,9 +1,4 @@
1
- export declare const createMediaQueries: ({ desktopOrTabletMinHeight, tabletMinWidth, desktopMinWidth, largeDesktopMinWidth, }: {
2
- tabletMinWidth: number;
3
- desktopMinWidth: number;
4
- largeDesktopMinWidth: number;
5
- desktopOrTabletMinHeight: number;
6
- }) => {
1
+ export declare type MediaQueries = Readonly<{
7
2
  mobile: string;
8
3
  tablet: string;
9
4
  desktop: string;
@@ -12,4 +7,11 @@ export declare const createMediaQueries: ({ desktopOrTabletMinHeight, tabletMinW
12
7
  tabletOrSmaller: string;
13
8
  desktopOrBigger: string;
14
9
  supportsHover: string;
15
- };
10
+ touchableOnly: string;
11
+ }>;
12
+ export declare const createMediaQueries: ({ desktopOrTabletMinHeight, tabletMinWidth, desktopMinWidth, largeDesktopMinWidth, }: {
13
+ tabletMinWidth: number;
14
+ desktopMinWidth: number;
15
+ largeDesktopMinWidth: number;
16
+ desktopOrTabletMinHeight: number;
17
+ }) => MediaQueries;
@@ -17,7 +17,11 @@ var createMediaQueries = function createMediaQueries(param) {
17
17
  // Also enabled for (pointer: none) for acceptance tests, where (pointer: fine) doesn't match.
18
18
  // WARNING: you may be tempted to use @media (hover: hover) instead, but that doesn't work as expected in some android browsers.
19
19
  // See: https://hover-pointer-media-query.glitch.me/ and https://github.com/mui-org/material-ui/issues/15736
20
- supportsHover: "@media (pointer: fine), (pointer: none)"
20
+ supportsHover: "@media (pointer: fine), (pointer: none)",
21
+ /**
22
+ * Scopes the styles to touchable devices.
23
+ * See: https://stackoverflow.com/questions/12469875/how-to-code-css-media-queries-targeting-all-mobile-devices-and-tablets/42835826#42835826
24
+ */ touchableOnly: "@media (pointer: coarse), @media (hover: none)"
21
25
  };
22
26
  };
23
27
  exports.createMediaQueries = createMediaQueries;
@@ -1,11 +1,6 @@
1
1
  // @flow
2
2
 
3
- declare export var createMediaQueries: (x: {
4
- tabletMinWidth: number,
5
- desktopMinWidth: number,
6
- largeDesktopMinWidth: number,
7
- desktopOrTabletMinHeight: number,
8
- }) => {
3
+ export type MediaQueries = $ReadOnly<{
9
4
  mobile: string,
10
5
  tablet: string,
11
6
  desktop: string,
@@ -14,4 +9,11 @@ declare export var createMediaQueries: (x: {
14
9
  tabletOrSmaller: string,
15
10
  desktopOrBigger: string,
16
11
  supportsHover: string,
17
- };
12
+ touchableOnly: string,
13
+ }>;
14
+ declare export var createMediaQueries: (x: {
15
+ tabletMinWidth: number,
16
+ desktopMinWidth: number,
17
+ largeDesktopMinWidth: number,
18
+ desktopOrTabletMinHeight: number,
19
+ }) => MediaQueries;
@@ -3,8 +3,15 @@ export declare const isInsideNovumNativeApp: (platformOverrides?: Theme['platfor
3
3
  export declare const isRunningAcceptanceTest: (platformOverrides?: Theme['platformOverrides']) => boolean;
4
4
  export declare const isAndroid: (platformOverrides: Theme['platformOverrides']) => boolean;
5
5
  export declare const isIos: (platformOverrides: Theme['platformOverrides']) => boolean;
6
+ /**
7
+ * Returns true if the browser is a safari browser:
8
+ * webview, mobile, desktop or a browser like Chrome for iOS which is just a safari with a skin
9
+ *
10
+ * Note that this function checks the navigator vendor. It doesn't use platformOverrides or userAgent.
11
+ */
12
+ export declare const isSafari: () => boolean;
6
13
  export declare const isFirefox: (platformOverrides?: {
7
- platform?: "ios" | "android" | "desktop" | undefined;
14
+ platform?: "desktop" | "ios" | "android" | undefined;
8
15
  insideNovumNativeApp?: boolean | undefined;
9
16
  userAgent?: string | undefined;
10
17
  } | undefined) => boolean;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- exports.getPlatform = exports.getIosVersion = exports.isOldChrome = exports.isChrome = exports.isFirefox = exports.isIos = exports.isAndroid = exports.isRunningAcceptanceTest = exports.isInsideNovumNativeApp = void 0;
5
+ exports.getPlatform = exports.getIosVersion = exports.isOldChrome = exports.isChrome = exports.isFirefox = exports.isSafari = exports.isIos = exports.isAndroid = exports.isRunningAcceptanceTest = exports.isInsideNovumNativeApp = void 0;
6
6
  var _webviewBridge = require("@tef-novum/webview-bridge");
7
7
  function _arrayLikeToArray(arr, len) {
8
8
  if (len == null || len > arr.length) len = arr.length;
@@ -91,6 +91,10 @@ var isIos = function isIos(platformOverrides) {
91
91
  return false;
92
92
  };
93
93
  exports.isIos = isIos;
94
+ var isSafari = function isSafari() {
95
+ return navigator.vendor.includes("Apple");
96
+ };
97
+ exports.isSafari = isSafari;
94
98
  var isFirefox = function isFirefox(platformOverrides) {
95
99
  return !!getUserAgent(platformOverrides).match(/Firefox\/([0-9]+)\./);
96
100
  };
@@ -13,9 +13,16 @@ declare export var isAndroid: (
13
13
  declare export var isIos: (
14
14
  platformOverrides: $PropertyType<Theme, "platformOverrides">
15
15
  ) => boolean;
16
+ /**
17
+ * Returns true if the browser is a safari browser:
18
+ * webview, mobile, desktop or a browser like Chrome for iOS which is just a safari with a skin
19
+ *
20
+ * Note that this function checks the navigator vendor. It doesn't use platformOverrides or userAgent.
21
+ */
22
+ declare export var isSafari: () => boolean;
16
23
  declare export var isFirefox: (
17
24
  platformOverrides?: {
18
- platform?: "ios" | "android" | "desktop" | void,
25
+ platform?: "desktop" | "ios" | "android" | void,
19
26
  insideNovumNativeApp?: boolean | void,
20
27
  userAgent?: string | void,
21
28
  } | void
package/dist/video.js CHANGED
@@ -10,6 +10,7 @@ var _jss = require("./jss");
10
10
  var _aspectRatioSupport = require("./utils/aspect-ratio-support");
11
11
  var _common = require("./utils/common");
12
12
  var _dom = require("./utils/dom");
13
+ var _platform = require("./utils/platform");
13
14
  function _interopRequireWildcard(obj) {
14
15
  if (obj && obj.__esModule) {
15
16
  return obj;
@@ -97,6 +98,7 @@ exports.RATIO = RATIO;
97
98
  var useStyles = (0, _jss).createUseStyles(function() {
98
99
  return {
99
100
  video: {
101
+ background: "transparent",
100
102
  display: "block",
101
103
  objectFit: "cover",
102
104
  maxWidth: "100%",
@@ -198,7 +200,11 @@ var Video = /*#__PURE__*/ React.forwardRef(function(_param, ref) {
198
200
  } else {
199
201
  width = props.width || "100%";
200
202
  }
201
- var needsWrapper = withCssAspectRatio && !supportsAspectRatio;
203
+ /**
204
+ * In safari, when using a video with poster, the transition from pause to play does a flicker,
205
+ * To avoid this, in Safari browsers, instead of using the poster attribute, we use a
206
+ * wrapper with the poster as background image
207
+ */ var needsWrapper = (0, _platform).isSafari() || withCssAspectRatio && !supportsAspectRatio;
202
208
  var video1 = /*#__PURE__*/ (0, _jsxRuntime).jsx("video", _objectSpread({
203
209
  ref: (0, _common).combineRefs(ref, videoRef),
204
210
  playsInline: true,
@@ -207,14 +213,14 @@ var Video = /*#__PURE__*/ React.forwardRef(function(_param, ref) {
207
213
  autoPlay: autoPlay,
208
214
  muted: muted,
209
215
  loop: loop
210
- }, !needsWrapper ? {
216
+ }, needsWrapper ? {} : {
211
217
  width: width,
212
218
  height: height
213
- } : {}, {
219
+ }, {
214
220
  className: classes.video,
215
221
  preload: preload,
216
222
  // This transparent pixel fallback avoids showing the ugly "play" image in android webviews
217
- poster: poster || TRANSPARENT_PIXEL
223
+ poster: needsWrapper ? TRANSPARENT_PIXEL : poster || TRANSPARENT_PIXEL
218
224
  }, (0, _dom).getPrefixedDataAttributes(dataAttributes), {
219
225
  children: sources.map(function(param, index) {
220
226
  var src = param.src, type = param.type;
@@ -228,7 +234,10 @@ var Video = /*#__PURE__*/ React.forwardRef(function(_param, ref) {
228
234
  return /*#__PURE__*/ (0, _jsxRuntime).jsx("div", {
229
235
  style: {
230
236
  width: width,
231
- height: height
237
+ height: height,
238
+ backgroundImage: poster ? 'url("'.concat(poster, '")') : undefined,
239
+ backgroundSize: "cover",
240
+ backgroundPosition: "50% 50%"
232
241
  },
233
242
  className: classes.wrapper,
234
243
  children: video1