@patternfly/react-core 6.3.1-prerelease.14 → 6.3.1-prerelease.15

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 (223) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/components/package.json +1 -1
  3. package/deprecated/package.json +1 -1
  4. package/dist/dynamic/components/AboutModal/package.json +1 -1
  5. package/dist/dynamic/components/Accordion/package.json +1 -1
  6. package/dist/dynamic/components/ActionList/package.json +1 -1
  7. package/dist/dynamic/components/Alert/package.json +1 -1
  8. package/dist/dynamic/components/Avatar/package.json +1 -1
  9. package/dist/dynamic/components/BackToTop/package.json +1 -1
  10. package/dist/dynamic/components/Backdrop/package.json +1 -1
  11. package/dist/dynamic/components/BackgroundImage/package.json +1 -1
  12. package/dist/dynamic/components/Badge/package.json +1 -1
  13. package/dist/dynamic/components/Banner/package.json +1 -1
  14. package/dist/dynamic/components/Brand/package.json +1 -1
  15. package/dist/dynamic/components/Breadcrumb/package.json +1 -1
  16. package/dist/dynamic/components/Button/package.json +1 -1
  17. package/dist/dynamic/components/CalendarMonth/package.json +1 -1
  18. package/dist/dynamic/components/Card/package.json +1 -1
  19. package/dist/dynamic/components/Checkbox/package.json +1 -1
  20. package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
  21. package/dist/dynamic/components/CodeBlock/package.json +1 -1
  22. package/dist/dynamic/components/Content/package.json +1 -1
  23. package/dist/dynamic/components/DataList/package.json +1 -1
  24. package/dist/dynamic/components/DatePicker/package.json +1 -1
  25. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  26. package/dist/dynamic/components/Divider/package.json +1 -1
  27. package/dist/dynamic/components/Drawer/package.json +1 -1
  28. package/dist/dynamic/components/Dropdown/package.json +1 -1
  29. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  30. package/dist/dynamic/components/EmptyState/package.json +1 -1
  31. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  32. package/dist/dynamic/components/FileUpload/package.json +1 -1
  33. package/dist/dynamic/components/Form/package.json +1 -1
  34. package/dist/dynamic/components/FormSelect/package.json +1 -1
  35. package/dist/dynamic/components/HelperText/package.json +1 -1
  36. package/dist/dynamic/components/Hint/package.json +1 -1
  37. package/dist/dynamic/components/Icon/package.json +1 -1
  38. package/dist/dynamic/components/InputGroup/package.json +1 -1
  39. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  40. package/dist/dynamic/components/Label/package.json +1 -1
  41. package/dist/dynamic/components/List/package.json +1 -1
  42. package/dist/dynamic/components/LoginPage/package.json +1 -1
  43. package/dist/dynamic/components/Masthead/package.json +1 -1
  44. package/dist/dynamic/components/Menu/package.json +1 -1
  45. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  46. package/dist/dynamic/components/Modal/package.json +1 -1
  47. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  48. package/dist/dynamic/components/Nav/package.json +1 -1
  49. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  50. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  51. package/dist/dynamic/components/NumberInput/package.json +1 -1
  52. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  53. package/dist/dynamic/components/Page/package.json +1 -1
  54. package/dist/dynamic/components/Pagination/package.json +1 -1
  55. package/dist/dynamic/components/Panel/package.json +1 -1
  56. package/dist/dynamic/components/Popover/package.json +1 -1
  57. package/dist/dynamic/components/Progress/package.json +1 -1
  58. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  59. package/dist/dynamic/components/Radio/package.json +1 -1
  60. package/dist/dynamic/components/SearchInput/package.json +1 -1
  61. package/dist/dynamic/components/Select/package.json +1 -1
  62. package/dist/dynamic/components/Sidebar/package.json +1 -1
  63. package/dist/dynamic/components/SimpleList/package.json +1 -1
  64. package/dist/dynamic/components/Skeleton/package.json +1 -1
  65. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  66. package/dist/dynamic/components/Slider/package.json +1 -1
  67. package/dist/dynamic/components/Spinner/package.json +1 -1
  68. package/dist/dynamic/components/Switch/package.json +1 -1
  69. package/dist/dynamic/components/Tabs/package.json +1 -1
  70. package/dist/dynamic/components/TextArea/package.json +1 -1
  71. package/dist/dynamic/components/TextInput/package.json +1 -1
  72. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  73. package/dist/dynamic/components/TimePicker/package.json +1 -1
  74. package/dist/dynamic/components/Timestamp/package.json +1 -1
  75. package/dist/dynamic/components/Title/package.json +1 -1
  76. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  77. package/dist/dynamic/components/Toolbar/package.json +1 -1
  78. package/dist/dynamic/components/Tooltip/package.json +1 -1
  79. package/dist/dynamic/components/TreeView/package.json +1 -1
  80. package/dist/dynamic/components/Truncate/package.json +1 -1
  81. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  82. package/dist/dynamic/components/Wizard/package.json +1 -1
  83. package/dist/dynamic/deprecated/components/Chip/package.json +1 -1
  84. package/dist/dynamic/deprecated/components/DragDrop/package.json +1 -1
  85. package/dist/dynamic/deprecated/components/DualListSelector/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/Modal/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/Tile/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/package.json +1 -1
  90. package/dist/dynamic/helpers/AnimationsProvider/AnimationsProvider/package.json +1 -0
  91. package/dist/dynamic/helpers/AnimationsProvider/package.json +1 -0
  92. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  93. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  94. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  95. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  96. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  97. package/dist/dynamic/helpers/constants/package.json +1 -1
  98. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  99. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  100. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  101. package/dist/dynamic/helpers/package.json +1 -1
  102. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  103. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  104. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  105. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  106. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  107. package/dist/dynamic/helpers/util/package.json +1 -1
  108. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  109. package/dist/dynamic/layouts/Flex/package.json +1 -1
  110. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  111. package/dist/dynamic/layouts/Grid/package.json +1 -1
  112. package/dist/dynamic/layouts/Level/package.json +1 -1
  113. package/dist/dynamic/layouts/Split/package.json +1 -1
  114. package/dist/dynamic/layouts/Stack/package.json +1 -1
  115. package/dist/dynamic/styles/package.json +1 -1
  116. package/dist/dynamic-modules.json +5 -0
  117. package/dist/esm/components/Alert/AlertGroup.d.ts +2 -13
  118. package/dist/esm/components/Alert/AlertGroup.d.ts.map +1 -1
  119. package/dist/esm/components/Alert/AlertGroup.js +33 -38
  120. package/dist/esm/components/Alert/AlertGroup.js.map +1 -1
  121. package/dist/esm/components/Alert/AlertGroupInline.d.ts.map +1 -1
  122. package/dist/esm/components/Alert/AlertGroupInline.js +3 -1
  123. package/dist/esm/components/Alert/AlertGroupInline.js.map +1 -1
  124. package/dist/esm/components/DualListSelector/DualListSelector.d.ts +2 -9
  125. package/dist/esm/components/DualListSelector/DualListSelector.d.ts.map +1 -1
  126. package/dist/esm/components/DualListSelector/DualListSelector.js +6 -16
  127. package/dist/esm/components/DualListSelector/DualListSelector.js.map +1 -1
  128. package/dist/esm/components/DualListSelector/DualListSelectorTreeItem.d.ts.map +1 -1
  129. package/dist/esm/components/DualListSelector/DualListSelectorTreeItem.js +3 -1
  130. package/dist/esm/components/DualListSelector/DualListSelectorTreeItem.js.map +1 -1
  131. package/dist/esm/components/Form/FormFieldGroupExpandable.d.ts.map +1 -1
  132. package/dist/esm/components/Form/FormFieldGroupExpandable.js +3 -1
  133. package/dist/esm/components/Form/FormFieldGroupExpandable.js.map +1 -1
  134. package/dist/esm/components/Form/InternalFormFieldGroup.d.ts.map +1 -1
  135. package/dist/esm/components/Form/InternalFormFieldGroup.js +3 -1
  136. package/dist/esm/components/Form/InternalFormFieldGroup.js.map +1 -1
  137. package/dist/esm/components/SearchInput/SearchInput.d.ts.map +1 -1
  138. package/dist/esm/components/SearchInput/SearchInput.js +3 -1
  139. package/dist/esm/components/SearchInput/SearchInput.js.map +1 -1
  140. package/dist/esm/components/TreeView/TreeView.d.ts.map +1 -1
  141. package/dist/esm/components/TreeView/TreeView.js +3 -1
  142. package/dist/esm/components/TreeView/TreeView.js.map +1 -1
  143. package/dist/esm/components/TreeView/TreeViewListItem.d.ts.map +1 -1
  144. package/dist/esm/components/TreeView/TreeViewListItem.js +3 -1
  145. package/dist/esm/components/TreeView/TreeViewListItem.js.map +1 -1
  146. package/dist/esm/helpers/AnimationsProvider/AnimationsProvider.d.ts +76 -0
  147. package/dist/esm/helpers/AnimationsProvider/AnimationsProvider.d.ts.map +1 -0
  148. package/dist/esm/helpers/AnimationsProvider/AnimationsProvider.js +83 -0
  149. package/dist/esm/helpers/AnimationsProvider/AnimationsProvider.js.map +1 -0
  150. package/dist/esm/helpers/AnimationsProvider/index.d.ts +2 -0
  151. package/dist/esm/helpers/AnimationsProvider/index.d.ts.map +1 -0
  152. package/dist/esm/helpers/AnimationsProvider/index.js +2 -0
  153. package/dist/esm/helpers/AnimationsProvider/index.js.map +1 -0
  154. package/dist/esm/helpers/index.d.ts +1 -0
  155. package/dist/esm/helpers/index.d.ts.map +1 -1
  156. package/dist/esm/helpers/index.js +1 -0
  157. package/dist/esm/helpers/index.js.map +1 -1
  158. package/dist/js/components/Alert/AlertGroup.d.ts +2 -13
  159. package/dist/js/components/Alert/AlertGroup.d.ts.map +1 -1
  160. package/dist/js/components/Alert/AlertGroup.js +33 -37
  161. package/dist/js/components/Alert/AlertGroup.js.map +1 -1
  162. package/dist/js/components/Alert/AlertGroupInline.d.ts.map +1 -1
  163. package/dist/js/components/Alert/AlertGroupInline.js +3 -1
  164. package/dist/js/components/Alert/AlertGroupInline.js.map +1 -1
  165. package/dist/js/components/DualListSelector/DualListSelector.d.ts +2 -9
  166. package/dist/js/components/DualListSelector/DualListSelector.d.ts.map +1 -1
  167. package/dist/js/components/DualListSelector/DualListSelector.js +7 -16
  168. package/dist/js/components/DualListSelector/DualListSelector.js.map +1 -1
  169. package/dist/js/components/DualListSelector/DualListSelectorTreeItem.d.ts.map +1 -1
  170. package/dist/js/components/DualListSelector/DualListSelectorTreeItem.js +3 -1
  171. package/dist/js/components/DualListSelector/DualListSelectorTreeItem.js.map +1 -1
  172. package/dist/js/components/Form/FormFieldGroupExpandable.d.ts.map +1 -1
  173. package/dist/js/components/Form/FormFieldGroupExpandable.js +3 -1
  174. package/dist/js/components/Form/FormFieldGroupExpandable.js.map +1 -1
  175. package/dist/js/components/Form/InternalFormFieldGroup.d.ts.map +1 -1
  176. package/dist/js/components/Form/InternalFormFieldGroup.js +3 -1
  177. package/dist/js/components/Form/InternalFormFieldGroup.js.map +1 -1
  178. package/dist/js/components/SearchInput/SearchInput.d.ts.map +1 -1
  179. package/dist/js/components/SearchInput/SearchInput.js +3 -1
  180. package/dist/js/components/SearchInput/SearchInput.js.map +1 -1
  181. package/dist/js/components/TreeView/TreeView.d.ts.map +1 -1
  182. package/dist/js/components/TreeView/TreeView.js +3 -1
  183. package/dist/js/components/TreeView/TreeView.js.map +1 -1
  184. package/dist/js/components/TreeView/TreeViewListItem.d.ts.map +1 -1
  185. package/dist/js/components/TreeView/TreeViewListItem.js +3 -1
  186. package/dist/js/components/TreeView/TreeViewListItem.js.map +1 -1
  187. package/dist/js/helpers/AnimationsProvider/AnimationsProvider.d.ts +76 -0
  188. package/dist/js/helpers/AnimationsProvider/AnimationsProvider.d.ts.map +1 -0
  189. package/dist/js/helpers/AnimationsProvider/AnimationsProvider.js +89 -0
  190. package/dist/js/helpers/AnimationsProvider/AnimationsProvider.js.map +1 -0
  191. package/dist/js/helpers/AnimationsProvider/index.d.ts +2 -0
  192. package/dist/js/helpers/AnimationsProvider/index.d.ts.map +1 -0
  193. package/dist/js/helpers/AnimationsProvider/index.js +5 -0
  194. package/dist/js/helpers/AnimationsProvider/index.js.map +1 -0
  195. package/dist/js/helpers/index.d.ts +1 -0
  196. package/dist/js/helpers/index.d.ts.map +1 -1
  197. package/dist/js/helpers/index.js +1 -0
  198. package/dist/js/helpers/index.js.map +1 -1
  199. package/dist/umd/assets/{output-BRqYjXqq.css → output-BwG6uaWN.css} +12790 -12790
  200. package/dist/umd/react-core.min.js +3 -3
  201. package/helpers/package.json +1 -1
  202. package/layouts/package.json +1 -1
  203. package/next/package.json +1 -1
  204. package/package.json +2 -2
  205. package/src/components/Alert/AlertGroup.tsx +59 -63
  206. package/src/components/Alert/AlertGroupInline.tsx +3 -1
  207. package/src/components/Alert/__tests__/AlertGroup.test.tsx +55 -4
  208. package/src/components/DualListSelector/DualListSelector.tsx +32 -39
  209. package/src/components/DualListSelector/DualListSelectorTreeItem.tsx +3 -1
  210. package/src/components/DualListSelector/__tests__/DualListSelector.test.tsx +28 -0
  211. package/src/components/Form/FormFieldGroupExpandable.tsx +3 -1
  212. package/src/components/Form/InternalFormFieldGroup.tsx +3 -1
  213. package/src/components/Form/__tests__/FormFieldGroupExpandable.test.tsx +30 -0
  214. package/src/components/SearchInput/SearchInput.tsx +3 -1
  215. package/src/components/SearchInput/__tests__/SearchInput.test.tsx +52 -0
  216. package/src/components/TreeView/TreeView.tsx +3 -1
  217. package/src/components/TreeView/TreeViewListItem.tsx +3 -1
  218. package/src/components/TreeView/__tests__/TreeView.test.tsx +28 -0
  219. package/src/components/TreeView/__tests__/__snapshots__/TreeView.test.tsx.snap +1 -1
  220. package/src/helpers/AnimationsProvider/AnimationsProvider.tsx +104 -0
  221. package/src/helpers/AnimationsProvider/__tests__/AnimationsProvider.test.tsx +157 -0
  222. package/src/helpers/AnimationsProvider/index.ts +1 -0
  223. package/src/helpers/index.ts +1 -0
