@telus-uds/components-base 1.74.0 → 1.75.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.
package/CHANGELOG.md CHANGED
@@ -1,12 +1,21 @@
1
1
  # Change Log - @telus-uds/components-base
2
2
 
3
- This log was last generated on Thu, 18 Jan 2024 22:43:26 GMT and should not be manually modified.
3
+ This log was last generated on Mon, 29 Jan 2024 18:26:01 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## 1.75.0
8
+
9
+ Mon, 29 Jan 2024 18:26:01 GMT
10
+
11
+ ### Minor changes
12
+
13
+ - Styles changed in notification component to be SSR (35577399+JoshHC@users.noreply.github.com)
14
+ - Bump @telus-uds/system-theme-tokens to v2.50.1
15
+
7
16
  ## 1.74.0
8
17
 
9
- Thu, 18 Jan 2024 22:43:26 GMT
18
+ Thu, 18 Jan 2024 22:55:53 GMT
10
19
 
11
20
  ### Minor changes
12
21
 
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
- var _StyleSheet = _interopRequireDefault(require("react-native-web/dist/cjs/exports/StyleSheet"));
9
8
  var _View = _interopRequireDefault(require("react-native-web/dist/cjs/exports/View"));
10
9
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
10
  var _ThemeProvider = require("../ThemeProvider");
