@wix/interact 1.93.0 → 2.0.0-rc.4

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-BoEj_7uB.js +18 -0
  14. package/dist/index-BoEj_7uB.js.map +1 -0
  15. package/dist/index-DUTdIvfw.mjs +7969 -0
  16. package/dist/index-DUTdIvfw.mjs.map +1 -0
  17. package/dist/tsconfig.build.tsbuildinfo +1 -0
  18. package/dist/types/core/Interact.d.ts +25 -10
  19. package/dist/types/core/Interact.d.ts.map +1 -0
  20. package/dist/types/core/InteractionController.d.ts +24 -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 +31 -12
  57. package/dist/types/types.d.ts.map +1 -0
  58. package/dist/types/utils.d.ts +2 -1
  59. package/dist/types/utils.d.ts.map +1 -0
  60. package/dist/types/{InteractElement.d.ts → web/InteractElement.d.ts} +117 -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 -163
  101. package/dist/cjs/InteractElement.js.map +0 -1
  102. package/dist/cjs/__tests__/interact.spec.js +0 -2094
  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 -250
  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 -37
  117. package/dist/cjs/handlers/animationEnd.js.map +0 -1
  118. package/dist/cjs/handlers/click.js +0 -122
  119. package/dist/cjs/handlers/click.js.map +0 -1
  120. package/dist/cjs/handlers/hover.js +0 -147
  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 -131
  129. package/dist/cjs/handlers/viewEnter.js.map +0 -1
  130. package/dist/cjs/handlers/viewProgress.js +0 -79
  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 -98
  137. package/dist/cjs/utils.js.map +0 -1
  138. package/dist/esm/InteractElement.js +0 -157
  139. package/dist/esm/InteractElement.js.map +0 -1
  140. package/dist/esm/__tests__/interact.spec.js +0 -2102
  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 -245
  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 -33
  155. package/dist/esm/handlers/animationEnd.js.map +0 -1
  156. package/dist/esm/handlers/click.js +0 -122
  157. package/dist/esm/handlers/click.js.map +0 -1
  158. package/dist/esm/handlers/hover.js +0 -147
  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 -133
  167. package/dist/esm/handlers/viewEnter.js.map +0 -1
  168. package/dist/esm/handlers/viewProgress.js +0 -75
  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 -92
  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
package/package.json CHANGED
@@ -1,73 +1,90 @@
1
1
  {
2
2
  "name": "@wix/interact",
3
- "version": "1.93.0",
4
- "author": {
5
- "name": "wow!Team",
6
- "email": "wow-dev@wix.com"
7
- },
8
- "license": "UNLICENSED",
3
+ "version": "2.0.0-rc.4",
4
+ "description": "A powerful, declarative interaction library for creating engaging web apps.",
5
+ "license": "MIT",
9
6
  "main": "dist/cjs/index.js",
10
- "module": "dist/esm/index.js",
11
- "sideEffects": false,
7
+ "module": "dist/es/index.js",
12
8
  "types": "dist/types/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/types/index.d.ts",
12
+ "import": "./dist/es/index.js",
13
+ "require": "./dist/cjs/index.js"
14
+ },
15
+ "./react": {
16
+ "types": "./dist/types/react/index.d.ts",
17
+ "import": "./dist/es/react.js",
18
+ "require": "./dist/cjs/react.js"
19
+ },
20
+ "./web": {
21
+ "types": "./dist/types/web/index.d.ts",
22
+ "import": "./dist/es/web.js",
23
+ "require": "./dist/cjs/web.js"
24
+ }
25
+ },
13
26
  "files": [
14
- "dist/cjs",
15
- "dist/esm",
16
- "dist/types"
27
+ "dist",
28
+ "rules",
29
+ "docs"
17
30
  ],
18
- "publishConfig": {
19
- "registry": "https://registry.npmjs.org/",
20
- "access": "public"
21
- },
31
+ "sideEffects": false,
22
32
  "scripts": {
23
- "build": "yoshi-library build",
24
- "start": "yoshi-library start",
25
- "test": "yoshi-library test",
26
- "test:coverage": "yoshi-library test --coverage",
27
- "playground": "yarn workspace @wix/interact-playground dev",
28
- "lint": "yoshi-library lint"
33
+ "dev": "vite dev --open",
34
+ "build": "rimraf dist && vite build && npm run build:types",
35
+ "build:types": "tsc -p tsconfig.build.json",
36
+ "lint": "tsc --noEmit",
37
+ "test": "vitest run",
38
+ "coverage": "vitest run --coverage"
29
39
  },
