@wix/interact 1.86.0 → 1.89.0

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 (33) hide show
  1. package/dist/cjs/__tests__/interact.spec.js +26 -0
  2. package/dist/cjs/__tests__/interact.spec.js.map +1 -1
  3. package/dist/cjs/__tests__/viewEnter.spec.js +207 -0
  4. package/dist/cjs/__tests__/viewEnter.spec.js.map +1 -0
  5. package/dist/cjs/core/Interact.js +12 -0
  6. package/dist/cjs/core/Interact.js.map +1 -1
  7. package/dist/cjs/handlers/pointerMove.js +8 -2
  8. package/dist/cjs/handlers/pointerMove.js.map +1 -1
  9. package/dist/cjs/handlers/viewEnter.js +63 -11
  10. package/dist/cjs/handlers/viewEnter.js.map +1 -1
  11. package/dist/cjs/handlers/viewProgress.js +9 -3
  12. package/dist/cjs/handlers/viewProgress.js.map +1 -1
  13. package/dist/cjs/types.js.map +1 -1
  14. package/dist/esm/__tests__/interact.spec.js +25 -0
  15. package/dist/esm/__tests__/interact.spec.js.map +1 -1
  16. package/dist/esm/__tests__/viewEnter.spec.js +210 -0
  17. package/dist/esm/__tests__/viewEnter.spec.js.map +1 -0
  18. package/dist/esm/core/Interact.js +12 -0
  19. package/dist/esm/core/Interact.js.map +1 -1
  20. package/dist/esm/handlers/pointerMove.js +8 -2
  21. package/dist/esm/handlers/pointerMove.js.map +1 -1
  22. package/dist/esm/handlers/viewEnter.js +65 -11
  23. package/dist/esm/handlers/viewEnter.js.map +1 -1
  24. package/dist/esm/handlers/viewProgress.js +9 -3
  25. package/dist/esm/handlers/viewProgress.js.map +1 -1
  26. package/dist/esm/types.js.map +1 -1
  27. package/dist/types/__tests__/viewEnter.spec.d.ts +0 -0
  28. package/dist/types/core/Interact.d.ts +6 -1
  29. package/dist/types/handlers/pointerMove.d.ts +2 -0
  30. package/dist/types/handlers/viewEnter.d.ts +2 -0
  31. package/dist/types/handlers/viewProgress.d.ts +2 -0
  32. package/dist/types/types.d.ts +5 -0
  33. package/package.json +7 -6
