@wix/interact 1.86.0 → 1.90.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,210 @@
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 = function (overrides) {
58
+ if (overrides === void 0) {
59
+ overrides = {};
60
+ }
61
+ return {
62
+ target: element,
63
+ isIntersecting: true,
64
+ boundingClientRect: {
65
+ height: 100,
66
+ width: 100
67
+ },
68
+ rootBounds: {
69
+ height: 100,
70
+ width: 100
71
+ },
72
+ ...overrides
73
+ };
74
+ };
75
+ describe('Regular flow', () => {
76
+ it('should create an IntersectionObserver and observe the source', () => {
77
+ viewEnterHandler.add(element, target, {
78
+ duration: 1000,
79
+ namedEffect: {
80
+ type: 'FadeIn'
81
+ }
82
+ }, {});
83
+ expect(IntersectionObserverMock).toHaveBeenCalled();
84
+ expect(observeSpy).toHaveBeenCalledWith(element);
85
+ });
86
+ it('should unobserve after first intersection if type is "once"', () => {
87
+ viewEnterHandler.add(element, target, {
88
+ duration: 1000,
89
+ namedEffect: {
90
+ type: 'FadeIn'
91
+ }
92
+ }, {
93
+ type: 'once'
94
+ });
95
+ const entry = createEntry();
96
+ observerCallback([entry]);
97
+ expect(unobserveSpy).toHaveBeenCalledWith(element);
98
+ });
99
+ });
100
+ describe('Safe flow', () => {
101
+ it('should check for safe mode conditions on first run when not intersecting', () => {
102
+ viewEnterHandler.add(element, target, {
103
+ duration: 1000,
104
+ namedEffect: {
105
+ type: 'FadeIn'
106
+ }
107
+ }, {
108
+ useSafeViewEnter: true,
109
+ threshold: 0.5
110
+ });
111
+ const entry = createEntry({
112
+ isIntersecting: false,
113
+ boundingClientRect: {
114
+ height: 1000
115
+ },
116
+ rootBounds: {
117
+ height: 400
118
+ }
119
+ });
120
+ observerCallback([entry]);
121
+ expect(fastdom.measure).toHaveBeenCalled();
122
+ });
123
+ it('should switch to safe observer if element is too tall for root', () => {
124
+ const threshold = 0.5;
125
+ const sourceHeight = 1000;
126
+ const rootHeight = 400; // 1000 * 0.5 = 500 > 400 -> Should trigger safe mode
127
+
128
+ viewEnterHandler.add(element, target, {
129
+ duration: 1000,
130
+ namedEffect: {
131
+ type: 'FadeIn'
132
+ }
133
+ }, {
134
+ useSafeViewEnter: true,
135
+ threshold
136
+ });
137
+ const entry = createEntry({
138
+ isIntersecting: false,
139
+ boundingClientRect: {
140
+ height: sourceHeight
141
+ },
142
+ rootBounds: {
143
+ height: rootHeight
144
+ }
145
+ });
146
+ observerCallback([entry]);
147
+ expect(fastdom.mutate).toHaveBeenCalled();
148
+ expect(unobserveSpy).toHaveBeenCalledWith(element);
149
+ expect(IntersectionObserverMock).toHaveBeenCalledTimes(2);
150
+ const safeObserverConfig = IntersectionObserverMock.mock.calls[1][1];
151
+ expect(safeObserverConfig.threshold).toEqual([0]);
152
+ expect(safeObserverConfig.rootMargin).toBe('0px 0px -10% 0px');
153
+ });
154
+ it('should NOT switch to safe observer if element fits in root', () => {
155
+ const threshold = 0.5;
156
+ const sourceHeight = 600;
157
+ const rootHeight = 400; // 600 * 0.5 = 300 < 400 -> No safe mode needed
158
+
159
+ viewEnterHandler.add(element, target, {
160
+ duration: 1000,
161
+ namedEffect: {
162
+ type: 'FadeIn'
163
+ }
164
+ }, {
165
+ useSafeViewEnter: true,
166
+ threshold
167
+ });
168
+ const entry = createEntry({
169
+ isIntersecting: false,
170
+ boundingClientRect: {
171
+ height: sourceHeight
172
+ },
173
+ rootBounds: {
174
+ height: rootHeight
175
+ }
176
+ });
177
+ observerCallback([entry]);
178
+ expect(fastdom.measure).toHaveBeenCalled();
179
+ expect(fastdom.mutate).not.toHaveBeenCalled();
180
+ expect(unobserveSpy).not.toHaveBeenCalledWith(element);
181
+ expect(IntersectionObserverMock).toHaveBeenCalledTimes(1);
182
+ });
183
+ it('should NOT switch to safe observer if useSafeViewEnter is false', () => {
184
+ const threshold = 0.5;
185
+ const sourceHeight = 1000;
186
+ const rootHeight = 400;
187
+ viewEnterHandler.add(element, target, {
188
+ duration: 1000,
189
+ namedEffect: {
190
+ type: 'FadeIn'
191
+ }
192
+ }, {
193
+ useSafeViewEnter: false,
194
+ threshold
195
+ });
196
+ const entry = createEntry({
197
+ isIntersecting: false,
198
+ boundingClientRect: {
199
+ height: sourceHeight
200
+ },
201
+ rootBounds: {
202
+ height: rootHeight
203
+ }
204
+ });
205
+ observerCallback([entry]);
206
+ expect(fastdom.measure).not.toHaveBeenCalled();
207
+ });
208
+ });
209
+ });
210
+ //# 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":[]}
@@ -3,6 +3,7 @@ var _Interact;
3
3
  import { getInterpolatedKey } from './utilities';
