@telus-uds/components-base 3.3.0 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CHANGELOG.md +28 -2
  2. package/lib/cjs/ActivityIndicator/Dots.js +165 -0
  3. package/lib/cjs/ActivityIndicator/Dots.native.js +221 -0
  4. package/lib/cjs/ActivityIndicator/Spinner.js +57 -50
  5. package/lib/cjs/ActivityIndicator/Spinner.native.js +90 -108
  6. package/lib/cjs/ActivityIndicator/index.js +12 -1
  7. package/lib/cjs/ActivityIndicator/shared.js +53 -6
  8. package/lib/cjs/Button/ButtonBase.js +1 -1
  9. package/lib/cjs/Button/ButtonLink.js +1 -0
  10. package/lib/cjs/Carousel/Carousel.js +18 -7
  11. package/lib/cjs/ExpandCollapse/ExpandCollapse.js +3 -1
  12. package/lib/cjs/ExpandCollapseMini/ExpandCollapseMini.js +10 -1
  13. package/lib/cjs/FileUpload/FileUpload.js +31 -2
  14. package/lib/cjs/Link/Link.js +8 -1
  15. package/lib/cjs/Link/LinkBase.js +2 -0
  16. package/lib/cjs/MultiSelectFilter/MultiSelectFilter.js +3 -2
  17. package/lib/cjs/utils/containUniqueFields.js +5 -5
  18. package/lib/cjs/utils/useUniqueId.js +2 -6
  19. package/lib/esm/ActivityIndicator/Dots.js +158 -0
  20. package/lib/esm/ActivityIndicator/Dots.native.js +212 -0
  21. package/lib/esm/ActivityIndicator/Spinner.js +58 -51
  22. package/lib/esm/ActivityIndicator/Spinner.native.js +90 -110
  23. package/lib/esm/ActivityIndicator/index.js +12 -1
  24. package/lib/esm/ActivityIndicator/shared.js +52 -5
  25. package/lib/esm/Button/ButtonBase.js +2 -2
  26. package/lib/esm/Button/ButtonLink.js +2 -1
  27. package/lib/esm/Carousel/Carousel.js +18 -7
  28. package/lib/esm/ExpandCollapse/ExpandCollapse.js +4 -2
  29. package/lib/esm/ExpandCollapseMini/ExpandCollapseMini.js +11 -2
  30. package/lib/esm/FileUpload/FileUpload.js +31 -2
  31. package/lib/esm/Link/Link.js +8 -1
  32. package/lib/esm/Link/LinkBase.js +2 -0
  33. package/lib/esm/MultiSelectFilter/MultiSelectFilter.js +3 -2
  34. package/lib/esm/utils/containUniqueFields.js +5 -5
  35. package/lib/esm/utils/useUniqueId.js +3 -7
  36. package/lib/package.json +4 -3
  37. package/package.json +4 -3
  38. package/src/ActivityIndicator/Dots.jsx +200 -0
  39. package/src/ActivityIndicator/Dots.native.jsx +213 -0
  40. package/src/ActivityIndicator/Spinner.jsx +95 -59
  41. package/src/ActivityIndicator/Spinner.native.jsx +125 -132
  42. package/src/ActivityIndicator/index.jsx +17 -2
  43. package/src/ActivityIndicator/shared.js +52 -5
  44. package/src/Button/ButtonBase.jsx +4 -2
  45. package/src/Button/ButtonLink.jsx +3 -1
  46. package/src/Carousel/Carousel.jsx +28 -7
  47. package/src/ExpandCollapse/ExpandCollapse.jsx +9 -4
  48. package/src/ExpandCollapseMini/ExpandCollapseMini.jsx +15 -3
  49. package/src/FileUpload/FileUpload.jsx +32 -2
  50. package/src/Link/Link.jsx +8 -1
  51. package/src/Link/LinkBase.jsx +2 -0
  52. package/src/MultiSelectFilter/MultiSelectFilter.jsx +2 -2
  53. package/src/utils/containUniqueFields.js +5 -5
  54. package/src/utils/useUniqueId.js +3 -8
@@ -5,147 +5,129 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _react = _interopRequireDefault(require("react"));
8
+ var _View = _interopRequireDefault(require("react-native-web/dist/cjs/exports/View"));
8
9
  var _Animated = _interopRequireDefault(require("react-native-web/dist/cjs/exports/Animated"));
9
10
  var _Easing = _interopRequireDefault(require("react-native-web/dist/cjs/exports/Easing"));
10
- var _StyleSheet = _interopRequireDefault(require("react-native-web/dist/cjs/exports/StyleSheet"));
11
- var _View = _interopRequireDefault(require("react-native-web/dist/cjs/exports/View"));
11
+ var _reactNativeSvg = _interopRequireWildcard(require("react-native-svg"));
12
12
  var _shared = require("./shared");
13
13
  var _A11yInfoProvider = require("../A11yInfoProvider");
14
14
  var _jsxRuntime = require("react/jsx-runtime");