@@ -75,6 +74,156 @@ const selectDismissButtonContainerStyles = _ref4 => {
75
74
  const selectContentContainerStyle = maxWidth => ({
76
75
  width: maxWidth || '100%'
77
76
  });
77
+ const getMediaQueryStyles = (themeTokens, themeOptions, viewport, mediaIdsRef, dismissible) => {
78
+ const transformedSelectContainerStyles = Object.entries(themeTokens).reduce((acc, _ref5) => {
79
+ let [vp, viewportTokens] = _ref5;
80
+ acc[vp] = selectContainerStyles({
81
+ ...viewportTokens
82
+ });
83
+ return acc;
84
+ }, {});
85
+ const selectContainerMediaQueryStyles = (0, _utils.createMediaQueryStyles)(transformedSelectContainerStyles);
86
+ const {
87
+ ids: containerIds,
88
+ styles: containerStyles
89
+ } = _utils.StyleSheet.create({
90
+ container: {
91
+ flexDirection: 'row',
92
+ ...selectContainerMediaQueryStyles
93
+ }
94
+ });
95
+ const {
96
+ ids: contentContainerIds,
97
+ styles: contentContainerStyles
98
+ } = _utils.StyleSheet.create({
99
+ contentContainer: {
100
+ flexDirection: 'row',
101
+ flexShrink: 1,
102
+ justifyContent: 'space-between',
103
+ ...(0, _utils.createMediaQueryStyles)({
104
+ xs: {
105
+ width: (themeOptions === null || themeOptions === void 0 ? void 0 : themeOptions.contentMaxWidth.xs) || '100%'
106
+ },
107
+ md: {
108
+ width: (themeOptions === null || themeOptions === void 0 ? void 0 : themeOptions.contentMaxWidth.md) || '100%'
109
+ },
110
+ lg: {
111
+ width: (themeOptions === null || themeOptions === void 0 ? void 0 : themeOptions.contentMaxWidth.lg) || '100%'
112
+ },
113
+ sm: {
114
+ width: (themeOptions === null || themeOptions === void 0 ? void 0 : themeOptions.contentMaxWidth.sm) || '100%'
115
+ },
116
+ xl: {
117
+ width: (themeOptions === null || themeOptions === void 0 ? void 0 : themeOptions.contentMaxWidth.xl) || '100%'
118
+ }
119
+ })
120
+ }
121
+ });
122
+ const {
123
+ ids: staticContentContainerIds,
124
+ styles: staticContentContainerStyles
125
+ } = _utils.StyleSheet.create({
126
+ staticContentContainer: {
127
+ flexDirection: 'row',
128
+ flexShrink: 1
129
+ }
130
+ });
131
+ const {
132
+ ids: iconContainerIds,
133
+ styles: iconContainerStyles
134
+ } = _utils.StyleSheet.create({
135
+ iconContainer: selectIconContainerStyles(themeTokens[viewport])
136
+ });
137
+ const {
138
+ ids: dismissButtonContainerIds,
139
+ styles: dismissButtonContainerStyles
140
+ } = _utils.StyleSheet.create({
141
+ dismissButtonContainer: selectDismissButtonContainerStyles(themeTokens[viewport])
142
+ });
143
+ const {
144
+ ids: textIds,
145
+ styles: textStyles
146
+ } = _utils.StyleSheet.create({
147
+ text: selectTextStyles(themeTokens[viewport], themeOptions, dismissible)
148
+ });
149
+ const {
150
+ styles: selectIconPropsStyles
151
+ } = _utils.StyleSheet.create({
152
+ selectIconProps: selectIconProps(themeTokens[viewport])
153
+ });
154
+ const {
155
+ styles: selectDismissIconPropsStyles
156
+ } = _utils.StyleSheet.create({
157
+ selectDismissIconProps: selectDismissIconProps(themeTokens[viewport])
158
+ });
159
+
160
+ // eslint-disable-next-line no-param-reassign
161
+ mediaIdsRef.current = {
162
+ containerIds,
163
+ contentContainerIds,
164
+ staticContentContainerIds,
165
+ iconContainerIds,
166
+ dismissButtonContainerIds,
167
+ textIds
168
+ };
169
+ return {
170
+ containerStyles,
171
+ contentContainerStyles,
172
+ staticContentContainerStyles,
173
+ iconContainerStyles,
174
+ dismissButtonContainerStyles,
175
+ textStyles,
176
+ selectIconPropsStyles,
177
+ selectDismissIconPropsStyles
178
+ };
179
+ };
180
+ const getDefaultStyles = (themeTokens, themeOptions, maxWidth, dismissible) => ({
181
+ containerStyles: {
182
+ container: {
183
+ flexDirection: 'row',
184
+ ...selectContainerStyles(themeTokens)
185
+ }
186
+ },
187
+ contentContainerStyles: {
188
+ contentContainer: {
189
+ flexDirection: 'row',
190
+ flexShrink: 1,
191
+ justifyContent: 'space-between',
192
+ ...selectContentContainerStyle(maxWidth)
193
+ }
194
+ },
195
+ staticContentContainerStyles: {
196
+ staticContentContainer: {
197
+ flexDirection: 'row',
198
+ flexShrink: 1
199
+ }
200
+ },
201
+ iconContainerStyles: {
202
+ iconContainer: {
203
+ ...selectIconContainerStyles(themeTokens)
204
+ }
205
+ },
206
+ dismissButtonContainerStyles: {
207
+ dismissButtonContainer: {
208
+ ...selectDismissButtonContainerStyles(themeTokens)
209
+ }
210
+ },
211
+ textStyles: {
212
+ text: {
213
+ ...selectTextStyles(themeTokens, themeOptions, dismissible)
214
+ }
215
+ },
216
+ selectIconPropsStyles: {
217
+ selectIconProps: {
218
+ ...selectIconProps(themeTokens)
219
+ }
220
+ },
221
+ selectDismissIconPropsStyles: {
222
+ selectDismissIconProps: {
223
+ ...selectDismissIconProps(themeTokens)
224
+ }
225
+ }
226
+ });
78
227
 
79
228
  /**
80
229
  * A banner that highlights important messages:
@@ -127,7 +276,7 @@ const selectContentContainerStyle = maxWidth => ({
127
276
  * Use full-width `Notifications` to show system-based messages coming from the application, not in response to user action.
128
277
  * Show system notifications at the top of the page, below the navigation, and expands the full-width of the viewport
129
278
  */
130
- const Notification = /*#__PURE__*/(0, _react.forwardRef)((_ref5, ref) => {
279
+ const Notification = /*#__PURE__*/(0, _react.forwardRef)((_ref6, ref) => {
131
280
  let {
132
281
  children,
133
282
  system,
@@ -136,13 +285,9 @@ const Notification = /*#__PURE__*/(0, _react.forwardRef)((_ref5, ref) => {
136
285
  tokens,
137
286
  variant,
138
287
  ...rest
139
- } = _ref5;
288
+ } = _ref6;
140
289
  const [isDismissed, setIsDismissed] = (0, _react.useState)(false);
141
290
  const viewport = (0, _ViewportProvider.useViewport)();
142
- const themeTokens = (0, _ThemeProvider.useThemeTokens)('Notification', tokens, variant, {
143
- system,
144
- viewport
145
- });
146
291
  const getCopy = (0, _useCopy.default)({
147
292
  dictionary: _dictionary.default,
148
293
  copy
@@ -150,42 +295,89 @@ const Notification = /*#__PURE__*/(0, _react.forwardRef)((_ref5, ref) => {
150
295
  const {
151
296
  themeOptions
152
297
  } = (0, _ThemeProvider.useTheme)();
153
- const contentMaxWidth = (0, _utils.useResponsiveProp)(themeOptions === null || themeOptions === void 0 ? void 0 : themeOptions.contentMaxWidth);
298
+ const {
299
+ enableMediaQueryStyleSheet
300
+ } = themeOptions;
301
+ const useTokens = enableMediaQueryStyleSheet ? _ThemeProvider.useResponsiveThemeTokens : _ThemeProvider.useThemeTokens;
302
+ const themeTokens = useTokens('Notification', tokens, variant, {
303
+ system,
304
+ viewport
305
+ });
306
+ const maxWidth = (0, _utils.useResponsiveProp)(themeOptions === null || themeOptions === void 0 ? void 0 : themeOptions.contentMaxWidth);
307
+ const notificationComponentRef = (0, _react.useRef)({
308
+ containerStyles: {},
309
+ contentContainerStyles: {},
310
+ staticContentContainerStyles: {},
311
+ iconContainerStyles: {},
312
+ dismissButtonContainerStyles: {},
313
+ textStyles: {},
314
+ selectIconPropsStyles: {},
315
+ selectDismissIconPropsStyles: {}
316
+ });
317
+ const mediaIdsRef = (0, _react.useRef)({
318
+ containerIds: {},
319
+ contentContainerIds: {},
320
+ staticContentContainerIds: {},
321
+ iconContainerIds: {},
322
+ dismissButtonContainerIds: {},
323
+ textIds: {},
324
+ selectIconPropsIds: {},
325
+ selectDismissIconPropsIds: {}
326
+ });
327
+ if (enableMediaQueryStyleSheet) {
328
+ notificationComponentRef.current = getMediaQueryStyles(themeTokens, themeOptions, viewport, mediaIdsRef, dismissible);
329
+ } else {
330
+ notificationComponentRef.current = getDefaultStyles(themeTokens, themeOptions, maxWidth, dismissible);
331
+ }
154
332
  if (isDismissed) {
155
333
  return null;
156
334
  }
157
- const textStyles = selectTextStyles(themeTokens, themeOptions, dismissible);
158
335
  const content = (0, _utils.wrapStringsInText)(typeof children === 'function' ? children({
159
- textStyles,
336
+ textStyles: notificationComponentRef.current.textStyles.text,
160
337
  variant
161
338
  }) : children, {
162
- style: textStyles
339
+ style: notificationComponentRef.current.textStyles.text
163
340
  });
164
341
  const {
165
342
  icon: IconComponent,
166
343
  dismissIcon: DismissIconComponent,
167
344
  dismissIconColor
168
- } = themeTokens;
345
+ } = enableMediaQueryStyleSheet === false ? themeTokens : themeTokens[viewport];
169
346
  const onDismissPress = () => setIsDismissed(true);
170
347
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
171
348
  ref: ref,
172
- style: [staticStyles.container, selectContainerStyles(themeTokens)],
349
+ style: notificationComponentRef.current.containerStyles.container,
350
+ dataSet: mediaIdsRef && {
351
+ media: mediaIdsRef.current.containerIds.container
352
+ },
173
353
  ...selectProps(rest),
174
354
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_View.default, {
175
- style: [staticStyles.content, selectContentContainerStyle(contentMaxWidth)],
355
+ style: notificationComponentRef.current.contentContainerStyles.contentContainer,
356
+ dataSet: mediaIdsRef && {
357
+ media: mediaIdsRef.current.contentContainerIds.contentContainer
358
+ },
176
359
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_View.default, {
177
- style: staticStyles.contentContainer,
360
+ style: notificationComponentRef.current.staticContentContainerStyles.staticContentContainer,
361
+ dataSet: mediaIdsRef && {
362
+ media: mediaIdsRef.current.staticContentContainerIds.staticContentContainer
363
+ },
178
364
  children: [IconComponent && /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
179
- style: selectIconContainerStyles(themeTokens),
365
+ style: notificationComponentRef.current.iconContainerStyles.iconContainer,
366
+ dataSet: mediaIdsRef && {
367
+ media: mediaIdsRef.current.iconContainerIds.iconContainer
368
+ },
180
369
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(IconComponent, {
181
- ...selectIconProps(themeTokens)
370
+ ...notificationComponentRef.current.selectIconPropsStyles.selectIconProps
182
371
  })
183
372
  }), content && typeof content === 'function' ? content({
184
- textStyles,
373
+ textStyles: notificationComponentRef.current.textStyles.text,
185
374
  variant
186
375
  }) : content]
187
376
  }), dismissible && DismissIconComponent && /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
188
- style: selectDismissButtonContainerStyles(themeTokens),
377
+ style: notificationComponentRef.current.dismissButtonContainerStyles.dismissButtonContainer,
378
+ dataSet: mediaIdsRef && {
379
+ media: mediaIdsRef.current.dismissButtonContainerIds.dismissButtonContainer
380
+ },
189
381
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
190
382
  action: "close",
191
383
  onPress: onDismissPress,
@@ -197,7 +389,7 @@ const Notification = /*#__PURE__*/(0, _react.forwardRef)((_ref5, ref) => {
197
389
  size: 'small'
198
390
  },
199
391
  children: () => /*#__PURE__*/(0, _jsxRuntime.jsx)(DismissIconComponent, {
200
- ...selectDismissIconProps(themeTokens)
392
+ ...notificationComponentRef.current.selectDismissIconPropsStyles.selectDismissIconProps
201
393
  })
202
394
  })
203
395
  })]
@@ -229,18 +421,4 @@ Notification.propTypes = {
229
421
  variant: _utils.variantProp.propType
230
422
  };
231
423
  var _default = Notification;
232
- exports.default = _default;
233
- const staticStyles = _StyleSheet.default.create({
234
- container: {
235
- flexDirection: 'row'
236
- },
237
- contentContainer: {
238
- flexDirection: 'row',
239
- flexShrink: 1
240
- },
241
- content: {
242
- flexDirection: 'row',
243
- flexShrink: 1,
244
- justifyContent: 'space-between'
245
- }
246
- });
424
+ exports.default = _default;
@@ -15,12 +15,11 @@ const createStyleSheet = stylesWithQuery => {
15
15
  styles: {},
16
16
  fullStyles: {}
17
17
  };
18
- let cleanStyles;
19
18
  let ids = {};
19
+ const cleanStyles = (0, _common.deepClone)(stylesWithQuery);
20
20
  Object.keys(stylesWithQuery).forEach(key => {
21
21
  if (!(stylesWithQuery !== null && stylesWithQuery !== void 0 && stylesWithQuery[key])) return;
22
22
  const mediaQueriesAndPseudoClasses = Object.keys(stylesWithQuery[key]).filter(_common.isMediaOrPseudo);
23
- cleanStyles = (0, _common.deepClone)(stylesWithQuery);
24
23
  mediaQueriesAndPseudoClasses.forEach(query => {
25
24
  var _ids;
26
25
  const css = (0, _createDeclarationBlock.default)(stylesWithQuery[key][query]);
@@ -1,9 +1,8 @@
1
- import React, { forwardRef, useState } from 'react';
2
- import StyleSheet from "react-native-web/dist/exports/StyleSheet";
1
+ import React, { forwardRef, useState, useRef } from 'react';
3
2
  import View from "react-native-web/dist/exports/View";
4
3
  import PropTypes from 'prop-types';
5
- import { applyTextStyles, useTheme, useThemeTokens } from '../ThemeProvider';
6
- import { a11yProps, getTokensPropType, selectSystemProps, selectTokens, variantProp, viewProps, wrapStringsInText, useResponsiveProp } from '../utils';
4
+ import { applyTextStyles, useTheme, useThemeTokens, useResponsiveThemeTokens } from '../ThemeProvider';
5
+ import { a11yProps, getTokensPropType, selectSystemProps, selectTokens, variantProp, viewProps, wrapStringsInText, useResponsiveProp, createMediaQueryStyles, StyleSheet } from '../utils';
7
6
  import IconButton from '../IconButton';
8
7
  import useCopy from '../utils/useCopy';
9
8
  import dictionary from './dictionary';
@@ -67,6 +66,156 @@ const selectDismissButtonContainerStyles = _ref4 => {
67
66
  const selectContentContainerStyle = maxWidth => ({
68
67
  width: maxWidth || '100%'
69
68
  });
69
+ const getMediaQueryStyles = (themeTokens, themeOptions, viewport, mediaIdsRef, dismissible) => {
70
+ const transformedSelectContainerStyles = Object.entries(themeTokens).reduce((acc, _ref5) => {
71
+ let [vp, viewportTokens] = _ref5;
72
+ acc[vp] = selectContainerStyles({
73
+ ...viewportTokens
74
+ });
75
+ return acc;
76
+ }, {});
77
+ const selectContainerMediaQueryStyles = createMediaQueryStyles(transformedSelectContainerStyles);
78
+ const {
79
+ ids: containerIds,
80
+ styles: containerStyles
81
+ } = StyleSheet.create({
82
+ container: {
83
+ flexDirection: 'row',
84
+ ...selectContainerMediaQueryStyles
85
+ }
86
+ });
87
+ const {
88
+ ids: contentContainerIds,
89
+ styles: contentContainerStyles
90
+ } = StyleSheet.create({
91
+ contentContainer: {
92
+ flexDirection: 'row',
93
+ flexShrink: 1,
94
+ justifyContent: 'space-between',
95
+ ...createMediaQueryStyles({
96
+ xs: {
97
+ width: (themeOptions === null || themeOptions === void 0 ? void 0 : themeOptions.contentMaxWidth.xs) || '100%'
98
+ },
99
+ md: {
100
+ width: (themeOptions === null || themeOptions === void 0 ? void 0 : themeOptions.contentMaxWidth.md) || '100%'
101
+ },
102
+ lg: {
103
+ width: (themeOptions === null || themeOptions === void 0 ? void 0 : themeOptions.contentMaxWidth.lg) || '100%'
104
+ },
105
+ sm: {
106
+ width: (themeOptions === null || themeOptions === void 0 ? void 0 : themeOptions.contentMaxWidth.sm) || '100%'
107
+ },
108
+ xl: {
109
+ width: (themeOptions === null || themeOptions === void 0 ? void 0 : themeOptions.contentMaxWidth.xl) || '100%'
110
+ }
111
+ })
112
+ }
113
+ });
114
+ const {
115
+ ids: staticContentContainerIds,
116
+ styles: staticContentContainerStyles
117
+ } = StyleSheet.create({
118
+ staticContentContainer: {
119
+ flexDirection: 'row',
120
+ flexShrink: 1
121
+ }
122
+ });
123
+ const {
124
+ ids: iconContainerIds,
125
+ styles: iconContainerStyles
126
+ } = StyleSheet.create({
127
+ iconContainer: selectIconContainerStyles(themeTokens[viewport])
128
+ });
129
+ const {
130
+ ids: dismissButtonContainerIds,
131
+ styles: dismissButtonContainerStyles
132
+ } = StyleSheet.create({
133
+ dismissButtonContainer: selectDismissButtonContainerStyles(themeTokens[viewport])
134
+ });
135
+ const {
136
+ ids: textIds,
137
+ styles: textStyles
138
+ } = StyleSheet.create({
139
+ text: selectTextStyles(themeTokens[viewport], themeOptions, dismissible)
140
+ });
141
+ const {
142
+ styles: selectIconPropsStyles
143
+ } = StyleSheet.create({
144
+ selectIconProps: selectIconProps(themeTokens[viewport])
145
+ });
146
+ const {
147
+ styles: selectDismissIconPropsStyles
148
+ } = StyleSheet.create({
149
+ selectDismissIconProps: selectDismissIconProps(themeTokens[viewport])
150
+ });
151
+
152
+ // eslint-disable-next-line no-param-reassign
153
+ mediaIdsRef.current = {
154
+ containerIds,
155
+ contentContainerIds,
156
+ staticContentContainerIds,
157
+ iconContainerIds,
158
+ dismissButtonContainerIds,
159
+ textIds
160
+ };
161
+ return {
162
+ containerStyles,
163
+ contentContainerStyles,
164
+ staticContentContainerStyles,
165
+ iconContainerStyles,
166
+ dismissButtonContainerStyles,
167
+ textStyles,
168
+ selectIconPropsStyles,
169
+ selectDismissIconPropsStyles
170
+ };
171
+ };
172
+ const getDefaultStyles = (themeTokens, themeOptions, maxWidth, dismissible) => ({
173
+ containerStyles: {
174
+ container: {
175
+ flexDirection: 'row',
176
+ ...selectContainerStyles(themeTokens)
177
+ }
178
+ },
179
+ contentContainerStyles: {
180
+ contentContainer: {
181
+ flexDirection: 'row',
182
+ flexShrink: 1,
183
+ justifyContent: 'space-between',
184
+ ...selectContentContainerStyle(maxWidth)
185
+ }
186
+ },
187
+ staticContentContainerStyles: {
188
+ staticContentContainer: {
189
+ flexDirection: 'row',
190
+ flexShrink: 1
191
+ }
192
+ },
193
+ iconContainerStyles: {
194
+ iconContainer: {
195
+ ...selectIconContainerStyles(themeTokens)
196
+ }
197
+ },
198
+ dismissButtonContainerStyles: {
199
+ dismissButtonContainer: {
200
+ ...selectDismissButtonContainerStyles(themeTokens)
201
+ }
202
+ },
203
+ textStyles: {
204
+ text: {
205
+ ...selectTextStyles(themeTokens, themeOptions, dismissible)
206
+ }
207
+ },
208
+ selectIconPropsStyles: {
209
+ selectIconProps: {
210
+ ...selectIconProps(themeTokens)
211
+ }
212
+ },
213
+ selectDismissIconPropsStyles: {
214
+ selectDismissIconProps: {
215
+ ...selectDismissIconProps(themeTokens)
216
+ }
217
+ }
218
+ });
70
219
 
71
220
  /**
72
221
  * A banner that highlights important messages:
@@ -119,7 +268,7 @@ const selectContentContainerStyle = maxWidth => ({
119
268
  * Use full-width `Notifications` to show system-based messages coming from the application, not in response to user action.
120
269
  * Show system notifications at the top of the page, below the navigation, and expands the full-width of the viewport
121
270
  */
122
- const Notification = /*#__PURE__*/forwardRef((_ref5, ref) => {
271
+ const Notification = /*#__PURE__*/forwardRef((_ref6, ref) => {
123
272
  let {
124
273
  children,
125
274
  system,
@@ -128,13 +277,9 @@ const Notification = /*#__PURE__*/forwardRef((_ref5, ref) => {
128
277
  tokens,
129
278
  variant,
130
279
  ...rest
131
- } = _ref5;
280
+ } = _ref6;
132
281
  const [isDismissed, setIsDismissed] = useState(false);
133
282
  const viewport = useViewport();
134
- const themeTokens = useThemeTokens('Notification', tokens, variant, {
135
- system,
136
- viewport
137
- });
138
283
  const getCopy = useCopy({
139
284
  dictionary,
140
285
  copy
@@ -142,42 +287,89 @@ const Notification = /*#__PURE__*/forwardRef((_ref5, ref) => {
142
287
  const {
143
288
  themeOptions
144
289
  } = useTheme();
145
- const contentMaxWidth = useResponsiveProp(themeOptions === null || themeOptions === void 0 ? void 0 : themeOptions.contentMaxWidth);
290
+ const {
291
+ enableMediaQueryStyleSheet
292
+ } = themeOptions;
293
+ const useTokens = enableMediaQueryStyleSheet ? useResponsiveThemeTokens : useThemeTokens;
294
+ const themeTokens = useTokens('Notification', tokens, variant, {
295
+ system,
296
+ viewport
297
+ });
298
+ const maxWidth = useResponsiveProp(themeOptions === null || themeOptions === void 0 ? void 0 : themeOptions.contentMaxWidth);
299
+ const notificationComponentRef = useRef({
300
+ containerStyles: {},
301
+ contentContainerStyles: {},
302
+ staticContentContainerStyles: {},
303
+ iconContainerStyles: {},
304
+ dismissButtonContainerStyles: {},
305
+ textStyles: {},
306
+ selectIconPropsStyles: {},
307
+ selectDismissIconPropsStyles: {}
308
+ });
309
+ const mediaIdsRef = useRef({
310
+ containerIds: {},
311
+ contentContainerIds: {},
312
+ staticContentContainerIds: {},
313
+ iconContainerIds: {},
314
+ dismissButtonContainerIds: {},
315
+ textIds: {},
316
+ selectIconPropsIds: {},
317
+ selectDismissIconPropsIds: {}
318
+ });
319
+ if (enableMediaQueryStyleSheet) {
320
+ notificationComponentRef.current = getMediaQueryStyles(themeTokens, themeOptions, viewport, mediaIdsRef, dismissible);
321
+ } else {
322
+ notificationComponentRef.current = getDefaultStyles(themeTokens, themeOptions, maxWidth, dismissible);
323
+ }
146
324
  if (isDismissed) {
147
325
  return null;
148
326
  }
149
- const textStyles = selectTextStyles(themeTokens, themeOptions, dismissible);
150
327
  const content = wrapStringsInText(typeof children === 'function' ? children({
151
- textStyles,
328
+ textStyles: notificationComponentRef.current.textStyles.text,
152
329
  variant
153
330
  }) : children, {
154
- style: textStyles
331
+ style: notificationComponentRef.current.textStyles.text
155
332
  });
156
333
  const {
157
334
  icon: IconComponent,
158
335
  dismissIcon: DismissIconComponent,
159
336
  dismissIconColor
160
- } = themeTokens;
337
+ } = enableMediaQueryStyleSheet === false ? themeTokens : themeTokens[viewport];
161
338
  const onDismissPress = () => setIsDismissed(true);
162
339
  return /*#__PURE__*/_jsx(View, {
163
340
  ref: ref,
164
- style: [staticStyles.container, selectContainerStyles(themeTokens)],
341
+ style: notificationComponentRef.current.containerStyles.container,
342
+ dataSet: mediaIdsRef && {
343
+ media: mediaIdsRef.current.containerIds.container
344
+ },
165
345
  ...selectProps(rest),
166
346
  children: /*#__PURE__*/_jsxs(View, {
167
- style: [staticStyles.content, selectContentContainerStyle(contentMaxWidth)],
347
+ style: notificationComponentRef.current.contentContainerStyles.contentContainer,
348
+ dataSet: mediaIdsRef && {
349
+ media: mediaIdsRef.current.contentContainerIds.contentContainer
350
+ },
168
351
  children: [/*#__PURE__*/_jsxs(View, {
169
- style: staticStyles.contentContainer,
352
+ style: notificationComponentRef.current.staticContentContainerStyles.staticContentContainer,
353
+ dataSet: mediaIdsRef && {
354
+ media: mediaIdsRef.current.staticContentContainerIds.staticContentContainer
355
+ },
170
356
  children: [IconComponent && /*#__PURE__*/_jsx(View, {
171
- style: selectIconContainerStyles(themeTokens),
357
+ style: notificationComponentRef.current.iconContainerStyles.iconContainer,
358
+ dataSet: mediaIdsRef && {
359
+ media: mediaIdsRef.current.iconContainerIds.iconContainer
360
+ },
172
361
  children: /*#__PURE__*/_jsx(IconComponent, {
173
- ...selectIconProps(themeTokens)
362
+ ...notificationComponentRef.current.selectIconPropsStyles.selectIconProps
174
363
  })
175
364
  }), content && typeof content === 'function' ? content({
176
- textStyles,
365
+ textStyles: notificationComponentRef.current.textStyles.text,
177
366
  variant
178
367
  }) : content]
179
368
  }), dismissible && DismissIconComponent && /*#__PURE__*/_jsx(View, {
180
- style: selectDismissButtonContainerStyles(themeTokens),
369
+ style: notificationComponentRef.current.dismissButtonContainerStyles.dismissButtonContainer,
370
+ dataSet: mediaIdsRef && {
371
+ media: mediaIdsRef.current.dismissButtonContainerIds.dismissButtonContainer
372
+ },
181
373
  children: /*#__PURE__*/_jsx(IconButton, {
182
374
  action: "close",
183
375
  onPress: onDismissPress,
@@ -189,7 +381,7 @@ const Notification = /*#__PURE__*/forwardRef((_ref5, ref) => {
189
381
  size: 'small'
190
382
  },
191
383
  children: () => /*#__PURE__*/_jsx(DismissIconComponent, {
192
- ...selectDismissIconProps(themeTokens)
384
+ ...notificationComponentRef.current.selectDismissIconPropsStyles.selectDismissIconProps
193
385
  })
194
386
  })
195
387
  })]
@@ -220,18 +412,4 @@ Notification.propTypes = {
220
412
  tokens: getTokensPropType('Notification'),
221
413
  variant: variantProp.propType
222
414
  };
223
- export default Notification;
224
- const staticStyles = StyleSheet.create({
225
- container: {
226
- flexDirection: 'row'
227
- },
228
- contentContainer: {
229
- flexDirection: 'row',
230
- flexShrink: 1
231
- },
232
- content: {
233
- flexDirection: 'row',
234
- flexShrink: 1,
235
- justifyContent: 'space-between'
236
- }
237
- });
415
+ export default Notification;
@@ -8,12 +8,11 @@ const createStyleSheet = stylesWithQuery => {
8
8
  styles: {},
9
9
  fullStyles: {}
10
10
  };
11
- let cleanStyles;
12
11
  let ids = {};
12
+ const cleanStyles = deepClone(stylesWithQuery);
13
13
  Object.keys(stylesWithQuery).forEach(key => {
14
14
  if (!(stylesWithQuery !== null && stylesWithQuery !== void 0 && stylesWithQuery[key])) return;
15
15
  const mediaQueriesAndPseudoClasses = Object.keys(stylesWithQuery[key]).filter(isMediaOrPseudo);
16
- cleanStyles = deepClone(stylesWithQuery);
17
16
  mediaQueriesAndPseudoClasses.forEach(query => {
18
17
  var _ids;
19
18
  const css = createDeclarationBlock(stylesWithQuery[key][query]);
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "@floating-ui/react-native": "^0.8.1",
12
12
  "@gorhom/portal": "^1.0.14",
13
13
  "@telus-uds/system-constants": "^1.3.0",
14
- "@telus-uds/system-theme-tokens": "^2.50.0",
14
+ "@telus-uds/system-theme-tokens": "^2.50.1",
15
15
  "airbnb-prop-types": "^2.16.0",
16
16
  "css-mediaquery": "^0.1.2",
17
17
  "expo-linear-gradient": "^12.5.0",
@@ -85,5 +85,5 @@
85
85
  "standard-engine": {
86
86
  "skip": true
87
87
  },
88
- "version": "1.74.0"
88
+ "version": "1.75.0"
89
89
  }
@@ -1,8 +1,13 @@
1
- import React, { forwardRef, useState } from 'react'
2
- import { StyleSheet, View } from 'react-native'
1
+ import React, { forwardRef, useState, useRef } from 'react'
2
+ import { View } from 'react-native'
3
3
 
4
4
  import PropTypes from 'prop-types'
5
- import { applyTextStyles, useTheme, useThemeTokens } from '../ThemeProvider'
5
+ import {
6
+ applyTextStyles,
7
+ useTheme,
8
+ useThemeTokens,
9
+ useResponsiveThemeTokens
10
+ } from '../ThemeProvider'
6
11
  import {
7
12
  a11yProps,
8
13
  getTokensPropType,
@@ -11,7 +16,9 @@ import {
11
16
  variantProp,
12
17
  viewProps,
13
18
  wrapStringsInText,
14
- useResponsiveProp
19
+ useResponsiveProp,
20
+ createMediaQueryStyles,
21
+ StyleSheet
15
22
  } from '../utils'
16
23
  import IconButton from '../IconButton'
17
24
  import useCopy from '../utils/useCopy'
@@ -61,6 +68,110 @@ const selectContentContainerStyle = (maxWidth) => ({
61
68
  width: maxWidth || '100%'
62
69
  })
63
70
 
71
+ const getMediaQueryStyles = (themeTokens, themeOptions, viewport, mediaIdsRef, dismissible) => {
72
+ const transformedSelectContainerStyles = Object.entries(themeTokens).reduce(
73
+ (acc, [vp, viewportTokens]) => {
74
+ acc[vp] = selectContainerStyles({ ...viewportTokens })
75
+ return acc
76
+ },
77
+ {}
78
+ )
79
+
80
+ const selectContainerMediaQueryStyles = createMediaQueryStyles(transformedSelectContainerStyles)
81
+
82
+ const { ids: containerIds, styles: containerStyles } = StyleSheet.create({
83
+ container: { flexDirection: 'row', ...selectContainerMediaQueryStyles }
84
+ })
85
+
86
+ const { ids: contentContainerIds, styles: contentContainerStyles } = StyleSheet.create({
87
+ contentContainer: {
88
+ flexDirection: 'row',
89
+ flexShrink: 1,
90
+ justifyContent: 'space-between',
91
+ ...createMediaQueryStyles({
92
+ xs: { width: themeOptions?.contentMaxWidth.xs || '100%' },
93
+ md: { width: themeOptions?.contentMaxWidth.md || '100%' },
94
+ lg: { width: themeOptions?.contentMaxWidth.lg || '100%' },
95
+ sm: { width: themeOptions?.contentMaxWidth.sm || '100%' },
96
+ xl: { width: themeOptions?.contentMaxWidth.xl || '100%' }
97
+ })
98
+ }
99
+ })
100
+
101
+ const { ids: staticContentContainerIds, styles: staticContentContainerStyles } =
102
+ StyleSheet.create({
103
+ staticContentContainer: { flexDirection: 'row', flexShrink: 1 }
104
+ })
105
+
106
+ const { ids: iconContainerIds, styles: iconContainerStyles } = StyleSheet.create({
107
+ iconContainer: selectIconContainerStyles(themeTokens[viewport])
108
+ })
109
+
110
+ const { ids: dismissButtonContainerIds, styles: dismissButtonContainerStyles } =
111
+ StyleSheet.create({
112
+ dismissButtonContainer: selectDismissButtonContainerStyles(themeTokens[viewport])
113
+ })
114
+
115
+ const { ids: textIds, styles: textStyles } = StyleSheet.create({
116
+ text: selectTextStyles(themeTokens[viewport], themeOptions, dismissible)
117
+ })
118
+
119
+ const { styles: selectIconPropsStyles } = StyleSheet.create({
120
+ selectIconProps: selectIconProps(themeTokens[viewport])
121
+ })
122
+
123
+ const { styles: selectDismissIconPropsStyles } = StyleSheet.create({
124
+ selectDismissIconProps: selectDismissIconProps(themeTokens[viewport])
125
+ })
126
+
127
+ // eslint-disable-next-line no-param-reassign
128
+ mediaIdsRef.current = {
129
+ containerIds,
130
+ contentContainerIds,
131
+ staticContentContainerIds,
132
+ iconContainerIds,
133
+ dismissButtonContainerIds,
134
+ textIds
135
+ }
136
+
137
+ return {
138
+ containerStyles,
139
+ contentContainerStyles,
140
+ staticContentContainerStyles,
141
+ iconContainerStyles,
142
+ dismissButtonContainerStyles,
143
+ textStyles,
144
+ selectIconPropsStyles,
145
+ selectDismissIconPropsStyles
146
+ }
147
+ }
148
+
149
+ const getDefaultStyles = (themeTokens, themeOptions, maxWidth, dismissible) => ({
150
+ containerStyles: {
151
+ container: { flexDirection: 'row', ...selectContainerStyles(themeTokens) }
152
+ },
153
+ contentContainerStyles: {
154
+ contentContainer: {
155
+ flexDirection: 'row',
156
+ flexShrink: 1,
157
+ justifyContent: 'space-between',
158
+ ...selectContentContainerStyle(maxWidth)
159
+ }
160
+ },
161
+ staticContentContainerStyles: {
162
+ staticContentContainer: { flexDirection: 'row', flexShrink: 1 }
163
+ },
164
+ iconContainerStyles: { iconContainer: { ...selectIconContainerStyles(themeTokens) } },
165
+ dismissButtonContainerStyles: {
166
+ dismissButtonContainer: { ...selectDismissButtonContainerStyles(themeTokens) }
167
+ },
168
+ textStyles: { text: { ...selectTextStyles(themeTokens, themeOptions, dismissible) } },
169
+ selectIconPropsStyles: { selectIconProps: { ...selectIconProps(themeTokens) } },
170
+ selectDismissIconPropsStyles: {
171
+ selectDismissIconProps: { ...selectDismissIconProps(themeTokens) }
172
+ }
173
+ })
174
+
64
175
  /**
65
176
  * A banner that highlights important messages:
66
177
  * - Status message to show there is an error or outage of services
@@ -116,43 +227,121 @@ const Notification = forwardRef(
116
227
  ({ children, system, dismissible, copy = 'en', tokens, variant, ...rest }, ref) => {
117
228
  const [isDismissed, setIsDismissed] = useState(false)
118
229
  const viewport = useViewport()
119
- const themeTokens = useThemeTokens('Notification', tokens, variant, { system, viewport })
120
230
  const getCopy = useCopy({ dictionary, copy })
231
+
121
232
  const { themeOptions } = useTheme()
122
- const contentMaxWidth = useResponsiveProp(themeOptions?.contentMaxWidth)
233
+ const { enableMediaQueryStyleSheet } = themeOptions
234
+ const useTokens = enableMediaQueryStyleSheet ? useResponsiveThemeTokens : useThemeTokens
235
+ const themeTokens = useTokens('Notification', tokens, variant, { system, viewport })
236
+ const maxWidth = useResponsiveProp(themeOptions?.contentMaxWidth)
237
+
238
+ const notificationComponentRef = useRef({
239
+ containerStyles: {},
240
+ contentContainerStyles: {},
241
+ staticContentContainerStyles: {},
242
+ iconContainerStyles: {},
243
+ dismissButtonContainerStyles: {},
244
+ textStyles: {},
245
+ selectIconPropsStyles: {},
246
+ selectDismissIconPropsStyles: {}
247
+ })
248
+ const mediaIdsRef = useRef({
249
+ containerIds: {},
250
+ contentContainerIds: {},
251
+ staticContentContainerIds: {},
252
+ iconContainerIds: {},
253
+ dismissButtonContainerIds: {},
254
+ textIds: {},
255
+ selectIconPropsIds: {},
256
+ selectDismissIconPropsIds: {}
257
+ })
258
+
259
+ if (enableMediaQueryStyleSheet) {
260
+ notificationComponentRef.current = getMediaQueryStyles(
261
+ themeTokens,
262
+ themeOptions,
263
+ viewport,
264
+ mediaIdsRef,
265
+ dismissible
266
+ )
267
+ } else {
268
+ notificationComponentRef.current = getDefaultStyles(
269
+ themeTokens,
270
+ themeOptions,
271
+ maxWidth,
272
+ dismissible
273
+ )
274
+ }
123
275
 
124
276
  if (isDismissed) {
125
277
  return null
126
278
  }
127
279
 
128
- const textStyles = selectTextStyles(themeTokens, themeOptions, dismissible)
129
-
130
280
  const content = wrapStringsInText(
131
- typeof children === 'function' ? children({ textStyles, variant }) : children,
132
- { style: textStyles }
281
+ typeof children === 'function'
282
+ ? children({ textStyles: notificationComponentRef.current.textStyles.text, variant })
283
+ : children,
284
+ { style: notificationComponentRef.current.textStyles.text }
133
285
  )
134
286
 
135
- const { icon: IconComponent, dismissIcon: DismissIconComponent, dismissIconColor } = themeTokens
287
+ const {
288
+ icon: IconComponent,
289
+ dismissIcon: DismissIconComponent,
290
+ dismissIconColor
291
+ } = enableMediaQueryStyleSheet === false ? themeTokens : themeTokens[viewport]
136
292
 
137
293
  const onDismissPress = () => setIsDismissed(true)
138
294
 
139
295
  return (
140
296
  <View
141
297
  ref={ref}
142
- style={[staticStyles.container, selectContainerStyles(themeTokens)]}
298
+ style={notificationComponentRef.current.containerStyles.container}
299
+ dataSet={mediaIdsRef && { media: mediaIdsRef.current.containerIds.container }}
143
300
  {...selectProps(rest)}
144
301
  >
145
- <View style={[staticStyles.content, selectContentContainerStyle(contentMaxWidth)]}>
146
- <View style={staticStyles.contentContainer}>
302
+ <View
303
+ style={notificationComponentRef.current.contentContainerStyles.contentContainer}
304
+ dataSet={
305
+ mediaIdsRef && { media: mediaIdsRef.current.contentContainerIds.contentContainer }
306
+ }
307
+ >
308
+ <View
309
+ style={
310
+ notificationComponentRef.current.staticContentContainerStyles.staticContentContainer
311
+ }
312
+ dataSet={
313
+ mediaIdsRef && {
314
+ media: mediaIdsRef.current.staticContentContainerIds.staticContentContainer
315
+ }
316
+ }
317
+ >
147
318
  {IconComponent && (
148
- <View style={selectIconContainerStyles(themeTokens)}>
149
- <IconComponent {...selectIconProps(themeTokens)} />
319
+ <View
320
+ style={notificationComponentRef.current.iconContainerStyles.iconContainer}
321
+ dataSet={
322
+ mediaIdsRef && { media: mediaIdsRef.current.iconContainerIds.iconContainer }
323
+ }
324
+ >
325
+ <IconComponent
326
+ {...notificationComponentRef.current.selectIconPropsStyles.selectIconProps}
327
+ />
150
328
  </View>
151
329
  )}
152
- {content && typeof content === 'function' ? content({ textStyles, variant }) : content}
330
+ {content && typeof content === 'function'
331
+ ? content({ textStyles: notificationComponentRef.current.textStyles.text, variant })
332
+ : content}
153
333
  </View>
154
334
  {dismissible && DismissIconComponent && (
155
- <View style={selectDismissButtonContainerStyles(themeTokens)}>
335
+ <View
336
+ style={
337
+ notificationComponentRef.current.dismissButtonContainerStyles.dismissButtonContainer
338
+ }
339
+ dataSet={
340
+ mediaIdsRef && {
341
+ media: mediaIdsRef.current.dismissButtonContainerIds.dismissButtonContainer
342
+ }
343
+ }
344
+ >
156
345
  <IconButton
157
346
  action="close"
158
347
  onPress={onDismissPress}
@@ -161,7 +350,12 @@ const Notification = forwardRef(
161
350
  accessibilityLabel={getCopy('dismiss')}
162
351
  variant={{ inverse: dismissIconColor === '#ffffff', size: 'small' }}
163
352
  >
164
- {() => <DismissIconComponent {...selectDismissIconProps(themeTokens)} />}
353
+ {() => (
354
+ <DismissIconComponent
355
+ {...notificationComponentRef.current.selectDismissIconPropsStyles
356
+ .selectDismissIconProps}
357
+ />
358
+ )}
165
359
  </IconButton>
166
360
  </View>
167
361
  )}
@@ -198,18 +392,3 @@ Notification.propTypes = {
198
392
  }
199
393
 
200
394
  export default Notification
201
-
202
- const staticStyles = StyleSheet.create({
203
- container: {
204
- flexDirection: 'row'
205
- },
206
- contentContainer: {
207
- flexDirection: 'row',
208
- flexShrink: 1
209
- },
210
- content: {
211
- flexDirection: 'row',
212
- flexShrink: 1,
213
- justifyContent: 'space-between'
214
- }
215
- })
@@ -5,13 +5,14 @@ import { isMediaOrPseudo, deepClone, createCssRule } from '../utils/common'
5
5
 
6
6
  const createStyleSheet = (stylesWithQuery) => {
7
7
  if (!stylesWithQuery) return { ids: {}, styles: {}, fullStyles: {} }
8
- let cleanStyles
8
+
9
9
  let ids = {}
10
+ const cleanStyles = deepClone(stylesWithQuery)
11
+
10
12
  Object.keys(stylesWithQuery).forEach((key) => {
11
13
  if (!stylesWithQuery?.[key]) return
12
14
 
13
15
  const mediaQueriesAndPseudoClasses = Object.keys(stylesWithQuery[key]).filter(isMediaOrPseudo)
14
- cleanStyles = deepClone(stylesWithQuery)
15
16
  mediaQueriesAndPseudoClasses.forEach((query) => {
16
17
  const css = createDeclarationBlock(stylesWithQuery[key][query])
17
18
  const stringHash = `rnmq-${hash(`${key}${query}${css}`)}`