@@ -0,0 +1,207 @@
1
+ jest.mock('@wix/motion', () => ({
2
+ getAnimation: jest.fn().mockReturnValue({
3
+ play: jest.fn(),
4
+ cancel: jest.fn(),
5
+ onFinish: jest.fn(),
6
+ isCSS: false
7
+ })
8
+ }));
9
+ jest.mock('fastdom', () => ({
10
+ measure: jest.fn(cb => cb()),
11
+ mutate: jest.fn(cb => cb())
12
+ }));
13
+ describe('viewEnter handler', () => {
14
+ let viewEnterHandler;
15
+ let fastdom;
16
+ let element;
17
+ let target;
18
+ let observerCallback;
19
+ let observerMock;
20
+ let observeSpy;
21
+ let unobserveSpy;
22
+ let IntersectionObserverMock;
23
+ beforeEach(() => {
24
+ jest.resetModules();
25
+ viewEnterHandler = require('../handlers/viewEnter').default;
26
+ fastdom = require('fastdom');
27
+
28
+ // Reset DOM
29
+ document.body.innerHTML = '';
30
+ element = document.createElement('div');
31
+ target = document.createElement('div');
32
+ document.body.appendChild(element);
33
+ document.body.appendChild(target);
34
+ jest.clearAllMocks();
35
+ observeSpy = jest.fn();
36
+ unobserveSpy = jest.fn();
37
+ observerMock = {
38
+ observe: observeSpy,
39
+ unobserve: unobserveSpy,
40
+ disconnect: jest.fn()
41
+ };
42
+ IntersectionObserverMock = jest.fn((cb, options) => {
43
+ observerCallback = cb;
44
+ return observerMock;
45
+ });
46
+ window.IntersectionObserver = IntersectionObserverMock;
47
+ });
48
+ afterEach(() => {
49
+ // Clean up handlers to prevent state leakage between tests
50
+ if (viewEnterHandler && element) {
51
+ viewEnterHandler.remove(element);
52
+ }
53
+ if (viewEnterHandler && target) {
54
+ viewEnterHandler.remove(target);
55
+ }
56
+ });
57
+ const createEntry = (overrides = {}) => {
58
+ return {
59
+ target: element,
60
+ isIntersecting: true,
61
+ boundingClientRect: {
62
+ height: 100,
63
+ width: 100
64
+ },
65
+ rootBounds: {
66
+ height: 100,
67
+ width: 100
68
+ },
69
+ ...overrides
70
+ };
71
+ };
72
+ describe('Regular flow', () => {
73
+ it('should create an IntersectionObserver and observe the source', () => {
74
+ viewEnterHandler.add(element, target, {
75
+ duration: 1000,
76
+ namedEffect: {
77
+ type: 'FadeIn'
78
+ }
79
+ }, {});
80
+ expect(IntersectionObserverMock).toHaveBeenCalled();
81
+ expect(observeSpy).toHaveBeenCalledWith(element);
82
+ });
83
+ it('should unobserve after first intersection if type is "once"', () => {
84
+ viewEnterHandler.add(element, target, {
85
+ duration: 1000,
86
+ namedEffect: {
87
+ type: 'FadeIn'
88
+ }
89
+ }, {
90
+ type: 'once'
91
+ });
92
+ const entry = createEntry();
93
+ observerCallback([entry]);
94
+ expect(unobserveSpy).toHaveBeenCalledWith(element);
95
+ });
96
+ });
97
+ describe('Safe flow', () => {
98
+ it('should check for safe mode conditions on first run when not intersecting', () => {
99
+ viewEnterHandler.add(element, target, {
100
+ duration: 1000,
101
+ namedEffect: {
102
+ type: 'FadeIn'
103
+ }
104
+ }, {
105
+ useSafeViewEnter: true,
106
+ threshold: 0.5
107
+ });
108
+ const entry = createEntry({
109
+ isIntersecting: false,
110
+ boundingClientRect: {
111
+ height: 1000
112
+ },
113
+ rootBounds: {
114
+ height: 400
115
+ }
116
+ });
117
+ observerCallback([entry]);
118
+ expect(fastdom.measure).toHaveBeenCalled();
119
+ });
120
+ it('should switch to safe observer if element is too tall for root', () => {
121
+ const threshold = 0.5;
122
+ const sourceHeight = 1000;
123
+ const rootHeight = 400; // 1000 * 0.5 = 500 > 400 -> Should trigger safe mode
124
+
125
+ viewEnterHandler.add(element, target, {
126
+ duration: 1000,
127
+ namedEffect: {
128
+ type: 'FadeIn'
129
+ }
130
+ }, {
131
+ useSafeViewEnter: true,
132
+ threshold
133
+ });
134
+ const entry = createEntry({
135
+ isIntersecting: false,
136
+ boundingClientRect: {
137
+ height: sourceHeight
138
+ },
139
+ rootBounds: {
140
+ height: rootHeight
141
+ }
142
+ });
143
+ observerCallback([entry]);
144
+ expect(fastdom.mutate).toHaveBeenCalled();
145
+ expect(unobserveSpy).toHaveBeenCalledWith(element);
146
+ expect(IntersectionObserverMock).toHaveBeenCalledTimes(2);
147
+ const safeObserverConfig = IntersectionObserverMock.mock.calls[1][1];
148
+ expect(safeObserverConfig.threshold).toEqual([0]);
149
+ expect(safeObserverConfig.rootMargin).toBe('0px 0px -10% 0px');
150
+ });
151
+ it('should NOT switch to safe observer if element fits in root', () => {
152
+ const threshold = 0.5;
153
+ const sourceHeight = 600;
154
+ const rootHeight = 400; // 600 * 0.5 = 300 < 400 -> No safe mode needed
155
+
156
+ viewEnterHandler.add(element, target, {
157
+ duration: 1000,
158
+ namedEffect: {
159
+ type: 'FadeIn'
160
+ }
161
+ }, {
162
+ useSafeViewEnter: true,
163
+ threshold
164
+ });
165
+ const entry = createEntry({
166
+ isIntersecting: false,
167
+ boundingClientRect: {
168
+ height: sourceHeight
169
+ },
170
+ rootBounds: {
171
+ height: rootHeight
172
+ }
173
+ });
174
+ observerCallback([entry]);
175
+ expect(fastdom.measure).toHaveBeenCalled();
176
+ expect(fastdom.mutate).not.toHaveBeenCalled();
177
+ expect(unobserveSpy).not.toHaveBeenCalledWith(element);
178
+ expect(IntersectionObserverMock).toHaveBeenCalledTimes(1);
179
+ });
180
+ it('should NOT switch to safe observer if useSafeViewEnter is false', () => {
181
+ const threshold = 0.5;
182
+ const sourceHeight = 1000;
183
+ const rootHeight = 400;
184
+ viewEnterHandler.add(element, target, {
185
+ duration: 1000,
186
+ namedEffect: {
187
+ type: 'FadeIn'
188
+ }
189
+ }, {
190
+ useSafeViewEnter: false,
191
+ threshold
192
+ });
193
+ const entry = createEntry({
194
+ isIntersecting: false,
195
+ boundingClientRect: {
196
+ height: sourceHeight
197
+ },
198
+ rootBounds: {
199
+ height: rootHeight
200
+ }
201
+ });
202
+ observerCallback([entry]);
203
+ expect(fastdom.measure).not.toHaveBeenCalled();
204
+ });
205
+ });
206
+ });
207
+ //# sourceMappingURL=viewEnter.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["jest","mock","getAnimation","fn","mockReturnValue","play","cancel","onFinish","isCSS","measure","cb","mutate","describe","viewEnterHandler","fastdom","element","target","observerCallback","observerMock","observeSpy","unobserveSpy","IntersectionObserverMock","beforeEach","resetModules","require","default","document","body","innerHTML","createElement","appendChild","clearAllMocks","observe","unobserve","disconnect","options","window","IntersectionObserver","afterEach","remove","createEntry","overrides","isIntersecting","boundingClientRect","height","width","rootBounds","it","add","duration","namedEffect","type","expect","toHaveBeenCalled","toHaveBeenCalledWith","entry","useSafeViewEnter","threshold","sourceHeight","rootHeight","toHaveBeenCalledTimes","safeObserverConfig","calls","toEqual","rootMargin","toBe","not"],"sources":["../../../src/__tests__/viewEnter.spec.ts"],"sourcesContent":["jest.mock('@wix/motion', () => ({\n getAnimation: jest.fn().mockReturnValue({\n play: jest.fn(),\n cancel: jest.fn(),\n onFinish: jest.fn(),\n isCSS: false,\n }),\n}));\n\njest.mock('fastdom', () => ({\n measure: jest.fn((cb) => cb()),\n mutate: jest.fn((cb) => cb()),\n}));\n\ndescribe('viewEnter handler', () => {\n let viewEnterHandler: any;\n let fastdom: any;\n let element: HTMLElement;\n let target: HTMLElement;\n let observerCallback: (entries: Partial<IntersectionObserverEntry>[]) => void;\n let observerMock: any;\n let observeSpy: jest.Mock;\n let unobserveSpy: jest.Mock;\n let IntersectionObserverMock: jest.Mock;\n\n beforeEach(() => {\n jest.resetModules();\n viewEnterHandler = require('../handlers/viewEnter').default;\n fastdom = require('fastdom');\n\n // Reset DOM\n document.body.innerHTML = '';\n element = document.createElement('div');\n target = document.createElement('div');\n document.body.appendChild(element);\n document.body.appendChild(target);\n\n jest.clearAllMocks();\n\n observeSpy = jest.fn();\n unobserveSpy = jest.fn();\n observerMock = {\n observe: observeSpy,\n unobserve: unobserveSpy,\n disconnect: jest.fn(),\n };\n\n IntersectionObserverMock = jest.fn((cb, options) => {\n observerCallback = cb;\n return observerMock;\n });\n (window as any).IntersectionObserver = IntersectionObserverMock;\n });\n\n afterEach(() => {\n // Clean up handlers to prevent state leakage between tests\n if (viewEnterHandler && element) {\n viewEnterHandler.remove(element);\n }\n if (viewEnterHandler && target) {\n viewEnterHandler.remove(target);\n }\n });\n\n const createEntry = (\n overrides: Partial<IntersectionObserverEntry> = {},\n ): Partial<IntersectionObserverEntry> => {\n return {\n target: element,\n isIntersecting: true,\n boundingClientRect: {\n height: 100,\n width: 100,\n } as unknown as DOMRectReadOnly,\n rootBounds: {\n height: 100,\n width: 100,\n } as unknown as DOMRectReadOnly,\n ...overrides,\n };\n };\n\n describe('Regular flow', () => {\n it('should create an IntersectionObserver and observe the source', () => {\n viewEnterHandler.add(\n element,\n target,\n { duration: 1000, namedEffect: { type: 'FadeIn' } },\n {},\n );\n\n expect(IntersectionObserverMock).toHaveBeenCalled();\n expect(observeSpy).toHaveBeenCalledWith(element);\n });\n\n it('should unobserve after first intersection if type is \"once\"', () => {\n viewEnterHandler.add(\n element,\n target,\n { duration: 1000, namedEffect: { type: 'FadeIn' } },\n { type: 'once' },\n );\n\n const entry = createEntry();\n observerCallback([entry]);\n\n expect(unobserveSpy).toHaveBeenCalledWith(element);\n });\n });\n\n describe('Safe flow', () => {\n it('should check for safe mode conditions on first run when not intersecting', () => {\n viewEnterHandler.add(\n element,\n target,\n { duration: 1000, namedEffect: { type: 'FadeIn' } },\n { useSafeViewEnter: true, threshold: 0.5 },\n );\n\n const entry = createEntry({\n isIntersecting: false,\n boundingClientRect: { height: 1000 } as DOMRectReadOnly,\n rootBounds: { height: 400 } as DOMRectReadOnly,\n });\n observerCallback([entry]);\n\n expect(fastdom.measure).toHaveBeenCalled();\n });\n\n it('should switch to safe observer if element is too tall for root', () => {\n const threshold = 0.5;\n const sourceHeight = 1000;\n const rootHeight = 400; // 1000 * 0.5 = 500 > 400 -> Should trigger safe mode\n\n viewEnterHandler.add(\n element,\n target,\n { duration: 1000, namedEffect: { type: 'FadeIn' } },\n { useSafeViewEnter: true, threshold },\n );\n\n const entry = createEntry({\n isIntersecting: false,\n boundingClientRect: { height: sourceHeight } as DOMRectReadOnly,\n rootBounds: { height: rootHeight } as DOMRectReadOnly,\n });\n\n observerCallback([entry]);\n\n expect(fastdom.mutate).toHaveBeenCalled();\n expect(unobserveSpy).toHaveBeenCalledWith(element);\n\n expect(IntersectionObserverMock).toHaveBeenCalledTimes(2);\n\n const safeObserverConfig = IntersectionObserverMock.mock.calls[1][1];\n expect(safeObserverConfig.threshold).toEqual([0]);\n expect(safeObserverConfig.rootMargin).toBe('0px 0px -10% 0px');\n });\n\n it('should NOT switch to safe observer if element fits in root', () => {\n const threshold = 0.5;\n const sourceHeight = 600;\n const rootHeight = 400; // 600 * 0.5 = 300 < 400 -> No safe mode needed\n\n viewEnterHandler.add(\n element,\n target,\n { duration: 1000, namedEffect: { type: 'FadeIn' } },\n { useSafeViewEnter: true, threshold },\n );\n\n const entry = createEntry({\n isIntersecting: false,\n boundingClientRect: { height: sourceHeight } as DOMRectReadOnly,\n rootBounds: { height: rootHeight } as DOMRectReadOnly,\n });\n\n observerCallback([entry]);\n\n expect(fastdom.measure).toHaveBeenCalled();\n expect(fastdom.mutate).not.toHaveBeenCalled();\n expect(unobserveSpy).not.toHaveBeenCalledWith(element);\n expect(IntersectionObserverMock).toHaveBeenCalledTimes(1);\n });\n\n it('should NOT switch to safe observer if useSafeViewEnter is false', () => {\n const threshold = 0.5;\n const sourceHeight = 1000;\n const rootHeight = 400;\n\n viewEnterHandler.add(\n element,\n target,\n { duration: 1000, namedEffect: { type: 'FadeIn' } },\n { useSafeViewEnter: false, threshold },\n );\n\n const entry = createEntry({\n isIntersecting: false,\n boundingClientRect: { height: sourceHeight } as DOMRectReadOnly,\n rootBounds: { height: rootHeight } as DOMRectReadOnly,\n });\n\n observerCallback([entry]);\n\n expect(fastdom.measure).not.toHaveBeenCalled();\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -8,6 +8,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
8
8
  var _utilities = require("./utilities");
9
9
  var _InteractElement = require("../InteractElement");
10
10
  var _utils = require("../utils");
11
+ var _handlers = _interopRequireDefault(require("../handlers"));
11
12
  var _Interact;