4
4
  import { getInteractElement } from '../InteractElement';
5
5
  import { generateId } from '../utils';
6
+ import TRIGGER_TO_HANDLER_MODULE_MAP from '../handlers';
6
7
  function registerInteractElement() {
7
8
  if (!customElements.get('interact-element')) {
8
9
  const interactElement = getInteractElement();
@@ -94,6 +95,17 @@ export class Interact {
94
95
  Interact.instances.length = 0;
95
96
  Interact.elementCache.clear();
96
97
  }
98
+ static setup(options) {
99
+ if (options.scrollOptionsGetter) {
100
+ TRIGGER_TO_HANDLER_MODULE_MAP.viewProgress.registerOptionsGetter == null || TRIGGER_TO_HANDLER_MODULE_MAP.viewProgress.registerOptionsGetter(options.scrollOptionsGetter);
101
+ }
102
+ if (options.pointerOptionsGetter) {
103
+ TRIGGER_TO_HANDLER_MODULE_MAP.pointerMove.registerOptionsGetter == null || TRIGGER_TO_HANDLER_MODULE_MAP.pointerMove.registerOptionsGetter(options.pointerOptionsGetter);
104
+ }
105
+ if (options.viewEnter) {
106
+ TRIGGER_TO_HANDLER_MODULE_MAP.viewEnter.setOptions(options.viewEnter);
107
+ }
108
+ }
97
109
  static getInstance(key) {
98
110
  return Interact.instances.find(instance => instance.has(key));
99
111
  }
@@ -1 +1 @@
1
- {"version":3,"names":["getInterpolatedKey","getInteractElement","generateId","registerInteractElement","customElements","get","interactElement","define","_convertToKeyTemplate","key","replace","Interact","constructor","_defineProperty","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","create","instance","push","length","getInstance","find","getElement","undefined","set","_Interact","Map","interactionIdCounter","getSelector","d","_temp","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"],"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":["getInterpolatedKey","getInteractElement","generateId","TRIGGER_TO_HANDLER_MODULE_MAP","registerInteractElement","customElements","get","interactElement","define","_convertToKeyTemplate","key","replace","Interact","constructor","_defineProperty","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","create","instance","push","length","setup","options","scrollOptionsGetter","viewProgress","registerOptionsGetter","pointerOptionsGetter","pointerMove","viewEnter","setOptions","getInstance","find","getElement","undefined","set","_Interact","Map","interactionIdCounter","getSelector","d","_temp","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"],"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":[]}
@@ -2,6 +2,10 @@ import { getScrubScene } from '@wix/motion';
2
2
  import { Pointer } from 'kuliso';
3
3
  import { effectToAnimationOptions, addHandlerToMap, removeElementFromHandlerMap } from './utilities';
4
4
  const pointerManagerMap = new WeakMap();
5
+ let pointerOptionsGetter = () => ({});
6
+ function registerOptionsGetter(getter) {
7
+ pointerOptionsGetter = getter;
8
+ }
5
9
  function addPointerMoveHandler(source, target, effect, options, reducedMotion) {
6
10
  if (options === void 0) {
7
11
  options = {};
@@ -20,7 +24,8 @@ function addPointerMoveHandler(source, target, effect, options, reducedMotion) {
20
24
  if (scene) {
21
25
  const pointer = new Pointer({
22
26
  root: options.hitArea === 'root' ? document.documentElement : source,
23
- scenes: Array.isArray(scene) ? scene : [scene]
27
+ scenes: Array.isArray(scene) ? scene : [scene],
28
+ ...pointerOptionsGetter()
24
29
  });
25
30
  const cleanup = () => {
26
31
  pointer.destroy();
@@ -40,6 +45,7 @@ function removePointerMoveHandler(element) {
40
45
  }
41
46
  export default {
42
47
  add: addPointerMoveHandler,
43
- remove: removePointerMoveHandler
48
+ remove: removePointerMoveHandler,
49
+ registerOptionsGetter
44
50
  };
45
51
  //# sourceMappingURL=pointerMove.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["getScrubScene","Pointer","effectToAnimationOptions","addHandlerToMap","removeElementFromHandlerMap","pointerManagerMap","WeakMap","addPointerMoveHandler","source","target","effect","options","reducedMotion","triggerParams","trigger","element","scene","pointer","root","hitArea","document","documentElement","scenes","Array","isArray","cleanup","destroy","handlerObj","start","removePointerMoveHandler","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,SAASA,aAAa,QAAQ,aAAa;AAC3C,SAASC,OAAO,QAAQ,QAAQ;AAMhC,SACEC,wBAAwB,EACxBC,eAAe,EACfC,2BAA2B,QACtB,aAAa;AAEpB,MAAMC,iBAAiB,GAAG,IAAIC,OAAO,CAAC,CAAqB;AAE3D,SAASC,qBAAqBA,CAC5BC,MAAmB,EACnBC,MAAmB,EACnBC,MAAmB,EACnBC,OAA0B,EAC1BC,aAAsB,EACtB;EAAA,IAFAD,OAA0B;IAA1BA,OAA0B,GAAG,CAAC,CAAC;EAAA;EAAA,IAC/BC,aAAsB;IAAtBA,aAAsB,GAAG,KAAK;EAAA;EAE9B,IAAIA,aAAa,EAAE;IACjB;EACF;EAEA,MAAMC,aAAa,GAAG;IACpBC,OAAO,EAAE,cAAuB;IAChCC,OAAO,EAAEP;EACX,CAAC;EAED,MAAMQ,KAAK,GAAGhB,aAAa,CACzBS,MAAM,EACNP,wBAAwB,CAACQ,MAAM,CAAC,EAChCG,aACF,CAAC;EAED,IAAIG,KAAK,EAAE;IACT,MAAMC,OAAO,GAAG,IAAIhB,OAAO,CAAC;MAC1BiB,IAAI,EAAEP,OAAO,CAACQ,OAAO,KAAK,MAAM,GAAGC,QAAQ,CAACC,eAAe,GAAGb,MAAM;MACpEc,MAAM,EAAEC,KAAK,CAACC,OAAO,CAACR,KAAK,CAAC,GAAGA,KAAK,GAAG,CAACA,KAAK;IAC/C,CAAC,CAAC;IACF,MAAMS,OAAO,GAAGA,CAAA,KAAM;MACpBR,OAAO,CAACS,OAAO,CAAC,CAAC;IACnB,CAAC;IAED,MAAMC,UAAU,GAAG;MAAEnB,MAAM;MAAEC,MAAM;MAAEgB;IAAQ,CAAC;IAE9CtB,eAAe,CAACE,iBAAiB,EAAEG,MAAM,EAAEmB,UAAU,CAAC;IACtDxB,eAAe,CAACE,iBAAiB,EAAEI,MAAM,EAAEkB,UAAU,CAAC;IAEtDV,OAAO,CAACW,KAAK,CAAC,CAAC;EACjB;AACF;AAEA,SAASC,wBAAwBA,CAACd,OAAoB,EAAE;EACtDX,2BAA2B,CAACC,iBAAiB,EAAEU,OAAO,CAAC;AACzD;AAEA,eAAe;EACbe,GAAG,EAAEvB,qBAAqB;EAC1BwB,MAAM,EAAEF;AACV,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["getScrubScene","Pointer","effectToAnimationOptions","addHandlerToMap","removeElementFromHandlerMap","pointerManagerMap","WeakMap","pointerOptionsGetter","registerOptionsGetter","getter","addPointerMoveHandler","source","target","effect","options","reducedMotion","triggerParams","trigger","element","scene","pointer","root","hitArea","document","documentElement","scenes","Array","isArray","cleanup","destroy","handlerObj","start","removePointerMoveHandler","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,SAASA,aAAa,QAAQ,aAAa;AAC3C,SAASC,OAAO,QAAuB,QAAQ;AAM/C,SACEC,wBAAwB,EACxBC,eAAe,EACfC,2BAA2B,QACtB,aAAa;AAEpB,MAAMC,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,EAC1BC,aAAsB,EACtB;EAAA,IAFAD,OAA0B;IAA1BA,OAA0B,GAAG,CAAC,CAAC;EAAA;EAAA,IAC/BC,aAAsB;IAAtBA,aAAsB,GAAG,KAAK;EAAA;EAE9B,IAAIA,aAAa,EAAE;IACjB;EACF;EAEA,MAAMC,aAAa,GAAG;IACpBC,OAAO,EAAE,cAAuB;IAChCC,OAAO,EAAEP;EACX,CAAC;EAED,MAAMQ,KAAK,GAAGnB,aAAa,CACzBY,MAAM,EACNV,wBAAwB,CAACW,MAAM,CAAC,EAChCG,aACF,CAAC;EAED,IAAIG,KAAK,EAAE;IACT,MAAMC,OAAO,GAAG,IAAInB,OAAO,CAAC;MAC1BoB,IAAI,EAAEP,OAAO,CAACQ,OAAO,KAAK,MAAM,GAAGC,QAAQ,CAACC,eAAe,GAAGb,MAAM;MACpEc,MAAM,EAAEC,KAAK,CAACC,OAAO,CAACR,KAAK,CAAC,GAAGA,KAAK,GAAG,CAACA,KAAK,CAAC;MAC9C,GAAGZ,oBAAoB,CAAC;IAC1B,CAAC,CAAC;IACF,MAAMqB,OAAO,GAAGA,CAAA,KAAM;MACpBR,OAAO,CAACS,OAAO,CAAC,CAAC;IACnB,CAAC;IAED,MAAMC,UAAU,GAAG;MAAEnB,MAAM;MAAEC,MAAM;MAAEgB;IAAQ,CAAC;IAE9CzB,eAAe,CAACE,iBAAiB,EAAEM,MAAM,EAAEmB,UAAU,CAAC;IACtD3B,eAAe,CAACE,iBAAiB,EAAEO,MAAM,EAAEkB,UAAU,CAAC;IAEtDV,OAAO,CAACW,KAAK,CAAC,CAAC;EACjB;AACF;AAEA,SAASC,wBAAwBA,CAACd,OAAoB,EAAE;EACtDd,2BAA2B,CAACC,iBAAiB,EAAEa,OAAO,CAAC;AACzD;AAEA,eAAe;EACbe,GAAG,EAAEvB,qBAAqB;EAC1BwB,MAAM,EAAEF,wBAAwB;EAChCxB;AACF,CAAC","ignoreList":[]}
@@ -1,16 +1,65 @@
1
1
  import { getAnimation } from '@wix/motion';
2
2
  import { effectToAnimationOptions, addHandlerToMap, removeElementFromHandlerMap } from './utilities';
3
+ import fastdom from 'fastdom';
4
+ const SAFE_OBSERVER_CONFIG = {
5
+ root: null,
6
+ rootMargin: '0px 0px -10% 0px',
7
+ threshold: [0]
8
+ };
3
9
  const observers = {};
4
10
  const handlerMap = new WeakMap();
5
- function getObserver(options) {
6
- const key = JSON.stringify(options);
11
+ const elementFirstRun = new WeakSet();
12
+ const elementObserverMap = new WeakMap();
13
+ let viewEnterOptions = {};
14
+ function setOptions(options) {
15
+ viewEnterOptions = options;
16
+ }
17
+ function getObserver(options, isSafeMode) {
18
+ if (isSafeMode === void 0) {
19
+ isSafeMode = false;
20
+ }
21
+ const key = JSON.stringify({
22
+ ...options,
23
+ isSafeMode
24
+ });
7
25
  if (observers[key]) {
8
26
  return observers[key];
9
27
  }
28
+ const config = isSafeMode ? SAFE_OBSERVER_CONFIG : {
29
+ root: null,
30
+ rootMargin: options.inset ? `${options.inset} 0px ${options.inset}` : '0px',
31
+ threshold: options.threshold
32
+ };
10
33
  const observer = new IntersectionObserver(entries => {
11
34
  entries.forEach(entry => {
35
+ const target = entry.target;
36
+ const isFirstRun = !elementFirstRun.has(target);
37
+ if (isFirstRun) {
38
+ elementFirstRun.add(target);
39
+ if (options.useSafeViewEnter && !entry.isIntersecting) {
40
+ fastdom.measure(() => {
41
+ var _entry$rootBounds;
42
+ const sourceHeight = entry.boundingClientRect.height;
43
+ const rootHeight = (_entry$rootBounds = entry.rootBounds) == null ? void 0 : _entry$rootBounds.height;
44
+ if (!rootHeight) {
45
+ return;
46
+ }
47
+ const threshold = Array.isArray(options.threshold) ? Math.min(...options.threshold) : options.threshold;
48
+ const needsSafeObserver = threshold && sourceHeight * threshold > rootHeight;
49
+ if (needsSafeObserver) {
50
+ fastdom.mutate(() => {
51
+ observer.unobserve(target);
52
+ const safeObserver = getObserver(options, true);
53
+ elementObserverMap.set(target, safeObserver);
54
+ safeObserver.observe(target);
55
+ });
56
+ }
57
+ });
58
+ return;
59
+ }
60
+ }
12
61
  if (entry.isIntersecting) {
13
- const handlers = handlerMap.get(entry.target);
62
+ const handlers = handlerMap.get(target);
14
63
  handlers == null || handlers.forEach(_ref => {
15
64
  let {
16
65
  source,
@@ -22,14 +71,11 @@ function getObserver(options) {
22
71
  });
23
72
  if (options.type === 'once') {
24
73
  observer.unobserve(entry.target);
74
+ elementFirstRun.delete(target);
25
75
  }
26
76
  }
27
77
  });
28
- }, {
29
- root: null,
30
- rootMargin: options.inset ? `${options.inset} 0px ${options.inset}` : '0px',
31
- threshold: options.threshold
32
- });
78
+ }, config);
33
79
  observers[key] = observer;
34
80
  return observer;
35
81
  }
@@ -40,7 +86,10 @@ function addViewEnterHandler(source, target, effect, options, reducedMotion) {
40
86
  if (reducedMotion === void 0) {
41
87
  reducedMotion = false;
42
88
  }
43
- const observer = getObserver(options);
89
+ const observer = getObserver({
90
+ ...viewEnterOptions,
91
+ ...options
92
+ });
44
93
  const animation = getAnimation(target, effectToAnimationOptions(effect), undefined, reducedMotion);
45
94
  if (animation != null && animation.isCSS && options.type === 'once') {
46
95
  animation.onFinish(() => {
@@ -55,8 +104,11 @@ function addViewEnterHandler(source, target, effect, options, reducedMotion) {
55
104
  });
56
105
  };
57
106
  const cleanup = () => {
58
- observer.unobserve(source);
107
+ const currentObserver = elementObserverMap.get(source) || observer;
108
+ currentObserver.unobserve(source);
59
109
  animation.cancel();
110
+ elementFirstRun.delete(source);
111
+ elementObserverMap.delete(source);
60
112
  };
61
113
  const handlerObj = {
62
114
  source,
@@ -66,6 +118,7 @@ function addViewEnterHandler(source, target, effect, options, reducedMotion) {
66
118
  };
67
119
  addHandlerToMap(handlerMap, source, handlerObj);
68
120
  addHandlerToMap(handlerMap, target, handlerObj);
121
+ elementObserverMap.set(source, observer);
69
122
  observer.observe(source);
70
123
  }
71
124
  function removeViewEnterHandler(element) {
@@ -73,6 +126,7 @@ function removeViewEnterHandler(element) {
73
126
  }
74
127
  export default {
75
128
  add: addViewEnterHandler,
76
- remove: removeViewEnterHandler
129
+ remove: removeViewEnterHandler,
130
+ setOptions
77
131
  };
78
132
  //# sourceMappingURL=viewEnter.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["getAnimation","effectToAnimationOptions","addHandlerToMap","removeElementFromHandlerMap","observers","handlerMap","WeakMap","getObserver","options","key","JSON","stringify","observer","IntersectionObserver","entries","forEach","entry","isIntersecting","handlers","get","target","_ref","source","handler","type","unobserve","root","rootMargin","inset","threshold","addViewEnterHandler","effect","reducedMotion","animation","undefined","isCSS","onFinish","dataset","motionEnter","play","cleanup","cancel","handlerObj","observe","removeViewEnterHandler","element","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":["getAnimation","effectToAnimationOptions","addHandlerToMap","removeElementFromHandlerMap","fastdom","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","measure","_entry$rootBounds","sourceHeight","boundingClientRect","height","rootHeight","rootBounds","Array","isArray","Math","min","needsSafeObserver","mutate","unobserve","safeObserver","set","observe","handlers","get","_ref","source","handler","type","delete","addViewEnterHandler","effect","reducedMotion","animation","undefined","isCSS","onFinish","dataset","motionEnter","play","cleanup","currentObserver","cancel","handlerObj","removeViewEnterHandler","element","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":[]}
@@ -2,6 +2,10 @@ import { getWebAnimation, getScrubScene } from '@wix/motion';
2
2
  import { Scroll } from 'fizban';
3
3
  import { effectToAnimationOptions, addHandlerToMap, removeElementFromHandlerMap } from './utilities';
4
4
  const scrollManagerMap = new WeakMap();
5
+ let scrollOptionsGetter = () => ({});
6
+ function registerOptionsGetter(getter) {
7
+ scrollOptionsGetter = getter;
8
+ }
5
9
  function addViewProgressHandler(source, target, effect, __, reducedMotion) {
6
10
  if (reducedMotion === void 0) {
7
11
  reducedMotion = false;
@@ -29,8 +33,9 @@ function addViewProgressHandler(source, target, effect, __, reducedMotion) {
29
33
  scenes,
30
34
  observeViewportEntry: false,
31
35
  observeViewportResize: false,
32
- observeSourcesResize: false,
33
- root: document.documentElement
36
+ observeSourcesResize: true,
37
+ root: document.body,
38
+ ...scrollOptionsGetter()
34
39
  });
35
40
  const cleanup = () => {
36
41
  scroll.destroy();
@@ -53,6 +58,7 @@ function removeViewProgressHandler(element) {
53
58
  }
54
59
  export default {
55
60
  add: addViewProgressHandler,
56
- remove: removeViewProgressHandler
61
+ remove: removeViewProgressHandler,
62
+ registerOptionsGetter
57
63
  };
58
64
  //# sourceMappingURL=viewProgress.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["getWebAnimation","getScrubScene","Scroll","effectToAnimationOptions","addHandlerToMap","removeElementFromHandlerMap","scrollManagerMap","WeakMap","addViewProgressHandler","source","target","effect","__","reducedMotion","triggerParams","trigger","element","effectOptions","window","animationGroup","play","scene","scenes","Array","isArray","scroll","viewSource","observeViewportEntry","observeViewportResize","observeSourcesResize","root","document","documentElement","cleanup","destroy","handlerObj","Promise","all","map","s","ready","resolve","then","start","removeViewProgressHandler","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,SAASA,eAAe,EAAEC,aAAa,QAAQ,aAAa;AAC5D,SAASC,MAAM,QAAQ,QAAQ;AAE/B,SACEC,wBAAwB,EACxBC,eAAe,EACfC,2BAA2B,QACtB,aAAa;AAEpB,MAAMC,gBAAgB,GAAG,IAAIC,OAAO,CAAC,CAAqB;AAE1D,SAASC,sBAAsBA,CAC7BC,MAAmB,EACnBC,MAAmB,EACnBC,MAAmB,EACnBC,EAAmB,EACnBC,aAAsB,EAChB;EAAA,IADNA,aAAsB;IAAtBA,aAAsB,GAAG,KAAK;EAAA;EAE9B,IAAIA,aAAa,EAAE;IACjB;EACF;EAEA,MAAMC,aAAa,GAAG;IACpBC,OAAO,EAAE,eAAwB;IACjCC,OAAO,EAAEP;EACX,CAAC;EAED,MAAMQ,aAAa,GAAGd,wBAAwB,CAACQ,MAAM,CAAC;EAEtD,IAAI,cAAc,IAAIO,MAAM,EAAE;IAC5B;IACA,MAAMC,cAAc,GAAGnB,eAAe,CACpCU,MAAM,EACNO,aAAa,EACbH,aACF,CAAC;IAED,IAAIK,cAAc,EAAE;MACjBA,cAAc,CAASC,IAAI,CAAC,CAAC;IAChC;EACF,CAAC,MAAM;IACL,MAAMC,KAAK,GAAGpB,aAAa,CAACS,MAAM,EAAEO,aAAa,EAAEH,aAAa,CAAC;IAEjE,IAAIO,KAAK,EAAE;MACT,MAAMC,MAAM,GAAGC,KAAK,CAACC,OAAO,CAACH,KAAK,CAAC,GAAGA,KAAK,GAAG,CAACA,KAAK,CAAC;MACrD,MAAMI,MAAM,GAAG,IAAIvB,MAAM,CAAC;QACxBwB,UAAU,EAAEjB,MAAM;QAClBa,MAAM;QACNK,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;QACpBR,MAAM,CAACS,OAAO,CAAC,CAAC;MAClB,CAAC;MAED,MAAMC,UAAU,GAAG;QAAE1B,MAAM;QAAEC,MAAM;QAAEuB;MAAQ,CAAC;MAE9C7B,eAAe,CAACE,gBAAgB,EAAEG,MAAM,EAAE0B,UAAU,CAAC;MACrD/B,eAAe,CAACE,gBAAgB,EAAEI,MAAM,EAAEyB,UAAU,CAAC;MAErDC,OAAO,CAACC,GAAG,CACRf,MAAM,CAAwBgB,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,KAAK,IAAIJ,OAAO,CAACK,OAAO,CAAC,CAAC,CACxE,CAAC,CAACC,IAAI,CAAC,MAAM;QACXjB,MAAM,CAACkB,KAAK,CAAC,CAAC;MAChB,CAAC,CAAC;IACJ;EACF;AACF;AAEA,SAASC,yBAAyBA,CAAC5B,OAAoB,EAAQ;EAC7DX,2BAA2B,CAACC,gBAAgB,EAAEU,OAAO,CAAC;AACxD;AAEA,eAAe;EACb6B,GAAG,EAAErC,sBAAsB;EAC3BsC,MAAM,EAAEF;AACV,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["getWebAnimation","getScrubScene","Scroll","effectToAnimationOptions","addHandlerToMap","removeElementFromHandlerMap","scrollManagerMap","WeakMap","scrollOptionsGetter","registerOptionsGetter","getter","addViewProgressHandler","source","target","effect","__","reducedMotion","triggerParams","trigger","element","effectOptions","window","animationGroup","play","scene","scenes","Array","isArray","scroll","viewSource","observeViewportEntry","observeViewportResize","observeSourcesResize","root","document","body","cleanup","destroy","handlerObj","Promise","all","map","s","ready","resolve","then","start","removeViewProgressHandler","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,SAASA,eAAe,EAAEC,aAAa,QAAQ,aAAa;AAC5D,SAASC,MAAM,QAAsB,QAAQ;AAE7C,SACEC,wBAAwB,EACxBC,eAAe,EACfC,2BAA2B,QACtB,aAAa;AAEpB,MAAMC,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,EAChB;EAAA,IADNA,aAAsB;IAAtBA,aAAsB,GAAG,KAAK;EAAA;EAE9B,IAAIA,aAAa,EAAE;IACjB;EACF;EAEA,MAAMC,aAAa,GAAG;IACpBC,OAAO,EAAE,eAAwB;IACjCC,OAAO,EAAEP;EACX,CAAC;EAED,MAAMQ,aAAa,GAAGjB,wBAAwB,CAACW,MAAM,CAAC;EAEtD,IAAI,cAAc,IAAIO,MAAM,EAAE;IAC5B;IACA,MAAMC,cAAc,GAAGtB,eAAe,CACpCa,MAAM,EACNO,aAAa,EACbH,aACF,CAAC;IAED,IAAIK,cAAc,EAAE;MACjBA,cAAc,CAASC,IAAI,CAAC,CAAC;IAChC;EACF,CAAC,MAAM;IACL,MAAMC,KAAK,GAAGvB,aAAa,CAACY,MAAM,EAAEO,aAAa,EAAEH,aAAa,CAAC;IAEjE,IAAIO,KAAK,EAAE;MACT,MAAMC,MAAM,GAAGC,KAAK,CAACC,OAAO,CAACH,KAAK,CAAC,GAAGA,KAAK,GAAG,CAACA,KAAK,CAAC;MACrD,MAAMI,MAAM,GAAG,IAAI1B,MAAM,CAAC;QACxB2B,UAAU,EAAEjB,MAAM;QAClBa,MAAM;QACNK,oBAAoB,EAAE,KAAK;QAC3BC,qBAAqB,EAAE,KAAK;QAC5BC,oBAAoB,EAAE,IAAI;QAC1BC,IAAI,EAAEC,QAAQ,CAACC,IAAI;QACnB,GAAG3B,mBAAmB,CAAC;MACzB,CAAC,CAAC;MAEF,MAAM4B,OAAO,GAAGA,CAAA,KAAM;QACpBR,MAAM,CAACS,OAAO,CAAC,CAAC;MAClB,CAAC;MAED,MAAMC,UAAU,GAAG;QAAE1B,MAAM;QAAEC,MAAM;QAAEuB;MAAQ,CAAC;MAE9ChC,eAAe,CAACE,gBAAgB,EAAEM,MAAM,EAAE0B,UAAU,CAAC;MACrDlC,eAAe,CAACE,gBAAgB,EAAEO,MAAM,EAAEyB,UAAU,CAAC;MAErDC,OAAO,CAACC,GAAG,CACRf,MAAM,CAAwBgB,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,KAAK,IAAIJ,OAAO,CAACK,OAAO,CAAC,CAAC,CACxE,CAAC,CAACC,IAAI,CAAC,MAAM;QACXjB,MAAM,CAACkB,KAAK,CAAC,CAAC;MAChB,CAAC,CAAC;IACJ;EACF;AACF;AAEA,SAASC,yBAAyBA,CAAC5B,OAAoB,EAAQ;EAC7Dd,2BAA2B,CAACC,gBAAgB,EAAEa,OAAO,CAAC;AACxD;AAEA,eAAe;EACb6B,GAAG,EAAErC,sBAAsB;EAC3BsC,MAAM,EAAEF,yBAAyB;EACjCtC;AACF,CAAC","ignoreList":[]}