30
- "lint-staged": {
31
- "*.{js,ts}": "yarn lint"
40
+ "keywords": [
41
+ "animation",
42
+ "javascript",
43
+ "css",
44
+ "waapi"
45
+ ],
46
+ "author": {
47
+ "name": "wow!Team",
48
+ "email": "wow-dev@wix.com"
49
+ },
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "https://github.com/wix-incubator/interact"
53
+ },
54
+ "bugs": {
55
+ "url": "https://github.com/wix-incubator/interact/issues"
32
56
  },
33
57
  "dependencies": {
34
- "@babel/runtime": "^7.26.0",
35
- "@wix/motion": "1.656.0",
58
+ "@wix/motion": "^1.0.0",
36
59
  "fastdom": "^1.0.12",
37
- "fizban": "^0.7.0",
60
+ "fizban": "^0.7.2",
38
61
  "kuliso": "^0.4.13"
39
62
  },
40
- "devDependencies": {
41
- "@types/jest": "^27.5.2",
42
- "@types/node": "^16.18.123",
43
- "@wix/eslint-config-yoshi": "^6.163.0",
44
- "@wix/jest-yoshi-preset": "^6.163.0",
45
- "@wix/yoshi-flow-library": "^6.163.0",
46
- "ts-jest": "^29.2.5",
47
- "typescript": "~4.9.5"
63
+ "peerDependencies": {
64
+ "react": "^18.3.1",
65
+ "react-dom": "^18.3.1"
48
66
  },
49
- "jest": {
50
- "preset": "@wix/jest-yoshi-preset"
51
- },
52
- "yoshiFlowLibrary": {
53
- "buildEsmWithBabel": true
54
- },
55
- "eslintConfig": {
56
- "extends": "@wix/eslint-config-yoshi"
57
- },
58
- "wix": {
59
- "artifact": {
60
- "groupId": "com.wixpress.wow",
61
- "artifactId": "interact"
67
+ "peerDependenciesMeta": {
68
+ "react": {
69
+ "optional": true
62
70
  },
63
- "validations": {
64
- "postDependenciesBuild": [
65
- "lint"
66
- ]
71
+ "react-dom": {
72
+ "optional": true
67
73
  }
68
74
  },
69
- "wallaby": {
70
- "autoDetect": true
71
- },
72
- "falconPackageHash": "6b4071ff75035af06326865108012e422c9f4adbbfed6828d778e157"
73
- }
75
+ "devDependencies": {
76
+ "@testing-library/dom": "^10.4.0",
77
+ "@testing-library/react": "^16.1.0",
78
+ "@types/react": "^18.3.2",
79
+ "@types/react-dom": "^18.3.0",
80
+ "@vitejs/plugin-react": "^4.3.4",
81
+ "@vitest/coverage-v8": "^4.0.14",
82
+ "jsdom": "^24.0.0",
83
+ "react": "^18.3.1",
84
+ "react-dom": "^18.3.1",
85
+ "rimraf": "^6.0.1",
86
+ "typescript": "^5.9.3",
87
+ "vite": "^7.2.2",
88
+ "vitest": "^4.0.14"
89
+ }
90
+ }
@@ -0,0 +1,255 @@
1
+ # @wix/interact Integration Rules
2
+
3
+ This document outlines the rules and best practices for generating code that integrates `@wix/interact` into a webpage.
4
+
5
+ ## 1. Overview
6
+
7
+ `@wix/interact` is a library for creating interactive animations and effects triggered by user actions (click, hover, scroll, etc.). It works by binding **Triggers** and **Effects** to specific **Elements**.
8
+
9
+ ## 2. Core Components
10
+
11
+ ### `<interact-element>`
12
+ The custom element wrapper is **required** for any element that triggers an interaction or recieves an effect.
13
+
14
+ **Rules:**
15
+ - MUST have a `data-interact-key` attribute that is unique within the scope.
16
+ - MUST contain at least one child element.
17
+ - **Usage:**
18
+ ```html
19
+ <interact-element data-interact-key="my-button">
20
+ <button>Click Me</button>
21
+ </interact-element>
22
+ ```
23
+
24
+ ### `Interact.create(config)`
25
+ The entry point for initializing interactions.
26
+
27
+ **Rules:**
28
+ - MUST be called at least once with the full configuration, or per page for single-page apps.
29
+ - **Usage:**
30
+ ```javascript
31
+ import { Interact } from '@wix/interact';
32
+ Interact.create(config);
33
+ ```
34
+
35
+ ## 3. Configuration Schema
36
+
37
+ The `InteractConfig` object defines the behavior.
38
+
39
+ ```typescript
40
+ type InteractConfig = {
41
+ interactions: Interaction[]; // Required: Array of interaction definitions
42
+ effects?: Record<string, Effect>; // Optional: Reusable named effects
43
+ conditions?: Record<string, Condition>; // Optional: Reusable conditions (media queries)
44
+ };
45
+ ```
46
+
47
+ ### Interaction Definition
48
+ ```typescript
49
+ {
50
+ key: 'element-key', // Matches data-interact-key
51
+ trigger: 'trigger-type', // e.g., 'hover', 'click'
52
+ selector?: '.child-cls', // Optional: Targets specific child inside the interact-element
53
+ listContainer?: '.list', // Optional: A selector for the element containing a list, for interactions on lists
54
+ params?: { ... }, // Trigger-specific parameters
55
+ conditions?: ['cond-id'], // Array of condition IDs
56
+ effects: [ ... ] // Array of effects to apply
57
+ }
58
+ ```
59
+
60
+ ### Element Selection Hierarchy
61
+ 1. **`listContainer`**: If present, selects a container to target its immediate children as list items.
62
+ 2. **`selector`**: Matches elements within the root, or within each list item.
63
+ 3. **Fallback**: If neither is provided, targets the **first child** of `<interact-element>`.
64
+
65
+ ## 4. Generating Critical CSS for Entrance Animations
66
+
67
+ ### `generate(config)`
68
+ Generates critical CSS styles that prevent flash-of-unstyled-content (FOUC) for elements with `viewEnter` entrance animations.
69
+
70
+ **Rules:**
71
+ - MUST be called server-side or at build time to generate static CSS.
72
+ - The generated CSS hides the first child of elements marked with `data-interact-initial="true"` until their entrance animation completes.
73
+ - Only affects users who have not requested reduced motion (`prefers-reduced-motion: no-preference`).
74
+ - The `<interact-element>` MUST have `data-interact-initial="true"` attribute to be affected by the generated CSS.
75
+
76
+ **Usage:**
77
+ ```javascript
78
+ import { generate } from '@wix/interact';
79
+
80
+ const config = {/*...*/};
81
+
82
+ // Generate CSS at build time or on server
83
+ const css = generate(config);
84
+
85
+ // Include in your HTML template
86
+ const html = `
87
+ <!DOCTYPE html>
88
+ <html>
89
+ <head>
90
+ <style>${css}</style>
91
+ </head>
92
+ <body>
93
+ <interact-element data-interact-key="hero" data-interact-initial="true">
94
+ <section class="hero">
95
+ ...
96
+ </section>
97
+ </interact-element>
98
+ <script type="module" src="./main.js"></script>
99
+ </body>
100
+ </html>
101
+ `;
102
+ ```
103
+
104
+ **When to Use:**
105
+ - For elements that have a `viewEnter` trigger with `type: 'once'` and an effect on same element
106
+ - To prevent elements from being visible before their entrance animation plays
107
+ - For server-side rendering (SSR) or static site generation (SSG) scenarios
108
+
109
+ **Important Notes:**
110
+ - The attribute `data-motion-enter="done"` is automatically set by the runtime when the entrance animation completes
111
+ - Users with `prefers-reduced-motion: reduce` will see elements immediately (no hiding)
112
+ - The CSS resets transform properties to prevent any inherited transforms from affecting the hidden state
113
+
114
+ ## 5. Triggers & Behaviors
115
+
116
+ | Trigger | Description | Key Parameters |
117
+ | :--- | :--- | :--- |
118
+ | `hover` | Mouse enter/leave | `type`: 'once', 'alternate', 'repeat', 'state' for animations, or `method`: 'add', 'remove', 'toggle', 'clear' for states |
119
+ | `click` | Mouse click | `type`: 'once', 'alternate', 'repeat', 'state' for animations, or `method`: 'add', 'remove', 'toggle', 'clear' for states |
120
+ | `viewEnter` | Element enters viewport | `type`: 'once', 'alternate', 'repeat', 'state'; `threshold` (0-1) |
121
+ | `viewProgress` | Scroll progress inside viewport | (No specific params, uses effect ranges) |
122
+ | `pointerMove` | Mouse movement | `hitArea`: 'self' (default) or 'root' |
123
+ | `animationEnd` | Chaining animations | `effectId`: ID of the previous effect |
124
+
125
+ ## 6. Effects & Animations
126
+
127
+ Effects define *what* happens. They can be inline or referenced by ID.
128
+
129
+ ### Effect Types
130
+
131
+ #### 1. Named Effects (Pre-built)
132
+ Use Motion effect presets for consistency.
133
+ ```typescript
134
+ {
135
+ namedEffect: { type: 'FadeIn' },
136
+ duration: 800,
137
+ easing: 'ease-out'
138
+ }
139
+ ```
140
+
141
+ #### 2. Keyframe Effects (Custom)
142
+ Define explicit Web Animations API-like keyframes.
143
+ ```typescript
144
+ {
145
+ keyframeEffect: {
146
+ name: 'custom-slide',
147
+ keyframes: [
148
+ { transform: 'translateY(20px)', opacity: 0 },
149
+ { transform: 'translateY(0)', opacity: 1 }
150
+ ]
151
+ },
152
+ duration: 500
153
+ }
154
+ ```
155
+
156
+ #### 3. Transition Effects
157
+ Smoothly transition CSS properties.
158
+ ```typescript
159
+ {
160
+ transition: {
161
+ duration: 300,
162
+ styleProperties: [{ name: 'backgroundColor', value: 'red' }]
163
+ }
164
+ }
165
+ ```
166
+
167
+ #### 4. Scroll Effects
168
+ Used with `viewProgress`, linked to scroll progress while element is inside viewport.
169
+ ```typescript
170
+ {
171
+ keyframeEffect: { ... },
172
+ rangeStart: { name: 'cover', offset: { value: 0, type: 'percentage' } },
173
+ rangeEnd: { name: 'cover', offset: { value: 100, type: 'percentage' } }
174
+ }
175
+ ```
176
+
177
+ #### 5. Mouse Effects
178
+ Used with `pointerMove`, linked to mouse progress while moving over an element.
179
+ ```typescript
180
+ {
181
+ namedEffect: { type: 'Track3DMouse' },
182
+ centeredToTarget: true
183
+ }
184
+ ```
185
+
186
+ ### Targeting
187
+ - **Self**: Omit `key` in the effect to target the trigger element. If using `selector` for trigger, also specify it again for the effect target.
188
+ - **Cross-Targeting**: Specify a different `key` and/or `selector` in the effect to animate a different element.
189
+
190
+ ## 7. Examples
191
+
192
+ ### Basic Hover (Scale)
193
+ ```typescript
194
+ const config = {
195
+ effects: {
196
+ scaleUp: {
197
+ transitionProperties: [
198
+ {
199
+ name: 'transform',
200
+ value: 'scale(1.1)',
201
+ duration: 300,
202
+ delay: 100,
203
+ easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)'
204
+ }
205
+ ]
206
+ }
207
+ },
208
+ interactions: [{
209
+ key: 'btn',
210
+ trigger: 'hover',
211
+ effects: [{
212
+ effectId: 'scaleUp'
213
+ }]
214
+ }]
215
+ };
216
+ ```
217
+
218
+ ### Viewport Entrance
219
+ ```typescript
220
+ const config = {
221
+ interactions: [{
222
+ key: 'hero',
223
+ trigger: 'viewEnter',
224
+ params: { type: 'once', threshold: 0.2 },
225
+ effects: [{
226
+ namedEffect: { type: 'FadeIn' },
227
+ duration: 800
228
+ }]
229
+ }]
230
+ };
231
+ ```
232
+
233
+ ### Interactive Toggle (Click)
234
+ ```typescript
235
+ const config = {
236
+ interactions: [{
237
+ key: 'menu-btn',
238
+ trigger: 'click',
239
+ params: { type: 'alternate' },
240
+ effects: [{
241
+ key: 'menu-content',
242
+ effectId: 'menu-open', // Creates state 'menu-open'
243
+ keyframeEffect: {
244
+ name: 'slide',
245
+ keyframes: [
246
+ { transform: 'translateX(-100%)' },
247
+ { transform: 'translateX(0)' }
248
+ ]
249
+ },
250
+ duration: 300
251
+ }]
252
+ }]
253
+ };
254
+ ```
255
+