15
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
16
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
15
17
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
- const ea = _shared.MIN_EMPTY_ANGLE / 2;
17
- const sa = _shared.MIN_STROKE_ANGLE / 2;
18
18
  const Spinner = /*#__PURE__*/_react.default.forwardRef((_ref, ref) => {
19
19
  let {
20
20
  size,
21
21
  color,
22
+ indicatorBackgroundColor,
22
23
  thickness,
23
24
  label,
24
25
  isStatic = false
25
26
  } = _ref;
26
- const {
27
- current: timer
28
- } = _react.default.useRef(new _Animated.default.Value(0));
29
27
  const {
30
28
  reduceMotionEnabled
31
29
  } = (0, _A11yInfoProvider.useA11yInfo)();
32
30
  const reduceMotion = reduceMotionEnabled || isStatic;
33
- _react.default.useLayoutEffect(() => {
34
- const loop = _Animated.default.timing(timer, {
31
+
32
+ // Animated value between 0..1 that will loop
33
+ const progress = _react.default.useRef(new _Animated.default.Value(0)).current;
34
+
35
+ // Local state to force re-render on each frame
36
+ const [progressVal, setProgressVal] = _react.default.useState(0);
37
+ _react.default.useEffect(() => {
38
+ if (reduceMotion) {
39
+ progress.stopAnimation(() => {
40
+ progress.setValue(0);
41
+ setProgressVal(0);
42
+ });
43
+ return undefined;
44
+ }
45
+ const id = progress.addListener(_ref2 => {
46
+ let {
47
+ value
48
+ } = _ref2;
49
+ setProgressVal(value);
50
+ });
51
+ _Animated.default.loop(_Animated.default.timing(progress, {
52
+ toValue: 1,
35
53
  duration: _shared.DURATION,
36
54
  easing: _Easing.default.linear,
37
- // Animated.loop does not work if useNativeDriver is true on web
38
- useNativeDriver: true,
39
- toValue: 1,
55
+ useNativeDriver: false,
40
56
  isInteraction: false
41
- });
42
- if (!reduceMotion) _Animated.default.loop(loop).start();else loop.stop();
43
- }, [timer, reduceMotion]);
44
- const frames = 60 * _shared.DURATION / 1000;
45
- const easing = _Easing.default.bezier(..._shared.BEZIER);
46
- const containerStyle = {
47
- width: size,
48
- height: size / (reduceMotion ? 1.5 : 2),
49
- overflow: 'hidden'
50
- };
51
- const animationFrequency = reduceMotion ? [0] : [0, 1];
57
+ })).start();
58
+ return () => {
59
+ progress.removeListener(id);
60
+ progress.stopAnimation();
61
+ };
62
+ }, [progress, reduceMotion]);
52
63
 
53
- // Credit to https://github.com/n4kz/react-native-indicators and https://github.com/callstack/react-native-paper for this
64
+ /* The same logic used in Wweb keyframes:
65
+ - rotation from -90° base plus 0..183° => -90..93
66
+ - dasharray from 1% -> 50% -> 1%
67
+ - dashoffset from 0 -> 0 -> -49%
68
+ */
69
+
70
+ // 1) rotation (0->183) plus base offset -90
71
+ const rotationDeg = -90 + 183 * progressVal; // -90..+93
72
+
73
+ // strokeDasharray
74
+ let dashArrayVisible;
75
+ if (progressVal < _shared.SPINNER_DASHARRAY_HALF) {
76
+ const segmentProgress = progressVal / _shared.SPINNER_DASHARRAY_HALF;
77
+ dashArrayVisible = _shared.SPINNER_DASHARRAY_MIN + (_shared.SPINNER_DASHARRAY_HALF - _shared.SPINNER_DASHARRAY_MIN) * segmentProgress;
78
+ } else {
79
+ const segmentProgress = (progressVal - _shared.SPINNER_DASHARRAY_HALF) / _shared.SPINNER_DASHARRAY_HALF;
80
+ dashArrayVisible = _shared.SPINNER_DASHARRAY_HALF + (_shared.SPINNER_DASHARRAY_MIN - _shared.SPINNER_DASHARRAY_HALF) * segmentProgress;
81
+ }
82
+ const visibleLength = dashArrayVisible * _shared.SVG_CIRCUMFERENCE;
83
+ const invisibleLength = _shared.SVG_CIRCUMFERENCE - visibleLength;
84
+ const strokeDasharray = `${visibleLength},${invisibleLength}`;
85
+
86
+ // strokeDashoffset
87
+ let strokeDashoffset = 0;
88
+ if (progressVal > _shared.SPINNER_DASHARRAY_HALF) {
89
+ const segmentProgress = (progressVal - _shared.SPINNER_DASHARRAY_HALF) / _shared.SPINNER_DASHARRAY_HALF;
90
+ strokeDashoffset = -_shared.SPINNER_DASHOFFSET_FACTOR * _shared.SVG_CIRCUMFERENCE * segmentProgress;
91
+ }
92
+ const strokeWidth = thickness * _shared.SVG_SIZE / size;
54
93
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
55
94
  ref: ref,
56
- style: [styles.container],
95
+ style: {
96
+ width: size,
97
+ height: size
98
+ },
57
99
  accessible: true,
58
100
  accessibilityLabel: label,
59
101
  accessibilityRole: "progressbar",
60
102
  accessibilityState: {
61
103
  busy: true
62
104
  },
63
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Animated.default.View, {
64
- style: [{
65
- width: size,
66
- height: size
67
- }],
68
- collapsable: false,
69
- children: animationFrequency.map(index => {
70
- const inputRange = Array.from(new Array(frames), (_, frameIndex) => frameIndex / (frames - 1));
71
- const outputRange = Array.from(new Array(frames), (_, frameIndex) => {
72
- let progress = 2 * frameIndex / (frames - 1);
73
- const rotation = index ? +(360 - sa) : -(180 - sa);
74
- if (progress > 1.0) {
75
- progress = 2.0 - progress;
76
- }
77
- const direction = index ? -1 : +1;
78
- return `${direction * (180 - (sa + ea)) * easing(progress) + rotation}deg`;
79
- });
80
- const layerStyle = {
81
- width: size,
82
- height: size
83
- };
84
- const viewportStyle = {
85
- width: size,
86
- height: size
87
- };
88
- if (!reduceMotion) {
89
- layerStyle.transform = [{
90
- rotate: timer.interpolate({
91
- inputRange: [0, 1],
92
- outputRange: [`${0 + ea + sa}deg`, `${2 * 360 + ea + sa}deg`]
93
- })
94
- }];
95
- viewportStyle.transform = [{
96
- translateY: index ? -size / 2 : 0
97
- }, {
98
- rotate: timer.interpolate({
99
- inputRange,
100
- outputRange
101
- })
102
- }];
103
- }
104
- const offsetStyle = index ? {
105
- top: size / 2
106
- } : null;
107
- const lineStyle = {
108
- width: size,
109
- height: size,
110
- borderColor: color,
111
- borderWidth: thickness,
112
- borderRadius: size / 2
113
- };
114
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Animated.default.View, {
115
- style: [styles.layer],
116
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Animated.default.View, {
117
- style: layerStyle,
118
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Animated.default.View, {
119
- style: [containerStyle, offsetStyle],
120
- collapsable: false,
121
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Animated.default.View, {
122
- style: viewportStyle,
123
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Animated.default.View, {
124
- style: containerStyle,
125
- collapsable: false,
126
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Animated.default.View, {
127
- style: lineStyle
128
- })
129
- })
130
- })
131
- })
132
- })
133
- }, index);
134
- })
105
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNativeSvg.default, {
106
+ width: size,
107
+ height: size,
108
+ viewBox: `0 0 ${_shared.SVG_SIZE} ${_shared.SVG_SIZE}`,
109
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSvg.Circle, {
110
+ cx: _shared.SVG_CENTER,
111
+ cy: _shared.SVG_CENTER,
112
+ r: _shared.SPINNER_RADIUS,
113
+ fill: "none",
114
+ stroke: indicatorBackgroundColor,
115
+ strokeWidth: strokeWidth
116
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSvg.Circle, {
117
+ cx: _shared.SVG_CENTER,
118
+ cy: _shared.SVG_CENTER,
119
+ r: _shared.SPINNER_RADIUS,
120
+ fill: "none",
121
+ stroke: color,
122
+ strokeWidth: strokeWidth,
123
+ strokeLinecap: "round",
124
+ transform: `rotate(${rotationDeg}, 24, 24)`,
125
+ strokeDasharray: strokeDasharray,
126
+ strokeDashoffset: strokeDashoffset
127
+ })]
135
128
  })
