@react-md/core 1.0.0-next.1 → 1.0.0-next.2

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 (138) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +8 -0
  3. package/coverage/clover.xml +2 -2
  4. package/coverage/lcov-report/DefaultToastRenderer.tsx.html +166 -112
  5. package/coverage/lcov-report/Snackbar.tsx.html +360 -402
  6. package/coverage/lcov-report/Toast.tsx.html +868 -0
  7. package/coverage/lcov-report/ToastManager.tsx.html +1783 -0
  8. package/coverage/lcov-report/ToastManagerProvider.tsx.html +216 -216
  9. package/coverage/lcov-report/icon/FontIcon.tsx.html +28 -28
  10. package/coverage/lcov-report/icon/index.html +1 -1
  11. package/coverage/lcov-report/index.html +1 -1
  12. package/coverage/lcov-report/snackbar/Snackbar.tsx.html +55 -97
  13. package/coverage/lcov-report/snackbar/Toast.tsx.html +546 -501
  14. package/coverage/lcov-report/snackbar/ToastManager.tsx.html +269 -269
  15. package/coverage/lcov-report/snackbar/ToastManagerProvider.tsx.html +23 -23
  16. package/coverage/lcov-report/snackbar/index.html +59 -14
  17. package/coverage/lcov-report/snackbar/snackbarStyles.ts.html +12 -87
  18. package/coverage/lcov-report/snackbar/toastStyles.ts.html +206 -146
  19. package/coverage/lcov-report/snackbar/useCurrentToastActions.ts.html +226 -0
  20. package/coverage/lcov-report/snackbarStyles.ts.html +46 -121
  21. package/coverage/lcov-report/transition/config.ts.html +5 -5
  22. package/coverage/lcov-report/transition/index.html +1 -1
  23. package/coverage/lcov-report/typography/Typography.tsx.html +108 -402
  24. package/coverage/lcov-report/typography/index.html +10 -10
  25. package/dist/_core.scss +34 -1
  26. package/dist/_utils.scss +57 -0
  27. package/dist/app-bar/_app-bar.scss +15 -23
  28. package/dist/avatar/_avatar.scss +25 -34
  29. package/dist/badge/_badge.scss +71 -44
  30. package/dist/box/_box.scss +18 -29
  31. package/dist/button/_button.scss +50 -62
  32. package/dist/card/_card.scss +14 -23
  33. package/dist/chip/_chip.scss +33 -46
  34. package/dist/dialog/_dialog.scss +95 -93
  35. package/dist/divider/Divider.d.ts +0 -1
  36. package/dist/divider/Divider.js.map +1 -1
  37. package/dist/divider/_divider.scss +33 -43
  38. package/dist/form/Label.d.ts +5 -5
  39. package/dist/form/Label.js.map +1 -1
  40. package/dist/form/TextArea.js +1 -1
  41. package/dist/form/TextArea.js.map +1 -1
  42. package/dist/form/TextFieldContainerStyles.d.ts +7 -7
  43. package/dist/form/TextFieldContainerStyles.js.map +1 -1
  44. package/dist/form/_form.scss +200 -203
  45. package/dist/form/textAreaStyles.d.ts +2 -2
  46. package/dist/form/textAreaStyles.js.map +1 -1
  47. package/dist/form/types.d.ts +0 -2
  48. package/dist/form/types.js.map +1 -1
  49. package/dist/icon/_icon.scss +31 -47
  50. package/dist/interaction/_interaction.scss +47 -57
  51. package/dist/layout/_layout.scss +14 -19
  52. package/dist/link/_link.scss +15 -23
  53. package/dist/list/_list.scss +53 -63
  54. package/dist/menu/_menu.scss +16 -27
  55. package/dist/overlay/_overlay.scss +14 -19
  56. package/dist/progress/_progress.scss +25 -30
  57. package/dist/segmented-button/_segmented-button.scss +32 -43
  58. package/dist/sheet/_sheet.scss +24 -42
  59. package/dist/snackbar/DefaultToastRenderer.js +1 -1
  60. package/dist/snackbar/DefaultToastRenderer.js.map +1 -1
  61. package/dist/snackbar/Snackbar.d.ts +1 -3
  62. package/dist/snackbar/Snackbar.js +2 -3
  63. package/dist/snackbar/Snackbar.js.map +1 -1
  64. package/dist/snackbar/Toast.d.ts +1 -1
  65. package/dist/snackbar/Toast.js +5 -1
  66. package/dist/snackbar/Toast.js.map +1 -1
  67. package/dist/snackbar/ToastManager.d.ts +2 -1
  68. package/dist/snackbar/ToastManager.js +1 -1
  69. package/dist/snackbar/ToastManager.js.map +1 -1
  70. package/dist/snackbar/_snackbar.scss +15 -23
  71. package/dist/table/_table.scss +55 -70
  72. package/dist/tabs/_tabs.scss +25 -30
  73. package/dist/theme/_theme.scss +31 -89
  74. package/dist/tooltip/_tooltip.scss +16 -25
  75. package/dist/transition/_transition.scss +38 -37
  76. package/dist/tree/_tree.scss +102 -109
  77. package/dist/typography/_typography.scss +17 -22
  78. package/dist/window-splitter/_window-splitter.scss +19 -45
  79. package/package.json +1 -1
  80. package/src/_core.scss +34 -1
  81. package/src/_utils.scss +57 -0
  82. package/src/app-bar/_app-bar.scss +15 -23
  83. package/src/avatar/_avatar.scss +25 -34
  84. package/src/badge/_badge.scss +71 -44
  85. package/src/box/_box.scss +18 -29
  86. package/src/button/_button.scss +50 -62
  87. package/src/card/_card.scss +14 -23
  88. package/src/chip/_chip.scss +33 -46
  89. package/src/dialog/_dialog.scss +95 -93
  90. package/src/divider/Divider.tsx +0 -1
  91. package/src/divider/_divider.scss +33 -43
  92. package/src/form/Label.tsx +5 -5
  93. package/src/form/TextArea.tsx +1 -1
  94. package/src/form/TextFieldContainerStyles.ts +7 -7
  95. package/src/form/_form.scss +200 -203
  96. package/src/form/textAreaStyles.ts +2 -2
  97. package/src/form/types.ts +0 -2
  98. package/src/icon/_icon.scss +31 -47
  99. package/src/interaction/_interaction.scss +47 -57
  100. package/src/layout/_layout.scss +14 -19
  101. package/src/link/_link.scss +15 -23
  102. package/src/list/_list.scss +53 -63
  103. package/src/menu/_menu.scss +16 -27
  104. package/src/overlay/_overlay.scss +14 -19
  105. package/src/progress/_progress.scss +25 -30
  106. package/src/segmented-button/_segmented-button.scss +32 -43
  107. package/src/sheet/_sheet.scss +24 -42
  108. package/src/snackbar/DefaultToastRenderer.tsx +1 -1
  109. package/src/snackbar/Snackbar.tsx +17 -25
  110. package/src/snackbar/Toast.tsx +7 -2
  111. package/src/snackbar/ToastManager.tsx +3 -2
  112. package/src/snackbar/__tests__/Snackbar.tsx +12 -11
  113. package/src/snackbar/__tests__/ToastManagerProvider.tsx +20 -42
  114. package/src/snackbar/__tests__/__snapshots__/Snackbar.tsx.snap +127 -27
  115. package/src/snackbar/__tests__/__snapshots__/ToastManagerProvider.tsx.snap +23 -8
  116. package/src/snackbar/_snackbar.scss +15 -23
  117. package/src/table/_table.scss +55 -70
  118. package/src/tabs/_tabs.scss +25 -30
  119. package/src/theme/_theme.scss +31 -89
  120. package/src/tooltip/_tooltip.scss +16 -25
  121. package/src/transition/_transition.scss +38 -37
  122. package/src/tree/_tree.scss +102 -109
  123. package/src/typography/_typography.scss +17 -22
  124. package/src/window-splitter/_window-splitter.scss +19 -45
  125. package/.turbo/turbo-lint.log +0 -12
  126. package/.turbo/turbo-test.log +0 -166
  127. package/.turbo/turbo-typecheck.log +0 -4
  128. package/dist/divider/VerticalDivider.d.ts +0 -32
  129. package/dist/divider/useVerticalDividerHeight.d.ts +0 -37
  130. package/dist/icon/MaterialIconsProvider.d.ts +0 -12
  131. package/dist/icon/MaterialIconsProvider.js +0 -17
  132. package/dist/icon/MaterialIconsProvider.js.map +0 -1
  133. package/dist/icon/MaterialSymbolsProvider.d.ts +0 -145
  134. package/dist/icon/MaterialSymbolsProvider.js +0 -60
  135. package/dist/icon/MaterialSymbolsProvider.js.map +0 -1
  136. package/dist/link/LinkProvider.d.ts +0 -29
  137. package/dist/menu/menuConfig.d.ts +0 -60
  138. package/dist/tooltip/useOverflowTooltip.d.ts +0 -61
