@wix/interact 1.92.0 → 2.0.0-rc.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 (179) hide show
  1. package/dist/cjs/index.js +2 -23
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/react.js +15 -0
  4. package/dist/cjs/react.js.map +1 -0
  5. package/dist/cjs/web.js +2 -0
  6. package/dist/cjs/web.js.map +1 -0
  7. package/dist/es/index.js +8 -0
  8. package/dist/es/index.js.map +1 -0
  9. package/dist/es/react.js +650 -0
  10. package/dist/es/react.js.map +1 -0
  11. package/dist/es/web.js +56 -0
  12. package/dist/es/web.js.map +1 -0
  13. package/dist/index-C8QxOkui.mjs +7940 -0
  14. package/dist/index-C8QxOkui.mjs.map +1 -0
  15. package/dist/index-DEPRHaUt.js +18 -0
  16. package/dist/index-DEPRHaUt.js.map +1 -0
  17. package/dist/tsconfig.build.tsbuildinfo +1 -0
  18. package/dist/types/core/Interact.d.ts +17 -7
  19. package/dist/types/core/Interact.d.ts.map +1 -0
  20. package/dist/types/core/InteractionController.d.ts +19 -0
  21. package/dist/types/core/InteractionController.d.ts.map +1 -0
  22. package/dist/types/core/add.d.ts +4 -3
  23. package/dist/types/core/add.d.ts.map +1 -0
  24. package/dist/types/core/css.d.ts +3 -0
  25. package/dist/types/core/css.d.ts.map +1 -0
  26. package/dist/types/core/remove.d.ts +3 -1
  27. package/dist/types/core/remove.d.ts.map +1 -0
  28. package/dist/types/core/utilities.d.ts +1 -0
  29. package/dist/types/core/utilities.d.ts.map +1 -0
  30. package/dist/types/dom/api.d.ts +3 -0
  31. package/dist/types/dom/api.d.ts.map +1 -0
  32. package/dist/types/handlers/animationEnd.d.ts +3 -2
  33. package/dist/types/handlers/animationEnd.d.ts.map +1 -0
  34. package/dist/types/handlers/click.d.ts +3 -2
  35. package/dist/types/handlers/click.d.ts.map +1 -0
  36. package/dist/types/handlers/hover.d.ts +3 -2
  37. package/dist/types/handlers/hover.d.ts.map +1 -0
  38. package/dist/types/handlers/index.d.ts +1 -0
  39. package/dist/types/handlers/index.d.ts.map +1 -0
  40. package/dist/types/handlers/pointerMove.d.ts +3 -2
  41. package/dist/types/handlers/pointerMove.d.ts.map +1 -0
  42. package/dist/types/handlers/utilities.d.ts +1 -0
  43. package/dist/types/handlers/utilities.d.ts.map +1 -0
  44. package/dist/types/handlers/viewEnter.d.ts +3 -2
  45. package/dist/types/handlers/viewEnter.d.ts.map +1 -0
  46. package/dist/types/handlers/viewProgress.d.ts +4 -3
  47. package/dist/types/handlers/viewProgress.d.ts.map +1 -0
  48. package/dist/types/index.d.ts +3 -2
  49. package/dist/types/index.d.ts.map +1 -0
  50. package/dist/types/react/Interaction.d.ts +10 -0
  51. package/dist/types/react/Interaction.d.ts.map +1 -0
  52. package/dist/types/react/index.d.ts +8 -0
  53. package/dist/types/react/index.d.ts.map +1 -0
  54. package/dist/types/react/interactRef.d.ts +3 -0
  55. package/dist/types/react/interactRef.d.ts.map +1 -0
  56. package/dist/types/types.d.ts +25 -10
  57. package/dist/types/types.d.ts.map +1 -0
  58. package/dist/types/utils.d.ts +4 -2
  59. package/dist/types/utils.d.ts.map +1 -0
  60. package/dist/types/{InteractElement.d.ts → web/InteractElement.d.ts} +115 -77
  61. package/dist/types/web/InteractElement.d.ts.map +1 -0
  62. package/dist/types/web/defineInteractElement.d.ts +2 -0
  63. package/dist/types/web/defineInteractElement.d.ts.map +1 -0
  64. package/dist/types/web/index.d.ts +6 -0
  65. package/dist/types/web/index.d.ts.map +1 -0
  66. package/docs/README.md +211 -0
  67. package/docs/advanced/README.md +164 -0
  68. package/docs/api/README.md +157 -0
  69. package/docs/api/element-selection.md +607 -0
  70. package/docs/api/functions.md +638 -0
  71. package/docs/api/interact-class.md +663 -0
  72. package/docs/api/interact-element.md +565 -0
  73. package/docs/api/interaction-controller.md +450 -0
  74. package/docs/api/types.md +957 -0
  75. package/docs/examples/README.md +212 -0
  76. package/docs/examples/click-interactions.md +977 -0
  77. package/docs/examples/entrance-animations.md +935 -0
  78. package/docs/examples/hover-effects.md +930 -0
  79. package/docs/examples/list-patterns.md +737 -0
  80. package/docs/guides/README.md +49 -0
  81. package/docs/guides/conditions-and-media-queries.md +1068 -0
  82. package/docs/guides/configuration-structure.md +726 -0
  83. package/docs/guides/custom-elements.md +327 -0
  84. package/docs/guides/effects-and-animations.md +634 -0
  85. package/docs/guides/getting-started.md +379 -0
  86. package/docs/guides/lists-and-dynamic-content.md +713 -0
  87. package/docs/guides/state-management.md +747 -0
  88. package/docs/guides/understanding-triggers.md +690 -0
  89. package/docs/integration/README.md +264 -0
  90. package/docs/integration/react.md +605 -0
  91. package/package.json +73 -56
  92. package/rules/Integration.md +255 -0
  93. package/rules/click-rules.md +533 -0
  94. package/rules/full-lean.md +346 -0
  95. package/rules/hover-rules.md +593 -0
  96. package/rules/pointermove-rules.md +1341 -0
  97. package/rules/scroll-list-rules.md +900 -0
  98. package/rules/viewenter-rules.md +1015 -0
  99. package/rules/viewprogress-rules.md +1044 -0
  100. package/dist/cjs/InteractElement.js +0 -162
  101. package/dist/cjs/InteractElement.js.map +0 -1
  102. package/dist/cjs/__tests__/interact.spec.js +0 -1930
  103. package/dist/cjs/__tests__/interact.spec.js.map +0 -1
  104. package/dist/cjs/__tests__/viewEnter.spec.js +0 -207
  105. package/dist/cjs/__tests__/viewEnter.spec.js.map +0 -1
  106. package/dist/cjs/core/Interact.js +0 -257
  107. package/dist/cjs/core/Interact.js.map +0 -1
  108. package/dist/cjs/core/add.js +0 -246
  109. package/dist/cjs/core/add.js.map +0 -1
  110. package/dist/cjs/core/remove.js +0 -35
  111. package/dist/cjs/core/remove.js.map +0 -1
  112. package/dist/cjs/core/utilities.js +0 -16
  113. package/dist/cjs/core/utilities.js.map +0 -1
  114. package/dist/cjs/external-types.d.js +0 -2
  115. package/dist/cjs/external-types.d.js.map +0 -1
  116. package/dist/cjs/handlers/animationEnd.js +0 -33
  117. package/dist/cjs/handlers/animationEnd.js.map +0 -1
  118. package/dist/cjs/handlers/click.js +0 -116
  119. package/dist/cjs/handlers/click.js.map +0 -1
  120. package/dist/cjs/handlers/hover.js +0 -141
  121. package/dist/cjs/handlers/hover.js.map +0 -1
  122. package/dist/cjs/handlers/index.js +0 -32
  123. package/dist/cjs/handlers/index.js.map +0 -1
  124. package/dist/cjs/handlers/pointerMove.js +0 -49
  125. package/dist/cjs/handlers/pointerMove.js.map +0 -1
  126. package/dist/cjs/handlers/utilities.js +0 -49
  127. package/dist/cjs/handlers/utilities.js.map +0 -1
  128. package/dist/cjs/handlers/viewEnter.js +0 -127
  129. package/dist/cjs/handlers/viewEnter.js.map +0 -1
  130. package/dist/cjs/handlers/viewProgress.js +0 -65
  131. package/dist/cjs/handlers/viewProgress.js.map +0 -1
  132. package/dist/cjs/test-types.d.js +0 -2
  133. package/dist/cjs/test-types.d.js.map +0 -1
  134. package/dist/cjs/types.js +0 -2
  135. package/dist/cjs/types.js.map +0 -1
  136. package/dist/cjs/utils.js +0 -68
  137. package/dist/cjs/utils.js.map +0 -1
  138. package/dist/esm/InteractElement.js +0 -156
  139. package/dist/esm/InteractElement.js.map +0 -1
  140. package/dist/esm/__tests__/interact.spec.js +0 -1937
  141. package/dist/esm/__tests__/interact.spec.js.map +0 -1
  142. package/dist/esm/__tests__/viewEnter.spec.js +0 -210
  143. package/dist/esm/__tests__/viewEnter.spec.js.map +0 -1
  144. package/dist/esm/core/Interact.js +0 -251
  145. package/dist/esm/core/Interact.js.map +0 -1
  146. package/dist/esm/core/add.js +0 -241
  147. package/dist/esm/core/add.js.map +0 -1
  148. package/dist/esm/core/remove.js +0 -30
  149. package/dist/esm/core/remove.js.map +0 -1
  150. package/dist/esm/core/utilities.js +0 -14
  151. package/dist/esm/core/utilities.js.map +0 -1
  152. package/dist/esm/external-types.d.js +0 -2
  153. package/dist/esm/external-types.d.js.map +0 -1
  154. package/dist/esm/handlers/animationEnd.js +0 -29
  155. package/dist/esm/handlers/animationEnd.js.map +0 -1
  156. package/dist/esm/handlers/click.js +0 -116
  157. package/dist/esm/handlers/click.js.map +0 -1
  158. package/dist/esm/handlers/hover.js +0 -141
  159. package/dist/esm/handlers/hover.js.map +0 -1
  160. package/dist/esm/handlers/index.js +0 -27
  161. package/dist/esm/handlers/index.js.map +0 -1
  162. package/dist/esm/handlers/pointerMove.js +0 -48
  163. package/dist/esm/handlers/pointerMove.js.map +0 -1
  164. package/dist/esm/handlers/utilities.js +0 -43
  165. package/dist/esm/handlers/utilities.js.map +0 -1
  166. package/dist/esm/handlers/viewEnter.js +0 -129
  167. package/dist/esm/handlers/viewEnter.js.map +0 -1
  168. package/dist/esm/handlers/viewProgress.js +0 -61
  169. package/dist/esm/handlers/viewProgress.js.map +0 -1
  170. package/dist/esm/index.js +0 -5
  171. package/dist/esm/index.js.map +0 -1
  172. package/dist/esm/test-types.d.js +0 -2
  173. package/dist/esm/test-types.d.js.map +0 -1
  174. package/dist/esm/types.js +0 -2
  175. package/dist/esm/types.js.map +0 -1
  176. package/dist/esm/utils.js +0 -63
  177. package/dist/esm/utils.js.map +0 -1
  178. package/dist/types/__tests__/interact.spec.d.ts +0 -1
  179. package/dist/types/__tests__/viewEnter.spec.d.ts +0 -0