12
13
  function registerInteractElement() {
13
14
  if (!customElements.get('interact-element')) {
@@ -100,6 +101,17 @@ class Interact {
100
101
  Interact.instances.length = 0;
101
102
  Interact.elementCache.clear();
102
103
  }
104
+ static setup(options) {
105
+ if (options.scrollOptionsGetter) {
106
+ _handlers.default.viewProgress.registerOptionsGetter == null || _handlers.default.viewProgress.registerOptionsGetter(options.scrollOptionsGetter);
107
+ }
108
+ if (options.pointerOptionsGetter) {
109
+ _handlers.default.pointerMove.registerOptionsGetter == null || _handlers.default.pointerMove.registerOptionsGetter(options.pointerOptionsGetter);
110
+ }
111
+ if (options.viewEnter) {
112
+ _handlers.default.viewEnter.setOptions(options.viewEnter);
113
+ }
114
+ }
103
115
  static getInstance(key) {
104
116
  return Interact.instances.find(instance => instance.has(key));
105
117
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_utilities","require","_InteractElement","_utils","_Interact","registerInteractElement","customElements","get","interactElement","getInteractElement","define","_convertToKeyTemplate","key","replace","Interact","constructor","_defineProperty2","default","dataCache","effects","conditions","interactions","addedInteractions","listInteractionsCache","elements","Set","init","config","window","parseConfig","didRegister","elementCache","forEach","element","connect","destroy","disconnect","clear","instances","splice","indexOf","setElement","add","deleteElement","clearInteractionStateForKey","delete","has","processedKey","_this$get","interactionIds","interactionId_","interactionId","getInterpolatedKey","create","instance","push","length","getInstance","find","getElement","undefined","set","exports","Map","interactionIdCounter","getSelector","d","asCombinator","addItemFilter","listContainer","itemFilter","listItemSelector","selector","_config$interactions","interaction_","source","interactionIdx","effects_","rest","console","error","triggers","selectors","Array","from","reverse","interaction","effect","target","effectId","referencedEffect","generateId"],"sources":["../../../src/core/Interact.ts"],"sourcesContent":["import {\n InteractCache,\n IInteractElement,\n InteractConfig,\n EffectRef,\n Effect,\n Interaction,\n} from '../types';\nimport { getInterpolatedKey } from './utilities';\nimport { getInteractElement } from '../InteractElement';\nimport { generateId } from '../utils';\n\nfunction registerInteractElement() {\n if (!customElements.get('interact-element')) {\n const interactElement = getInteractElement();\n customElements.define('interact-element', interactElement);\n\n return true;\n }\n\n return false;\n}\n\nfunction _convertToKeyTemplate(key: string) {\n return key.replace(/\\[([-\\w]+)]/g, '[]');\n}\n\nexport class Interact {\n dataCache: InteractCache;\n addedInteractions: { [interactionId: string]: boolean };\n listInteractionsCache: {\n [listContainer: string]: { [interactionId: string]: boolean };\n };\n elements: Set<IInteractElement>;\n static forceReducedMotion: boolean = false;\n static instances: Interact[] = [];\n static elementCache = new Map<string, IInteractElement>();\n\n constructor() {\n this.dataCache = { effects: {}, conditions: {}, interactions: {} };\n this.addedInteractions = {};\n this.listInteractionsCache = {};\n this.elements = new Set();\n }\n\n init(config: InteractConfig): void {\n if (typeof window === 'undefined' || !window.customElements) {\n return;\n }\n\n this.dataCache = parseConfig(config);\n\n const didRegister = registerInteractElement();\n\n if (!didRegister) {\n Interact.elementCache.forEach((element: IInteractElement, key) =>\n element.connect(key),\n );\n }\n }\n\n destroy(): void {\n for (const element of this.elements) {\n element.disconnect();\n }\n this.addedInteractions = {};\n this.listInteractionsCache = {};\n this.elements.clear();\n this.dataCache = { effects: {}, conditions: {}, interactions: {} };\n Interact.instances.splice(Interact.instances.indexOf(this), 1);\n }\n\n setElement(key: string, element: IInteractElement) {\n this.elements.add(element);\n\n Interact.setElement(key, element);\n }\n\n deleteElement(key: string) {\n const element = Interact.elementCache.get(key);\n\n this.clearInteractionStateForKey(key);\n\n if (element) {\n this.elements.delete(element);\n Interact.elementCache.delete(key);\n }\n }\n\n has(key: string): boolean {\n return !!this.get(key);\n }\n\n get(key: string): InteractCache['interactions'][string] | undefined {\n const processedKey = _convertToKeyTemplate(key);\n return this.dataCache.interactions[processedKey];\n }\n\n clearInteractionStateForKey(key: string): void {\n const interactionIds = this.get(key)?.interactionIds || [];\n\n interactionIds.forEach((interactionId_) => {\n const interactionId = getInterpolatedKey(interactionId_, key);\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this.addedInteractions[interactionId];\n });\n }\n\n static create(config: InteractConfig): Interact {\n const instance = new Interact();\n Interact.instances.push(instance);\n\n instance.init(config);\n\n return instance;\n }\n\n static destroy(): void {\n Interact.elementCache.forEach((element: IInteractElement) => {\n element.disconnect();\n });\n Interact.instances.length = 0;\n Interact.elementCache.clear();\n }\n\n static getInstance(key: string): Interact | undefined {\n return Interact.instances.find((instance) => instance.has(key));\n }\n\n static getElement(key: string | undefined): IInteractElement | undefined {\n return key ? Interact.elementCache.get(key) : undefined;\n }\n\n static setElement(key: string, element: IInteractElement): void {\n Interact.elementCache.set(key, element);\n }\n}\n\nlet interactionIdCounter = 0;\n\nexport function getSelector(\n d: Interaction | Effect,\n {\n asCombinator = false,\n addItemFilter = false,\n }: { asCombinator?: boolean; addItemFilter?: boolean } = {},\n): string {\n if (d.listContainer) {\n const itemFilter = `${\n addItemFilter && d.listItemSelector ? ` > ${d.listItemSelector}` : ''\n }`;\n\n if (d.selector) {\n return `${d.listContainer}${itemFilter} ${d.selector}`;\n }\n\n return `${d.listContainer}${itemFilter || ' > *'}`;\n } else if (d.selector) {\n return d.selector;\n }\n\n // TODO: consider moving :scope to be configurable since it may lead to unexpected results in some cases\n return asCombinator ? '> :first-child' : ':scope > :first-child';\n}\n\n/**\n * Parses the config object and caches interactions, effects, and conditions\n */\nfunction parseConfig(config: InteractConfig): InteractCache {\n const conditions = config.conditions || {};\n const interactions: InteractCache['interactions'] = {};\n\n config.interactions?.forEach((interaction_) => {\n const source = interaction_.key;\n const interactionIdx = ++interactionIdCounter;\n const { effects: effects_, ...rest } = interaction_;\n\n if (!source) {\n console.error(\n `Interaction ${interactionIdx} is missing a key for source element.`,\n );\n return;\n }\n\n if (!interactions[source]) {\n interactions[source] = {\n triggers: [],\n effects: {},\n interactionIds: new Set(),\n selectors: new Set(),\n };\n }\n\n /*\n * Cache interaction trigger by source element\n */\n const effects = Array.from(effects_);\n effects.reverse(); // reverse to ensure the first effect is the one that will be applied first\n const interaction = { ...rest, effects };\n\n interactions[source].triggers.push(interaction);\n interactions[source].selectors.add(getSelector(interaction));\n\n const listContainer = interaction.listContainer;\n\n effects.forEach((effect) => {\n /*\n * Target cascade order is the first of:\n * -> Config.interactions.effects.effect.key\n * -> Config.effects.effect.key\n * -> Config.interactions.interaction.key\n */\n let target = effect.key;\n\n if (!target && (effect as EffectRef).effectId) {\n const referencedEffect = config.effects[(effect as EffectRef).effectId];\n\n if (referencedEffect) {\n target = referencedEffect.key;\n }\n }\n\n if (!(effect as EffectRef).effectId) {\n (effect as EffectRef).effectId = generateId();\n }\n\n // if no target is specified, use the source element as the target\n target = target || source;\n effect.key = target;\n const effectId = (effect as EffectRef).effectId;\n\n if (listContainer && effect.listContainer) {\n // we do not support having 2 separate lists for same interaction\n if (target !== source || effect.listContainer !== listContainer) {\n return;\n }\n }\n\n const interactionId = `${target}::${effectId}::${interactionIdx}`;\n effect.interactionId = interactionId;\n interactions[source].interactionIds.add(interactionId);\n\n if (target === source) {\n // if target is the source element, no need to add an interaction to `effects`\n return;\n }\n\n /*\n * Cache interaction effect by target element\n */\n if (!interactions[target]) {\n interactions[target] = {\n triggers: [],\n effects: {\n [interactionId]: [],\n },\n interactionIds: new Set(),\n selectors: new Set(),\n };\n } else if (!interactions[target].effects[interactionId]) {\n interactions[target].effects[interactionId] = [];\n interactions[target].interactionIds.add(interactionId);\n }\n\n interactions[target].effects[interactionId].push({ ...rest, effect });\n interactions[target].selectors.add(getSelector(effect));\n });\n });\n\n return {\n effects: config.effects || {},\n conditions,\n interactions,\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_utilities","require","_InteractElement","_utils","_handlers","_interopRequireDefault","_Interact","registerInteractElement","customElements","get","interactElement","getInteractElement","define","_convertToKeyTemplate","key","replace","Interact","constructor","_defineProperty2","default","dataCache","effects","conditions","interactions","addedInteractions","listInteractionsCache","elements","Set","init","config","window","parseConfig","didRegister","elementCache","forEach","element","connect","destroy","disconnect","clear","instances","splice","indexOf","setElement","add","deleteElement","clearInteractionStateForKey","delete","has","processedKey","_this$get","interactionIds","interactionId_","interactionId","getInterpolatedKey","create","instance","push","length","setup","options","scrollOptionsGetter","TRIGGER_TO_HANDLER_MODULE_MAP","viewProgress","registerOptionsGetter","pointerOptionsGetter","pointerMove","viewEnter","setOptions","getInstance","find","getElement","undefined","set","exports","Map","interactionIdCounter","getSelector","d","asCombinator","addItemFilter","listContainer","itemFilter","listItemSelector","selector","_config$interactions","interaction_","source","interactionIdx","effects_","rest","console","error","triggers","selectors","Array","from","reverse","interaction","effect","target","effectId","referencedEffect","generateId"],"sources":["../../../src/core/Interact.ts"],"sourcesContent":["import {\n InteractCache,\n IInteractElement,\n InteractConfig,\n EffectRef,\n Effect,\n Interaction,\n ViewEnterParams,\n ViewEnterHandlerModule,\n} from '../types';\nimport { getInterpolatedKey } from './utilities';\nimport { getInteractElement } from '../InteractElement';\nimport { generateId } from '../utils';\nimport TRIGGER_TO_HANDLER_MODULE_MAP from '../handlers';\n\nfunction registerInteractElement() {\n if (!customElements.get('interact-element')) {\n const interactElement = getInteractElement();\n customElements.define('interact-element', interactElement);\n\n return true;\n }\n\n return false;\n}\n\nfunction _convertToKeyTemplate(key: string) {\n return key.replace(/\\[([-\\w]+)]/g, '[]');\n}\n\nexport class Interact {\n dataCache: InteractCache;\n addedInteractions: { [interactionId: string]: boolean };\n listInteractionsCache: {\n [listContainer: string]: { [interactionId: string]: boolean };\n };\n elements: Set<IInteractElement>;\n static forceReducedMotion: boolean = false;\n static instances: Interact[] = [];\n static elementCache = new Map<string, IInteractElement>();\n\n constructor() {\n this.dataCache = { effects: {}, conditions: {}, interactions: {} };\n this.addedInteractions = {};\n this.listInteractionsCache = {};\n this.elements = new Set();\n }\n\n init(config: InteractConfig): void {\n if (typeof window === 'undefined' || !window.customElements) {\n return;\n }\n\n this.dataCache = parseConfig(config);\n\n const didRegister = registerInteractElement();\n\n if (!didRegister) {\n Interact.elementCache.forEach((element: IInteractElement, key) =>\n element.connect(key),\n );\n }\n }\n\n destroy(): void {\n for (const element of this.elements) {\n element.disconnect();\n }\n this.addedInteractions = {};\n this.listInteractionsCache = {};\n this.elements.clear();\n this.dataCache = { effects: {}, conditions: {}, interactions: {} };\n Interact.instances.splice(Interact.instances.indexOf(this), 1);\n }\n\n setElement(key: string, element: IInteractElement) {\n this.elements.add(element);\n\n Interact.setElement(key, element);\n }\n\n deleteElement(key: string) {\n const element = Interact.elementCache.get(key);\n\n this.clearInteractionStateForKey(key);\n\n if (element) {\n this.elements.delete(element);\n Interact.elementCache.delete(key);\n }\n }\n\n has(key: string): boolean {\n return !!this.get(key);\n }\n\n get(key: string): InteractCache['interactions'][string] | undefined {\n const processedKey = _convertToKeyTemplate(key);\n return this.dataCache.interactions[processedKey];\n }\n\n clearInteractionStateForKey(key: string): void {\n const interactionIds = this.get(key)?.interactionIds || [];\n\n interactionIds.forEach((interactionId_) => {\n const interactionId = getInterpolatedKey(interactionId_, key);\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this.addedInteractions[interactionId];\n });\n }\n\n static create(config: InteractConfig): Interact {\n const instance = new Interact();\n Interact.instances.push(instance);\n\n instance.init(config);\n\n return instance;\n }\n\n static destroy(): void {\n Interact.elementCache.forEach((element: IInteractElement) => {\n element.disconnect();\n });\n Interact.instances.length = 0;\n Interact.elementCache.clear();\n }\n\n static setup(options: {\n scrollOptionsGetter?: () => Partial<scrollConfig>;\n pointerOptionsGetter?: () => Partial<PointerConfig>;\n viewEnter?: Partial<ViewEnterParams>;\n }): void {\n if (options.scrollOptionsGetter) {\n TRIGGER_TO_HANDLER_MODULE_MAP.viewProgress.registerOptionsGetter?.(\n options.scrollOptionsGetter,\n );\n }\n\n if (options.pointerOptionsGetter) {\n TRIGGER_TO_HANDLER_MODULE_MAP.pointerMove.registerOptionsGetter?.(\n options.pointerOptionsGetter,\n );\n }\n\n if (options.viewEnter) {\n (\n TRIGGER_TO_HANDLER_MODULE_MAP.viewEnter as ViewEnterHandlerModule\n ).setOptions(options.viewEnter);\n }\n }\n\n static getInstance(key: string): Interact | undefined {\n return Interact.instances.find((instance) => instance.has(key));\n }\n\n static getElement(key: string | undefined): IInteractElement | undefined {\n return key ? Interact.elementCache.get(key) : undefined;\n }\n\n static setElement(key: string, element: IInteractElement): void {\n Interact.elementCache.set(key, element);\n }\n}\n\nlet interactionIdCounter = 0;\n\nexport function getSelector(\n d: Interaction | Effect,\n {\n asCombinator = false,\n addItemFilter = false,\n }: { asCombinator?: boolean; addItemFilter?: boolean } = {},\n): string {\n if (d.listContainer) {\n const itemFilter = `${\n addItemFilter && d.listItemSelector ? ` > ${d.listItemSelector}` : ''\n }`;\n\n if (d.selector) {\n return `${d.listContainer}${itemFilter} ${d.selector}`;\n }\n\n return `${d.listContainer}${itemFilter || ' > *'}`;\n } else if (d.selector) {\n return d.selector;\n }\n\n // TODO: consider moving :scope to be configurable since it may lead to unexpected results in some cases\n return asCombinator ? '> :first-child' : ':scope > :first-child';\n}\n\n/**\n * Parses the config object and caches interactions, effects, and conditions\n */\nfunction parseConfig(config: InteractConfig): InteractCache {\n const conditions = config.conditions || {};\n const interactions: InteractCache['interactions'] = {};\n\n config.interactions?.forEach((interaction_) => {\n const source = interaction_.key;\n const interactionIdx = ++interactionIdCounter;\n const { effects: effects_, ...rest } = interaction_;\n\n if (!source) {\n console.error(\n `Interaction ${interactionIdx} is missing a key for source element.`,\n );\n return;\n }\n\n if (!interactions[source]) {\n interactions[source] = {\n triggers: [],\n effects: {},\n interactionIds: new Set(),\n selectors: new Set(),\n };\n }\n\n /*\n * Cache interaction trigger by source element\n */\n const effects = Array.from(effects_);\n effects.reverse(); // reverse to ensure the first effect is the one that will be applied first\n const interaction = { ...rest, effects };\n\n interactions[source].triggers.push(interaction);\n interactions[source].selectors.add(getSelector(interaction));\n\n const listContainer = interaction.listContainer;\n\n effects.forEach((effect) => {\n /*\n * Target cascade order is the first of:\n * -> Config.interactions.effects.effect.key\n * -> Config.effects.effect.key\n * -> Config.interactions.interaction.key\n */\n let target = effect.key;\n\n if (!target && (effect as EffectRef).effectId) {\n const referencedEffect = config.effects[(effect as EffectRef).effectId];\n\n if (referencedEffect) {\n target = referencedEffect.key;\n }\n }\n\n if (!(effect as EffectRef).effectId) {\n (effect as EffectRef).effectId = generateId();\n }\n\n // if no target is specified, use the source element as the target\n target = target || source;\n effect.key = target;\n const effectId = (effect as EffectRef).effectId;\n\n if (listContainer && effect.listContainer) {\n // we do not support having 2 separate lists for same interaction\n if (target !== source || effect.listContainer !== listContainer) {\n return;\n }\n }\n\n const interactionId = `${target}::${effectId}::${interactionIdx}`;\n effect.interactionId = interactionId;\n interactions[source].interactionIds.add(interactionId);\n\n if (target === source) {\n // if target is the source element, no need to add an interaction to `effects`\n return;\n }\n\n /*\n * Cache interaction effect by target element\n */\n if (!interactions[target]) {\n interactions[target] = {\n triggers: [],\n effects: {\n [interactionId]: [],\n },\n interactionIds: new Set(),\n selectors: new Set(),\n };\n } else if (!interactions[target].effects[interactionId]) {\n interactions[target].effects[interactionId] = [];\n interactions[target].interactionIds.add(interactionId);\n }\n\n interactions[target].effects[interactionId].push({ ...rest, effect });\n interactions[target].selectors.add(getSelector(effect));\n });\n });\n\n return {\n effects: config.effects || {},\n conditions,\n interactions,\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -6,6 +6,10 @@ var _motion = require("@wix/motion");
6
6
  var _kuliso = require("kuliso");
7
7
  var _utilities = require("./utilities");
8
8
  const pointerManagerMap = new WeakMap();
9
+ let pointerOptionsGetter = () => ({});
10
+ function registerOptionsGetter(getter) {
11
+ pointerOptionsGetter = getter;
12
+ }
9
13
  function addPointerMoveHandler(source, target, effect, options = {}, reducedMotion = false) {
10
14
  if (reducedMotion) {
11
15
  return;
@@ -18,7 +22,8 @@ function addPointerMoveHandler(source, target, effect, options = {}, reducedMoti
18
22
  if (scene) {
19
23
  const pointer = new _kuliso.Pointer({
20
24
  root: options.hitArea === 'root' ? document.documentElement : source,
21
- scenes: Array.isArray(scene) ? scene : [scene]
25
+ scenes: Array.isArray(scene) ? scene : [scene],
26
+ ...pointerOptionsGetter()
22
27
  });
23
28
  const cleanup = () => {
24
29
  pointer.destroy();
@@ -38,6 +43,7 @@ function removePointerMoveHandler(element) {
38
43
  }
39
44
  var _default = exports.default = {
40
45
  add: addPointerMoveHandler,
41
- remove: removePointerMoveHandler
46
+ remove: removePointerMoveHandler,
47
+ registerOptionsGetter
42
48
  };
43
49
  //# sourceMappingURL=pointerMove.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_motion","require","_kuliso","_utilities","pointerManagerMap","WeakMap","addPointerMoveHandler","source","target","effect","options","reducedMotion","triggerParams","trigger","element","scene","getScrubScene","effectToAnimationOptions","pointer","Pointer","root","hitArea","document","documentElement","scenes","Array","isArray","cleanup","destroy","handlerObj","addHandlerToMap","start","removePointerMoveHandler","removeElementFromHandlerMap","_default","exports","default","add","remove"],"sources":["../../../src/handlers/pointerMove.ts"],"sourcesContent":["import { getScrubScene } from '@wix/motion';\nimport { Pointer } from 'kuliso';\nimport type {\n PointerMoveParams,\n ScrubEffect,\n HandlerObjectMap,\n} from '../types';\nimport {\n effectToAnimationOptions,\n addHandlerToMap,\n removeElementFromHandlerMap,\n} from './utilities';\n\nconst pointerManagerMap = new WeakMap() as HandlerObjectMap;\n\nfunction addPointerMoveHandler(\n source: HTMLElement,\n target: HTMLElement,\n effect: ScrubEffect,\n options: PointerMoveParams = {},\n reducedMotion: boolean = false,\n) {\n if (reducedMotion) {\n return;\n }\n\n const triggerParams = {\n trigger: 'pointer-move' as const,\n element: source,\n };\n\n const scene = getScrubScene(\n target,\n effectToAnimationOptions(effect),\n triggerParams,\n );\n\n if (scene) {\n const pointer = new Pointer({\n root: options.hitArea === 'root' ? document.documentElement : source,\n scenes: Array.isArray(scene) ? scene : [scene],\n });\n const cleanup = () => {\n pointer.destroy();\n };\n\n const handlerObj = { source, target, cleanup };\n\n addHandlerToMap(pointerManagerMap, source, handlerObj);\n addHandlerToMap(pointerManagerMap, target, handlerObj);\n\n pointer.start();\n }\n}\n\nfunction removePointerMoveHandler(element: HTMLElement) {\n removeElementFromHandlerMap(pointerManagerMap, element);\n}\n\nexport default {\n add: addPointerMoveHandler,\n remove: removePointerMoveHandler,\n};\n"],"mappings":";;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAMA,IAAAE,UAAA,GAAAF,OAAA;AAMA,MAAMG,iBAAiB,GAAG,IAAIC,OAAO,CAAC,CAAqB;AAE3D,SAASC,qBAAqBA,CAC5BC,MAAmB,EACnBC,MAAmB,EACnBC,MAAmB,EACnBC,OAA0B,GAAG,CAAC,CAAC,EAC/BC,aAAsB,GAAG,KAAK,EAC9B;EACA,IAAIA,aAAa,EAAE;IACjB;EACF;EAEA,MAAMC,aAAa,GAAG;IACpBC,OAAO,EAAE,cAAuB;IAChCC,OAAO,EAAEP;EACX,CAAC;EAED,MAAMQ,KAAK,GAAG,IAAAC,qBAAa,EACzBR,MAAM,EACN,IAAAS,mCAAwB,EAACR,MAAM,CAAC,EAChCG,aACF,CAAC;EAED,IAAIG,KAAK,EAAE;IACT,MAAMG,OAAO,GAAG,IAAIC,eAAO,CAAC;MAC1BC,IAAI,EAAEV,OAAO,CAACW,OAAO,KAAK,MAAM,GAAGC,QAAQ,CAACC,eAAe,GAAGhB,MAAM;MACpEiB,MAAM,EAAEC,KAAK,CAACC,OAAO,CAACX,KAAK,CAAC,GAAGA,KAAK,GAAG,CAACA,KAAK;IAC/C,CAAC,CAAC;IACF,MAAMY,OAAO,GAAGA,CAAA,KAAM;MACpBT,OAAO,CAACU,OAAO,CAAC,CAAC;IACnB,CAAC;IAED,MAAMC,UAAU,GAAG;MAAEtB,MAAM;MAAEC,MAAM;MAAEmB;IAAQ,CAAC;IAE9C,IAAAG,0BAAe,EAAC1B,iBAAiB,EAAEG,MAAM,EAAEsB,UAAU,CAAC;IACtD,IAAAC,0BAAe,EAAC1B,iBAAiB,EAAEI,MAAM,EAAEqB,UAAU,CAAC;IAEtDX,OAAO,CAACa,KAAK,CAAC,CAAC;EACjB;AACF;AAEA,SAASC,wBAAwBA,CAAClB,OAAoB,EAAE;EACtD,IAAAmB,sCAA2B,EAAC7B,iBAAiB,EAAEU,OAAO,CAAC;AACzD;AAAC,IAAAoB,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEc;EACbC,GAAG,EAAE/B,qBAAqB;EAC1BgC,MAAM,EAAEN;AACV,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_motion","require","_kuliso","_utilities","pointerManagerMap","WeakMap","pointerOptionsGetter","registerOptionsGetter","getter","addPointerMoveHandler","source","target","effect","options","reducedMotion","triggerParams","trigger","element","scene","getScrubScene","effectToAnimationOptions","pointer","Pointer","root","hitArea","document","documentElement","scenes","Array","isArray","cleanup","destroy","handlerObj","addHandlerToMap","start","removePointerMoveHandler","removeElementFromHandlerMap","_default","exports","default","add","remove"],"sources":["../../../src/handlers/pointerMove.ts"],"sourcesContent":["import { getScrubScene } from '@wix/motion';\nimport { Pointer, PointerConfig } from 'kuliso';\nimport type {\n PointerMoveParams,\n ScrubEffect,\n HandlerObjectMap,\n} from '../types';\nimport {\n effectToAnimationOptions,\n addHandlerToMap,\n removeElementFromHandlerMap,\n} from './utilities';\n\nconst pointerManagerMap = new WeakMap() as HandlerObjectMap;\nlet pointerOptionsGetter: () => Partial<PointerConfig> = () => ({});\n\nfunction registerOptionsGetter(getter: () => Partial<PointerConfig>) {\n pointerOptionsGetter = getter;\n}\n\nfunction addPointerMoveHandler(\n source: HTMLElement,\n target: HTMLElement,\n effect: ScrubEffect,\n options: PointerMoveParams = {},\n reducedMotion: boolean = false,\n) {\n if (reducedMotion) {\n return;\n }\n\n const triggerParams = {\n trigger: 'pointer-move' as const,\n element: source,\n };\n\n const scene = getScrubScene(\n target,\n effectToAnimationOptions(effect),\n triggerParams,\n );\n\n if (scene) {\n const pointer = new Pointer({\n root: options.hitArea === 'root' ? document.documentElement : source,\n scenes: Array.isArray(scene) ? scene : [scene],\n ...pointerOptionsGetter(),\n });\n const cleanup = () => {\n pointer.destroy();\n };\n\n const handlerObj = { source, target, cleanup };\n\n addHandlerToMap(pointerManagerMap, source, handlerObj);\n addHandlerToMap(pointerManagerMap, target, handlerObj);\n\n pointer.start();\n }\n}\n\nfunction removePointerMoveHandler(element: HTMLElement) {\n removeElementFromHandlerMap(pointerManagerMap, element);\n}\n\nexport default {\n add: addPointerMoveHandler,\n remove: removePointerMoveHandler,\n registerOptionsGetter,\n};\n"],"mappings":";;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAMA,IAAAE,UAAA,GAAAF,OAAA;AAMA,MAAMG,iBAAiB,GAAG,IAAIC,OAAO,CAAC,CAAqB;AAC3D,IAAIC,oBAAkD,GAAGA,CAAA,MAAO,CAAC,CAAC,CAAC;AAEnE,SAASC,qBAAqBA,CAACC,MAAoC,EAAE;EACnEF,oBAAoB,GAAGE,MAAM;AAC/B;AAEA,SAASC,qBAAqBA,CAC5BC,MAAmB,EACnBC,MAAmB,EACnBC,MAAmB,EACnBC,OAA0B,GAAG,CAAC,CAAC,EAC/BC,aAAsB,GAAG,KAAK,EAC9B;EACA,IAAIA,aAAa,EAAE;IACjB;EACF;EAEA,MAAMC,aAAa,GAAG;IACpBC,OAAO,EAAE,cAAuB;IAChCC,OAAO,EAAEP;EACX,CAAC;EAED,MAAMQ,KAAK,GAAG,IAAAC,qBAAa,EACzBR,MAAM,EACN,IAAAS,mCAAwB,EAACR,MAAM,CAAC,EAChCG,aACF,CAAC;EAED,IAAIG,KAAK,EAAE;IACT,MAAMG,OAAO,GAAG,IAAIC,eAAO,CAAC;MAC1BC,IAAI,EAAEV,OAAO,CAACW,OAAO,KAAK,MAAM,GAAGC,QAAQ,CAACC,eAAe,GAAGhB,MAAM;MACpEiB,MAAM,EAAEC,KAAK,CAACC,OAAO,CAACX,KAAK,CAAC,GAAGA,KAAK,GAAG,CAACA,KAAK,CAAC;MAC9C,GAAGZ,oBAAoB,CAAC;IAC1B,CAAC,CAAC;IACF,MAAMwB,OAAO,GAAGA,CAAA,KAAM;MACpBT,OAAO,CAACU,OAAO,CAAC,CAAC;IACnB,CAAC;IAED,MAAMC,UAAU,GAAG;MAAEtB,MAAM;MAAEC,MAAM;MAAEmB;IAAQ,CAAC;IAE9C,IAAAG,0BAAe,EAAC7B,iBAAiB,EAAEM,MAAM,EAAEsB,UAAU,CAAC;IACtD,IAAAC,0BAAe,EAAC7B,iBAAiB,EAAEO,MAAM,EAAEqB,UAAU,CAAC;IAEtDX,OAAO,CAACa,KAAK,CAAC,CAAC;EACjB;AACF;AAEA,SAASC,wBAAwBA,CAAClB,OAAoB,EAAE;EACtD,IAAAmB,sCAA2B,EAAChC,iBAAiB,EAAEa,OAAO,CAAC;AACzD;AAAC,IAAAoB,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEc;EACbC,GAAG,EAAE/B,qBAAqB;EAC1BgC,MAAM,EAAEN,wBAAwB;EAChC5B;AACF,CAAC","ignoreList":[]}
@@ -1,20 +1,67 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  exports.__esModule = true;
4
5
  exports.default = void 0;
5
6
  var _motion = require("@wix/motion");
6
7
  var _utilities = require("./utilities");
8
+ var _fastdom = _interopRequireDefault(require("fastdom"));
9
+ const SAFE_OBSERVER_CONFIG = {
10
+ root: null,
11
+ rootMargin: '0px 0px -10% 0px',
12
+ threshold: [0]
13
+ };
7
14
  const observers = {};
8
15
  const handlerMap = new WeakMap();
9
- function getObserver(options) {
10
- const key = JSON.stringify(options);
16
+ const elementFirstRun = new WeakSet();
17
+ const elementObserverMap = new WeakMap();
18
+ let viewEnterOptions = {};
19
+ function setOptions(options) {
20
+ viewEnterOptions = options;
21
+ }
22
+ function getObserver(options, isSafeMode = false) {
23
+ const key = JSON.stringify({
24
+ ...options,
25
+ isSafeMode
26
+ });
11
27
  if (observers[key]) {
12
28
  return observers[key];
13
29
  }
30
+ const config = isSafeMode ? SAFE_OBSERVER_CONFIG : {
31
+ root: null,
32
+ rootMargin: options.inset ? `${options.inset} 0px ${options.inset}` : '0px',
33
+ threshold: options.threshold
34
+ };
14
35
  const observer = new IntersectionObserver(entries => {
15
36
  entries.forEach(entry => {
37
+ const target = entry.target;
38
+ const isFirstRun = !elementFirstRun.has(target);
39
+ if (isFirstRun) {
40
+ elementFirstRun.add(target);
41
+ if (options.useSafeViewEnter && !entry.isIntersecting) {
42
+ _fastdom.default.measure(() => {
43
+ var _entry$rootBounds;
44
+ const sourceHeight = entry.boundingClientRect.height;
45
+ const rootHeight = (_entry$rootBounds = entry.rootBounds) == null ? void 0 : _entry$rootBounds.height;
46
+ if (!rootHeight) {
47
+ return;
48
+ }
49
+ const threshold = Array.isArray(options.threshold) ? Math.min(...options.threshold) : options.threshold;
50
+ const needsSafeObserver = threshold && sourceHeight * threshold > rootHeight;
51
+ if (needsSafeObserver) {
52
+ _fastdom.default.mutate(() => {
53
+ observer.unobserve(target);
54
+ const safeObserver = getObserver(options, true);
55
+ elementObserverMap.set(target, safeObserver);
56
+ safeObserver.observe(target);
57
+ });
58
+ }
59
+ });
60
+ return;
61
+ }
62
+ }
16
63
  if (entry.isIntersecting) {
17
- const handlers = handlerMap.get(entry.target);
64
+ const handlers = handlerMap.get(target);
18
65
  handlers == null || handlers.forEach(({
19
66
  source,
20
67
  handler
@@ -25,19 +72,19 @@ function getObserver(options) {
25
72
  });
26
73
  if (options.type === 'once') {
27
74
  observer.unobserve(entry.target);
75
+ elementFirstRun.delete(target);
28
76
  }
29
77
  }
30
78
  });
31
- }, {
32
- root: null,
33
- rootMargin: options.inset ? `${options.inset} 0px ${options.inset}` : '0px',
34
- threshold: options.threshold
35
- });
79
+ }, config);
36
80
  observers[key] = observer;
37
81
  return observer;
38
82
  }
39
83
  function addViewEnterHandler(source, target, effect, options = {}, reducedMotion = false) {
40
- const observer = getObserver(options);
84
+ const observer = getObserver({
85
+ ...viewEnterOptions,
86
+ ...options
87
+ });
41
88
  const animation = (0, _motion.getAnimation)(target, (0, _utilities.effectToAnimationOptions)(effect), undefined, reducedMotion);
42
89
  if (animation != null && animation.isCSS && options.type === 'once') {
43
90
  animation.onFinish(() => {
@@ -52,8 +99,11 @@ function addViewEnterHandler(source, target, effect, options = {}, reducedMotion
52
99
  });
53
100
  };
54
101
  const cleanup = () => {
55
- observer.unobserve(source);
102
+ const currentObserver = elementObserverMap.get(source) || observer;
103
+ currentObserver.unobserve(source);
56
104
  animation.cancel();
105
+ elementFirstRun.delete(source);
106
+ elementObserverMap.delete(source);
57
107
  };
58
108
  const handlerObj = {
59
109
  source,
@@ -63,6 +113,7 @@ function addViewEnterHandler(source, target, effect, options = {}, reducedMotion
63
113
  };
64
114
  (0, _utilities.addHandlerToMap)(handlerMap, source, handlerObj);
65
115
  (0, _utilities.addHandlerToMap)(handlerMap, target, handlerObj);
116
+ elementObserverMap.set(source, observer);
66
117
  observer.observe(source);
67
118
  }
68
119
  function removeViewEnterHandler(element) {
@@ -70,6 +121,7 @@ function removeViewEnterHandler(element) {
70
121
  }
71
122
  var _default = exports.default = {
72
123
  add: addViewEnterHandler,
73
- remove: removeViewEnterHandler
124
+ remove: removeViewEnterHandler,
125
+ setOptions
74
126
  };
75
127
  //# sourceMappingURL=viewEnter.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_motion","require","_utilities","observers","handlerMap","WeakMap","getObserver","options","key","JSON","stringify","observer","IntersectionObserver","entries","forEach","entry","isIntersecting","handlers","get","target","source","handler","type","unobserve","root","rootMargin","inset","threshold","addViewEnterHandler","effect","reducedMotion","animation","getAnimation","effectToAnimationOptions","undefined","isCSS","onFinish","dataset","motionEnter","play","cleanup","cancel","handlerObj","addHandlerToMap","observe","removeViewEnterHandler","element","removeElementFromHandlerMap","_default","exports","default","add","remove"],"sources":["../../../src/handlers/viewEnter.ts"],"sourcesContent":["import type { AnimationGroup } from '@wix/motion';\nimport { getAnimation } from '@wix/motion';\nimport type { TimeEffect, HandlerObjectMap, ViewEnterParams } from '../types';\nimport {\n effectToAnimationOptions,\n addHandlerToMap,\n removeElementFromHandlerMap,\n} from './utilities';\n\nconst observers: Record<string, IntersectionObserver> = {};\nconst handlerMap = new WeakMap() as HandlerObjectMap;\n\nfunction getObserver(options: ViewEnterParams) {\n const key = JSON.stringify(options);\n\n if (observers[key]) {\n return observers[key];\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n const handlers = handlerMap.get(entry.target as HTMLElement);\n\n handlers?.forEach(({ source, handler }) => {\n if (source === entry.target) {\n handler!();\n }\n });\n\n if (options.type === 'once') {\n observer.unobserve(entry.target);\n }\n }\n });\n },\n {\n root: null,\n rootMargin: options.inset\n ? `${options.inset} 0px ${options.inset}`\n : '0px',\n threshold: options.threshold,\n },\n );\n\n observers[key] = observer;\n\n return observer;\n}\n\nfunction addViewEnterHandler(\n source: HTMLElement,\n target: HTMLElement,\n effect: TimeEffect,\n options: ViewEnterParams = {},\n reducedMotion: boolean = false,\n) {\n const observer = getObserver(options);\n const animation = getAnimation(\n target,\n effectToAnimationOptions(effect),\n undefined,\n reducedMotion,\n ) as AnimationGroup;\n\n if (animation?.isCSS && options.type === 'once') {\n animation.onFinish(() => {\n target.dataset.motionEnter = 'done';\n });\n }\n\n const handler = () => {\n animation.play(() => {\n if (!animation.isCSS) {\n target.dataset.motionEnter = 'done';\n }\n });\n };\n const cleanup = () => {\n observer.unobserve(source);\n animation.cancel();\n };\n const handlerObj = { source, target, handler, cleanup };\n\n addHandlerToMap(handlerMap, source, handlerObj);\n addHandlerToMap(handlerMap, target, handlerObj);\n\n observer.observe(source);\n}\n\nfunction removeViewEnterHandler(element: HTMLElement) {\n removeElementFromHandlerMap(handlerMap, element);\n}\n\nexport default {\n add: addViewEnterHandler,\n remove: removeViewEnterHandler,\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_motion","require","_utilities","_fastdom","_interopRequireDefault","SAFE_OBSERVER_CONFIG","root","rootMargin","threshold","observers","handlerMap","WeakMap","elementFirstRun","WeakSet","elementObserverMap","viewEnterOptions","setOptions","options","getObserver","isSafeMode","key","JSON","stringify","config","inset","observer","IntersectionObserver","entries","forEach","entry","target","isFirstRun","has","add","useSafeViewEnter","isIntersecting","fastdom","measure","_entry$rootBounds","sourceHeight","boundingClientRect","height","rootHeight","rootBounds","Array","isArray","Math","min","needsSafeObserver","mutate","unobserve","safeObserver","set","observe","handlers","get","source","handler","type","delete","addViewEnterHandler","effect","reducedMotion","animation","getAnimation","effectToAnimationOptions","undefined","isCSS","onFinish","dataset","motionEnter","play","cleanup","currentObserver","cancel","handlerObj","addHandlerToMap","removeViewEnterHandler","element","removeElementFromHandlerMap","_default","exports","default","remove"],"sources":["../../../src/handlers/viewEnter.ts"],"sourcesContent":["import type { AnimationGroup } from '@wix/motion';\nimport { getAnimation } from '@wix/motion';\nimport type { TimeEffect, HandlerObjectMap, ViewEnterParams } from '../types';\nimport {\n effectToAnimationOptions,\n addHandlerToMap,\n removeElementFromHandlerMap,\n} from './utilities';\nimport fastdom from 'fastdom';\n\nconst SAFE_OBSERVER_CONFIG: IntersectionObserverInit = {\n root: null,\n rootMargin: '0px 0px -10% 0px',\n threshold: [0],\n};\n\nconst observers: Record<string, IntersectionObserver> = {};\nconst handlerMap = new WeakMap() as HandlerObjectMap;\nconst elementFirstRun = new WeakSet<HTMLElement>();\nconst elementObserverMap = new WeakMap<HTMLElement, IntersectionObserver>();\nlet viewEnterOptions: Partial<ViewEnterParams> = {};\n\nfunction setOptions(options: Partial<ViewEnterParams>) {\n viewEnterOptions = options;\n}\n\nfunction getObserver(options: ViewEnterParams, isSafeMode: boolean = false) {\n const key = JSON.stringify({ ...options, isSafeMode });\n\n if (observers[key]) {\n return observers[key];\n }\n\n const config: IntersectionObserverInit = isSafeMode\n ? SAFE_OBSERVER_CONFIG\n : {\n root: null,\n rootMargin: options.inset\n ? `${options.inset} 0px ${options.inset}`\n : '0px',\n threshold: options.threshold,\n };\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n const target = entry.target as HTMLElement;\n const isFirstRun = !elementFirstRun.has(target);\n\n if (isFirstRun) {\n elementFirstRun.add(target);\n\n if (options.useSafeViewEnter && !entry.isIntersecting) {\n fastdom.measure(() => {\n const sourceHeight = entry.boundingClientRect.height;\n const rootHeight = entry.rootBounds?.height;\n\n if (!rootHeight) {\n return;\n }\n\n const threshold = Array.isArray(options.threshold)\n ? Math.min(...options.threshold)\n : options.threshold;\n\n const needsSafeObserver =\n threshold && sourceHeight * threshold > rootHeight;\n\n if (needsSafeObserver) {\n fastdom.mutate(() => {\n observer.unobserve(target);\n const safeObserver = getObserver(options, true);\n elementObserverMap.set(target, safeObserver);\n safeObserver.observe(target);\n });\n }\n });\n return;\n }\n }\n\n if (entry.isIntersecting) {\n const handlers = handlerMap.get(target);\n\n handlers?.forEach(({ source, handler }) => {\n if (source === entry.target) {\n handler!();\n }\n });\n\n if (options.type === 'once') {\n observer.unobserve(entry.target);\n elementFirstRun.delete(target);\n }\n }\n });\n }, config);\n\n observers[key] = observer;\n\n return observer;\n}\n\nfunction addViewEnterHandler(\n source: HTMLElement,\n target: HTMLElement,\n effect: TimeEffect,\n options: ViewEnterParams = {},\n reducedMotion: boolean = false,\n) {\n const observer = getObserver({ ...viewEnterOptions, ...options });\n const animation = getAnimation(\n target,\n effectToAnimationOptions(effect),\n undefined,\n reducedMotion,\n ) as AnimationGroup;\n\n if (animation?.isCSS && options.type === 'once') {\n animation.onFinish(() => {\n target.dataset.motionEnter = 'done';\n });\n }\n\n const handler = () => {\n animation.play(() => {\n if (!animation.isCSS) {\n target.dataset.motionEnter = 'done';\n }\n });\n };\n const cleanup = () => {\n const currentObserver = elementObserverMap.get(source) || observer;\n currentObserver.unobserve(source);\n animation.cancel();\n elementFirstRun.delete(source);\n elementObserverMap.delete(source);\n };\n const handlerObj = { source, target, handler, cleanup };\n\n addHandlerToMap(handlerMap, source, handlerObj);\n addHandlerToMap(handlerMap, target, handlerObj);\n\n elementObserverMap.set(source, observer);\n observer.observe(source);\n}\n\nfunction removeViewEnterHandler(element: HTMLElement) {\n removeElementFromHandlerMap(handlerMap, element);\n}\n\nexport default {\n add: addViewEnterHandler,\n remove: removeViewEnterHandler,\n setOptions,\n};\n"],"mappings":"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","ignoreList":[]}
@@ -6,6 +6,10 @@ var _motion = require("@wix/motion");
6
6
  var _fizban = require("fizban");
7
7
  var _utilities = require("./utilities");
8
8
  const scrollManagerMap = new WeakMap();
9
+ let scrollOptionsGetter = () => ({});
10
+ function registerOptionsGetter(getter) {
11
+ scrollOptionsGetter = getter;
12
+ }
9
13
  function addViewProgressHandler(source, target, effect, __, reducedMotion = false) {
10
14
  if (reducedMotion) {
11
15
  return;
@@ -30,8 +34,9 @@ function addViewProgressHandler(source, target, effect, __, reducedMotion = fals
30
34
  scenes,
31
35
  observeViewportEntry: false,
32
36
  observeViewportResize: false,
33
- observeSourcesResize: false,
34
- root: document.documentElement
37
+ observeSourcesResize: true,
38
+ root: document.body,
39
+ ...scrollOptionsGetter()
35
40
  });
36
41
  const cleanup = () => {
37
42
  scroll.destroy();
@@ -54,6 +59,7 @@ function removeViewProgressHandler(element) {
54
59
  }
55
60
  var _default = exports.default = {
56
61
  add: addViewProgressHandler,
57
- remove: removeViewProgressHandler
62
+ remove: removeViewProgressHandler,
63
+ registerOptionsGetter
58
64
  };
59
65
  //# sourceMappingURL=viewProgress.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_motion","require","_fizban","_utilities","scrollManagerMap","WeakMap","addViewProgressHandler","source","target","effect","__","reducedMotion","triggerParams","trigger","element","effectOptions","effectToAnimationOptions","window","animationGroup","getWebAnimation","play","scene","getScrubScene","scenes","Array","isArray","scroll","Scroll","viewSource","observeViewportEntry","observeViewportResize","observeSourcesResize","root","document","documentElement","cleanup","destroy","handlerObj","addHandlerToMap","Promise","all","map","s","ready","resolve","then","start","removeViewProgressHandler","removeElementFromHandlerMap","_default","exports","default","add","remove"],"sources":["../../../src/handlers/viewProgress.ts"],"sourcesContent":["import type { ScrubScrollScene } from '@wix/motion';\nimport { getWebAnimation, getScrubScene } from '@wix/motion';\nimport { Scroll } from 'fizban';\nimport type { ViewEnterParams, ScrubEffect, HandlerObjectMap } from '../types';\nimport {\n effectToAnimationOptions,\n addHandlerToMap,\n removeElementFromHandlerMap,\n} from './utilities';\n\nconst scrollManagerMap = new WeakMap() as HandlerObjectMap;\n\nfunction addViewProgressHandler(\n source: HTMLElement,\n target: HTMLElement,\n effect: ScrubEffect,\n __: ViewEnterParams,\n reducedMotion: boolean = false,\n): void {\n if (reducedMotion) {\n return;\n }\n\n const triggerParams = {\n trigger: 'view-progress' as const,\n element: source,\n };\n\n const effectOptions = effectToAnimationOptions(effect);\n\n if ('ViewTimeline' in window) {\n // Use ViewTimeline for modern browsers\n const animationGroup = getWebAnimation(\n target,\n effectOptions,\n triggerParams,\n );\n\n if (animationGroup) {\n (animationGroup as any).play();\n }\n } else {\n const scene = getScrubScene(target, effectOptions, triggerParams);\n\n if (scene) {\n const scenes = Array.isArray(scene) ? scene : [scene];\n const scroll = new Scroll({\n viewSource: source,\n scenes,\n observeViewportEntry: false,\n observeViewportResize: false,\n observeSourcesResize: false,\n root: document.documentElement,\n });\n\n const cleanup = () => {\n scroll.destroy();\n };\n\n const handlerObj = { source, target, cleanup };\n\n addHandlerToMap(scrollManagerMap, source, handlerObj);\n addHandlerToMap(scrollManagerMap, target, handlerObj);\n\n Promise.all(\n (scenes as ScrubScrollScene[]).map((s) => s.ready || Promise.resolve()),\n ).then(() => {\n scroll.start();\n });\n }\n }\n}\n\nfunction removeViewProgressHandler(element: HTMLElement): void {\n removeElementFromHandlerMap(scrollManagerMap, element);\n}\n\nexport default {\n add: addViewProgressHandler,\n remove: removeViewProgressHandler,\n};\n"],"mappings":";;;;AACA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAAE,UAAA,GAAAF,OAAA;AAMA,MAAMG,gBAAgB,GAAG,IAAIC,OAAO,CAAC,CAAqB;AAE1D,SAASC,sBAAsBA,CAC7BC,MAAmB,EACnBC,MAAmB,EACnBC,MAAmB,EACnBC,EAAmB,EACnBC,aAAsB,GAAG,KAAK,EACxB;EACN,IAAIA,aAAa,EAAE;IACjB;EACF;EAEA,MAAMC,aAAa,GAAG;IACpBC,OAAO,EAAE,eAAwB;IACjCC,OAAO,EAAEP;EACX,CAAC;EAED,MAAMQ,aAAa,GAAG,IAAAC,mCAAwB,EAACP,MAAM,CAAC;EAEtD,IAAI,cAAc,IAAIQ,MAAM,EAAE;IAC5B;IACA,MAAMC,cAAc,GAAG,IAAAC,uBAAe,EACpCX,MAAM,EACNO,aAAa,EACbH,aACF,CAAC;IAED,IAAIM,cAAc,EAAE;MACjBA,cAAc,CAASE,IAAI,CAAC,CAAC;IAChC;EACF,CAAC,MAAM;IACL,MAAMC,KAAK,GAAG,IAAAC,qBAAa,EAACd,MAAM,EAAEO,aAAa,EAAEH,aAAa,CAAC;IAEjE,IAAIS,KAAK,EAAE;MACT,MAAME,MAAM,GAAGC,KAAK,CAACC,OAAO,CAACJ,KAAK,CAAC,GAAGA,KAAK,GAAG,CAACA,KAAK,CAAC;MACrD,MAAMK,MAAM,GAAG,IAAIC,cAAM,CAAC;QACxBC,UAAU,EAAErB,MAAM;QAClBgB,MAAM;QACNM,oBAAoB,EAAE,KAAK;QAC3BC,qBAAqB,EAAE,KAAK;QAC5BC,oBAAoB,EAAE,KAAK;QAC3BC,IAAI,EAAEC,QAAQ,CAACC;MACjB,CAAC,CAAC;MAEF,MAAMC,OAAO,GAAGA,CAAA,KAAM;QACpBT,MAAM,CAACU,OAAO,CAAC,CAAC;MAClB,CAAC;MAED,MAAMC,UAAU,GAAG;QAAE9B,MAAM;QAAEC,MAAM;QAAE2B;MAAQ,CAAC;MAE9C,IAAAG,0BAAe,EAAClC,gBAAgB,EAAEG,MAAM,EAAE8B,UAAU,CAAC;MACrD,IAAAC,0BAAe,EAAClC,gBAAgB,EAAEI,MAAM,EAAE6B,UAAU,CAAC;MAErDE,OAAO,CAACC,GAAG,CACRjB,MAAM,CAAwBkB,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,KAAK,IAAIJ,OAAO,CAACK,OAAO,CAAC,CAAC,CACxE,CAAC,CAACC,IAAI,CAAC,MAAM;QACXnB,MAAM,CAACoB,KAAK,CAAC,CAAC;MAChB,CAAC,CAAC;IACJ;EACF;AACF;AAEA,SAASC,yBAAyBA,CAACjC,OAAoB,EAAQ;EAC7D,IAAAkC,sCAA2B,EAAC5C,gBAAgB,EAAEU,OAAO,CAAC;AACxD;AAAC,IAAAmC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEc;EACbC,GAAG,EAAE9C,sBAAsB;EAC3B+C,MAAM,EAAEN;AACV,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_motion","require","_fizban","_utilities","scrollManagerMap","WeakMap","scrollOptionsGetter","registerOptionsGetter","getter","addViewProgressHandler","source","target","effect","__","reducedMotion","triggerParams","trigger","element","effectOptions","effectToAnimationOptions","window","animationGroup","getWebAnimation","play","scene","getScrubScene","scenes","Array","isArray","scroll","Scroll","viewSource","observeViewportEntry","observeViewportResize","observeSourcesResize","root","document","body","cleanup","destroy","handlerObj","addHandlerToMap","Promise","all","map","s","ready","resolve","then","start","removeViewProgressHandler","removeElementFromHandlerMap","_default","exports","default","add","remove"],"sources":["../../../src/handlers/viewProgress.ts"],"sourcesContent":["import type { ScrubScrollScene } from '@wix/motion';\nimport { getWebAnimation, getScrubScene } from '@wix/motion';\nimport { Scroll, scrollConfig } from 'fizban';\nimport type { ViewEnterParams, ScrubEffect, HandlerObjectMap } from '../types';\nimport {\n effectToAnimationOptions,\n addHandlerToMap,\n removeElementFromHandlerMap,\n} from './utilities';\n\nconst scrollManagerMap = new WeakMap() as HandlerObjectMap;\nlet scrollOptionsGetter: () => Partial<scrollConfig> = () => ({});\n\nfunction registerOptionsGetter(getter: () => scrollConfig) {\n scrollOptionsGetter = getter;\n}\n\nfunction addViewProgressHandler(\n source: HTMLElement,\n target: HTMLElement,\n effect: ScrubEffect,\n __: ViewEnterParams,\n reducedMotion: boolean = false,\n): void {\n if (reducedMotion) {\n return;\n }\n\n const triggerParams = {\n trigger: 'view-progress' as const,\n element: source,\n };\n\n const effectOptions = effectToAnimationOptions(effect);\n\n if ('ViewTimeline' in window) {\n // Use ViewTimeline for modern browsers\n const animationGroup = getWebAnimation(\n target,\n effectOptions,\n triggerParams,\n );\n\n if (animationGroup) {\n (animationGroup as any).play();\n }\n } else {\n const scene = getScrubScene(target, effectOptions, triggerParams);\n\n if (scene) {\n const scenes = Array.isArray(scene) ? scene : [scene];\n const scroll = new Scroll({\n viewSource: source,\n scenes,\n observeViewportEntry: false,\n observeViewportResize: false,\n observeSourcesResize: true,\n root: document.body,\n ...scrollOptionsGetter(),\n });\n\n const cleanup = () => {\n scroll.destroy();\n };\n\n const handlerObj = { source, target, cleanup };\n\n addHandlerToMap(scrollManagerMap, source, handlerObj);\n addHandlerToMap(scrollManagerMap, target, handlerObj);\n\n Promise.all(\n (scenes as ScrubScrollScene[]).map((s) => s.ready || Promise.resolve()),\n ).then(() => {\n scroll.start();\n });\n }\n }\n}\n\nfunction removeViewProgressHandler(element: HTMLElement): void {\n removeElementFromHandlerMap(scrollManagerMap, element);\n}\n\nexport default {\n add: addViewProgressHandler,\n remove: removeViewProgressHandler,\n registerOptionsGetter,\n};\n"],"mappings":";;;;AACA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAAE,UAAA,GAAAF,OAAA;AAMA,MAAMG,gBAAgB,GAAG,IAAIC,OAAO,CAAC,CAAqB;AAC1D,IAAIC,mBAAgD,GAAGA,CAAA,MAAO,CAAC,CAAC,CAAC;AAEjE,SAASC,qBAAqBA,CAACC,MAA0B,EAAE;EACzDF,mBAAmB,GAAGE,MAAM;AAC9B;AAEA,SAASC,sBAAsBA,CAC7BC,MAAmB,EACnBC,MAAmB,EACnBC,MAAmB,EACnBC,EAAmB,EACnBC,aAAsB,GAAG,KAAK,EACxB;EACN,IAAIA,aAAa,EAAE;IACjB;EACF;EAEA,MAAMC,aAAa,GAAG;IACpBC,OAAO,EAAE,eAAwB;IACjCC,OAAO,EAAEP;EACX,CAAC;EAED,MAAMQ,aAAa,GAAG,IAAAC,mCAAwB,EAACP,MAAM,CAAC;EAEtD,IAAI,cAAc,IAAIQ,MAAM,EAAE;IAC5B;IACA,MAAMC,cAAc,GAAG,IAAAC,uBAAe,EACpCX,MAAM,EACNO,aAAa,EACbH,aACF,CAAC;IAED,IAAIM,cAAc,EAAE;MACjBA,cAAc,CAASE,IAAI,CAAC,CAAC;IAChC;EACF,CAAC,MAAM;IACL,MAAMC,KAAK,GAAG,IAAAC,qBAAa,EAACd,MAAM,EAAEO,aAAa,EAAEH,aAAa,CAAC;IAEjE,IAAIS,KAAK,EAAE;MACT,MAAME,MAAM,GAAGC,KAAK,CAACC,OAAO,CAACJ,KAAK,CAAC,GAAGA,KAAK,GAAG,CAACA,KAAK,CAAC;MACrD,MAAMK,MAAM,GAAG,IAAIC,cAAM,CAAC;QACxBC,UAAU,EAAErB,MAAM;QAClBgB,MAAM;QACNM,oBAAoB,EAAE,KAAK;QAC3BC,qBAAqB,EAAE,KAAK;QAC5BC,oBAAoB,EAAE,IAAI;QAC1BC,IAAI,EAAEC,QAAQ,CAACC,IAAI;QACnB,GAAG/B,mBAAmB,CAAC;MACzB,CAAC,CAAC;MAEF,MAAMgC,OAAO,GAAGA,CAAA,KAAM;QACpBT,MAAM,CAACU,OAAO,CAAC,CAAC;MAClB,CAAC;MAED,MAAMC,UAAU,GAAG;QAAE9B,MAAM;QAAEC,MAAM;QAAE2B;MAAQ,CAAC;MAE9C,IAAAG,0BAAe,EAACrC,gBAAgB,EAAEM,MAAM,EAAE8B,UAAU,CAAC;MACrD,IAAAC,0BAAe,EAACrC,gBAAgB,EAAEO,MAAM,EAAE6B,UAAU,CAAC;MAErDE,OAAO,CAACC,GAAG,CACRjB,MAAM,CAAwBkB,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,KAAK,IAAIJ,OAAO,CAACK,OAAO,CAAC,CAAC,CACxE,CAAC,CAACC,IAAI,CAAC,MAAM;QACXnB,MAAM,CAACoB,KAAK,CAAC,CAAC;MAChB,CAAC,CAAC;IACJ;EACF;AACF;AAEA,SAASC,yBAAyBA,CAACjC,OAAoB,EAAQ;EAC7D,IAAAkC,sCAA2B,EAAC/C,gBAAgB,EAAEa,OAAO,CAAC;AACxD;AAAC,IAAAmC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEc;EACbC,GAAG,EAAE9C,sBAAsB;EAC3B+C,MAAM,EAAEN,yBAAyB;EACjC3C;AACF,CAAC","ignoreList":[]}