@windstream/react-shared-components 0.1.93 → 0.1.95
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/dist/contentful/index.esm.js +2 -2
- package/dist/contentful/index.esm.js.map +1 -1
- package/dist/contentful/index.js +3 -3
- package/dist/contentful/index.js.map +1 -1
- package/dist/core.d.ts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utils/index.esm.js +1 -1
- package/dist/utils/index.js +1 -1
- package/package.json +14 -8
- package/src/components/accordion/index.test.tsx +270 -0
- package/src/components/alert-card/index.test.tsx +152 -0
- package/src/components/animation-wrapper/index.test.tsx +424 -0
- package/src/components/brand-button/index.test.tsx +292 -0
- package/src/components/button/index.test.tsx +91 -0
- package/src/components/call-button/index.test.tsx +260 -0
- package/src/components/checkbox/index.test.tsx +252 -0
- package/src/components/checklist/index.test.tsx +231 -0
- package/src/components/checklist/index.tsx +64 -29
- package/src/components/checklist/types.ts +7 -1
- package/src/components/collapse/index.test.tsx +277 -0
- package/src/components/collapse/index.tsx +1 -0
- package/src/components/divider/index.test.tsx +53 -0
- package/src/components/image/index.test.tsx +174 -0
- package/src/components/input/index.test.tsx +348 -0
- package/src/components/link/index.test.tsx +199 -0
- package/src/components/list/index.test.tsx +166 -0
- package/src/components/material-icon/index.test.tsx +130 -0
- package/src/components/modal/index.test.tsx +310 -0
- package/src/components/next-image/index.test.tsx +406 -0
- package/src/components/pagination/index.test.tsx +521 -0
- package/src/components/radio-button/index.test.tsx +151 -0
- package/src/components/see-more/index.test.tsx +96 -0
- package/src/components/select/index.test.tsx +256 -0
- package/src/components/select-plan-button/index.test.tsx +173 -0
- package/src/components/skeleton/index.test.tsx +74 -0
- package/src/components/spinner/index.test.tsx +76 -0
- package/src/components/text/index.test.tsx +65 -0
- package/src/components/tooltip/index.test.tsx +50 -0
- package/src/components/view-cart-button/index.test.tsx +57 -0
- package/src/contentful/blocks/accordion/index.test.tsx +218 -0
- package/src/contentful/blocks/accordion/index.tsx +3 -1
- package/src/contentful/blocks/address-input-banner/index.test.tsx +132 -0
- package/src/contentful/blocks/anchored-bottom-banner/index.test.tsx +287 -0
- package/src/contentful/blocks/blogs-grid/BlogGrid.stories.tsx +5 -4
- package/src/contentful/blocks/blogs-grid/index.test.tsx +355 -0
- package/src/contentful/blocks/blogs-grid-base/index.test.tsx +274 -0
- package/src/contentful/blocks/breadcrumbs/index.test.tsx +281 -0
- package/src/contentful/blocks/button/index.test.tsx +339 -0
- package/src/contentful/blocks/callout/index.test.tsx +539 -0
- package/src/contentful/blocks/cards/blog-card/index.test.tsx +218 -0
- package/src/contentful/blocks/cards/floating-image-card/index.test.tsx +201 -0
- package/src/contentful/blocks/cards/full-image-card/index.test.tsx +216 -0
- package/src/contentful/blocks/cards/index.test.tsx +39 -0
- package/src/contentful/blocks/cards/product-card/index.test.tsx +263 -0
- package/src/contentful/blocks/cards/simple-card/index.test.tsx +364 -0
- package/src/contentful/blocks/cards/simple-card/index.tsx +1 -1
- package/src/contentful/blocks/cards/testimonial-card/index.test.tsx +180 -0
- package/src/contentful/blocks/carousel/helper.test.tsx +539 -0
- package/src/contentful/blocks/carousel/index.test.tsx +308 -0
- package/src/contentful/blocks/carousel/types.test.ts +16 -0
- package/src/contentful/blocks/cart-retention-banner/index.test.tsx +409 -0
- package/src/contentful/blocks/cart-retention-banner/index.tsx +4 -4
- package/src/contentful/blocks/comparison-table/index.test.tsx +114 -0
- package/src/contentful/blocks/cookiebanner/index.test.tsx +277 -0
- package/src/contentful/blocks/cta-callout/index.test.tsx +244 -0
- package/src/contentful/blocks/dynamic-tabs/index.test.tsx +240 -0
- package/src/contentful/blocks/email-input-block/index.test.tsx +213 -0
- package/src/contentful/blocks/email-input-block/index.tsx +40 -35
- package/src/contentful/blocks/find-kinetic/index.test.tsx +269 -0
- package/src/contentful/blocks/floating-banner/index.test.tsx +246 -0
- package/src/contentful/blocks/footer/index.test.tsx +302 -0
- package/src/contentful/blocks/image-promo-bar/helper.test.tsx +61 -0
- package/src/contentful/blocks/image-promo-bar/index.test.tsx +467 -0
- package/src/contentful/blocks/image-promo-bar/index.tsx +248 -246
- package/src/contentful/blocks/image-promo-bar/vimeo-embed.test.tsx +142 -0
- package/src/contentful/blocks/image-promo-bar/youtube-embed.test.tsx +104 -0
- package/src/contentful/blocks/modal/index.test.tsx +209 -0
- package/src/contentful/blocks/navigation/desktop-link-groups.tsx/index.test.tsx +208 -0
- package/src/contentful/blocks/navigation/index.test.tsx +924 -0
- package/src/contentful/blocks/navigation/mobile-link-groups.tsx/index.test.tsx +131 -0
- package/src/contentful/blocks/primary-hero/index.test.tsx +286 -0
- package/src/contentful/blocks/primary-hero/index.tsx +7 -4
- package/src/contentful/blocks/search-block/index.test.tsx +268 -0
- package/src/contentful/blocks/shape-background-wrapper/index.test.tsx +284 -0
- package/src/contentful/blocks/text/index.test.tsx +36 -0
- package/src/contentful/index.test.ts +45 -0
- package/src/global-mocks/contentful/to-document.ts +25 -0
- package/src/global-mocks/cookie.ts +48 -0
- package/src/global-mocks/cx.ts +37 -0
- package/src/global-mocks/index.ts +89 -0
- package/src/global-mocks/speed-card-bg.ts +27 -0
- package/src/global-mocks/utm.ts +49 -0
- package/src/hooks/contentful/use-contentful-rich-text.test.tsx +1758 -0
- package/src/hooks/contentful/use-contentful-rich-text.tsx +1 -1
- package/src/hooks/contentful/use-processed-check-list.test.tsx +277 -0
- package/src/hooks/use-body-scroll-lock.test.ts +134 -0
- package/src/hooks/use-carousel-swipe.test.ts +393 -0
- package/src/hooks/use-outside-click.test.ts +142 -0
- package/src/index.ts +1 -1
- package/src/next/index.test.ts +7 -0
- package/src/setupTests.ts +17 -11
- package/src/utils/contentful/to-document.test.ts +85 -0
- package/src/utils/cookie.test.ts +180 -0
- package/src/utils/cx.test.ts +90 -0
- package/src/utils/index.test.ts +115 -0
- package/src/utils/speed-card-bg.test.ts +46 -0
- package/src/utils/utm.test.ts +359 -0
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { AnimationWrapper } from "./index";
|
|
3
|
+
|
|
4
|
+
import { render, screen } from "@testing-library/react";
|
|
5
|
+
|
|
6
|
+
import "@testing-library/jest-dom";
|
|
7
|
+
|
|
8
|
+
// Mock framer-motion
|
|
9
|
+
const mockUseReducedMotion = jest.fn(() => false);
|
|
10
|
+
|
|
11
|
+
jest.mock("framer-motion", () => {
|
|
12
|
+
const actual = jest.requireActual("framer-motion");
|
|
13
|
+
return {
|
|
14
|
+
...actual,
|
|
15
|
+
useReducedMotion: () => mockUseReducedMotion(),
|
|
16
|
+
motion: new Proxy(
|
|
17
|
+
{},
|
|
18
|
+
{
|
|
19
|
+
get: (_target, prop: string) => {
|
|
20
|
+
const motionKeys = [
|
|
21
|
+
"whileHover",
|
|
22
|
+
"whileTap",
|
|
23
|
+
"transition",
|
|
24
|
+
"animate",
|
|
25
|
+
"initial",
|
|
26
|
+
"exit",
|
|
27
|
+
"variants",
|
|
28
|
+
];
|
|
29
|
+
const MotionMock = React.forwardRef(
|
|
30
|
+
(props: Record<string, unknown>, ref: React.Ref<unknown>) => {
|
|
31
|
+
const rest: Record<string, unknown> = {};
|
|
32
|
+
Object.keys(props).forEach(key => {
|
|
33
|
+
if (!motionKeys.includes(key)) {
|
|
34
|
+
rest[key] = props[key];
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return React.createElement(prop, {
|
|
38
|
+
...rest,
|
|
39
|
+
ref,
|
|
40
|
+
"data-motion": "true",
|
|
41
|
+
"data-while-hover": JSON.stringify(props.whileHover),
|
|
42
|
+
"data-while-tap": JSON.stringify(props.whileTap),
|
|
43
|
+
"data-transition": JSON.stringify(props.transition),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
MotionMock.displayName = `Motion(${prop})`;
|
|
48
|
+
return MotionMock;
|
|
49
|
+
},
|
|
50
|
+
}
|
|
51
|
+
),
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
describe("AnimationWrapper", () => {
|
|
56
|
+
beforeEach(() => {
|
|
57
|
+
mockUseReducedMotion.mockReturnValue(false);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
describe("when animation is disabled", () => {
|
|
61
|
+
it("returns the child directly when disableAnimation is true (default)", () => {
|
|
62
|
+
render(
|
|
63
|
+
<AnimationWrapper>
|
|
64
|
+
<button data-testid="child">Click</button>
|
|
65
|
+
</AnimationWrapper>
|
|
66
|
+
);
|
|
67
|
+
const btn = screen.getByTestId("child");
|
|
68
|
+
expect(btn).toBeInTheDocument();
|
|
69
|
+
expect(btn.tagName).toBe("BUTTON");
|
|
70
|
+
expect(btn).not.toHaveAttribute("data-motion");
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("returns the child directly when disableAnimation is explicitly true", () => {
|
|
74
|
+
render(
|
|
75
|
+
<AnimationWrapper disableAnimation={true}>
|
|
76
|
+
<span data-testid="child">Text</span>
|
|
77
|
+
</AnimationWrapper>
|
|
78
|
+
);
|
|
79
|
+
expect(screen.getByTestId("child")).not.toHaveAttribute("data-motion");
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("returns the child directly when user prefers reduced motion", () => {
|
|
83
|
+
mockUseReducedMotion.mockReturnValue(true);
|
|
84
|
+
render(
|
|
85
|
+
<AnimationWrapper disableAnimation={false} animationType="scale">
|
|
86
|
+
<div data-testid="child">Content</div>
|
|
87
|
+
</AnimationWrapper>
|
|
88
|
+
);
|
|
89
|
+
expect(screen.getByTestId("child")).not.toHaveAttribute("data-motion");
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
describe("when animation is enabled", () => {
|
|
94
|
+
describe("with intrinsic elements", () => {
|
|
95
|
+
it("wraps intrinsic element with motion component for scale animation", () => {
|
|
96
|
+
render(
|
|
97
|
+
<AnimationWrapper disableAnimation={false} animationType="scale">
|
|
98
|
+
<div data-testid="child">Animated</div>
|
|
99
|
+
</AnimationWrapper>
|
|
100
|
+
);
|
|
101
|
+
const el = screen.getByTestId("child");
|
|
102
|
+
expect(el).toHaveAttribute("data-motion", "true");
|
|
103
|
+
const whileHover = JSON.parse(
|
|
104
|
+
el.getAttribute("data-while-hover") || "{}"
|
|
105
|
+
);
|
|
106
|
+
expect(whileHover).toEqual({ scale: 1.02 });
|
|
107
|
+
const whileTap = JSON.parse(el.getAttribute("data-while-tap") || "{}");
|
|
108
|
+
expect(whileTap).toEqual({ scale: 0.98 });
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it("applies shadow animation preset", () => {
|
|
112
|
+
render(
|
|
113
|
+
<AnimationWrapper disableAnimation={false} animationType="shadow">
|
|
114
|
+
<div data-testid="child">Shadow</div>
|
|
115
|
+
</AnimationWrapper>
|
|
116
|
+
);
|
|
117
|
+
const el = screen.getByTestId("child");
|
|
118
|
+
const whileHover = JSON.parse(
|
|
119
|
+
el.getAttribute("data-while-hover") || "{}"
|
|
120
|
+
);
|
|
121
|
+
expect(whileHover).toEqual({
|
|
122
|
+
boxShadow: "0 10px 25px rgba(0,0,0,0.15)",
|
|
123
|
+
});
|
|
124
|
+
// shadow preset has no whileTap, so mergedWhileTap is undefined
|
|
125
|
+
const whileTap = el.getAttribute("data-while-tap");
|
|
126
|
+
expect(whileTap).toBeNull();
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it("applies lift animation preset", () => {
|
|
130
|
+
render(
|
|
131
|
+
<AnimationWrapper disableAnimation={false} animationType="lift">
|
|
132
|
+
<div data-testid="child">Lift</div>
|
|
133
|
+
</AnimationWrapper>
|
|
134
|
+
);
|
|
135
|
+
const el = screen.getByTestId("child");
|
|
136
|
+
const whileHover = JSON.parse(
|
|
137
|
+
el.getAttribute("data-while-hover") || "{}"
|
|
138
|
+
);
|
|
139
|
+
expect(whileHover).toEqual({ y: -5 });
|
|
140
|
+
const whileTap = JSON.parse(el.getAttribute("data-while-tap") || "{}");
|
|
141
|
+
expect(whileTap).toEqual({ y: 0 });
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it("applies opacity animation preset", () => {
|
|
145
|
+
render(
|
|
146
|
+
<AnimationWrapper disableAnimation={false} animationType="opacity">
|
|
147
|
+
<div data-testid="child">Opacity</div>
|
|
148
|
+
</AnimationWrapper>
|
|
149
|
+
);
|
|
150
|
+
const el = screen.getByTestId("child");
|
|
151
|
+
const whileHover = JSON.parse(
|
|
152
|
+
el.getAttribute("data-while-hover") || "{}"
|
|
153
|
+
);
|
|
154
|
+
expect(whileHover).toEqual({ opacity: 0.8 });
|
|
155
|
+
const transition = JSON.parse(
|
|
156
|
+
el.getAttribute("data-transition") || "{}"
|
|
157
|
+
);
|
|
158
|
+
expect(transition).toEqual({ duration: 0.2 });
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it("applies grow animation preset", () => {
|
|
162
|
+
render(
|
|
163
|
+
<AnimationWrapper disableAnimation={false} animationType="grow">
|
|
164
|
+
<div data-testid="child">Grow</div>
|
|
165
|
+
</AnimationWrapper>
|
|
166
|
+
);
|
|
167
|
+
const el = screen.getByTestId("child");
|
|
168
|
+
const whileHover = JSON.parse(
|
|
169
|
+
el.getAttribute("data-while-hover") || "{}"
|
|
170
|
+
);
|
|
171
|
+
expect(whileHover).toEqual({ scale: 1.1 });
|
|
172
|
+
const whileTap = JSON.parse(el.getAttribute("data-while-tap") || "{}");
|
|
173
|
+
expect(whileTap).toEqual({ scale: 0.95 });
|
|
174
|
+
const transition = JSON.parse(
|
|
175
|
+
el.getAttribute("data-transition") || "{}"
|
|
176
|
+
);
|
|
177
|
+
expect(transition).toEqual({
|
|
178
|
+
type: "spring",
|
|
179
|
+
stiffness: 300,
|
|
180
|
+
damping: 20,
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it("works with different intrinsic HTML elements (span)", () => {
|
|
185
|
+
render(
|
|
186
|
+
<AnimationWrapper disableAnimation={false} animationType="scale">
|
|
187
|
+
<span data-testid="child">Span</span>
|
|
188
|
+
</AnimationWrapper>
|
|
189
|
+
);
|
|
190
|
+
const el = screen.getByTestId("child");
|
|
191
|
+
expect(el.tagName).toBe("SPAN");
|
|
192
|
+
expect(el).toHaveAttribute("data-motion", "true");
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it("works with anchor elements", () => {
|
|
196
|
+
render(
|
|
197
|
+
<AnimationWrapper disableAnimation={false} animationType="lift">
|
|
198
|
+
<a data-testid="child" href="/test">
|
|
199
|
+
Link
|
|
200
|
+
</a>
|
|
201
|
+
</AnimationWrapper>
|
|
202
|
+
);
|
|
203
|
+
const el = screen.getByTestId("child");
|
|
204
|
+
expect(el.tagName).toBe("A");
|
|
205
|
+
expect(el).toHaveAttribute("href", "/test");
|
|
206
|
+
expect(el).toHaveAttribute("data-motion", "true");
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
describe("with composite (non-intrinsic) elements", () => {
|
|
211
|
+
const CustomComponent = ({ label }: { label: string }) => (
|
|
212
|
+
<span data-testid="custom">{label}</span>
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
it("wraps composite component in motion.div", () => {
|
|
216
|
+
const { container } = render(
|
|
217
|
+
<AnimationWrapper disableAnimation={false} animationType="scale">
|
|
218
|
+
<CustomComponent label="Hello" />
|
|
219
|
+
</AnimationWrapper>
|
|
220
|
+
);
|
|
221
|
+
// The wrapper should be a div with motion attributes
|
|
222
|
+
const wrapper = container.firstElementChild;
|
|
223
|
+
expect(wrapper?.tagName).toBe("DIV");
|
|
224
|
+
expect(wrapper).toHaveAttribute("data-motion", "true");
|
|
225
|
+
// The child should be rendered inside
|
|
226
|
+
expect(screen.getByTestId("custom")).toBeInTheDocument();
|
|
227
|
+
expect(screen.getByText("Hello")).toBeInTheDocument();
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
it("applies animation presets to motion.div wrapper", () => {
|
|
231
|
+
const { container } = render(
|
|
232
|
+
<AnimationWrapper disableAnimation={false} animationType="grow">
|
|
233
|
+
<CustomComponent label="Test" />
|
|
234
|
+
</AnimationWrapper>
|
|
235
|
+
);
|
|
236
|
+
const wrapper = container.firstElementChild;
|
|
237
|
+
const whileHover = JSON.parse(
|
|
238
|
+
wrapper?.getAttribute("data-while-hover") || "{}"
|
|
239
|
+
);
|
|
240
|
+
expect(whileHover).toEqual({ scale: 1.1 });
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
describe("with multiple animation types", () => {
|
|
245
|
+
it("merges multiple animation presets", () => {
|
|
246
|
+
render(
|
|
247
|
+
<AnimationWrapper
|
|
248
|
+
disableAnimation={false}
|
|
249
|
+
animationType={["scale", "shadow"]}
|
|
250
|
+
>
|
|
251
|
+
<div data-testid="child">Multi</div>
|
|
252
|
+
</AnimationWrapper>
|
|
253
|
+
);
|
|
254
|
+
const el = screen.getByTestId("child");
|
|
255
|
+
const whileHover = JSON.parse(
|
|
256
|
+
el.getAttribute("data-while-hover") || "{}"
|
|
257
|
+
);
|
|
258
|
+
expect(whileHover).toEqual({
|
|
259
|
+
scale: 1.02,
|
|
260
|
+
boxShadow: "0 10px 25px rgba(0,0,0,0.15)",
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it("merges whileTap from multiple presets", () => {
|
|
265
|
+
render(
|
|
266
|
+
<AnimationWrapper
|
|
267
|
+
disableAnimation={false}
|
|
268
|
+
animationType={["scale", "lift"]}
|
|
269
|
+
>
|
|
270
|
+
<div data-testid="child">Multi Tap</div>
|
|
271
|
+
</AnimationWrapper>
|
|
272
|
+
);
|
|
273
|
+
const el = screen.getByTestId("child");
|
|
274
|
+
const whileTap = JSON.parse(el.getAttribute("data-while-tap") || "{}");
|
|
275
|
+
expect(whileTap).toEqual({ scale: 0.98, y: 0 });
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
it("merges transitions from multiple presets", () => {
|
|
279
|
+
render(
|
|
280
|
+
<AnimationWrapper
|
|
281
|
+
disableAnimation={false}
|
|
282
|
+
animationType={["opacity", "lift"]}
|
|
283
|
+
>
|
|
284
|
+
<div data-testid="child">Merged</div>
|
|
285
|
+
</AnimationWrapper>
|
|
286
|
+
);
|
|
287
|
+
const el = screen.getByTestId("child");
|
|
288
|
+
const transition = JSON.parse(
|
|
289
|
+
el.getAttribute("data-transition") || "{}"
|
|
290
|
+
);
|
|
291
|
+
expect(transition).toEqual({
|
|
292
|
+
duration: 0.2,
|
|
293
|
+
type: "spring",
|
|
294
|
+
stiffness: 300,
|
|
295
|
+
damping: 20,
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
it("handles empty array of animation types", () => {
|
|
300
|
+
render(
|
|
301
|
+
<AnimationWrapper disableAnimation={false} animationType={[]}>
|
|
302
|
+
<div data-testid="child">No Animation</div>
|
|
303
|
+
</AnimationWrapper>
|
|
304
|
+
);
|
|
305
|
+
const el = screen.getByTestId("child");
|
|
306
|
+
// With empty array, mergePresets returns undefined, so no preset is applied
|
|
307
|
+
expect(el).toHaveAttribute("data-motion", "true");
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
describe("custom overrides", () => {
|
|
312
|
+
it("overrides preset whileHover with custom prop", () => {
|
|
313
|
+
render(
|
|
314
|
+
<AnimationWrapper
|
|
315
|
+
disableAnimation={false}
|
|
316
|
+
animationType="scale"
|
|
317
|
+
whileHover={{ scale: 2 }}
|
|
318
|
+
>
|
|
319
|
+
<div data-testid="child">Override</div>
|
|
320
|
+
</AnimationWrapper>
|
|
321
|
+
);
|
|
322
|
+
const el = screen.getByTestId("child");
|
|
323
|
+
const whileHover = JSON.parse(
|
|
324
|
+
el.getAttribute("data-while-hover") || "{}"
|
|
325
|
+
);
|
|
326
|
+
// Custom override should merge with preset (custom wins)
|
|
327
|
+
expect(whileHover.scale).toBe(2);
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
it("overrides preset whileTap with custom prop", () => {
|
|
331
|
+
render(
|
|
332
|
+
<AnimationWrapper
|
|
333
|
+
disableAnimation={false}
|
|
334
|
+
animationType="scale"
|
|
335
|
+
whileTap={{ scale: 0.5 }}
|
|
336
|
+
>
|
|
337
|
+
<div data-testid="child">Override Tap</div>
|
|
338
|
+
</AnimationWrapper>
|
|
339
|
+
);
|
|
340
|
+
const el = screen.getByTestId("child");
|
|
341
|
+
const whileTap = JSON.parse(el.getAttribute("data-while-tap") || "{}");
|
|
342
|
+
expect(whileTap.scale).toBe(0.5);
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
it("overrides preset transition with custom prop", () => {
|
|
346
|
+
render(
|
|
347
|
+
<AnimationWrapper
|
|
348
|
+
disableAnimation={false}
|
|
349
|
+
animationType="scale"
|
|
350
|
+
transition={{ duration: 1 }}
|
|
351
|
+
>
|
|
352
|
+
<div data-testid="child">Override Trans</div>
|
|
353
|
+
</AnimationWrapper>
|
|
354
|
+
);
|
|
355
|
+
const el = screen.getByTestId("child");
|
|
356
|
+
const transition = JSON.parse(
|
|
357
|
+
el.getAttribute("data-transition") || "{}"
|
|
358
|
+
);
|
|
359
|
+
expect(transition.duration).toBe(1);
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
it("uses custom whileHover even without animationType", () => {
|
|
363
|
+
render(
|
|
364
|
+
<AnimationWrapper
|
|
365
|
+
disableAnimation={false}
|
|
366
|
+
whileHover={{ rotate: 10 }}
|
|
367
|
+
>
|
|
368
|
+
<div data-testid="child">Custom Only</div>
|
|
369
|
+
</AnimationWrapper>
|
|
370
|
+
);
|
|
371
|
+
const el = screen.getByTestId("child");
|
|
372
|
+
const whileHover = JSON.parse(
|
|
373
|
+
el.getAttribute("data-while-hover") || "{}"
|
|
374
|
+
);
|
|
375
|
+
expect(whileHover).toEqual({ rotate: 10 });
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
it("uses custom whileTap without animationType", () => {
|
|
379
|
+
render(
|
|
380
|
+
<AnimationWrapper disableAnimation={false} whileTap={{ rotate: -5 }}>
|
|
381
|
+
<div data-testid="child">Tap</div>
|
|
382
|
+
</AnimationWrapper>
|
|
383
|
+
);
|
|
384
|
+
const el = screen.getByTestId("child");
|
|
385
|
+
const whileTap = JSON.parse(el.getAttribute("data-while-tap") || "{}");
|
|
386
|
+
expect(whileTap).toEqual({ rotate: -5 });
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
it("uses custom transition without animationType", () => {
|
|
390
|
+
render(
|
|
391
|
+
<AnimationWrapper
|
|
392
|
+
disableAnimation={false}
|
|
393
|
+
transition={{ delay: 0.5 }}
|
|
394
|
+
>
|
|
395
|
+
<div data-testid="child">Trans</div>
|
|
396
|
+
</AnimationWrapper>
|
|
397
|
+
);
|
|
398
|
+
const el = screen.getByTestId("child");
|
|
399
|
+
const transition = JSON.parse(
|
|
400
|
+
el.getAttribute("data-transition") || "{}"
|
|
401
|
+
);
|
|
402
|
+
expect(transition).toEqual({ delay: 0.5 });
|
|
403
|
+
});
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
describe("no animationType and no custom overrides", () => {
|
|
407
|
+
it("renders motion component with undefined animation props", () => {
|
|
408
|
+
render(
|
|
409
|
+
<AnimationWrapper disableAnimation={false}>
|
|
410
|
+
<div data-testid="child">Plain</div>
|
|
411
|
+
</AnimationWrapper>
|
|
412
|
+
);
|
|
413
|
+
const el = screen.getByTestId("child");
|
|
414
|
+
expect(el).toHaveAttribute("data-motion", "true");
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
describe("displayName", () => {
|
|
420
|
+
it("has correct displayName", () => {
|
|
421
|
+
expect(AnimationWrapper.displayName).toBe("AnimationWrapper");
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
});
|