136
129
  });
137
130
  });
138
131
  Spinner.displayName = 'Spinner';
139
132
  Spinner.propTypes = _shared.propTypes;
140
- const styles = _StyleSheet.default.create({
141
- container: {
142
- flexGrow: 0,
143
- flexShrink: 0
144
- },
145
- layer: {
146
- ..._StyleSheet.default.absoluteFillObject,
147
- justifyContent: 'center',
148
- alignItems: 'center'
149
- }
150
- });
151
133
  var _default = exports.default = Spinner;
@@ -9,6 +9,7 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
9
9
  var _ThemeProvider = require("../ThemeProvider");
10
10
  var _props = require("../utils/props");
11
11
  var _Spinner = _interopRequireDefault(require("./Spinner"));
12
+ var _Dots = _interopRequireDefault(require("./Dots"));
12
13
  var _jsxRuntime = require("react/jsx-runtime");
13
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
15
  /**
@@ -23,13 +24,23 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
23
24
  } = _ref;
24
25
  const {
25
26
  size,
27
+ dotSize,
26
28
  color,
29
+ indicatorBackgroundColor,
27
30
  thickness
28
31
  } = (0, _ThemeProvider.useThemeTokens)('ActivityIndicator', tokens, variant);
29
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Spinner.default, {
32
+ return variant?.dots ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Dots.default, {
33
+ ref: ref,
34
+ size: dotSize,
35
+ color: color,
36
+ indicatorBackgroundColor: indicatorBackgroundColor,
37
+ label: label,
38
+ isStatic: isStatic
39
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_Spinner.default, {
30
40
  ref: ref,
31
41
  size: size,
32
42
  color: color,
43
+ indicatorBackgroundColor: indicatorBackgroundColor,
33
44
  thickness: thickness,
34
45
  label: label,
35
46
  isStatic: isStatic
@@ -3,18 +3,65 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.propTypes = exports.MIN_STROKE_ANGLE = exports.MIN_EMPTY_ANGLE = exports.DURATION = exports.BEZIER = void 0;
6
+ exports.propTypes = exports.UNDERSHOOT_FACTOR = exports.SVG_SIZE = exports.SVG_RADIUS = exports.SVG_CIRCUMFERENCE = exports.SVG_CENTER = exports.SPINNER_ROTATION_DEGREES = exports.SPINNER_RADIUS = exports.SPINNER_KEYTIMES = exports.SPINNER_DASHOFFSET_FACTOR = exports.SPINNER_DASHARRAY_MIN = exports.SPINNER_DASHARRAY_MAX = exports.SPINNER_DASHARRAY_HALF = exports.ROTATION_TRANSFORM = exports.OVERSHOOT_FACTOR = exports.DURATION = exports.DOT_FADEOUT_OUTPUT_RANGE = exports.DOT_FADEOUT_INPUT_RANGE = exports.DOTS_TOTAL_ANIMATION_DURATION = exports.DOTS_SPACING_X = exports.DOTS_PADDING_FACTOR = exports.DOTS_JUMP_HEIGHT_FACTOR = exports.DOTS_FADEOUT_VALUES = exports.DOTS_FADEOUT_KEYTIMES = exports.DOTS_BASE_Y_FACTOR = exports.DOTS_ANIMATION_DURATION = exports.DOT3_COLOR_KEYTIMES = exports.DOT3_ANIMATION_KEYTIMES = exports.DOT3_ANIMATION_INPUT_RANGE = exports.DOT2_COLOR_KEYTIMES = exports.DOT2_ANIMATION_KEYTIMES = exports.DOT2_ANIMATION_INPUT_RANGE = exports.DOT1_COLOR_KEYTIMES = exports.DOT1_ANIMATION_KEYTIMES = exports.DOT1_ANIMATION_INPUT_RANGE = exports.BOUNCY_CURVE = void 0;
7
7
  var _propTypes = _interopRequireDefault(require("prop-types"));
8
8
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
- // these could be specified by the theme
10
- const DURATION = exports.DURATION = 1800;
11
- const MIN_EMPTY_ANGLE = exports.MIN_EMPTY_ANGLE = 60;
12
- const MIN_STROKE_ANGLE = exports.MIN_STROKE_ANGLE = 30;
13
- const BEZIER = exports.BEZIER = [0.42, 0.0, 0.58, 1.0];
9
+ // Spinner
10
+ const DURATION = exports.DURATION = 1200;
11
+ const SVG_RADIUS = exports.SVG_RADIUS = 20;
12
+ const SVG_CIRCUMFERENCE = exports.SVG_CIRCUMFERENCE = SVG_RADIUS * 2 * Math.PI;
13
+ const SVG_SIZE = exports.SVG_SIZE = 48;
14
+ const ROTATION_TRANSFORM = exports.ROTATION_TRANSFORM = 'rotate(-90 24 24)';
15
+ const SVG_CENTER = exports.SVG_CENTER = 24;
16
+ const SPINNER_RADIUS = exports.SPINNER_RADIUS = 20;
17
+ const SPINNER_ROTATION_DEGREES = exports.SPINNER_ROTATION_DEGREES = 183;
18
+ const SPINNER_DASHARRAY_MIN = exports.SPINNER_DASHARRAY_MIN = 0.01;
19
+ const SPINNER_DASHARRAY_MAX = exports.SPINNER_DASHARRAY_MAX = 0.99;
20
+
21
+ // Spinner animation
22
+ const SPINNER_KEYTIMES = exports.SPINNER_KEYTIMES = '0; 0.5; 1';
23
+ const SPINNER_DASHARRAY_HALF = exports.SPINNER_DASHARRAY_HALF = 0.5;
24
+ const SPINNER_DASHOFFSET_FACTOR = exports.SPINNER_DASHOFFSET_FACTOR = 0.49;
25
+
26
+ // Dots
27
+ const DOTS_ANIMATION_DURATION = exports.DOTS_ANIMATION_DURATION = 300;
28
+ const DOTS_TOTAL_ANIMATION_DURATION = exports.DOTS_TOTAL_ANIMATION_DURATION = DOTS_ANIMATION_DURATION * 10;
29
+ const OVERSHOOT_FACTOR = exports.OVERSHOOT_FACTOR = 1.3;
30
+ const UNDERSHOOT_FACTOR = exports.UNDERSHOOT_FACTOR = 0.2;
31
+ const BOUNCY_CURVE = exports.BOUNCY_CURVE = '0.2 1 0.8 1';
32
+ const DOTS_SPACING_X = exports.DOTS_SPACING_X = 3;
33
+ const DOTS_BASE_Y_FACTOR = exports.DOTS_BASE_Y_FACTOR = 3;
34
+ const DOTS_JUMP_HEIGHT_FACTOR = exports.DOTS_JUMP_HEIGHT_FACTOR = 1;
35
+ const DOTS_PADDING_FACTOR = exports.DOTS_PADDING_FACTOR = 0.5;
36
+
37
+ // Dots fadeout
38
+ const DOTS_FADEOUT_KEYTIMES = exports.DOTS_FADEOUT_KEYTIMES = '0; 0.7; 0.8; 1';
39
+ const DOTS_FADEOUT_VALUES = exports.DOTS_FADEOUT_VALUES = '1; 1; 0; 0';
40
+
41
+ // Dots animation
42
+ const DOT1_ANIMATION_KEYTIMES = exports.DOT1_ANIMATION_KEYTIMES = '0; 0.1; 0.2; 1';
43
+ const DOT2_ANIMATION_KEYTIMES = exports.DOT2_ANIMATION_KEYTIMES = '0; 0.3; 0.4; 0.5; 1';
44
+ const DOT3_ANIMATION_KEYTIMES = exports.DOT3_ANIMATION_KEYTIMES = '0; 0.6; 0.7; 0.8; 1';
45
+
46
+ // Dots color keytimes
47
+ const DOT1_COLOR_KEYTIMES = exports.DOT1_COLOR_KEYTIMES = '0; 0.3; 0.4; 1';
48
+ const DOT2_COLOR_KEYTIMES = exports.DOT2_COLOR_KEYTIMES = '0; 0.3; 0.4; 0.6; 0.7; 1';
49
+ const DOT3_COLOR_KEYTIMES = exports.DOT3_COLOR_KEYTIMES = '0; 0.5; 0.6; 0.8; 1';
50
+
51
+ // Dots native fadeout
52
+ const DOT_FADEOUT_INPUT_RANGE = exports.DOT_FADEOUT_INPUT_RANGE = [0, 0.7, 0.8, 1];
53
+ const DOT_FADEOUT_OUTPUT_RANGE = exports.DOT_FADEOUT_OUTPUT_RANGE = [1, 1, 0, 0];
54
+
55
+ // Dots native animation
56
+ const DOT1_ANIMATION_INPUT_RANGE = exports.DOT1_ANIMATION_INPUT_RANGE = [0, 0.1, 0.2, 1];
57
+ const DOT2_ANIMATION_INPUT_RANGE = exports.DOT2_ANIMATION_INPUT_RANGE = [0, 0.3, 0.4, 0.5, 1];
58
+ const DOT3_ANIMATION_INPUT_RANGE = exports.DOT3_ANIMATION_INPUT_RANGE = [0, 0.6, 0.7, 0.8, 1];
14
59
  const propTypes = exports.propTypes = {
15
60
  color: _propTypes.default.string.isRequired,
61
+ baseColor: _propTypes.default.string,
16
62
  label: _propTypes.default.string.isRequired,
17
63
  size: _propTypes.default.number.isRequired,
64
+ dotsize: _propTypes.default.number,
18
65
  thickness: _propTypes.default.number.isRequired,
19
66
  isStatic: _propTypes.default.bool
20
67
  };
@@ -16,7 +16,7 @@ var _utils = require("../utils");
16
16
  var _Icon = require("../Icon");
17
17
  var _jsxRuntime = require("react/jsx-runtime");
18
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
19
- const [selectProps, selectedSystemPropTypes] = (0, _utils.selectSystemProps)([_utils.a11yProps, _utils.focusHandlerProps, _utils.linkProps, _utils.viewProps]);
19
+ const [selectProps, selectedSystemPropTypes] = (0, _utils.selectSystemProps)([_utils.a11yProps, _utils.focusHandlerProps, _utils.linkProps, _utils.viewProps, _utils.contentfulProps]);
20
20
  const getOuterBorderOffset = _ref => {
21
21
  let {
22
22
  outerBorderGap = 0,
@@ -50,6 +50,7 @@ ButtonLink.propTypes = {
50
50
  ..._props.a11yProps.types,
51
51
  ..._propTypes2.default,
52
52
  ..._props.linkProps.types,
53
+ ..._props.contentfulProps.types,
53
54
  children: _propTypes2.textAndA11yText,
54
55
  dataSet: _propTypes.default.object,
55
56
  accessibilityRole: _propTypes.default.string
@@ -91,7 +91,9 @@ const selectControlButtonPositionStyles = _ref => {
91
91
  positionProperty = getDynamicPositionProperty(),
92
92
  spaceBetweenSlideAndButton,
93
93
  enablePeeking,
94
- enableDisplayMultipleItemsPerSlide
94
+ enableDisplayMultipleItemsPerSlide,
95
+ isAutoPlayEnabled,
96
+ viewport
95
97
  } = _ref;
96
98
  const styles = {};
97
99
  if (positionVariant === 'edge') {
@@ -99,7 +101,7 @@ const selectControlButtonPositionStyles = _ref => {
99
101
  } else if (positionVariant === 'inside') {
100
102
  styles[positionProperty] = _Constants.DEFAULT_POSITION_OFFSET;
101
103
  } else if (positionVariant === 'outside') {
102
- if (enablePeeking || enableDisplayMultipleItemsPerSlide) {
104
+ if (enablePeeking || enableDisplayMultipleItemsPerSlide || isAutoPlayEnabled && viewport === 'xs') {
103
105
  styles[positionProperty] = 0;
104
106
  } else {
105
107
  styles[positionProperty] = -1 * (spaceBetweenSlideAndButton + buttonWidth);
@@ -107,7 +109,7 @@ const selectControlButtonPositionStyles = _ref => {
107
109
  }
108
110
  return styles;
109
111
  };
110
- const selectPreviousNextNavigationButtonStyles = (previousNextNavigationButtonWidth, previousNextNavigationPosition, spaceBetweenSlideAndPreviousNextNavigation, isFirstSlide, isLastSlide, areStylesAppliedOnPreviousButton, enablePeeking, enableDisplayMultipleItemsPerSlide) => {
112
+ const selectPreviousNextNavigationButtonStyles = (previousNextNavigationButtonWidth, previousNextNavigationPosition, spaceBetweenSlideAndPreviousNextNavigation, isFirstSlide, isLastSlide, areStylesAppliedOnPreviousButton, enablePeeking, enableDisplayMultipleItemsPerSlide, isAutoPlayEnabled, viewport) => {
111
113
  const styles = {
112
114
  zIndex: 1,
113
115
  position: 'absolute'
@@ -127,7 +129,9 @@ const selectPreviousNextNavigationButtonStyles = (previousNextNavigationButtonWi
127
129
  positionProperty: getDynamicPositionProperty(areStylesAppliedOnPreviousButton),
128
130
  spaceBetweenSlideAndButton: spaceBetweenSlideAndPreviousNextNavigation,
129
131
  enablePeeking,
130
- enableDisplayMultipleItemsPerSlide
132
+ enableDisplayMultipleItemsPerSlide,
133
+ isAutoPlayEnabled,
134
+ viewport
131
135
  })
132
136
  };
133
137
  };
@@ -174,6 +178,11 @@ const selectRootContainerStyles = (enableHero, viewport) => {
174
178
  alignItems: 'center'
175
179
  };
176
180
  }
181
+ if (enableHero) {
182
+ return {
183
+ paddingHorizontal: 16
184
+ };
185
+ }
177
186
  return {};
178
187
  };
179
188
  const selectMainContainerStyles = (enableHero, viewport) => {
@@ -888,7 +897,9 @@ const Carousel = /*#__PURE__*/_react.default.forwardRef((_ref3, ref) => {
888
897
  positionProperty: getDynamicPositionProperty(),
889
898
  spaceBetweenSlideAndButton: spaceBetweenSlideAndPreviousNextNavigation,
890
899
  enablePeeking,
891
- enableDisplayMultipleItemsPerSlide
900
+ enableDisplayMultipleItemsPerSlide,
901
+ isAutoPlayEnabled,
902
+ viewport
892
903
  })],