@@ -0,0 +1,737 @@
1
+ # List Patterns
2
+
3
+ Comprehensive examples of list and grid animations using `@wix/interact`. All examples use `listContainer` for optimal performance and automatic mutation tracking.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Entrance Animations](#entrance-animations)
8
+ - [Staggered Effects](#staggered-effects)
9
+ - [Hover Interactions](#hover-interactions)
10
+ - [Dynamic List Management](#dynamic-list-management)
11
+ - [Infinite Scroll](#infinite-scroll)
12
+ - [Filtering & Sorting](#filtering--sorting)
13
+ - [Grid Layouts](#grid-layouts)
14
+ - [Real-World Examples](#real-world-examples)
15
+
16
+ ## Entrance Animations
17
+
18
+ ### 1. Fade In List
19
+
20
+ Simple fade entrance for list items.
21
+
22
+ ```typescript
23
+ import { Interact } from '@wix/interact';
24
+
25
+ const config = {
26
+ interactions: [{
27
+ key: 'item-list',
28
+ listContainer: '.items',
29
+ trigger: 'viewEnter',
30
+ params: { type: 'once', threshold: 0.1 },
31
+ effects: [{
32
+ key: 'item-list',
33
+ listContainer: '.items',
34
+ keyframeEffect: {
35
+ name: 'fade-in',
36
+ keyframes: [
37
+ { opacity: '0' },
38
+ { opacity: '1' }
39
+ ]
40
+ },
41
+ duration: 600,
42
+ easing: 'ease-out'
43
+ }]
44
+ }]
45
+ };
46
+
47
+ Interact.create(config);
48
+ ```
49
+
50
+ ```html
51
+ <interact-element data-interact-key="item-list">
52
+ <ul class="items">
53
+ <li>Item 1</li>
54
+ <li>Item 2</li>
55
+ <li>Item 3</li>
56
+ </ul>
57
+ </interact-element>
58
+ ```
59
+
60
+ ### 2. Slide Up Cascade
61
+
62
+ Items slide up sequentially.
63
+
64
+ ```typescript
65
+ const config = {
66
+ interactions: [{
67
+ key: 'features',
68
+ listContainer: '.feature-list',
69
+ trigger: 'viewEnter',
70
+ params: { type: 'once', threshold: 0.2 },
71
+ effects: [{
72
+ key: 'features',
73
+ listContainer: '.feature-list',
74
+ keyframeEffect: {
75
+ name: 'slide-up',
76
+ keyframes: [
77
+ { opacity: '0', transform: 'translateY(40px)' },
78
+ { opacity: '1', transform: 'translateY(0)' }
79
+ ]
80
+ },
81
+ duration: 700,
82
+ easing: 'cubic-bezier(0.16, 1, 0.3, 1)'
83
+ }]
84
+ }]
85
+ };
86
+ ```
87
+
88
+ ```css
89
+ /* Add stagger via CSS */
90
+ .feature-list > *:nth-child(1) { animation-delay: 0ms; }
91
+ .feature-list > *:nth-child(2) { animation-delay: 100ms; }
92
+ .feature-list > *:nth-child(3) { animation-delay: 200ms; }
93
+ .feature-list > *:nth-child(4) { animation-delay: 300ms; }
94
+ .feature-list > *:nth-child(5) { animation-delay: 400ms; }
95
+ ```
96
+
97
+ ### 3. Scale and Rotate
98
+
99
+ Dramatic entrance with scale and rotation.
100
+
101
+ ```typescript
102
+ const config = {
103
+ interactions: [{
104
+ key: 'cards',
105
+ listContainer: '.card-grid',
106
+ trigger: 'viewEnter',
107
+ params: { type: 'once', threshold: 0.15 },
108
+ effects: [{
109
+ key: 'cards',
110
+ listContainer: '.card-grid',
111
+ keyframeEffect: {
112
+ name: 'scale-rotate',
113
+ keyframes: [
114
+ { opacity: '0', transform: 'scale(0.6) rotate(-15deg)' },
115
+ { opacity: '1', transform: 'scale(1) rotate(0deg)' }
116
+ ]
117
+ },
118
+ duration: 800,
119
+ easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)' // Elastic
120
+ }]
121
+ }]
122
+ };
123
+ ```
124
+
125
+ ### 4. Blur to Focus
126
+
127
+ Items transition from blurred to sharp.
128
+
129
+ ```typescript
130
+ const config = {
131
+ interactions: [{
132
+ key: 'photos',
133
+ listContainer: '.photo-grid',
134
+ trigger: 'viewEnter',
135
+ params: { type: 'once', threshold: 0.1 },
136
+ effects: [{
137
+ key: 'photos',
138
+ listContainer: '.photo-grid',
139
+ keyframeEffect: {
140
+ name: 'blur-focus',
141
+ keyframes: [
142
+ { opacity: '0', filter: 'blur(20px)', transform: 'scale(1.1)' },
143
+ { opacity: '1', filter: 'blur(0)', transform: 'scale(1)' }
144
+ ]
145
+ },
146
+ duration: 900,
147
+ easing: 'ease-out'
148
+ }]
149
+ }]
150
+ };
151
+ ```
152
+
153
+ ### 5. Slide From Sides
154
+
155
+ Alternating slide directions for list items.
156
+
157
+ ```typescript
158
+ const config = {
159
+ interactions: [{
160
+ key: 'timeline',
161
+ listContainer: '.timeline-items',
162
+ trigger: 'viewEnter',
163
+ params: { type: 'once', threshold: 0.2 },
164
+ effects: [{
165
+ key: 'timeline',
166
+ listContainer: '.timeline-items',
167
+ keyframeEffect: {
168
+ name: 'slide-alternate',
169
+ keyframes: [
170
+ { opacity: '0', transform: 'translateX(var(--slide-x, -50px))' },
171
+ { opacity: '1', transform: 'translateX(0)' }
172
+ ]
173
+ },
174
+ duration: 700,
175
+ easing: 'cubic-bezier(0.16, 1, 0.3, 1)'
176
+ }]
177
+ }]
178
+ };
179
+ ```
180
+
181
+ ```css
182
+ .timeline-items > *:nth-child(odd) { --slide-x: -50px; }
183
+ .timeline-items > *:nth-child(even) { --slide-x: 50px; }
184
+ ```
185
+
186
+ ## Staggered Effects
187
+
188
+ ### 6. Progressive Delay
189
+
190
+ Each item has increasing delay.
191
+
192
+ ```typescript
193
+ const config = {
194
+ interactions: [{
195
+ key: 'stagger-list',
196
+ listContainer: '.items',
197
+ trigger: 'viewEnter',
198
+ params: { type: 'once', threshold: 0.1 },
199
+ effects: [{
200
+ key: 'stagger-list',
201
+ listContainer: '.items',
202
+ keyframeEffect: {
203
+ name: 'stagger-fade',
204
+ keyframes: [
205
+ { opacity: '0', transform: 'translateY(20px)' },
206
+ { opacity: '1', transform: 'translateY(0)' }
207
+ ]
208
+ },
209
+ duration: 500,
210
+ easing: 'ease-out'
211
+ }]
212
+ }]
213
+ };
214
+ ```
215
+
216
+ ```css
217
+ /* Automatic stagger formula */
218
+ .items > * {
219
+ animation-delay: calc(var(--item-index, 0) * 80ms);
220
+ }
221
+
222
+ /* Or use nth-child */
223
+ .items > *:nth-child(n) {
224
+ animation-delay: calc((var(--nth) - 1) * 80ms);
225
+ }
226
+ ```
227
+
228
+ ```javascript
229
+ // Set index via JavaScript
230
+ document.querySelectorAll('.items > *').forEach((item, index) => {
231
+ item.style.setProperty('--item-index', index);
232
+ });
233
+ ```
234
+
235
+ ### 7. Wave Effect
236
+
237
+ Items animate in a wave pattern.
238
+
239
+ ```typescript
240
+ const config = {
241
+ interactions: [{
242
+ key: 'wave',
243
+ listContainer: '.wave-list',
244
+ trigger: 'viewEnter',
245
+ params: { type: 'once', threshold: 0.15 },
246
+ effects: [{
247
+ key: 'wave',
248
+ listContainer: '.wave-list',
249
+ keyframeEffect: {
250
+ name: 'wave',
251
+ keyframes: [
252
+ { transform: 'translateY(30px) scale(0.9)', opacity: '0' },
253
+ { transform: 'translateY(0) scale(1)', opacity: '1' }
254
+ ]
255
+ },
256
+ duration: 600,
257
+ easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)'
258
+ }]
259
+ }]
260
+ };
261
+ ```
262
+
263
+ ```css
264
+ .wave-list > * {
265
+ animation-delay: calc(sin(var(--item-index, 0) * 0.5) * 200ms);
266
+ }
267
+ ```
268
+
269
+ ### 8. Ripple Out From Center
270
+
271
+ Items animate outward from center.
272
+
273
+ ```typescript
274
+ const config = {
275
+ interactions: [{
276
+ key: 'ripple',
277
+ listContainer: '.grid',
278
+ trigger: 'viewEnter',
279
+ params: { type: 'once', threshold: 0.2 },
280
+ effects: [{
281
+ key: 'ripple',
282
+ listContainer: '.grid',
283
+ keyframeEffect: {
284
+ name: 'ripple',
285
+ keyframes: [
286
+ { transform: 'scale(0)', opacity: '0' },
287
+ { transform: 'scale(1)', opacity: '1' }
288
+ ]
289
+ },
290
+ duration: 700,
291
+ easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)'
292
+ }]
293
+ }]
294
+ };
295
+ ```
296
+
297
+ ```css
298
+ /* Calculate distance from center for delay */
299
+ .grid {
300
+ display: grid;
301
+ grid-template-columns: repeat(4, 1fr);
302
+ }
303
+
304
+ .grid > *:nth-child(n) {
305
+ --delay-multiplier: 50ms;
306
+ }
307
+
308
+ /* Center items animate first, outer items last */
309
+ .grid > *:nth-child(6),
310
+ .grid > *:nth-child(7),
311
+ .grid > *:nth-child(10),
312
+ .grid > *:nth-child(11) {
313
+ animation-delay: calc(0 * var(--delay-multiplier));
314
+ }
315
+
316
+ .grid > *:nth-child(2),
317
+ .grid > *:nth-child(5),
318
+ .grid > *:nth-child(8),
319
+ .grid > *:nth-child(9),
320
+ .grid > *:nth-child(12),
321
+ .grid > *:nth-child(15) {
322
+ animation-delay: calc(1 * var(--delay-multiplier));
323
+ }
324
+ ```
325
+
326
+ ## Hover Interactions
327
+
328
+ ### 9. Card Lift on Hover
329
+
330
+ Cards lift with shadow on hover.
331
+
332
+ ```typescript
333
+ const config = {
334
+ interactions: [{
335
+ key: 'cards',
336
+ listContainer: '.card-list',
337
+ trigger: 'hover',
338
+ effects: [{
339
+ key: 'cards',
340
+ listContainer: '.card-list',
341
+ keyframeEffect: {
342
+ name: 'lift',
343
+ keyframes: [
344
+ { transform: 'translateY(0)', boxShadow: '0 4px 12px rgba(0,0,0,0.1)' },
345
+ { transform: 'translateY(-8px)', boxShadow: '0 16px 32px rgba(0,0,0,0.15)' }
346
+ ]
347
+ },
348
+ duration: 250,
349
+ easing: 'ease-out'
350
+ }]
351
+ }]
352
+ };
353
+ ```
354
+
355
+ ### 10. Image Zoom in Grid
356
+
357
+ Zoom images on hover while keeping grid intact.
358
+
359
+ ```typescript
360
+ const config = {
361
+ interactions: [{
362
+ key: 'gallery',
363
+ listContainer: '.gallery-grid',
364
+ selector: '.gallery-item',
365
+ trigger: 'hover',
366
+ effects: [{
367
+ key: 'gallery',
368
+ listContainer: '.gallery-grid',
369
+ selector: '.gallery-item img',
370
+ keyframeEffect: {
371
+ name: 'zoom',
372
+ keyframes: [
373
+ { transform: 'scale(1)' },
374
+ { transform: 'scale(1.1)' }
375
+ ]
376
+ },
377
+ duration: 300,
378
+ easing: 'ease-out'
379
+ }]
380
+ }]
381
+ };
382
+ ```
383
+
384
+ ```html
385
+ <interact-element data-interact-key="gallery">
386
+ <div class="gallery-grid">
387
+ <div class="gallery-item">
388
+ <img src="photo1.jpg" />
389
+ </div>
390
+ <div class="gallery-item">
391
+ <img src="photo2.jpg" />
392
+ </div>
393
+ </div>
394
+ </interact-element>
395
+ ```
396
+
397
+ ```css
398
+ .gallery-item {
399
+ overflow: hidden; /* Contain zoomed image */
400
+ }
401
+ ```
402
+
403
+ ### 11. Reveal Overlay on Hover
404
+
405
+ Show overlay with content on hover.
406
+
407
+ ```typescript
408
+ const config = {
409
+ interactions: [{
410
+ key: 'products',
411
+ listContainer: '.product-grid',
412
+ selector: '.product-card',
413
+ trigger: 'hover',
414
+ effects: [{
415
+ key: 'products',
416
+ listContainer: '.product-grid',
417
+ selector: '.product-overlay',
418
+ keyframeEffect: {
419
+ name: 'reveal',
420
+ keyframes: [
421
+ { opacity: '0', transform: 'translateY(100%)' },
422
+ { opacity: '1', transform: 'translateY(0)' }
423
+ ]
424
+ },
425
+ duration: 300,
426
+ easing: 'ease-out'
427
+ }]
428
+ }]
429
+ };
430
+ ```
431
+
432
+ ## Dynamic List Management
433
+
434
+ ### 12. Add Item Animation
435
+
436
+ Animate new items as they're added.
437
+
438
+ ```typescript
439
+ const config = {
440
+ interactions: [{
441
+ key: 'todo-list',
442
+ listContainer: '.todos',
443
+ trigger: 'viewEnter',
444
+ params: { type: 'repeat' }, // Trigger for each new item
445
+ effects: [{
446
+ key: 'todo-list',
447
+ listContainer: '.todos',
448
+ keyframeEffect: {
449
+ name: 'add-item',
450
+ keyframes: [
451
+ { opacity: '0', transform: 'translateX(-30px) scale(0.9)' },
452
+ { opacity: '1', transform: 'translateX(0) scale(1)' }
453
+ ]
454
+ },
455
+ duration: 400,
456
+ easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)'
457
+ }]
458
+ }]
459
+ };
460
+
461
+ Interact.create(config);
462
+ ```
463
+
464
+ ```javascript
465
+ // Add new todo item
466
+ function addTodo(text) {
467
+ const list = document.querySelector('.todos');
468
+ const item = document.createElement('div');
469
+ item.className = 'todo-item';
470
+ item.innerHTML = `
471
+ <input type="checkbox" />
472
+ <span>${text}</span>
473
+ <button class="delete">Delete</button>
474
+ `;
475
+ list.appendChild(item); // Animation triggers automatically
476
+ }
477
+ ```
478
+
479
+ ### 13. Shopping Cart Updates
480
+
481
+ Animate cart items on add/update.
482
+
483
+ ```typescript
484
+ const config = {
485
+ interactions: [
486
+ // Add animation
487
+ {
488
+ key: 'cart',
489
+ listContainer: '.cart-items',
490
+ trigger: 'viewEnter',
491
+ params: { type: 'repeat' },
492
+ effects: [{
493
+ key: 'cart',
494
+ listContainer: '.cart-items',
495
+ keyframeEffect: {
496
+ name: 'cart-add',
497
+ keyframes: [
498
+ { opacity: '0', transform: 'scale(0.8) translateY(-20px)', backgroundColor: '#10b981' },
499
+ { opacity: '1', transform: 'scale(1) translateY(0)', backgroundColor: 'transparent' }
500
+ ]
501
+ },
502
+ duration: 500,
503
+ easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)'
504
+ }]
505
+ }
506
+ ]
507
+ };
508
+ ```
509
+
510
+ ## Infinite Scroll
511
+
512
+ ### 14. Infinite List Animation
513
+
514
+ Animate items as they load during scroll.
515
+
516
+ ```typescript
517
+ const config = {
518
+ interactions: [{
519
+ key: 'infinite',
520
+ listContainer: '.infinite-list',
521
+ trigger: 'viewEnter',
522
+ params: { type: 'repeat', threshold: 0.1 },
523
+ effects: [{
524
+ key: 'infinite',
525
+ listContainer: '.infinite-list',
526
+ keyframeEffect: {
527
+ name: 'scroll-fade',
528
+ keyframes: [
529
+ { opacity: '0', transform: 'translateY(30px)' },
530
+ { opacity: '1', transform: 'translateY(0)' }
531
+ ]
532
+ },
533
+ duration: 500,
534
+ easing: 'ease-out'
535
+ }]
536
+ }]
537
+ };
538
+
539
+ Interact.create(config);
540
+ ```
541
+
542
+ ```javascript
543
+ // Infinite scroll implementation
544
+ const observer = new IntersectionObserver((entries) => {
545
+ entries.forEach(entry => {
546
+ if (entry.isIntersecting) {
547
+ loadMoreItems();
548
+ }
549
+ });
550
+ }, { rootMargin: '200px' });
551
+
552
+ observer.observe(document.querySelector('.sentinel'));
553
+
554
+ async function loadMoreItems() {
555
+ const items = await fetchItems();
556
+ const container = document.querySelector('.infinite-list');
557
+
558
+ items.forEach(item => {
559
+ const element = document.createElement('div');
560
+ element.className = 'list-item';
561
+ element.textContent = item.title;
562
+ container.appendChild(element);
563
+ // Animation triggers automatically via viewEnter repeat
564
+ });
565
+ }
566
+ ```
567
+
568
+ ## Grid Layouts
569
+
570
+ ### 15. Responsive Grid Transitions
571
+
572
+ Different animations for different breakpoints.
573
+
574
+ ```typescript
575
+ const config = {
576
+ conditions: {
577
+ 'mobile': {
578
+ type: 'media',
579
+ predicate: '(max-width: 767px)'
580
+ },
581
+ 'desktop': {
582
+ type: 'media',
583
+ predicate: '(min-width: 768px)'
584
+ }
585
+ },
586
+ interactions: [
587
+ // Mobile: Simple fade
588
+ {
589
+ key: 'grid',
590
+ listContainer: '.responsive-grid',
591
+ trigger: 'viewEnter',
592
+ conditions: ['mobile'],
593
+ params: { type: 'once', threshold: 0.1 },
594
+ effects: [{
595
+ key: 'grid',
596
+ listContainer: '.responsive-grid',
597
+ keyframeEffect: {
598
+ name: 'mobile-fade',
599
+ keyframes: [
600
+ { opacity: '0' },
601
+ { opacity: '1' }
602
+ ]
603
+ },
604
+ duration: 400
605
+ }]
606
+ },
607
+ // Desktop: Complex entrance
608
+ {
609
+ key: 'grid',
610
+ listContainer: '.responsive-grid',
611
+ trigger: 'viewEnter',
612
+ conditions: ['desktop'],
613
+ params: { type: 'once', threshold: 0.15 },
614
+ effects: [{
615
+ key: 'grid',
616
+ listContainer: '.responsive-grid',
617
+ keyframeEffect: {
618
+ name: 'desktop-slide',
619
+ keyframes: [
620
+ { opacity: '0', transform: 'translateY(60px) scale(0.9)' },
621
+ { opacity: '1', transform: 'translateY(0) scale(1)' }
622
+ ]
623
+ },
624
+ duration: 800,
625
+ easing: 'cubic-bezier(0.16, 1, 0.3, 1)'
626
+ }]
627
+ }
628
+ ]
629
+ };
630
+ ```
631
+
632
+ ## Real-World Examples
633
+
634
+ ### 16. E-commerce Product Grid
635
+
636
+ Complete product grid with multiple interactions.
637
+
638
+ ```typescript
639
+ const config = {
640
+ interactions: [
641
+ // Entrance animation
642
+ {
643
+ key: 'products',
644
+ listContainer: '.product-grid',
645
+ trigger: 'viewEnter',
646
+ params: { type: 'once', threshold: 0.1 },
647
+ effects: [{
648
+ key: 'products',
649
+ listContainer: '.product-grid',
650
+ keyframeEffect: {
651
+ name: 'product-entrance',
652
+ keyframes: [
653
+ { opacity: '0', transform: 'translateY(40px) scale(0.95)' },
654
+ { opacity: '1', transform: 'translateY(0) scale(1)' }
655
+ ]
656
+ },
657
+ duration: 700,
658
+ easing: 'cubic-bezier(0.16, 1, 0.3, 1)'
659
+ }]
660
+ },
661
+ // Hover effect
662
+ {
663
+ key: 'products',
664
+ listContainer: '.product-grid',
665
+ selector: '.product-card',
666
+ trigger: 'hover',
667
+ effects: [
668
+ // Lift card
669
+ {
670
+ key: 'products',
671
+ listContainer: '.product-grid',
672
+ selector: '.product-card',
673
+ keyframeEffect: {
674
+ name: 'card-lift',
675
+ keyframes: [
676
+ { transform: 'translateY(0)', boxShadow: '0 4px 12px rgba(0,0,0,0.1)' },
677
+ { transform: 'translateY(-8px)', boxShadow: '0 16px 32px rgba(0,0,0,0.15)' }
678
+ ]
679
+ },
680
+ duration: 250
681
+ },
682
+ // Zoom image
683
+ {
684
+ key: 'products',
685
+ listContainer: '.product-grid',
686
+ selector: '.product-image img',
687
+ keyframeEffect: {
688
+ name: 'image-zoom',
689
+ keyframes: [
690
+ { transform: 'scale(1)' },
691
+ { transform: 'scale(1.05)' }
692
+ ]
693
+ },
694
+ duration: 300
695
+ },
696
+ // Reveal quick view
697
+ {
698
+ key: 'products',
699
+ listContainer: '.product-grid',
700
+ selector: '.quick-view',
701
+ keyframeEffect: {
702
+ name: 'reveal-button',
703
+ keyframes: [
704
+ { opacity: '0', transform: 'translateY(10px)' },
705
+ { opacity: '1', transform: 'translateY(0)' }
706
+ ]
707
+ },
708
+ duration: 200,
709
+ delay: 100
710
+ }
711
+ ]
712
+ }
713
+ ]
714
+ };
715
+ ```
716
+
717
+ ```html
718
+ <interact-element data-interact-key="products">
719
+ <div class="product-grid">
720
+ <div class="product-card">
721
+ <div class="product-image">
722
+ <img src="product1.jpg" />
723
+ </div>
724
+ <h3>Product Name</h3>
725
+ <p class="price">$99.00</p>
726
+ <button class="quick-view">Quick View</button>
727
+ </div>
728
+ <!-- More products... -->
729
+ </div>
730
+ </interact-element>
731
+ ```
732
+
733
+ ## See Also
734
+
735
+ - [Lists and Dynamic Content Guide](../guides/lists-and-dynamic-content.md)
736
+ - [Element Selection](../api/element-selection.md)
737
+ - [Performance Guide](../guides/performance.md)