@@ -1,6 +1,7 @@
1
1
  import { render, screen } from '@testing-library/react';
2
2
  import userEvent from '@testing-library/user-event';
3
3
  import { TreeView } from '../TreeView';
4
+ import { AnimationsProvider } from '../../../helpers/AnimationsProvider';
4
5
 
5
6
  jest.mock('../TreeViewList', () => ({
6
7
  TreeViewList: ({
@@ -293,6 +294,33 @@ test('Passes hasAnimations to TreeViewListItem', () => {
293
294
 
294
295
  expect(screen.getByText('TreeViewListItem hasAnimations: true')).toBeVisible();
295
296
  });
297
+
298
+ // Animation context tests
299
+ test('respects AnimationsProvider context when no local hasAnimations prop', () => {
300
+ render(
301
+ <AnimationsProvider config={{ hasAnimations: true }}>
302
+ <TreeView data={[basicData]} />
303
+ </AnimationsProvider>
304
+ );
305
+
306
+ expect(screen.getByText('TreeViewListItem hasAnimations: true')).toBeVisible();
307
+ });
308
+
309
+ test('local hasAnimations prop takes precedence over context', () => {
310
+ render(
311
+ <AnimationsProvider config={{ hasAnimations: true }}>
312
+ <TreeView data={[basicData]} hasAnimations={false} />
313
+ </AnimationsProvider>
314
+ );
315
+
316
+ expect(screen.getByText('TreeViewListItem hasAnimations: false')).toBeVisible();
317
+ });
318
+
319
+ test('works without AnimationsProvider (backward compatibility)', () => {
320
+ render(<TreeView data={[basicData]} />);
321
+
322
+ expect(screen.getByText('TreeViewListItem hasAnimations: false')).toBeVisible();
323
+ });
296
324
  test('Passes data.children to TreeViewListItem', () => {
297
325
  render(<TreeView data={[{ ...basicData, children: [{ name: 'Child 1' }] }]} />);
298
326
 
@@ -105,7 +105,7 @@ exports[`Matches snapshot 1`] = `
105
105
  TreeViewListItem useMemo: undefined
106
106
  </p>
107
107
  <p>
108
- TreeViewListItem hasAnimations: undefined
108
+ TreeViewListItem hasAnimations: false
109
109
  </p>
110
110
  <button>
111
111
  compareItems clicker
@@ -0,0 +1,104 @@
1
+ import { createContext, useContext, FunctionComponent, ReactNode } from 'react';
2
+
3
+ /** Configuration for animations throughout PatternFly components */
4
+ export interface AnimationsConfig {
5
+ /** Whether animations are enabled globally */
6
+ hasAnimations?: boolean;
7
+ }
8
+
9
+ /** Props for the AnimationsProvider component */
10
+ export interface AnimationsProviderProps {
11
+ /** Animation configuration settings */
12
+ config: AnimationsConfig;
13
+ /** Child components that will have access to the animations context */
14
+ children: ReactNode;
15
+ }
16
+
17
+ /** Context to provide animations configuration to child components */
18
+ const AnimationsContext = createContext<AnimationsConfig>({
19
+ hasAnimations: false
20
+ });
21
+
22
+ /**
23
+ * AnimationsProvider is an application-level provider that provides uniform
24
+ * animation configuration for all PatternFly React components via the React context API.
25
+ *
26
+ * **Usage**: Place this provider at the root of your application to enable global
27
+ * animation control without requiring manual prop drilling throughout your component tree.
28
+ *
29
+ * **Benefits**:
30
+ * - Centralized animation control for the entire application
31
+ * - Respects user accessibility preferences (reduced motion)
32
+ * - Components can still override the global setting when needed
33
+ * - Works with all PatternFly components that support animations
34
+ *
35
+ * @example
36
+ * ```tsx
37
+ * // App.tsx - Place at your application root
38
+ * import { AnimationsProvider } from '@patternfly/react-core';
39
+ *
40
+ * const App = () => (
41
+ * <AnimationsProvider config={{ hasAnimations: true }}>
42
+ * <MyApplication />
43
+ * </AnimationsProvider>
44
+ * );
45
+ * ```
46
+ */
47
+ export const AnimationsProvider: FunctionComponent<AnimationsProviderProps> = ({ config, children }) => (
48
+ <AnimationsContext.Provider value={config}>{children}</AnimationsContext.Provider>
49
+ );
50
+
51
+ /**
52
+ * Hook to access the animations configuration from the nearest AnimationsProvider.
53
+ *
54
+ * This hook allows components to check if animations are enabled and override
55
+ * their local hasAnimations prop accordingly.
56
+ *
57
+ * @returns The animations configuration object
58
+ *
59
+ * @example
60
+ * ```tsx
61
+ * const MyComponent = ({ hasAnimations: hasAnimationsProp, ...props }) => {
62
+ * const { hasAnimations: contextHasAnimations } = useAnimationsConfig();
63
+ * const hasAnimations = hasAnimationsProp ?? contextHasAnimations;
64
+ *
65
+ * return <div className={hasAnimations ? 'with-animations' : ''} {...props} />;
66
+ * };
67
+ * ```
68
+ */
69
+ export const useAnimationsConfig = (): AnimationsConfig => {
70
+ const context = useContext(AnimationsContext);
71
+
72
+ if (context === undefined) {
73
+ // Return default config if no provider is found
74
+ return { hasAnimations: false };
75
+ }
76
+
77
+ return context;
78
+ };
79
+
80
+ /**
81
+ * Utility hook that combines local hasAnimations prop with context configuration.
82
+ * The local prop takes precedence when explicitly set, otherwise falls back to context.
83
+ *
84
+ * @param hasAnimationsProp - The hasAnimations prop passed directly to the component
85
+ * @returns The resolved hasAnimations value
86
+ *
87
+ * @example
88
+ * ```tsx
89
+ * const MyComponent = ({ hasAnimations: hasAnimationsProp, ...props }) => {
90
+ * const hasAnimations = useHasAnimations(hasAnimationsProp);
91
+ *
92
+ * return <div className={hasAnimations ? 'animated' : 'static'} {...props} />;
93
+ * };
94
+ * ```
95
+ */
96
+ export const useHasAnimations = (hasAnimationsProp?: boolean): boolean => {
97
+ const { hasAnimations: contextHasAnimations } = useAnimationsConfig();
98
+
99
+ // Local prop takes precedence when explicitly set (including false)
100
+ // If local prop is undefined, fall back to context
101
+ return hasAnimationsProp ?? contextHasAnimations ?? false;
102
+ };
103
+
104
+ AnimationsProvider.displayName = 'AnimationsProvider';
@@ -0,0 +1,157 @@
1
+ import { render, screen } from '@testing-library/react';
2
+ import '@testing-library/jest-dom';
3
+ import { AnimationsProvider, useAnimationsConfig, useHasAnimations } from '../AnimationsProvider';
4
+
5
+ // Test component that uses the useAnimationsConfig hook
6
+ const TestConfigComponent = () => {
7
+ const { hasAnimations } = useAnimationsConfig();
8
+ return <div data-testid="config">{hasAnimations ? 'animations-enabled' : 'animations-disabled'}</div>;
9
+ };
10
+
11
+ // Test component that uses the useHasAnimations hook with a local prop
12
+ const TestHasAnimationsComponent = ({ hasAnimations: hasAnimationsProp }: { hasAnimations?: boolean }) => {
13
+ const hasAnimations = useHasAnimations(hasAnimationsProp);
14
+ return <div data-testid="has-animations">{hasAnimations ? 'animations-enabled' : 'animations-disabled'}</div>;
15
+ };
16
+
17
+ test('renders children correctly', () => {
18
+ render(
19
+ <AnimationsProvider config={{ hasAnimations: true }}>
20
+ <div data-testid="child">Test Child</div>
21
+ </AnimationsProvider>
22
+ );
23
+
24
+ expect(screen.getByTestId('child')).toBeInTheDocument();
25
+ expect(screen.getByTestId('child')).toHaveTextContent('Test Child');
26
+ });
27
+
28
+ test('provides explicit config', () => {
29
+ render(
30
+ <AnimationsProvider config={{ hasAnimations: false }}>
31
+ <TestConfigComponent />
32
+ </AnimationsProvider>
33
+ );
34
+
35
+ expect(screen.getByTestId('config')).toHaveTextContent('animations-disabled');
36
+ });
37
+
38
+ test('provides animations enabled config', () => {
39
+ render(
40
+ <AnimationsProvider config={{ hasAnimations: true }}>
41
+ <TestConfigComponent />
42
+ </AnimationsProvider>
43
+ );
44
+
45
+ expect(screen.getByTestId('config')).toHaveTextContent('animations-enabled');
46
+ });
47
+
48
+ test('provides animations disabled config', () => {
49
+ render(
50
+ <AnimationsProvider config={{ hasAnimations: false }}>
51
+ <TestConfigComponent />
52
+ </AnimationsProvider>
53
+ );
54
+
55
+ expect(screen.getByTestId('config')).toHaveTextContent('animations-disabled');
56
+ });
57
+
58
+ test('useAnimationsConfig returns default config when no provider', () => {
59
+ render(<TestConfigComponent />);
60
+
61
+ expect(screen.getByTestId('config')).toHaveTextContent('animations-disabled');
62
+ });
63
+
64
+ test('useHasAnimations uses context when no local prop provided', () => {
65
+ render(
66
+ <AnimationsProvider config={{ hasAnimations: true }}>
67
+ <TestHasAnimationsComponent />
68
+ </AnimationsProvider>
69
+ );
70
+
71
+ expect(screen.getByTestId('has-animations')).toHaveTextContent('animations-enabled');
72
+ });
73
+
74
+ test('useHasAnimations uses local prop when provided (true)', () => {
75
+ render(
76
+ <AnimationsProvider config={{ hasAnimations: false }}>
77
+ <TestHasAnimationsComponent hasAnimations={true} />
78
+ </AnimationsProvider>
79
+ );
80
+
81
+ expect(screen.getByTestId('has-animations')).toHaveTextContent('animations-enabled');
82
+ });
83
+
84
+ test('useHasAnimations uses local prop when provided (false)', () => {
85
+ render(
86
+ <AnimationsProvider config={{ hasAnimations: true }}>
87
+ <TestHasAnimationsComponent hasAnimations={false} />
88
+ </AnimationsProvider>
89
+ );
90
+
91
+ expect(screen.getByTestId('has-animations')).toHaveTextContent('animations-disabled');
92
+ });
93
+
94
+ test('useHasAnimations works without provider', () => {
95
+ render(<TestHasAnimationsComponent />);
96
+
97
+ expect(screen.getByTestId('has-animations')).toHaveTextContent('animations-disabled');
98
+ });
99
+
100
+ test('useHasAnimations with local prop and no provider', () => {
101
+ render(<TestHasAnimationsComponent hasAnimations={true} />);
102
+
103
+ expect(screen.getByTestId('has-animations')).toHaveTextContent('animations-enabled');
104
+ });
105
+
106
+ test('works in app-level scenario with multiple components', () => {
107
+ // Simulate realistic app-level usage
108
+ const MockApp = () => (
109
+ <div>
110
+ <header>
111
+ <TestConfigComponent />
112
+ </header>
113
+ <main>
114
+ <TestHasAnimationsComponent />
115
+ <TestHasAnimationsComponent hasAnimations={false} /> {/* Component override */}
116
+ </main>
117
+ </div>
118
+ );
119
+
120
+ render(
121
+ <AnimationsProvider config={{ hasAnimations: true }}>
122
+ <MockApp />
123
+ </AnimationsProvider>
124
+ );
125
+
126
+ const configs = screen.getAllByTestId('config');
127
+ const hasAnimationsComponents = screen.getAllByTestId('has-animations');
128
+
129
+ expect(configs[0]).toHaveTextContent('animations-enabled'); // Header uses provider
130
+ expect(hasAnimationsComponents[0]).toHaveTextContent('animations-enabled'); // Main uses provider
131
+ expect(hasAnimationsComponents[1]).toHaveTextContent('animations-disabled'); // Component override
132
+ });
133
+
134
+ test('handles dynamic context changes', () => {
135
+ const TestComponent = ({ hasAnimations }: { hasAnimations: boolean }) => (
136
+ <AnimationsProvider config={{ hasAnimations }}>
137
+ <TestConfigComponent />
138
+ <TestHasAnimationsComponent />
139
+ </AnimationsProvider>
140
+ );
141
+
142
+ const { rerender } = render(<TestComponent hasAnimations={true} />);
143
+
144
+ // Initially animations enabled
145
+ expect(screen.getByTestId('config')).toHaveTextContent('animations-enabled');
146
+ expect(screen.getByTestId('has-animations')).toHaveTextContent('animations-enabled');
147
+
148
+ // Change to disabled
149
+ rerender(<TestComponent hasAnimations={false} />);
150
+ expect(screen.getByTestId('config')).toHaveTextContent('animations-disabled');
151
+ expect(screen.getByTestId('has-animations')).toHaveTextContent('animations-disabled');
152
+
153
+ // Change back to enabled
154
+ rerender(<TestComponent hasAnimations={true} />);
155
+ expect(screen.getByTestId('config')).toHaveTextContent('animations-enabled');
156
+ expect(screen.getByTestId('has-animations')).toHaveTextContent('animations-enabled');
157
+ });
@@ -0,0 +1 @@
1
+ export * from './AnimationsProvider';
@@ -1,3 +1,4 @@
1
+ export * from './AnimationsProvider';
1
2
  export * from './constants';
2
3
  export * from './FocusTrap/FocusTrap';
3
4
  export * from './GenerateId/GenerateId';