893
904
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
894
905
  icon: isCarouselPlaying ? pauseIcon : playIcon,
@@ -897,7 +908,7 @@ const Carousel = /*#__PURE__*/_react.default.forwardRef((_ref3, ref) => {
897
908
  onPress: onAnimationControlButtonPress
898
909
  })
899
910
  }) : null, showPreviousNextNavigation && totalItems > 1 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
900
- style: selectPreviousNextNavigationButtonStyles(previousNextNavigationButtonWidth, previousNextNavigationPosition, spaceBetweenSlideAndPreviousNextNavigation, isFirstSlide, isLastSlide, true, enablePeeking, enableDisplayMultipleItemsPerSlide),
911
+ style: selectPreviousNextNavigationButtonStyles(previousNextNavigationButtonWidth, previousNextNavigationPosition, spaceBetweenSlideAndPreviousNextNavigation, isFirstSlide, isLastSlide, true, enablePeeking, enableDisplayMultipleItemsPerSlide, isAutoPlayEnabled, viewport),
901
912
  testID: "previous-button-container",
902
913
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
903
914
  onLayout: onPreviousNextNavigationButtonLayout,
@@ -949,7 +960,7 @@ const Carousel = /*#__PURE__*/_react.default.forwardRef((_ref3, ref) => {
949
960
  })
