@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.
- package/CHANGELOG.md +6 -0
- package/components/package.json +1 -1
- package/deprecated/package.json +1 -1
- package/dist/dynamic/components/AboutModal/package.json +1 -1
- package/dist/dynamic/components/Accordion/package.json +1 -1
- package/dist/dynamic/components/ActionList/package.json +1 -1
- package/dist/dynamic/components/Alert/package.json +1 -1
- package/dist/dynamic/components/Avatar/package.json +1 -1
- package/dist/dynamic/components/BackToTop/package.json +1 -1
- package/dist/dynamic/components/Backdrop/package.json +1 -1
- package/dist/dynamic/components/BackgroundImage/package.json +1 -1
- package/dist/dynamic/components/Badge/package.json +1 -1
- package/dist/dynamic/components/Banner/package.json +1 -1
- package/dist/dynamic/components/Brand/package.json +1 -1
- package/dist/dynamic/components/Breadcrumb/package.json +1 -1
- package/dist/dynamic/components/Button/package.json +1 -1
- package/dist/dynamic/components/CalendarMonth/package.json +1 -1
- package/dist/dynamic/components/Card/package.json +1 -1
- package/dist/dynamic/components/Checkbox/package.json +1 -1
- package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
- package/dist/dynamic/components/CodeBlock/package.json +1 -1
- package/dist/dynamic/components/Content/package.json +1 -1
- package/dist/dynamic/components/DataList/package.json +1 -1
- package/dist/dynamic/components/DatePicker/package.json +1 -1
- package/dist/dynamic/components/DescriptionList/package.json +1 -1
- package/dist/dynamic/components/Divider/package.json +1 -1
- package/dist/dynamic/components/Drawer/package.json +1 -1
- package/dist/dynamic/components/Dropdown/package.json +1 -1
- package/dist/dynamic/components/DualListSelector/package.json +1 -1
- package/dist/dynamic/components/EmptyState/package.json +1 -1
- package/dist/dynamic/components/ExpandableSection/package.json +1 -1
- package/dist/dynamic/components/FileUpload/package.json +1 -1
- package/dist/dynamic/components/Form/package.json +1 -1
- package/dist/dynamic/components/FormSelect/package.json +1 -1
- package/dist/dynamic/components/HelperText/package.json +1 -1
- package/dist/dynamic/components/Hint/package.json +1 -1
- package/dist/dynamic/components/Icon/package.json +1 -1
- package/dist/dynamic/components/InputGroup/package.json +1 -1
- package/dist/dynamic/components/JumpLinks/package.json +1 -1
- package/dist/dynamic/components/Label/package.json +1 -1
- package/dist/dynamic/components/List/package.json +1 -1
- package/dist/dynamic/components/LoginPage/package.json +1 -1
- package/dist/dynamic/components/Masthead/package.json +1 -1
- package/dist/dynamic/components/Menu/package.json +1 -1
- package/dist/dynamic/components/MenuToggle/package.json +1 -1
- package/dist/dynamic/components/Modal/package.json +1 -1
- package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
- package/dist/dynamic/components/Nav/package.json +1 -1
- package/dist/dynamic/components/NotificationBadge/package.json +1 -1
- package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
- package/dist/dynamic/components/NumberInput/package.json +1 -1
- package/dist/dynamic/components/OverflowMenu/package.json +1 -1
- package/dist/dynamic/components/Page/package.json +1 -1
- package/dist/dynamic/components/Pagination/package.json +1 -1
- package/dist/dynamic/components/Panel/package.json +1 -1
- package/dist/dynamic/components/Popover/package.json +1 -1
- package/dist/dynamic/components/Progress/package.json +1 -1
- package/dist/dynamic/components/ProgressStepper/package.json +1 -1
- package/dist/dynamic/components/Radio/package.json +1 -1
- package/dist/dynamic/components/SearchInput/package.json +1 -1
- package/dist/dynamic/components/Select/package.json +1 -1
- package/dist/dynamic/components/Sidebar/package.json +1 -1
- package/dist/dynamic/components/SimpleList/package.json +1 -1
- package/dist/dynamic/components/Skeleton/package.json +1 -1
- package/dist/dynamic/components/SkipToContent/package.json +1 -1
- package/dist/dynamic/components/Slider/package.json +1 -1
- package/dist/dynamic/components/Spinner/package.json +1 -1
- package/dist/dynamic/components/Switch/package.json +1 -1
- package/dist/dynamic/components/Tabs/package.json +1 -1
- package/dist/dynamic/components/TextArea/package.json +1 -1
- package/dist/dynamic/components/TextInput/package.json +1 -1
- package/dist/dynamic/components/TextInputGroup/package.json +1 -1
- package/dist/dynamic/components/TimePicker/package.json +1 -1
- package/dist/dynamic/components/Timestamp/package.json +1 -1
- package/dist/dynamic/components/Title/package.json +1 -1
- package/dist/dynamic/components/ToggleGroup/package.json +1 -1
- package/dist/dynamic/components/Toolbar/package.json +1 -1
- package/dist/dynamic/components/Tooltip/package.json +1 -1
- package/dist/dynamic/components/TreeView/package.json +1 -1
- package/dist/dynamic/components/Truncate/package.json +1 -1
- package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
- package/dist/dynamic/components/Wizard/package.json +1 -1
- package/dist/dynamic/deprecated/components/Chip/package.json +1 -1
- package/dist/dynamic/deprecated/components/DragDrop/package.json +1 -1
- package/dist/dynamic/deprecated/components/DualListSelector/package.json +1 -1
- package/dist/dynamic/deprecated/components/Modal/package.json +1 -1
- package/dist/dynamic/deprecated/components/Tile/package.json +1 -1
- package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
- package/dist/dynamic/deprecated/components/package.json +1 -1
- package/dist/dynamic/helpers/AnimationsProvider/AnimationsProvider/package.json +1 -0
- package/dist/dynamic/helpers/AnimationsProvider/package.json +1 -0
- package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
- package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
- package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
- package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
- package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
- package/dist/dynamic/helpers/constants/package.json +1 -1
- package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
- package/dist/dynamic/helpers/fileUtils/package.json +1 -1
- package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
- package/dist/dynamic/helpers/package.json +1 -1
- package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
- package/dist/dynamic/helpers/typeUtils/package.json +1 -1
- package/dist/dynamic/helpers/useInterval/package.json +1 -1
- package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
- package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
- package/dist/dynamic/helpers/util/package.json +1 -1
- package/dist/dynamic/layouts/Bullseye/package.json +1 -1
- package/dist/dynamic/layouts/Flex/package.json +1 -1
- package/dist/dynamic/layouts/Gallery/package.json +1 -1
- package/dist/dynamic/layouts/Grid/package.json +1 -1
- package/dist/dynamic/layouts/Level/package.json +1 -1
- package/dist/dynamic/layouts/Split/package.json +1 -1
- package/dist/dynamic/layouts/Stack/package.json +1 -1
- package/dist/dynamic/styles/package.json +1 -1
- package/dist/dynamic-modules.json +5 -0
- package/dist/esm/components/Alert/AlertGroup.d.ts +2 -13
- package/dist/esm/components/Alert/AlertGroup.d.ts.map +1 -1
- package/dist/esm/components/Alert/AlertGroup.js +33 -38
- package/dist/esm/components/Alert/AlertGroup.js.map +1 -1
- package/dist/esm/components/Alert/AlertGroupInline.d.ts.map +1 -1
- package/dist/esm/components/Alert/AlertGroupInline.js +3 -1
- package/dist/esm/components/Alert/AlertGroupInline.js.map +1 -1
- package/dist/esm/components/DualListSelector/DualListSelector.d.ts +2 -9
- package/dist/esm/components/DualListSelector/DualListSelector.d.ts.map +1 -1
- package/dist/esm/components/DualListSelector/DualListSelector.js +6 -16
- package/dist/esm/components/DualListSelector/DualListSelector.js.map +1 -1
- package/dist/esm/components/DualListSelector/DualListSelectorTreeItem.d.ts.map +1 -1
- package/dist/esm/components/DualListSelector/DualListSelectorTreeItem.js +3 -1
- package/dist/esm/components/DualListSelector/DualListSelectorTreeItem.js.map +1 -1
- package/dist/esm/components/Form/FormFieldGroupExpandable.d.ts.map +1 -1
- package/dist/esm/components/Form/FormFieldGroupExpandable.js +3 -1
- package/dist/esm/components/Form/FormFieldGroupExpandable.js.map +1 -1
- package/dist/esm/components/Form/InternalFormFieldGroup.d.ts.map +1 -1
- package/dist/esm/components/Form/InternalFormFieldGroup.js +3 -1
- package/dist/esm/components/Form/InternalFormFieldGroup.js.map +1 -1
- package/dist/esm/components/SearchInput/SearchInput.d.ts.map +1 -1
- package/dist/esm/components/SearchInput/SearchInput.js +3 -1
- package/dist/esm/components/SearchInput/SearchInput.js.map +1 -1
- package/dist/esm/components/TreeView/TreeView.d.ts.map +1 -1
- package/dist/esm/components/TreeView/TreeView.js +3 -1
- package/dist/esm/components/TreeView/TreeView.js.map +1 -1
- package/dist/esm/components/TreeView/TreeViewListItem.d.ts.map +1 -1
- package/dist/esm/components/TreeView/TreeViewListItem.js +3 -1
- package/dist/esm/components/TreeView/TreeViewListItem.js.map +1 -1
- package/dist/esm/helpers/AnimationsProvider/AnimationsProvider.d.ts +76 -0
- package/dist/esm/helpers/AnimationsProvider/AnimationsProvider.d.ts.map +1 -0
- package/dist/esm/helpers/AnimationsProvider/AnimationsProvider.js +83 -0
- package/dist/esm/helpers/AnimationsProvider/AnimationsProvider.js.map +1 -0
- package/dist/esm/helpers/AnimationsProvider/index.d.ts +2 -0
- package/dist/esm/helpers/AnimationsProvider/index.d.ts.map +1 -0
- package/dist/esm/helpers/AnimationsProvider/index.js +2 -0
- package/dist/esm/helpers/AnimationsProvider/index.js.map +1 -0
- package/dist/esm/helpers/index.d.ts +1 -0
- package/dist/esm/helpers/index.d.ts.map +1 -1
- package/dist/esm/helpers/index.js +1 -0
- package/dist/esm/helpers/index.js.map +1 -1
- package/dist/js/components/Alert/AlertGroup.d.ts +2 -13
- package/dist/js/components/Alert/AlertGroup.d.ts.map +1 -1
- package/dist/js/components/Alert/AlertGroup.js +33 -37
- package/dist/js/components/Alert/AlertGroup.js.map +1 -1
- package/dist/js/components/Alert/AlertGroupInline.d.ts.map +1 -1
- package/dist/js/components/Alert/AlertGroupInline.js +3 -1
- package/dist/js/components/Alert/AlertGroupInline.js.map +1 -1
- package/dist/js/components/DualListSelector/DualListSelector.d.ts +2 -9
- package/dist/js/components/DualListSelector/DualListSelector.d.ts.map +1 -1
- package/dist/js/components/DualListSelector/DualListSelector.js +7 -16
- package/dist/js/components/DualListSelector/DualListSelector.js.map +1 -1
- package/dist/js/components/DualListSelector/DualListSelectorTreeItem.d.ts.map +1 -1
- package/dist/js/components/DualListSelector/DualListSelectorTreeItem.js +3 -1
- package/dist/js/components/DualListSelector/DualListSelectorTreeItem.js.map +1 -1
- package/dist/js/components/Form/FormFieldGroupExpandable.d.ts.map +1 -1
- package/dist/js/components/Form/FormFieldGroupExpandable.js +3 -1
- package/dist/js/components/Form/FormFieldGroupExpandable.js.map +1 -1
- package/dist/js/components/Form/InternalFormFieldGroup.d.ts.map +1 -1
- package/dist/js/components/Form/InternalFormFieldGroup.js +3 -1
- package/dist/js/components/Form/InternalFormFieldGroup.js.map +1 -1
- package/dist/js/components/SearchInput/SearchInput.d.ts.map +1 -1
- package/dist/js/components/SearchInput/SearchInput.js +3 -1
- package/dist/js/components/SearchInput/SearchInput.js.map +1 -1
- package/dist/js/components/TreeView/TreeView.d.ts.map +1 -1
- package/dist/js/components/TreeView/TreeView.js +3 -1
- package/dist/js/components/TreeView/TreeView.js.map +1 -1
- package/dist/js/components/TreeView/TreeViewListItem.d.ts.map +1 -1
- package/dist/js/components/TreeView/TreeViewListItem.js +3 -1
- package/dist/js/components/TreeView/TreeViewListItem.js.map +1 -1
- package/dist/js/helpers/AnimationsProvider/AnimationsProvider.d.ts +76 -0
- package/dist/js/helpers/AnimationsProvider/AnimationsProvider.d.ts.map +1 -0
- package/dist/js/helpers/AnimationsProvider/AnimationsProvider.js +89 -0
- package/dist/js/helpers/AnimationsProvider/AnimationsProvider.js.map +1 -0
- package/dist/js/helpers/AnimationsProvider/index.d.ts +2 -0
- package/dist/js/helpers/AnimationsProvider/index.d.ts.map +1 -0
- package/dist/js/helpers/AnimationsProvider/index.js +5 -0
- package/dist/js/helpers/AnimationsProvider/index.js.map +1 -0
- package/dist/js/helpers/index.d.ts +1 -0
- package/dist/js/helpers/index.d.ts.map +1 -1
- package/dist/js/helpers/index.js +1 -0
- package/dist/js/helpers/index.js.map +1 -1
- package/dist/umd/assets/{output-BRqYjXqq.css → output-BwG6uaWN.css} +12790 -12790
- package/dist/umd/react-core.min.js +3 -3
- package/helpers/package.json +1 -1
- package/layouts/package.json +1 -1
- package/next/package.json +1 -1
- package/package.json +2 -2
- package/src/components/Alert/AlertGroup.tsx +59 -63
- package/src/components/Alert/AlertGroupInline.tsx +3 -1
- package/src/components/Alert/__tests__/AlertGroup.test.tsx +55 -4
- package/src/components/DualListSelector/DualListSelector.tsx +32 -39
- package/src/components/DualListSelector/DualListSelectorTreeItem.tsx +3 -1
- package/src/components/DualListSelector/__tests__/DualListSelector.test.tsx +28 -0
- package/src/components/Form/FormFieldGroupExpandable.tsx +3 -1
- package/src/components/Form/InternalFormFieldGroup.tsx +3 -1
- package/src/components/Form/__tests__/FormFieldGroupExpandable.test.tsx +30 -0
- package/src/components/SearchInput/SearchInput.tsx +3 -1
- package/src/components/SearchInput/__tests__/SearchInput.test.tsx +52 -0
- package/src/components/TreeView/TreeView.tsx +3 -1
- package/src/components/TreeView/TreeViewListItem.tsx +3 -1
- package/src/components/TreeView/__tests__/TreeView.test.tsx +28 -0
- package/src/components/TreeView/__tests__/__snapshots__/TreeView.test.tsx.snap +1 -1
- package/src/helpers/AnimationsProvider/AnimationsProvider.tsx +104 -0
- package/src/helpers/AnimationsProvider/__tests__/AnimationsProvider.test.tsx +157 -0
- package/src/helpers/AnimationsProvider/index.ts +1 -0
- 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
|
|
|
@@ -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';
|
package/src/helpers/index.ts
CHANGED