@@ -206,45 +206,27 @@ $linear-vertical-reverse-short-styles: (
206
206
  ),
207
207
  ) !default;
208
208
 
209
- $var-lookup: (
210
- background-color: (
211
- var: --rmd-progress-background-color,
212
- value: $background-color,
213
- ),
214
- color: (
215
- var: --rmd-progress-color,
216
- value: $color,
217
- ),
218
- circular-size: (
219
- var: --rmd-progress-circular-size,
220
- value: $circular-size,
221
- ),
222
- circular-stroke-width: (
223
- var: --rmd-progress-circular-width,
224
- value: $circular-stroke-width,
225
- ),
226
- linear-size: (
227
- var: --rmd-progress-linear-size,
228
- value: $linear-size,
229
- ),
209
+ $variables: (
210
+ background-color,
211
+ color,
212
+ circular-size,
213
+ circular-stroke-width,
214
+ linear-size
230
215
  );
231
216
 
232
217
  @function get-var($name, $fallback: null) {
233
- $found: utils.validate($var-lookup, $name, "progress var");
234
- $var: map.get($found, var);
235
- $value: if($fallback, $fallback, map.get($found, value));
236
-
237
- @if $value {
238
- @return var(#{$var}, #{$value});
218
+ $var: utils.get-var-name($variables, $name, "progress");
219
+ @if $fallback {
220
+ @return var(#{$var}, #{$fallback});
239
221
  }
240
222
 
241
223
  @return var(#{$var});
242
224
  }
243
225
 
244
226
  @mixin set-var($name, $value) {
245
- $var: map.get(utils.validate($var-lookup, $name, "progress var"), var);
246
-
247
- #{$var}: #{$value};
227
+ @if $value {
228
+ #{utils.get-var-name($variables, $name, "progress")}: #{$value};
229
+ }
248
230
  }
249
231
 
250
232
  @mixin use-var($property, $name: $property, $fallback: null) {
@@ -566,6 +548,19 @@ $var-lookup: (
566
548
  }
567
549
  }
568
550
 
551
+ @mixin variables {
552
+ @if not $disable-circular {
553
+ @include set-var(circular-size, $circular-size);
554
+ @include set-var(circular-stroke-width, $circular-stroke-width);
555
+ }
556
+
557
+ @if not $disable-linear {
558
+ @include set-var(background-color, $background-color);
559
+ @include set-var(color, $color);
560
+ @include set-var(linear-size, $linear-size);
561
+ }
562
+ }
563
+
569
564
  @mixin styles {
570
565
  @if not $disable-circular {
571
566
  @include _circular-progress;
@@ -59,29 +59,33 @@ $selected-background-color: theme.get-default-color(
59
59
 
60
60
  $typography-styles: typography.$button-styles !default;
61
61
 
62
- $var-lookup: (
63
- outline-width: (
64
- var: --rmd-segmented-button-outline-width,
65
- value: $outline-width,
66
- ),
67
- outline-color: (
68
- var: --rmd-segmented-button-outline-color,
69
- value: $outline-color,
70
- ),
71
- color: (
72
- var: --rmd-segmented-button-color,
73
- value: currentcolor,
74
- ),
75
- selected-background-color: (
76
- var: --rmd-segmented-button-selected-background-color,
77
- value: $selected-background-color,
78
- ),
79
- selected-color: (
80
- var: --rmd-segmented-button-selected-color,
81
- value: $selected-color,
82
- ),
62
+ $variables: (
63
+ outline-width,
64
+ outline-color,
65
+ color,
66
+ selected-background-color,
67
+ selected-color
83
68
  );
84
69
 
70
+ @function get-var($name, $fallback: null) {
71
+ $var: utils.get-var-name($variables, $name, "segmented-button");
72
+ @if $fallback {
73
+ @return var(#{$var}, #{$fallback});
74
+ }
75
+
76
+ @return var(#{$var});
77
+ }
78
+
79
+ @mixin set-var($name, $value) {
80
+ @if $value {
81
+ #{utils.get-var-name($variables, $name, "segmented-button")}: #{$value};
82
+ }
83
+ }
84
+
85
+ @mixin use-var($property, $name: $property, $fallback: null) {
86
+ #{$property}: get-var($name, $fallback);
87
+ }
88
+
85
89
  @mixin use-light-theme {
86
90
  @if not $disable-everything {
87
91
  @if $light-theme-outline-color != $dark-theme-outline-color {
@@ -124,29 +128,14 @@ $var-lookup: (
124
128
  }
125
129
  }
126
130
 
127
- @function get-var($name, $fallback: null) {
128
- $found: utils.validate($var-lookup, $name, "segmented button var");
129
- $var: map.get($found, var);
130
- $value: if($fallback, $fallback, map.get($found, value));
131
-
132
- @if $value {
133
- @return var(#{$var}, #{$value});
131
+ @mixin variables {
132
+ @if not $disable-everything {
133
+ @include set-var(outline-width, $outline-width);
134
+ @include set-var(outline-color, $outline-color);
135
+ @include set-var(color, currentcolor);
136
+ @include set-var(selected-background-color, $selected-background-color);
137
+ @include set-var(selected-color, $selected-color);
134
138
  }
135
-
136
- @return var(#{$var});
137
- }
138
-
139
- @mixin set-var($name, $value) {
140
- $var: map.get(
141
- utils.validate($var-lookup, $name, "segmented button var"),
142
- var
143
- );
144
-
145
- #{$var}: #{$value};
146
- }
147
-
148
- @mixin use-var($property, $name: $property, $fallback: null) {
149
- #{$property}: get-var($name, $fallback);
150
139
  }
151
140
 
152
141
  @mixin styles {
@@ -30,63 +30,45 @@ $touch-max-height: calc(100% - #{$touch-margin}) !default;
30
30
  $recommended-min-height: 3.5rem !default;
31
31
  $recommended-max-height: 50% !default;
32
32
 
33
- $var-lookup: (
34
- height: (
35
- var: --rmd-sheet-height,
36
- value: null,
37
- ),
38
- width: (
39
- var: --rmd-sheet-width,
40
- value: null,
41
- ),
42
- max-height: (
43
- var: --rmd-sheet-max-height,
44
- value: null,
45
- ),
46
- touch-width: (
47
- var: --rmd-sheet-touch-width,
48
- value: $touch-width,
49
- ),
50
- touch-max-height: (
51
- var: --rmd-sheet-touch-max-height,
52
- value: $touch-max-height,
53
- ),
54
- static-width: (
55
- var: --rmd-sheet-static-width,
56
- value: $static-width,
57
- ),
58
- transform-offscreen: (
59
- var: --rmd-sheet-transform-offscreen,
60
- value: null,
61
- ),
62
- z-index: (
63
- var: --rmd-sheet-z-index,
64
- value: $z-index,
65
- ),
33
+ $variables: (
34
+ height,
35
+ width,
36
+ max-height,
37
+ touch-width,
38
+ touch-max-height,
39
+ static-width,
40
+ transform-offscreen,
41
+ z-index
66
42
  );
67
43
 
68
44
  @function get-var($name, $fallback: null) {
69
- $found: utils.validate($var-lookup, $name, "sheet var");
70
- $var: map.get($found, var);
71
- $value: if($fallback, $fallback, map.get($found, value));
72
-
73
- @if $value {
74
- @return var(#{$var}, #{$value});
45
+ $var: utils.get-var-name($variables, $name, "sheet");
46
+ @if $fallback {
47
+ @return var(#{$var}, #{$fallback});
75
48
  }
76
49
 
77
50
  @return var(#{$var});
78
51
  }
79
52
 
80
53
  @mixin set-var($name, $value) {
81
- $var: map.get(utils.validate($var-lookup, $name, "sheet var"), var);
82
-
83
- #{$var}: #{$value};
54
+ @if $value {
55
+ #{utils.get-var-name($variables, $name, "sheet")}: #{$value};
56
+ }
84
57
  }
85
58
 
86
59
  @mixin use-var($property, $name: $property, $fallback: null) {
87
60
  #{$property}: get-var($name, $fallback);
88
61
  }
89
62
 
63
+ @mixin variables {
64
+ @if not $disable-everything {
65
+ @include set-var(touch-width, $touch-width);
66
+ @include set-var(touch-max-height, $touch-max-height);
67
+ @include set-var(static-width, $static-width);
68
+ @include set-var(z-index, $z-index);
69
+ }
70
+ }
71
+
90
72
  @mixin styles {
91
73
  @if not $disable-everything {
92
74
  .rmd-sheet {
@@ -61,7 +61,7 @@ export function DefaultToastRenderer(props: ToastRendererProps): ReactElement {
61
61
  } = props;
62
62
  const {
63
63
  closeButtonProps,
64
- closeButton = !!closeButtonProps,
64
+ closeButton = !!closeButtonProps || !!remaining.closeButtonProps,
65
65
  onEntered: defaultEntered = noop,
66
66
  onExited: defaultExited = noop,
67
67
  onMouseEnter: defaultMouseEnter = noop,
@@ -1,10 +1,5 @@
1
1
  "use client";
2
- import {
3
- forwardRef,
4
- type AriaRole,
5
- type ComponentType,
6
- type HTMLAttributes,
7
- } from "react";
2
+ import { forwardRef, type ComponentType, type HTMLAttributes } from "react";
8
3
  import { Portal } from "../portal/Portal.js";
9
4
  import { useEnsuredId } from "../useEnsuredId.js";
10
5
  import {
@@ -24,9 +19,6 @@ export interface SnackbarProps extends HTMLAttributes<HTMLDivElement> {
24
19
  */
25
20
  id?: string;
26
21
 
27
- /** @defaultValue `"status"` */
28
- role?: AriaRole;
29
-
30
22
  /**
31
23
  * Set this to the number of toasts that can be visible within the snackbar at
32
24
  * the same time. Any toasts added after this value will be added into the
@@ -154,7 +146,6 @@ export const Snackbar = forwardRef<HTMLDivElement, SnackbarProps>(
154
146
  function Snackbar(props, ref) {
155
147
  const {
156
148
  id: propId,
157
- role = "status",
158
149
  className,
159
150
  limit = 1,
160
151
  position = "bottom",
@@ -168,21 +159,22 @@ export const Snackbar = forwardRef<HTMLDivElement, SnackbarProps>(
168
159
 
169
160
  return (
170
161
  <Portal disabled={disablePortal}>
171
- <div
172
- {...remaining}
173
- id={id}
174
- ref={ref}
175
- role={role}
176
- className={snackbar({ position, className })}
177
- >
178
- {queue.map((toast) => (
179
- <RenderToast
180
- {...toast}
181
- key={toast.toastId}
182
- toastDefaults={toastDefaults}
183
- />
184
- ))}
185
- </div>
162
+ {queue.length > 0 && (
163
+ <div
164
+ {...remaining}
165
+ id={id}
166
+ ref={ref}
167
+ className={snackbar({ position, className })}
168
+ >
169
+ {queue.map((toast) => (
170
+ <RenderToast
171
+ {...toast}
172
+ key={toast.toastId}
173
+ toastDefaults={toastDefaults}
174
+ />
175
+ ))}
176
+ </div>
177
+ )}
186
178
  </Portal>
187
179
  );
188
180
  }
@@ -38,7 +38,7 @@ export interface ConfigurableToastProps
38
38
  /**
39
39
  * Note: This is set while creating the toast.
40
40
  *
41
- * @defaultValue `visibleTime === null ? "alert" : undefined`
41
+ * @defaultValue `visibleTime === null ? "alert" : "status"`
42
42
  */
43
43
  role?: AriaRole;
44
44
 
@@ -149,7 +149,7 @@ export const Toast = forwardRef<HTMLDivElement, ToastProps>(
149
149
  actionButton: propActionButton,
150
150
  paused,
151
151
  visible,
152
- closeIcon,
152
+ closeIcon: propCloseIcon,
153
153
  closeButtonProps,
154
154
  closeButton = !!closeButtonProps,
155
155
  contentProps,
@@ -190,6 +190,11 @@ export const Toast = forwardRef<HTMLDivElement, ToastProps>(
190
190
  );
191
191
  }
192
192
 
193
+ let closeIcon = propCloseIcon;
194
+ if (typeof closeButtonProps?.children !== "undefined") {
195
+ closeIcon = closeButtonProps.children;
196
+ }
197
+
193
198
  const action = !!actionButton;
194
199
  const reordered = stacked && action && closeButton;
195
200
  const { elementProps, rendered } = useScaleTransition({
@@ -15,7 +15,8 @@ export const DEFAULT_TOAST_VISIBLE_TIME = 5000;
15
15
  * - `"replace"` - if there is a currently visible toast, it will start the
16
16
  * leave transition and display the newly added toast instead.
17
17
  * - `"immediate"` - the same behavior as `"replace"` except that if there was a
18
- * currently visible toast, it will be shown once the newly added toast again.
18
+ * currently visible toast, the toast will be shown again once the `"immediate"`
19
+ * toast is hidden.
19
20
  *
20
21
  * @remarks \@since 6.0.0 Renamed from `MessagePriority` to `ToastPriority`
21
22
  */
@@ -304,7 +305,7 @@ export class ToastManager {
304
305
  const {
305
306
  toastId = nanoid(),
306
307
  visibleTime = DEFAULT_TOAST_VISIBLE_TIME,
307
- role = visibleTime === null ? "alert" : undefined,
308
+ role = visibleTime === null ? "alert" : "status",
308
309
  priority = "normal",
309
310
  duplicates = "restart",
310
311
  } = toast;
@@ -16,12 +16,13 @@ const render = (
16
16
  ui: ReactElement,
17
17
  options?: ReactMDRenderOptions
18
18
  ): RenderResult => {
19
+ const manager = new ToastManager();
20
+ manager.addToast({ children: "Toast" });
21
+
19
22
  return rmdRender(ui, {
20
23
  ...options,
21
24
  wrapper: ({ children }) => (
22
- <ToastManagerProvider manager={new ToastManager()}>
23
- {children}
24
- </ToastManagerProvider>
25
+ <ToastManagerProvider manager={manager}>{children}</ToastManagerProvider>
25
26
  ),
26
27
  });
27
28
  };
@@ -30,12 +31,12 @@ describe("Snackbar", () => {
30
31
  it("should apply the correct styling, HTML attributes, and allow a ref", () => {
31
32
  const ref = createRef<HTMLDivElement>();
32
33
  const props = {
33
- "aria-label": "Notifications",
34
+ "data-testid": "snackbar",
34
35
  ref,
35
36
  } as const;
36
37
  const { rerender } = render(<Snackbar {...props} />);
37
38
 
38
- const snackbar = screen.getByRole("status", { name: "Notifications" });
39
+ const snackbar = screen.getByTestId("snackbar");
39
40
  expect(ref.current).toBeInstanceOf(HTMLDivElement);
40
41
  expect(ref.current).toBe(snackbar);
41
42
  expect(snackbar).toMatchSnapshot();
@@ -60,8 +61,8 @@ describe("Snackbar", () => {
60
61
  "top-right",
61
62
  ];
62
63
 
63
- const { rerender } = render(<Snackbar />);
64
- const snackbar = screen.getByRole("status");
64
+ const { rerender } = render(<Snackbar data-testid="snackbar" />);
65
+ const snackbar = screen.getByTestId("snackbar");
65
66
  expect(snackbar).toMatchSnapshot();
66
67
 
67
68
  positions.forEach((position) => {
@@ -72,13 +73,13 @@ describe("Snackbar", () => {
72
73
  });
73
74
 
74
75
  it("should allow the portal behavior to be disabled", () => {
75
- const { container, rerender } = render(<Snackbar />);
76
- let snackbar = screen.getByRole("status");
76
+ const { container, rerender } = render(<Snackbar data-testid="snackbar" />);
77
+ let snackbar = screen.getByTestId("snackbar");
77
78
  expect(container).not.toContainElement(snackbar);
78
79
  expect(snackbar).toBeInTheDocument();
79
80
 
80
- rerender(<Snackbar disablePortal />);
81
- snackbar = screen.getByRole("status");
81
+ rerender(<Snackbar data-testid="snackbar" disablePortal />);
82
+ snackbar = screen.getByTestId("snackbar");
82
83
  expect(container).toContainElement(snackbar);
83
84
  });
84
85
  });
@@ -78,7 +78,7 @@ function SimpleTest(props: SimpleTestProps): ReactElement {
78
78
  Button
79
79
  </Button>
80
80
  {children}
81
- <Snackbar {...snackbar} />
81
+ <Snackbar data-testid="snackbar" {...snackbar} />
82
82
  </>
83
83
  );
84
84
  }
@@ -101,21 +101,18 @@ describe("ToastManagerProvider", () => {
101
101
  <Button onClick={() => addToast({ children: "Hello, world!" })}>
102
102
  Button
103
103
  </Button>
104
- <Snackbar />
104
+ <Snackbar data-testid="snackbar" />
105
105
  </>
106
106
  );
107
107
  }
108
108
 
109
109
  rmdRender(<Test />);
110
110
  const button = screen.getByRole("button", { name: "Button" });
111
- const snackbar = screen.getByRole("status");
112
- expect(snackbar).toBeInTheDocument();
111
+ expect(() => screen.getByTestId("snackbar")).toThrow();
113
112
 
114
113
  await user.click(button);
115
- const message = snackbar.firstElementChild;
116
- if (!message) {
117
- throw new Error();
118
- }
114
+ const snackbar = await screen.findByTestId("snackbar");
115
+ const message = await screen.findByRole("status");
119
116
 
120
117
  expect(snackbar).toMatchSnapshot();
121
118
 
@@ -126,20 +123,14 @@ describe("ToastManagerProvider", () => {
126
123
  });
127
124
 
128
125
  it("should allow toasts to be added outside of a react component (like redux)", async () => {
129
- rmdRender(<Snackbar />);
130
- const snackbar = screen.getByRole("status");
131
- expect(snackbar).toBeInTheDocument();
132
- expect(snackbar).toBeEmptyDOMElement();
126
+ rmdRender(<Snackbar data-testid="snackbar" />);
133
127
 
134
128
  act(() => {
135
129
  addToast({ toastId: "toast-id", children: "Fired outside of react!" });
136
130
  });
137
131
 
138
- let toast = screen.getByText("Fired outside of react!");
132
+ let toast = await screen.findByRole("status");
139
133
  expect(toast).toBeInTheDocument();
140
- await waitFor(() => {
141
- expect(toast.parentElement).not.toHaveClass(ENTER_CLASS_NAME);
142
- });
143
134
 
144
135
  act(() => {
145
136
  popToast();
@@ -150,8 +141,7 @@ describe("ToastManagerProvider", () => {
150
141
  addToast({ toastId: "toast-id", children: "Fired outside of react!" });
151
142
  addToast({ toastId: "toast-id-2", children: "Second toast" });
152
143
  });
153
- toast = screen.getByText("Fired outside of react!");
154
- expect(toast).toBeInTheDocument();
144
+ toast = await screen.findByRole("status");
155
145
 
156
146
  act(() => {
157
147
  removeToast("invalid-toast-id", false);
@@ -170,7 +160,7 @@ describe("ToastManagerProvider", () => {
170
160
  addToast({ children: "Toast" });
171
161
  clearToasts();
172
162
  });
173
- expect(snackbar).toBeEmptyDOMElement();
163
+ expect(() => screen.getByTestId("snackbar")).toThrow();
174
164
  });
175
165
 
176
166
  it("should not add a toast to another toast manager", async () => {
@@ -185,21 +175,20 @@ describe("ToastManagerProvider", () => {
185
175
  <Button onClick={() => addToast({ children: "Global" })}>
186
176
  Global
187
177
  </Button>
188
- <Snackbar />
178
+ <Snackbar data-testid="snackbar" />
189
179
  </>
190
180
  );
191
181
  }
192
182
 
193
183
  renderWithManager(<Test />);
194
- const snackbar = screen.getByRole("status");
195
184
  const scopedAdd = screen.getByRole("button", { name: "Scoped" });
196
185
  const globalAdd = screen.getByRole("button", { name: "Global" });
197
186
 
198
187
  await user.click(globalAdd);
199
- expect(snackbar).toBeEmptyDOMElement();
188
+ expect(() => screen.getByTestId("snackbar")).toThrow();
200
189
 
201
190
  await user.click(scopedAdd);
202
- expect(snackbar).not.toBeEmptyDOMElement();
191
+ const snackbar = await screen.findByTestId("snackbar");
203
192
  expect(within(snackbar).getByText("Scoped")).toBeInTheDocument();
204
193
  });
205
194
  });
@@ -221,15 +210,10 @@ describe("ToastManagerProvider", () => {
221
210
  // eslint-disable-next-line testing-library/render-result-naming-convention
222
211
  const result = renderWithManager(<SimpleTest {...props} />);
223
212
  const button = screen.getByRole("button", { name: "Button" });
224
- const snackbar = screen.getByRole("status");
225
- expect(snackbar).toBeEmptyDOMElement();
226
213
 
227
214
  await user.click(button);
228
- expect(snackbar).not.toBeEmptyDOMElement();
229
- const message = snackbar.firstElementChild;
230
- if (!message) {
231
- throw new Error();
232
- }
215
+ const snackbar = await screen.findByTestId("snackbar");
216
+ const message = await screen.findByRole("status");
233
217
 
234
218
  act(() => {
235
219
  jest.runOnlyPendingTimers();
@@ -331,15 +315,9 @@ describe("ToastManagerProvider", () => {
331
315
  const user = userEvent.setup({ delay: null });
332
316
  renderWithManager(<SimpleTest toast={{ toastId: "same-toast-id" }} />);
333
317
  const button = screen.getByRole("button", { name: "Button" });
334
- const snackbar = screen.getByRole("status");
335
- expect(snackbar).toBeEmptyDOMElement();
336
318
 
337
319
  await user.click(button);
338
- expect(snackbar).not.toBeEmptyDOMElement();
339
- const message = snackbar.firstElementChild;
340
- if (!message) {
341
- throw new Error();
342
- }
320
+ const message = await screen.findByRole("status");
343
321
 
344
322
  act(() => {
345
323
  jest.runOnlyPendingTimers();
@@ -456,7 +434,7 @@ describe("ToastManagerProvider", () => {
456
434
  </>
457
435
  );
458
436
  }
459
- const { user, message, snackbar } = await init({
437
+ const { user, message } = await init({
460
438
  children: <Children />,
461
439
  });
462
440
  act(() => {
@@ -474,8 +452,8 @@ describe("ToastManagerProvider", () => {
474
452
 
475
453
  const testFullFlow = async (button: HTMLElement): Promise<void> => {
476
454
  await user.click(button);
477
- expect(snackbar).not.toBeEmptyDOMElement();
478
- const nextMessage = snackbar.firstElementChild;
455
+ const snackbar = await screen.findByTestId("snackbar");
456
+ const nextMessage = within(snackbar).getByRole("status");
479
457
  expect(nextMessage).toHaveClass(ENTER_CLASS_NAME);
480
458
  act(() => {
481
459
  jest.runOnlyPendingTimers();
@@ -746,17 +724,17 @@ describe("ToastManagerProvider", () => {
746
724
  >
747
725
  Alert
748
726
  </Button>
749
- <Snackbar />
727
+ <Snackbar data-testid="snackbar" />
750
728
  </>
751
729
  );
752
730
  }
753
731
 
754
732
  renderWithManager(<Test />);
755
- const snackbar = screen.getByRole("status");
756
733
  const button = screen.getByRole("button", { name: "Alert" });
757
734
 
758
735
  await user.click(button);
759
736
 
737
+ const snackbar = screen.getByTestId("snackbar");
760
738
  const alert = screen.getByRole("alert");
761
739
  expect(snackbar).toMatchSnapshot();
762
740