950
961
  })
951
962
  }), showPreviousNextNavigation && totalItems > 1 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
952
- style: selectPreviousNextNavigationButtonStyles(previousNextNavigationButtonWidth, previousNextNavigationPosition, spaceBetweenSlideAndPreviousNextNavigation, isFirstSlide, isLastSlide, false, enablePeeking, enableDisplayMultipleItemsPerSlide),
963
+ style: selectPreviousNextNavigationButtonStyles(previousNextNavigationButtonWidth, previousNextNavigationPosition, spaceBetweenSlideAndPreviousNextNavigation, isFirstSlide, isLastSlide, false, enablePeeking, enableDisplayMultipleItemsPerSlide, isAutoPlayEnabled, viewport),
953
964
  testID: "next-button-container",
954
965
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
955
966
  onLayout: onPreviousNextNavigationButtonLayout,
@@ -12,7 +12,7 @@ var _ThemeProvider = require("../ThemeProvider");
12
12
  var _utils = require("../utils");
13
13
  var _jsxRuntime = require("react/jsx-runtime");
14
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
- const [selectProps, selectedSystemPropTypes] = (0, _utils.selectSystemProps)([_utils.a11yProps, _utils.viewProps]);
15
+ const [selectProps, selectedSystemPropTypes] = (0, _utils.selectSystemProps)([_utils.a11yProps, _utils.viewProps, _utils.contentfulProps]);
16
16
  function selectBorderStyles(tokens) {
17
17
  return {
18
18
  borderBottomWidth: tokens.borderWidth,
@@ -37,6 +37,7 @@ const ExpandCollapse = /*#__PURE__*/_react.default.forwardRef((_ref, ref) => {
37
37
  open,
38
38
  initialOpen,
39
39
  onChange,
40
+ dataSet,
40
41
  ...rest
41
42
  } = _ref;
42
43
  const {
@@ -56,6 +57,7 @@ const ExpandCollapse = /*#__PURE__*/_react.default.forwardRef((_ref, ref) => {
56
57
  style: staticStyles.container,
57
58
  ref: ref,
58
59
  ...selectProps(rest),
60
+ dataSet: dataSet,
59
61
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
60
62
  style: selectBorderStyles(themeTokens),
61
63
  children: typeof children === 'function' ? children({
@@ -11,6 +11,7 @@ var _utils = require("../utils");
11
11
  var _ExpandCollapseMiniControl = _interopRequireDefault(require("./ExpandCollapseMiniControl"));
12
12
  var _jsxRuntime = require("react/jsx-runtime");
13
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ const [selectContainerProps, selectedContainerPropTypes] = (0, _utils.selectSystemProps)([_utils.contentfulProps]);
14
15
  const ExpandCollapseMini = /*#__PURE__*/_react.default.forwardRef((_ref, ref) => {
15
16
  let {
16
17
  children,
@@ -18,6 +19,7 @@ const ExpandCollapseMini = /*#__PURE__*/_react.default.forwardRef((_ref, ref) =>
18
19
  tokens = {},
19
20
  nativeID,
20
21
  initialOpen = false,
22
+ dataSet,
21
23
  ...rest
22
24
  } = _ref;
23
25
  const expandCollapeMiniPanelId = 'ExpandCollapseMiniPanel';
@@ -31,6 +33,8 @@ const ExpandCollapseMini = /*#__PURE__*/_react.default.forwardRef((_ref, ref) =>
31
33
  onChange: handleChange,
32
34
  tokens: tokens,
33
35
  initialOpen: initialOpen ? [expandCollapeMiniPanelId] : [],
36
+ ...selectContainerProps(rest),
37
+ dataSet: dataSet,
34
38
  children: expandProps => /*#__PURE__*/(0, _jsxRuntime.jsx)(_ExpandCollapse.default.Panel, {
35
39
  ...expandProps,
36
40
  panelId: expandCollapeMiniPanelId,
@@ -60,6 +64,7 @@ const ExpandCollapseMini = /*#__PURE__*/_react.default.forwardRef((_ref, ref) =>
60
64
  ExpandCollapseMini.displayName = 'ExpandCollapseMini';
61
65
  ExpandCollapseMini.propTypes = {
62
66
  ..._ExpandCollapseMiniControl.default.propTypes,
67
+ ...selectedContainerPropTypes,
63
68
  /**
64
69
  * Function to call on pressing the panel's control, which should open or close the panel.
65
70
  */
@@ -79,6 +84,10 @@ ExpandCollapseMini.propTypes = {
79
84
  /**
80
85
  * Optional variant object to override the default theme tokens
81
86
  */
82
- tokens: (0, _utils.getTokensPropType)('ExpandCollapseMini')
87
+ tokens: (0, _utils.getTokensPropType)('ExpandCollapseMini'),
88
+ /**
89
+ * The dataSet prop allows to pass data-* attributes element to the component.
90
+ */
91
+ dataSet: _propTypes.default.object
83
92
  };
84
93
  var _default = exports.default = ExpandCollapseMini;
@@ -102,6 +102,7 @@ const FileUpload = /*#__PURE__*/_react.default.forwardRef((_ref2, ref) => {
102
102
  onUpload,
103
103
  onDelete,
104
104
  documentPicker,
105
+ dictionary = _dictionary.default,
105
106
  ...rest
106
107
  } = _ref2;
107
108
  if (minFilesCount <= 0) {
@@ -109,7 +110,7 @@ const FileUpload = /*#__PURE__*/_react.default.forwardRef((_ref2, ref) => {
109
110
  }
110
111
  const themeTokens = (0, _ThemeProvider.useThemeTokens)('FileUpload', tokens, variant);
111
112
  const getCopy = (0, _utils.useCopy)({
112
- dictionary: _dictionary.default,
113
+ dictionary,
113
114
  copy
114
115
  });
115
116
  const inputFileRef = _react.default.useRef(null);
@@ -322,6 +323,27 @@ const FileUpload = /*#__PURE__*/_react.default.forwardRef((_ref2, ref) => {
322
323
  });
323
324
  });
324
325
  FileUpload.displayName = 'FileUpload';
326
+ const dictionaryEntryShape = _propTypes.default.shape({
327
+ label: _propTypes.default.string.isRequired,
328
+ buttonLabel: _propTypes.default.string.isRequired,
329
+ dismissButtonLabel: _propTypes.default.string.isRequired,
330
+ wrongFileType: _propTypes.default.string.isRequired,
331
+ allowedFileTypes: _propTypes.default.string.isRequired,
332
+ fileTooBig: _propTypes.default.string.isRequired,
333
+ fileIsEmpty: _propTypes.default.string.isRequired,
334
+ problemUploading: _propTypes.default.string.isRequired,
335
+ problemDeleting: _propTypes.default.string.isRequired,
336
+ problemUploadingMultipleFiles: _propTypes.default.string.isRequired,
337
+ only: _propTypes.default.string.isRequired,
338
+ and: _propTypes.default.string.isRequired,
339
+ or: _propTypes.default.string.isRequired,
340
+ uploadSuccess: _propTypes.default.string.isRequired,
341
+ uploadError: _propTypes.default.string.isRequired,
342
+ deleteProblem: _propTypes.default.string.isRequired,
343
+ tooManyFiles: _propTypes.default.string.isRequired,
344
+ fileTooSmall: _propTypes.default.string.isRequired,
345
+ fewFiles: _propTypes.default.string.isRequired
346
+ });
325
347
  FileUpload.propTypes = {
326
348
  ...selectedSystemPropTypes,
327
349
  tokens: (0, _utils.getTokensPropType)('FileUpload'),
@@ -365,6 +387,13 @@ FileUpload.propTypes = {
365
387
  /**
366
388
  * The minimum file size allowed for upload in MB.
367
389
  */
368
- minFileSize: _propTypes.default.number
390
+ minFileSize: _propTypes.default.number,
391
+ /**
392
+ * Custom dictionary containing the labels to use for the steps
393
+ */
394
+ dictionary: _propTypes.default.shape({
395
+ en: dictionaryEntryShape,
396
+ fr: dictionaryEntryShape
397
+ })
369
398
  };
370
399
  var _default = exports.default = FileUpload;
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _react = _interopRequireDefault(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
8
9
  var _ThemeProvider = require("../ThemeProvider");
9
10
  var _LinkBase = _interopRequireDefault(require("./LinkBase"));
10
11
  var _jsxRuntime = require("react/jsx-runtime");
@@ -31,5 +32,11 @@ const Link = /*#__PURE__*/_react.default.forwardRef((_ref, ref) => {
31
32
  });
32
33
  });
33
34
  Link.displayName = 'Link';
34
- Link.propTypes = _LinkBase.default.propTypes;
35
+ Link.propTypes = {
36
+ ..._LinkBase.default.propTypes,
37
+ /**
38
+ * The dataSet prop allows to pass data-* attributes element to the component.
39
+ */
40
+ dataSet: _propTypes.default.object
41
+ };
35
42
  var _default = exports.default = Link;
@@ -143,6 +143,7 @@ const LinkBase = /*#__PURE__*/_react.default.forwardRef((_ref6, ref) => {
143
143
  variant,
144
144
  tokens = {},
145
145
  children,
146
+ dataSet,
146
147
  accessibilityRole = 'link',
147
148
  ...rawRest
148
149
  } = _ref6;
@@ -177,6 +178,7 @@ const LinkBase = /*#__PURE__*/_react.default.forwardRef((_ref6, ref) => {
177
178
  } = (0, _ThemeProvider.useTheme)();
178
179
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_InlinePressable.default, {
179
180
  ...selectedProps,
181
+ dataSet: dataSet,
180
182
  inlineFlex: hasIcon
181
183
  // assuming links without icons should be inline (even if they are long)
182
184
  ,
@@ -108,6 +108,7 @@ const MultiSelectFilter = /*#__PURE__*/_react.default.forwardRef((_ref3, ref) =>
108
108
  const [isOpen, setIsOpen] = _react.default.useState(false);
109
109
  const [checkedIds, setCheckedIds] = _react.default.useState(currentValues ?? []);
110
110
  const [maxWidth, setMaxWidth] = _react.default.useState(false);
111
+ const isSelected = currentValues.length > 0;
111
112
  const {
112
113
  headerFontColor,
113
114
  headerFontSize,
@@ -140,7 +141,8 @@ const MultiSelectFilter = /*#__PURE__*/_react.default.forwardRef((_ref3, ref) =>
140
141
  } = (0, _ThemeProvider.useThemeTokens)('MultiSelectFilter', tokens, {
141
142
  ...variant,
142
143
  maxHeight,
143
- maxWidth
144
+ maxWidth,
145
+ selected: isSelected
144
146
  }, {
145
147
  viewport
146
148
  });
@@ -168,7 +170,6 @@ const MultiSelectFilter = /*#__PURE__*/_react.default.forwardRef((_ref3, ref) =>
168
170
  const colSizeNotMobile = items.length > rowLimit ? 2 : 1;
169
171
  const colSize = viewport !== 'xs' ? colSizeNotMobile : 1;
170
172
  const itemsLengthNotMobile = items.length > 24 ? items.length / 2 : rowLimit;
171
- const isSelected = currentValues.length > 0;
172
173
  const rowLength = viewport !== 'xs' ? itemsLengthNotMobile : items.length;
173
174
  _react.default.useEffect(() => {
174
175
  if (colSize === 1) return setMaxWidth(false);
@@ -10,10 +10,10 @@ exports.default = void 0;
10
10
  // Note that if a value of a field in an item is not set, it will be
11
11
  // excluded from comparison.
12
12
  const containUniqueFields = (items, fields) => {
13
- const map = [];
13
+ const map = new Map();
14
14
  const itemsHaveDuplicateFields = items.some(item => fields.some(field => {
15
- if (!map[field]) {
16
- map[field] = [];
15
+ if (!map.has(field)) {
16
+ map.set(field, new Map());
17
17
  }
18
18
  if (!item[field]) {
19
19
  // We exclude empty values from comparison
@@ -21,8 +21,8 @@ const containUniqueFields = (items, fields) => {
21
21
  }
22
22
 
23
23
  // Duplicate found!
24
- if (map[field][item[field]]) return true;
25
- map[field][item[field]] = true;
24
+ if (map.get(field).has(item[field])) return true;
25
+ map.get(field).set(item[field], true);
26
26
  return false;
27
27
  }));
28
28
  return !itemsHaveDuplicateFields;