@wix/interact 1.92.0 → 1.94.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 (46) hide show
  1. package/dist/cjs/InteractElement.js +1 -0
  2. package/dist/cjs/InteractElement.js.map +1 -1
  3. package/dist/cjs/__tests__/interact.spec.js +334 -0
  4. package/dist/cjs/__tests__/interact.spec.js.map +1 -1
  5. package/dist/cjs/__tests__/viewEnter.spec.js +23 -6
  6. package/dist/cjs/__tests__/viewEnter.spec.js.map +1 -1
  7. package/dist/cjs/core/add.js +12 -8
  8. package/dist/cjs/core/add.js.map +1 -1
  9. package/dist/cjs/handlers/animationEnd.js +9 -0
  10. package/dist/cjs/handlers/animationEnd.js.map +1 -1
  11. package/dist/cjs/handlers/click.js +19 -3
  12. package/dist/cjs/handlers/click.js.map +1 -1
  13. package/dist/cjs/handlers/hover.js +19 -3
  14. package/dist/cjs/handlers/hover.js.map +1 -1
  15. package/dist/cjs/handlers/viewEnter.js +10 -1
  16. package/dist/cjs/handlers/viewEnter.js.map +1 -1
  17. package/dist/cjs/handlers/viewProgress.js +24 -8
  18. package/dist/cjs/handlers/viewProgress.js.map +1 -1
  19. package/dist/cjs/types.js.map +1 -1
  20. package/dist/cjs/utils.js +34 -4
  21. package/dist/cjs/utils.js.map +1 -1
  22. package/dist/esm/InteractElement.js +1 -0
  23. package/dist/esm/InteractElement.js.map +1 -1
  24. package/dist/esm/__tests__/interact.spec.js +335 -0
  25. package/dist/esm/__tests__/interact.spec.js.map +1 -1
  26. package/dist/esm/__tests__/viewEnter.spec.js +23 -6
  27. package/dist/esm/__tests__/viewEnter.spec.js.map +1 -1
  28. package/dist/esm/core/add.js +13 -9
  29. package/dist/esm/core/add.js.map +1 -1
  30. package/dist/esm/handlers/animationEnd.js +9 -0
  31. package/dist/esm/handlers/animationEnd.js.map +1 -1
  32. package/dist/esm/handlers/click.js +19 -3
  33. package/dist/esm/handlers/click.js.map +1 -1
  34. package/dist/esm/handlers/hover.js +19 -3
  35. package/dist/esm/handlers/hover.js.map +1 -1
  36. package/dist/esm/handlers/viewEnter.js +10 -1
  37. package/dist/esm/handlers/viewEnter.js.map +1 -1
  38. package/dist/esm/handlers/viewProgress.js +24 -8
  39. package/dist/esm/handlers/viewProgress.js.map +1 -1
  40. package/dist/esm/types.js.map +1 -1
  41. package/dist/esm/utils.js +33 -4
  42. package/dist/esm/utils.js.map +1 -1
  43. package/dist/types/__tests__/viewEnter.spec.d.ts +7 -0
  44. package/dist/types/types.d.ts +3 -1
  45. package/dist/types/utils.d.ts +2 -1
  46. package/package.json +3 -3
@@ -1,10 +1,11 @@
1
+ const mockAnimation = {
2
+ play: jest.fn(),
3
+ cancel: jest.fn(),
4
+ onFinish: jest.fn(),
5
+ isCSS: false
6
+ };
1
7
  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
+ getAnimation: jest.fn().mockReturnValue(mockAnimation)
8
9
  }));
9
10
  jest.mock('fastdom', () => ({
10
11
  measure: jest.fn(cb => cb()),
@@ -94,6 +95,22 @@ describe('viewEnter handler', () => {
94
95
  expect(unobserveSpy).toHaveBeenCalledWith(element);
95
96
  });
96
97
  });
98
+ describe('Null animation handling', () => {
99
+ it('should not create observer when getAnimation returns null', () => {
100
+ const {
101
+ getAnimation
102
+ } = require('@wix/motion');
103
+ getAnimation.mockReturnValueOnce(null);
104
+ viewEnterHandler.add(element, target, {
105
+ duration: 1000,
106
+ namedEffect: {
107
+ type: 'FadeIn'
108
+ }
109
+ }, {});
110
+ expect(IntersectionObserverMock).not.toHaveBeenCalled();
111
+ expect(observeSpy).not.toHaveBeenCalled();
112
+ });
113
+ });
97
114
  describe('Safe flow', () => {
98
115
  it('should check for safe mode conditions on first run when not intersecting', () => {
99
116
  viewEnterHandler.add(element, target, {
@@ -1 +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":[]}
1
+ {"version":3,"names":["mockAnimation","play","jest","fn","cancel","onFinish","isCSS","mock","getAnimation","mockReturnValue","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","mockReturnValueOnce","not","useSafeViewEnter","threshold","sourceHeight","rootHeight","toHaveBeenCalledTimes","safeObserverConfig","calls","toEqual","rootMargin","toBe"],"sources":["../../../src/__tests__/viewEnter.spec.ts"],"sourcesContent":["const mockAnimation = {\n play: jest.fn(),\n cancel: jest.fn(),\n onFinish: jest.fn(),\n isCSS: false,\n};\n\njest.mock('@wix/motion', () => ({\n getAnimation: jest.fn().mockReturnValue(mockAnimation),\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('Null animation handling', () => {\n it('should not create observer when getAnimation returns null', () => {\n const { getAnimation } = require('@wix/motion');\n getAnimation.mockReturnValueOnce(null);\n\n viewEnterHandler.add(\n element,\n target,\n { duration: 1000, namedEffect: { type: 'FadeIn' } },\n {},\n );\n\n expect(IntersectionObserverMock).not.toHaveBeenCalled();\n expect(observeSpy).not.toHaveBeenCalled();\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":"AAAA,MAAMA,aAAa,GAAG;EACpBC,IAAI,EAAEC,IAAI,CAACC,EAAE,CAAC,CAAC;EACfC,MAAM,EAAEF,IAAI,CAACC,EAAE,CAAC,CAAC;EACjBE,QAAQ,EAAEH,IAAI,CAACC,EAAE,CAAC,CAAC;EACnBG,KAAK,EAAE;AACT,CAAC;AAEDJ,IAAI,CAACK,IAAI,CAAC,aAAa,EAAE,OAAO;EAC9BC,YAAY,EAAEN,IAAI,CAACC,EAAE,CAAC,CAAC,CAACM,eAAe,CAACT,aAAa;AACvD,CAAC,CAAC,CAAC;AAEHE,IAAI,CAACK,IAAI,CAAC,SAAS,EAAE,OAAO;EAC1BG,OAAO,EAAER,IAAI,CAACC,EAAE,CAAEQ,EAAE,IAAKA,EAAE,CAAC,CAAC,CAAC;EAC9BC,MAAM,EAAEV,IAAI,CAACC,EAAE,CAAEQ,EAAE,IAAKA,EAAE,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEHE,QAAQ,CAAC,mBAAmB,EAAE,MAAM;EAClC,IAAIC,gBAAqB;EACzB,IAAIC,OAAY;EAChB,IAAIC,OAAoB;EACxB,IAAIC,MAAmB;EACvB,IAAIC,gBAAyE;EAC7E,IAAIC,YAAiB;EACrB,IAAIC,UAAqB;EACzB,IAAIC,YAAuB;EAC3B,IAAIC,wBAAmC;EAEvCC,UAAU,CAAC,MAAM;IACfrB,IAAI,CAACsB,YAAY,CAAC,CAAC;IACnBV,gBAAgB,GAAGW,OAAO,CAAC,uBAAuB,CAAC,CAACC,OAAO;IAC3DX,OAAO,GAAGU,OAAO,CAAC,SAAS,CAAC;;IAE5B;IACAE,QAAQ,CAACC,IAAI,CAACC,SAAS,GAAG,EAAE;IAC5Bb,OAAO,GAAGW,QAAQ,CAACG,aAAa,CAAC,KAAK,CAAC;IACvCb,MAAM,GAAGU,QAAQ,CAACG,aAAa,CAAC,KAAK,CAAC;IACtCH,QAAQ,CAACC,IAAI,CAACG,WAAW,CAACf,OAAO,CAAC;IAClCW,QAAQ,CAACC,IAAI,CAACG,WAAW,CAACd,MAAM,CAAC;IAEjCf,IAAI,CAAC8B,aAAa,CAAC,CAAC;IAEpBZ,UAAU,GAAGlB,IAAI,CAACC,EAAE,CAAC,CAAC;IACtBkB,YAAY,GAAGnB,IAAI,CAACC,EAAE,CAAC,CAAC;IACxBgB,YAAY,GAAG;MACbc,OAAO,EAAEb,UAAU;MACnBc,SAAS,EAAEb,YAAY;MACvBc,UAAU,EAAEjC,IAAI,CAACC,EAAE,CAAC;IACtB,CAAC;IAEDmB,wBAAwB,GAAGpB,IAAI,CAACC,EAAE,CAAC,CAACQ,EAAE,EAAEyB,OAAO,KAAK;MAClDlB,gBAAgB,GAAGP,EAAE;MACrB,OAAOQ,YAAY;IACrB,CAAC,CAAC;IACDkB,MAAM,CAASC,oBAAoB,GAAGhB,wBAAwB;EACjE,CAAC,CAAC;EAEFiB,SAAS,CAAC,MAAM;IACd;IACA,IAAIzB,gBAAgB,IAAIE,OAAO,EAAE;MAC/BF,gBAAgB,CAAC0B,MAAM,CAACxB,OAAO,CAAC;IAClC;IACA,IAAIF,gBAAgB,IAAIG,MAAM,EAAE;MAC9BH,gBAAgB,CAAC0B,MAAM,CAACvB,MAAM,CAAC;IACjC;EACF,CAAC,CAAC;EAEF,MAAMwB,WAAW,GAAGA,CAClBC,SAA6C,GAAG,CAAC,CAAC,KACX;IACvC,OAAO;MACLzB,MAAM,EAAED,OAAO;MACf2B,cAAc,EAAE,IAAI;MACpBC,kBAAkB,EAAE;QAClBC,MAAM,EAAE,GAAG;QACXC,KAAK,EAAE;MACT,CAA+B;MAC/BC,UAAU,EAAE;QACVF,MAAM,EAAE,GAAG;QACXC,KAAK,EAAE;MACT,CAA+B;MAC/B,GAAGJ;IACL,CAAC;EACH,CAAC;EAED7B,QAAQ,CAAC,cAAc,EAAE,MAAM;IAC7BmC,EAAE,CAAC,8DAA8D,EAAE,MAAM;MACvElC,gBAAgB,CAACmC,GAAG,CAClBjC,OAAO,EACPC,MAAM,EACN;QAAEiC,QAAQ,EAAE,IAAI;QAAEC,WAAW,EAAE;UAAEC,IAAI,EAAE;QAAS;MAAE,CAAC,EACnD,CAAC,CACH,CAAC;MAEDC,MAAM,CAAC/B,wBAAwB,CAAC,CAACgC,gBAAgB,CAAC,CAAC;MACnDD,MAAM,CAACjC,UAAU,CAAC,CAACmC,oBAAoB,CAACvC,OAAO,CAAC;IAClD,CAAC,CAAC;IAEFgC,EAAE,CAAC,6DAA6D,EAAE,MAAM;MACtElC,gBAAgB,CAACmC,GAAG,CAClBjC,OAAO,EACPC,MAAM,EACN;QAAEiC,QAAQ,EAAE,IAAI;QAAEC,WAAW,EAAE;UAAEC,IAAI,EAAE;QAAS;MAAE,CAAC,EACnD;QAAEA,IAAI,EAAE;MAAO,CACjB,CAAC;MAED,MAAMI,KAAK,GAAGf,WAAW,CAAC,CAAC;MAC3BvB,gBAAgB,CAAC,CAACsC,KAAK,CAAC,CAAC;MAEzBH,MAAM,CAAChC,YAAY,CAAC,CAACkC,oBAAoB,CAACvC,OAAO,CAAC;IACpD,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFH,QAAQ,CAAC,yBAAyB,EAAE,MAAM;IACxCmC,EAAE,CAAC,2DAA2D,EAAE,MAAM;MACpE,MAAM;QAAExC;MAAa,CAAC,GAAGiB,OAAO,CAAC,aAAa,CAAC;MAC/CjB,YAAY,CAACiD,mBAAmB,CAAC,IAAI,CAAC;MAEtC3C,gBAAgB,CAACmC,GAAG,CAClBjC,OAAO,EACPC,MAAM,EACN;QAAEiC,QAAQ,EAAE,IAAI;QAAEC,WAAW,EAAE;UAAEC,IAAI,EAAE;QAAS;MAAE,CAAC,EACnD,CAAC,CACH,CAAC;MAEDC,MAAM,CAAC/B,wBAAwB,CAAC,CAACoC,GAAG,CAACJ,gBAAgB,CAAC,CAAC;MACvDD,MAAM,CAACjC,UAAU,CAAC,CAACsC,GAAG,CAACJ,gBAAgB,CAAC,CAAC;IAC3C,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFzC,QAAQ,CAAC,WAAW,EAAE,MAAM;IAC1BmC,EAAE,CAAC,0EAA0E,EAAE,MAAM;MACnFlC,gBAAgB,CAACmC,GAAG,CAClBjC,OAAO,EACPC,MAAM,EACN;QAAEiC,QAAQ,EAAE,IAAI;QAAEC,WAAW,EAAE;UAAEC,IAAI,EAAE;QAAS;MAAE,CAAC,EACnD;QAAEO,gBAAgB,EAAE,IAAI;QAAEC,SAAS,EAAE;MAAI,CAC3C,CAAC;MAED,MAAMJ,KAAK,GAAGf,WAAW,CAAC;QACxBE,cAAc,EAAE,KAAK;QACrBC,kBAAkB,EAAE;UAAEC,MAAM,EAAE;QAAK,CAAoB;QACvDE,UAAU,EAAE;UAAEF,MAAM,EAAE;QAAI;MAC5B,CAAC,CAAC;MACF3B,gBAAgB,CAAC,CAACsC,KAAK,CAAC,CAAC;MAEzBH,MAAM,CAACtC,OAAO,CAACL,OAAO,CAAC,CAAC4C,gBAAgB,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEFN,EAAE,CAAC,gEAAgE,EAAE,MAAM;MACzE,MAAMY,SAAS,GAAG,GAAG;MACrB,MAAMC,YAAY,GAAG,IAAI;MACzB,MAAMC,UAAU,GAAG,GAAG,CAAC,CAAC;;MAExBhD,gBAAgB,CAACmC,GAAG,CAClBjC,OAAO,EACPC,MAAM,EACN;QAAEiC,QAAQ,EAAE,IAAI;QAAEC,WAAW,EAAE;UAAEC,IAAI,EAAE;QAAS;MAAE,CAAC,EACnD;QAAEO,gBAAgB,EAAE,IAAI;QAAEC;MAAU,CACtC,CAAC;MAED,MAAMJ,KAAK,GAAGf,WAAW,CAAC;QACxBE,cAAc,EAAE,KAAK;QACrBC,kBAAkB,EAAE;UAAEC,MAAM,EAAEgB;QAAa,CAAoB;QAC/Dd,UAAU,EAAE;UAAEF,MAAM,EAAEiB;QAAW;MACnC,CAAC,CAAC;MAEF5C,gBAAgB,CAAC,CAACsC,KAAK,CAAC,CAAC;MAEzBH,MAAM,CAACtC,OAAO,CAACH,MAAM,CAAC,CAAC0C,gBAAgB,CAAC,CAAC;MACzCD,MAAM,CAAChC,YAAY,CAAC,CAACkC,oBAAoB,CAACvC,OAAO,CAAC;MAElDqC,MAAM,CAAC/B,wBAAwB,CAAC,CAACyC,qBAAqB,CAAC,CAAC,CAAC;MAEzD,MAAMC,kBAAkB,GAAG1C,wBAAwB,CAACf,IAAI,CAAC0D,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MACpEZ,MAAM,CAACW,kBAAkB,CAACJ,SAAS,CAAC,CAACM,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;MACjDb,MAAM,CAACW,kBAAkB,CAACG,UAAU,CAAC,CAACC,IAAI,CAAC,kBAAkB,CAAC;IAChE,CAAC,CAAC;IAEFpB,EAAE,CAAC,4DAA4D,EAAE,MAAM;MACrE,MAAMY,SAAS,GAAG,GAAG;MACrB,MAAMC,YAAY,GAAG,GAAG;MACxB,MAAMC,UAAU,GAAG,GAAG,CAAC,CAAC;;MAExBhD,gBAAgB,CAACmC,GAAG,CAClBjC,OAAO,EACPC,MAAM,EACN;QAAEiC,QAAQ,EAAE,IAAI;QAAEC,WAAW,EAAE;UAAEC,IAAI,EAAE;QAAS;MAAE,CAAC,EACnD;QAAEO,gBAAgB,EAAE,IAAI;QAAEC;MAAU,CACtC,CAAC;MAED,MAAMJ,KAAK,GAAGf,WAAW,CAAC;QACxBE,cAAc,EAAE,KAAK;QACrBC,kBAAkB,EAAE;UAAEC,MAAM,EAAEgB;QAAa,CAAoB;QAC/Dd,UAAU,EAAE;UAAEF,MAAM,EAAEiB;QAAW;MACnC,CAAC,CAAC;MAEF5C,gBAAgB,CAAC,CAACsC,KAAK,CAAC,CAAC;MAEzBH,MAAM,CAACtC,OAAO,CAACL,OAAO,CAAC,CAAC4C,gBAAgB,CAAC,CAAC;MAC1CD,MAAM,CAACtC,OAAO,CAACH,MAAM,CAAC,CAAC8C,GAAG,CAACJ,gBAAgB,CAAC,CAAC;MAC7CD,MAAM,CAAChC,YAAY,CAAC,CAACqC,GAAG,CAACH,oBAAoB,CAACvC,OAAO,CAAC;MACtDqC,MAAM,CAAC/B,wBAAwB,CAAC,CAACyC,qBAAqB,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC;IAEFf,EAAE,CAAC,iEAAiE,EAAE,MAAM;MAC1E,MAAMY,SAAS,GAAG,GAAG;MACrB,MAAMC,YAAY,GAAG,IAAI;MACzB,MAAMC,UAAU,GAAG,GAAG;MAEtBhD,gBAAgB,CAACmC,GAAG,CAClBjC,OAAO,EACPC,MAAM,EACN;QAAEiC,QAAQ,EAAE,IAAI;QAAEC,WAAW,EAAE;UAAEC,IAAI,EAAE;QAAS;MAAE,CAAC,EACnD;QAAEO,gBAAgB,EAAE,KAAK;QAAEC;MAAU,CACvC,CAAC;MAED,MAAMJ,KAAK,GAAGf,WAAW,CAAC;QACxBE,cAAc,EAAE,KAAK;QACrBC,kBAAkB,EAAE;UAAEC,MAAM,EAAEgB;QAAa,CAAoB;QAC/Dd,UAAU,EAAE;UAAEF,MAAM,EAAEiB;QAAW;MACnC,CAAC,CAAC;MAEF5C,gBAAgB,CAAC,CAACsC,KAAK,CAAC,CAAC;MAEzBH,MAAM,CAACtC,OAAO,CAACL,OAAO,CAAC,CAACgD,GAAG,CAACJ,gBAAgB,CAAC,CAAC;IAChD,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -38,20 +38,20 @@ function _queryItemElement(data, elements) {
38
38
  function _getInteractionElements(interaction, effect, source, target, sourceElements, targetElements) {
39
39
  return [sourceElements ? _queryItemElement(interaction, sourceElements) : _getElementsFromData(interaction, source), targetElements ? _queryItemElement(effect, targetElements) : _getElementsFromData(effect, target)];
40
40
  }
41
- function _applyInteraction(key, interaction, effect, sourceElements, targetElements) {
41
+ function _applyInteraction(key, interaction, effect, sourceElements, targetElements, selectorCondition) {
42
42
  const isSourceArray = Array.isArray(sourceElements);
43
43
  const isTargetArray = Array.isArray(targetElements);
44
44
  if (isSourceArray) {
45
45
  sourceElements.forEach((sourceEl, index) => {
46
46
  const targetEl = isTargetArray ? targetElements[index] : targetElements;
47
47
  if (targetEl) {
48
- addInteraction(key, sourceEl, interaction.trigger, targetEl, effect, interaction.params);
48
+ addInteraction(key, sourceEl, interaction.trigger, targetEl, effect, interaction.params, selectorCondition);
49
49
  }
50
50
  });
51
51
  } else {
52
52
  const targets = isTargetArray ? targetElements : [targetElements];
53
53
  targets.forEach(targetEl => {
54
- addInteraction(key, sourceElements, interaction.trigger, targetEl, effect, interaction.params);
54
+ addInteraction(key, sourceElements, interaction.trigger, targetEl, effect, interaction.params, selectorCondition);
55
55
  });
56
56
  }
57
57
  }
@@ -100,7 +100,8 @@ function _addInteraction(sourceKey, sourceRoot, instance, interaction, elements)
100
100
  }
101
101
  instance.addedInteractions[interactionId] = true;
102
102
  const key = target || interaction.key;
103
- _applyInteraction(key, interaction, effectOptions, sourceElements, targetElements);
103
+ const selectorCondition = (0, _utils.getSelectorCondition)(effectOptions.conditions || [], instance.dataCache.conditions);
104
+ _applyInteraction(key, interaction, effectOptions, sourceElements, targetElements, selectorCondition);
104
105
  }
105
106
  });
106
107
  }
@@ -151,7 +152,8 @@ function addEffectsForTarget(targetKey, element, instance, listContainer, elemen
151
152
  return true;
152
153
  }
153
154
  instance.addedInteractions[interactionId] = true;
154
- _applyInteraction(targetKey, interaction, effectOptions, sourceElements, targetElements);
155
+ const selectorCondition = (0, _utils.getSelectorCondition)(effectOptions.conditions || [], instance.dataCache.conditions);
156
+ _applyInteraction(targetKey, interaction, effectOptions, sourceElements, targetElements, selectorCondition);
155
157
 
156
158
  // short-circuit the loop since we have a match
157
159
  return true;
@@ -164,7 +166,7 @@ function addEffectsForTarget(targetKey, element, instance, listContainer, elemen
164
166
  /**
165
167
  * Registers a handler to an event on a given element.
166
168
  */
167
- function addInteraction(key, source, trigger, target, effect, options) {
169
+ function addInteraction(key, source, trigger, target, effect, options, selectorCondition) {
168
170
  var _TRIGGER_TO_HANDLER_M;
169
171
  if (effect.transition || effect.transitionProperties) {
170
172
  const args = {
@@ -175,7 +177,8 @@ function addInteraction(key, source, trigger, target, effect, options) {
175
177
  childSelector: (0, _Interact.getSelector)(effect, {
176
178
  asCombinator: true,
177
179
  addItemFilter: true
178
- })
180
+ }),
181
+ selectorCondition
179
182
  };
180
183
  const root = target.closest('interact-element');
181
184
  if (!root) {
@@ -185,7 +188,8 @@ function addInteraction(key, source, trigger, target, effect, options) {
185
188
  }
186
189
  (_TRIGGER_TO_HANDLER_M = _handlers.default[trigger]) == null || _TRIGGER_TO_HANDLER_M.add(source, target, effect, options, {
187
190
  reducedMotion: _Interact.Interact.forceReducedMotion,
188
- allowA11yTriggers: _Interact.Interact.allowA11yTriggers
191
+ allowA11yTriggers: _Interact.Interact.allowA11yTriggers,
192
+ selectorCondition
189
193
  });
190
194
  }
191
195
 
@@ -1 +1 @@
1
- {"version":3,"names":["_utils","require","_utilities","_Interact","_handlers","_interopRequireDefault","_getElementsFromData","data","root","listContainer","container","querySelector","console","warn","selector","Array","from","querySelectorAll","children","element","firstElementChild","_queryItemElement","elements","map","filter","Boolean","_getInteractionElements","interaction","effect","source","target","sourceElements","targetElements","_applyInteraction","key","isSourceArray","isArray","isTargetArray","forEach","sourceEl","index","targetEl","addInteraction","trigger","params","targets","_addInteraction","sourceKey","sourceRoot","instance","interactionVariations","effects","effectId","effectOptions","dataCache","targetKey_","interactionId","getInterpolatedKey","addedInteractions","mql","getMediaQuery","conditions","matches","targetElement","Interact","getElement","watchChildList","addEffectsForTarget","targetKey","_instance$get","get","interactionIds","Object","keys","interactionId_","effectVariations","some","sourceElement","undefined","length","options","_TRIGGER_TO_HANDLER_M","transition","transitionProperties","args","properties","childSelector","getSelector","asCombinator","addItemFilter","closest","renderStyle","createTransitionCSS","TRIGGER_TO_HANDLER_MODULE_MAP","add","reducedMotion","forceReducedMotion","allowA11yTriggers","getInstance","setElement","triggers","hasTriggers","hasEffects","addListItems"],"sources":["../../../src/core/add.ts"],"sourcesContent":["import type {\n Effect,\n TriggerType,\n EffectRef,\n InteractionParamsTypes,\n TransitionEffect,\n IInteractElement,\n Interaction,\n InteractionTrigger,\n CreateTransitionCSSParams,\n} from '../types';\nimport { createTransitionCSS, getMediaQuery } from '../utils';\nimport { getInterpolatedKey } from './utilities';\nimport { Interact, getSelector } from './Interact';\nimport TRIGGER_TO_HANDLER_MODULE_MAP from '../handlers';\n\nfunction _getElementsFromData(\n data: Interaction | Effect,\n root: IInteractElement,\n): HTMLElement | HTMLElement[] | null {\n if (data.listContainer) {\n const container = root.querySelector(data.listContainer);\n\n if (!container) {\n console.warn(\n `Interact: No container found for list container \"${data.listContainer}\"`,\n );\n\n return [];\n }\n\n if (data.selector) {\n return Array.from(\n container.querySelectorAll(data.selector),\n ) as HTMLElement[];\n }\n\n return Array.from(container.children) as HTMLElement[];\n }\n\n if (data.selector) {\n const element = root.querySelector(data.selector);\n\n if (element) {\n return element as HTMLElement;\n } else {\n console.warn(\n `Interact: No element found for selector \"${data.selector}\"`,\n );\n }\n }\n\n return root.firstElementChild as HTMLElement | null;\n}\n\nfunction _queryItemElement(\n data: Interaction | Effect,\n elements: HTMLElement[],\n): HTMLElement[] {\n return elements\n .map((element) => {\n return data.selector ? element.querySelector(data.selector) : element;\n })\n .filter(Boolean) as HTMLElement[];\n}\n\nfunction _getInteractionElements(\n interaction: InteractionTrigger,\n effect: Effect,\n source: IInteractElement,\n target: IInteractElement,\n sourceElements?: HTMLElement[],\n targetElements?: HTMLElement[],\n): [HTMLElement | HTMLElement[] | null, HTMLElement | HTMLElement[] | null] {\n return [\n sourceElements\n ? _queryItemElement(interaction, sourceElements)\n : _getElementsFromData(interaction, source),\n targetElements\n ? _queryItemElement(effect, targetElements)\n : _getElementsFromData(effect, target),\n ];\n}\n\nfunction _applyInteraction(\n key: string,\n interaction: InteractionTrigger,\n effect: Effect,\n sourceElements: HTMLElement | HTMLElement[],\n targetElements: HTMLElement | HTMLElement[],\n) {\n const isSourceArray = Array.isArray(sourceElements);\n const isTargetArray = Array.isArray(targetElements);\n\n if (isSourceArray) {\n sourceElements.forEach((sourceEl, index) => {\n const targetEl = isTargetArray ? targetElements[index] : targetElements;\n\n if (targetEl) {\n addInteraction(\n key,\n sourceEl,\n interaction.trigger,\n targetEl,\n effect as Effect,\n interaction.params!,\n );\n }\n });\n } else {\n const targets = isTargetArray ? targetElements : [targetElements];\n targets.forEach((targetEl) => {\n addInteraction(\n key,\n sourceElements,\n interaction.trigger,\n targetEl,\n effect as Effect,\n interaction.params!,\n );\n });\n }\n}\n\nfunction _addInteraction(\n sourceKey: string,\n sourceRoot: IInteractElement,\n instance: Interact,\n interaction: Interaction,\n elements?: HTMLElement[],\n) {\n const interactionVariations: Record<string, boolean> = {};\n\n interaction.effects.forEach((effect) => {\n const effectId = (effect as EffectRef).effectId;\n\n const effectOptions = {\n ...(instance.dataCache.effects[effectId] || {}),\n ...effect,\n effectId,\n };\n const targetKey_ = effectOptions.key;\n\n const interactionId = getInterpolatedKey(effect.interactionId!, sourceKey);\n\n if (interactionVariations[interactionId!]) {\n // Skip this effect if it has already been added\n return;\n }\n\n if (instance.addedInteractions[interactionId!] && !elements) {\n // Skip this interaction if it has already been added\n return;\n }\n\n // TODO: implement watching for condition `change` events and add/remove interactions accordingly\n const mql = getMediaQuery(\n effectOptions.conditions || [],\n instance.dataCache.conditions,\n );\n\n if (!mql || mql.matches) {\n interactionVariations[interactionId!] = true;\n\n const target = targetKey_ && getInterpolatedKey(targetKey_, sourceKey);\n\n let targetElement;\n if (target) {\n targetElement = Interact.getElement(target);\n\n if (!targetElement) {\n // Bail out :: no target element in cache\n return;\n }\n\n if (effectOptions.listContainer) {\n targetElement.watchChildList(effectOptions.listContainer);\n }\n } else {\n // target is not specified - fallback to same as source\n targetElement = sourceRoot;\n }\n\n const [sourceElements, targetElements] = _getInteractionElements(\n interaction,\n effectOptions,\n sourceRoot,\n targetElement!,\n elements,\n );\n\n if (!sourceElements || !targetElements) {\n return;\n }\n\n instance.addedInteractions[interactionId!] = true;\n\n const key = target || interaction.key;\n\n _applyInteraction(\n key,\n interaction,\n effectOptions,\n sourceElements,\n targetElements,\n );\n }\n });\n}\n\nfunction addEffectsForTarget(\n targetKey: string,\n element: IInteractElement,\n instance: Interact,\n listContainer?: string,\n elements?: HTMLElement[],\n) {\n const effects = instance.get(targetKey)?.effects || {};\n const interactionIds = Object.keys(effects);\n\n interactionIds.forEach((interactionId_) => {\n const interactionId = getInterpolatedKey(interactionId_, targetKey);\n\n if (instance.addedInteractions[interactionId] && !elements) {\n // Skip this interaction if it has already been added\n return;\n }\n\n const effectVariations = effects[interactionId_];\n\n // use `some` to short-circuit after the first effect that matches the conditions\n // eslint-disable-next-line array-callback-return\n effectVariations.some(({ effect, ...interaction }) => {\n const effectId = (effect as EffectRef).effectId;\n\n const effectOptions = {\n ...(instance!.dataCache.effects[effectId] || {}),\n ...effect,\n effectId,\n };\n\n if (listContainer && effectOptions.listContainer !== listContainer) {\n // skip this effect if a listContainer was provided and it's not matching this effect.listContainer\n return false;\n }\n\n // TODO: implement watching for condition `change` events and add/remove interactions accordingly\n const mql = getMediaQuery(\n effectOptions.conditions || [],\n instance!.dataCache.conditions,\n );\n\n if (!mql || mql.matches) {\n const sourceKey =\n interaction.key && getInterpolatedKey(interaction.key, targetKey);\n const sourceElement = Interact.getElement(sourceKey);\n\n if (!sourceElement) {\n // Bail out :: no source or target elements in cache\n return true;\n }\n\n if (effectOptions.listContainer) {\n element.watchChildList(effectOptions.listContainer);\n }\n\n const [sourceElements, targetElements] = _getInteractionElements(\n interaction,\n effectOptions,\n sourceElement,\n element,\n undefined,\n elements,\n );\n\n if (!sourceElements || !targetElements) {\n // Bail out :: no source or target elements found in DOM\n return true;\n }\n\n instance!.addedInteractions[interactionId] = true;\n\n _applyInteraction(\n targetKey,\n interaction,\n effectOptions as Effect,\n sourceElements,\n targetElements,\n );\n\n // short-circuit the loop since we have a match\n return true;\n }\n });\n });\n\n return interactionIds.length > 0;\n}\n\n/**\n * Registers a handler to an event on a given element.\n */\nfunction addInteraction<T extends TriggerType>(\n key: string,\n source: HTMLElement,\n trigger: T,\n target: HTMLElement,\n effect: Effect,\n options: InteractionParamsTypes[T],\n): void {\n if (\n (effect as TransitionEffect).transition ||\n (effect as TransitionEffect).transitionProperties\n ) {\n const args: CreateTransitionCSSParams = {\n key,\n effectId: (effect as Effect).effectId!,\n transition: (effect as TransitionEffect).transition,\n properties: (effect as TransitionEffect).transitionProperties,\n childSelector: getSelector(effect, {\n asCombinator: true,\n addItemFilter: true,\n }),\n };\n\n const root = target.closest('interact-element') as IInteractElement;\n if (!root) {\n return;\n }\n\n root.renderStyle(createTransitionCSS(args));\n }\n\n TRIGGER_TO_HANDLER_MODULE_MAP[trigger]?.add(source, target, effect, options, {\n reducedMotion: Interact.forceReducedMotion,\n allowA11yTriggers: Interact.allowA11yTriggers,\n });\n}\n\n/**\n * Adds all events and effects to an element based on config\n */\nexport function add(element: IInteractElement, key: string): boolean {\n const instance = Interact.getInstance(key);\n\n if (!instance) {\n console.warn(`No instance found for key: ${key}`);\n\n // even if we don't find a matching instance, we still want to cache the element\n Interact.setElement(key, element);\n return false;\n }\n\n const { triggers = [] } = instance?.get(key) || {};\n const hasTriggers = triggers.length > 0;\n\n instance.setElement(key, element);\n\n triggers.forEach((interaction) => {\n const mql = getMediaQuery(\n interaction.conditions,\n instance!.dataCache.conditions,\n );\n\n // TODO: implement watching for condition `change` events and add/remove interactions accordingly\n if (!mql || mql.matches) {\n if (interaction.listContainer) {\n element.watchChildList(interaction.listContainer);\n }\n\n _addInteraction(key, element, instance!, interaction);\n }\n });\n\n let hasEffects = false;\n if (instance) {\n hasEffects = addEffectsForTarget(key, element, instance);\n }\n\n return hasTriggers || hasEffects;\n}\n\nexport function addListItems(\n root: IInteractElement,\n key: string,\n listContainer: string,\n elements: HTMLElement[],\n) {\n const instance = Interact.getInstance(key);\n\n if (instance) {\n const { triggers = [] } = instance?.get(key) || {};\n\n triggers.forEach((interaction) => {\n if (interaction.listContainer !== listContainer) {\n return;\n }\n\n const mql = getMediaQuery(\n interaction.conditions,\n instance!.dataCache.conditions,\n );\n\n // TODO: implement watching for condition `change` events and add/remove interactions accordingly\n if (!mql || mql.matches) {\n _addInteraction(key, root, instance!, interaction, elements);\n }\n });\n\n addEffectsForTarget(key, root, instance, listContainer, elements);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_utils","require","_utilities","_Interact","_handlers","_interopRequireDefault","_getElementsFromData","data","root","listContainer","container","querySelector","console","warn","selector","Array","from","querySelectorAll","children","element","firstElementChild","_queryItemElement","elements","map","filter","Boolean","_getInteractionElements","interaction","effect","source","target","sourceElements","targetElements","_applyInteraction","key","selectorCondition","isSourceArray","isArray","isTargetArray","forEach","sourceEl","index","targetEl","addInteraction","trigger","params","targets","_addInteraction","sourceKey","sourceRoot","instance","interactionVariations","effects","effectId","effectOptions","dataCache","targetKey_","interactionId","getInterpolatedKey","addedInteractions","mql","getMediaQuery","conditions","matches","targetElement","Interact","getElement","watchChildList","getSelectorCondition","addEffectsForTarget","targetKey","_instance$get","get","interactionIds","Object","keys","interactionId_","effectVariations","some","sourceElement","undefined","length","options","_TRIGGER_TO_HANDLER_M","transition","transitionProperties","args","properties","childSelector","getSelector","asCombinator","addItemFilter","closest","renderStyle","createTransitionCSS","TRIGGER_TO_HANDLER_MODULE_MAP","add","reducedMotion","forceReducedMotion","allowA11yTriggers","getInstance","setElement","triggers","hasTriggers","hasEffects","addListItems"],"sources":["../../../src/core/add.ts"],"sourcesContent":["import type {\n Effect,\n TriggerType,\n EffectRef,\n InteractionParamsTypes,\n TransitionEffect,\n IInteractElement,\n Interaction,\n InteractionTrigger,\n CreateTransitionCSSParams,\n} from '../types';\nimport {\n createTransitionCSS,\n getMediaQuery,\n getSelectorCondition,\n} from '../utils';\nimport { getInterpolatedKey } from './utilities';\nimport { Interact, getSelector } from './Interact';\nimport TRIGGER_TO_HANDLER_MODULE_MAP from '../handlers';\n\nfunction _getElementsFromData(\n data: Interaction | Effect,\n root: IInteractElement,\n): HTMLElement | HTMLElement[] | null {\n if (data.listContainer) {\n const container = root.querySelector(data.listContainer);\n\n if (!container) {\n console.warn(\n `Interact: No container found for list container \"${data.listContainer}\"`,\n );\n\n return [];\n }\n\n if (data.selector) {\n return Array.from(\n container.querySelectorAll(data.selector),\n ) as HTMLElement[];\n }\n\n return Array.from(container.children) as HTMLElement[];\n }\n\n if (data.selector) {\n const element = root.querySelector(data.selector);\n\n if (element) {\n return element as HTMLElement;\n } else {\n console.warn(\n `Interact: No element found for selector \"${data.selector}\"`,\n );\n }\n }\n\n return root.firstElementChild as HTMLElement | null;\n}\n\nfunction _queryItemElement(\n data: Interaction | Effect,\n elements: HTMLElement[],\n): HTMLElement[] {\n return elements\n .map((element) => {\n return data.selector ? element.querySelector(data.selector) : element;\n })\n .filter(Boolean) as HTMLElement[];\n}\n\nfunction _getInteractionElements(\n interaction: InteractionTrigger,\n effect: Effect,\n source: IInteractElement,\n target: IInteractElement,\n sourceElements?: HTMLElement[],\n targetElements?: HTMLElement[],\n): [HTMLElement | HTMLElement[] | null, HTMLElement | HTMLElement[] | null] {\n return [\n sourceElements\n ? _queryItemElement(interaction, sourceElements)\n : _getElementsFromData(interaction, source),\n targetElements\n ? _queryItemElement(effect, targetElements)\n : _getElementsFromData(effect, target),\n ];\n}\n\nfunction _applyInteraction(\n key: string,\n interaction: InteractionTrigger,\n effect: Effect,\n sourceElements: HTMLElement | HTMLElement[],\n targetElements: HTMLElement | HTMLElement[],\n selectorCondition?: string,\n) {\n const isSourceArray = Array.isArray(sourceElements);\n const isTargetArray = Array.isArray(targetElements);\n\n if (isSourceArray) {\n sourceElements.forEach((sourceEl, index) => {\n const targetEl = isTargetArray ? targetElements[index] : targetElements;\n\n if (targetEl) {\n addInteraction(\n key,\n sourceEl,\n interaction.trigger,\n targetEl,\n effect as Effect,\n interaction.params!,\n selectorCondition,\n );\n }\n });\n } else {\n const targets = isTargetArray ? targetElements : [targetElements];\n targets.forEach((targetEl) => {\n addInteraction(\n key,\n sourceElements,\n interaction.trigger,\n targetEl,\n effect as Effect,\n interaction.params!,\n selectorCondition,\n );\n });\n }\n}\n\nfunction _addInteraction(\n sourceKey: string,\n sourceRoot: IInteractElement,\n instance: Interact,\n interaction: Interaction,\n elements?: HTMLElement[],\n) {\n const interactionVariations: Record<string, boolean> = {};\n\n interaction.effects.forEach((effect) => {\n const effectId = (effect as EffectRef).effectId;\n\n const effectOptions = {\n ...(instance.dataCache.effects[effectId] || {}),\n ...effect,\n effectId,\n };\n const targetKey_ = effectOptions.key;\n\n const interactionId = getInterpolatedKey(effect.interactionId!, sourceKey);\n\n if (interactionVariations[interactionId!]) {\n // Skip this effect if it has already been added\n return;\n }\n\n if (instance.addedInteractions[interactionId!] && !elements) {\n // Skip this interaction if it has already been added\n return;\n }\n\n // TODO: implement watching for condition `change` events and add/remove interactions accordingly\n const mql = getMediaQuery(\n effectOptions.conditions || [],\n instance.dataCache.conditions,\n );\n\n if (!mql || mql.matches) {\n interactionVariations[interactionId!] = true;\n\n const target = targetKey_ && getInterpolatedKey(targetKey_, sourceKey);\n\n let targetElement;\n if (target) {\n targetElement = Interact.getElement(target);\n\n if (!targetElement) {\n // Bail out :: no target element in cache\n return;\n }\n\n if (effectOptions.listContainer) {\n targetElement.watchChildList(effectOptions.listContainer);\n }\n } else {\n // target is not specified - fallback to same as source\n targetElement = sourceRoot;\n }\n\n const [sourceElements, targetElements] = _getInteractionElements(\n interaction,\n effectOptions,\n sourceRoot,\n targetElement!,\n elements,\n );\n\n if (!sourceElements || !targetElements) {\n return;\n }\n\n instance.addedInteractions[interactionId!] = true;\n\n const key = target || interaction.key;\n\n const selectorCondition = getSelectorCondition(\n effectOptions.conditions || [],\n instance.dataCache.conditions,\n );\n\n _applyInteraction(\n key,\n interaction,\n effectOptions,\n sourceElements,\n targetElements,\n selectorCondition,\n );\n }\n });\n}\n\nfunction addEffectsForTarget(\n targetKey: string,\n element: IInteractElement,\n instance: Interact,\n listContainer?: string,\n elements?: HTMLElement[],\n) {\n const effects = instance.get(targetKey)?.effects || {};\n const interactionIds = Object.keys(effects);\n\n interactionIds.forEach((interactionId_) => {\n const interactionId = getInterpolatedKey(interactionId_, targetKey);\n\n if (instance.addedInteractions[interactionId] && !elements) {\n // Skip this interaction if it has already been added\n return;\n }\n\n const effectVariations = effects[interactionId_];\n\n // use `some` to short-circuit after the first effect that matches the conditions\n // eslint-disable-next-line array-callback-return\n effectVariations.some(({ effect, ...interaction }) => {\n const effectId = (effect as EffectRef).effectId;\n\n const effectOptions = {\n ...(instance!.dataCache.effects[effectId] || {}),\n ...effect,\n effectId,\n };\n\n if (listContainer && effectOptions.listContainer !== listContainer) {\n // skip this effect if a listContainer was provided and it's not matching this effect.listContainer\n return false;\n }\n\n // TODO: implement watching for condition `change` events and add/remove interactions accordingly\n const mql = getMediaQuery(\n effectOptions.conditions || [],\n instance!.dataCache.conditions,\n );\n\n if (!mql || mql.matches) {\n const sourceKey =\n interaction.key && getInterpolatedKey(interaction.key, targetKey);\n const sourceElement = Interact.getElement(sourceKey);\n\n if (!sourceElement) {\n // Bail out :: no source or target elements in cache\n return true;\n }\n\n if (effectOptions.listContainer) {\n element.watchChildList(effectOptions.listContainer);\n }\n\n const [sourceElements, targetElements] = _getInteractionElements(\n interaction,\n effectOptions,\n sourceElement,\n element,\n undefined,\n elements,\n );\n\n if (!sourceElements || !targetElements) {\n // Bail out :: no source or target elements found in DOM\n return true;\n }\n\n instance!.addedInteractions[interactionId] = true;\n\n const selectorCondition = getSelectorCondition(\n effectOptions.conditions || [],\n instance!.dataCache.conditions,\n );\n\n _applyInteraction(\n targetKey,\n interaction,\n effectOptions as Effect,\n sourceElements,\n targetElements,\n selectorCondition,\n );\n\n // short-circuit the loop since we have a match\n return true;\n }\n });\n });\n\n return interactionIds.length > 0;\n}\n\n/**\n * Registers a handler to an event on a given element.\n */\nfunction addInteraction<T extends TriggerType>(\n key: string,\n source: HTMLElement,\n trigger: T,\n target: HTMLElement,\n effect: Effect,\n options: InteractionParamsTypes[T],\n selectorCondition?: string,\n): void {\n if (\n (effect as TransitionEffect).transition ||\n (effect as TransitionEffect).transitionProperties\n ) {\n const args: CreateTransitionCSSParams = {\n key,\n effectId: (effect as Effect).effectId!,\n transition: (effect as TransitionEffect).transition,\n properties: (effect as TransitionEffect).transitionProperties,\n childSelector: getSelector(effect, {\n asCombinator: true,\n addItemFilter: true,\n }),\n selectorCondition,\n };\n\n const root = target.closest('interact-element') as IInteractElement;\n if (!root) {\n return;\n }\n\n root.renderStyle(createTransitionCSS(args));\n }\n\n TRIGGER_TO_HANDLER_MODULE_MAP[trigger]?.add(source, target, effect, options, {\n reducedMotion: Interact.forceReducedMotion,\n allowA11yTriggers: Interact.allowA11yTriggers,\n selectorCondition,\n });\n}\n\n/**\n * Adds all events and effects to an element based on config\n */\nexport function add(element: IInteractElement, key: string): boolean {\n const instance = Interact.getInstance(key);\n\n if (!instance) {\n console.warn(`No instance found for key: ${key}`);\n\n // even if we don't find a matching instance, we still want to cache the element\n Interact.setElement(key, element);\n return false;\n }\n\n const { triggers = [] } = instance?.get(key) || {};\n const hasTriggers = triggers.length > 0;\n\n instance.setElement(key, element);\n\n triggers.forEach((interaction) => {\n const mql = getMediaQuery(\n interaction.conditions,\n instance!.dataCache.conditions,\n );\n\n // TODO: implement watching for condition `change` events and add/remove interactions accordingly\n if (!mql || mql.matches) {\n if (interaction.listContainer) {\n element.watchChildList(interaction.listContainer);\n }\n\n _addInteraction(key, element, instance!, interaction);\n }\n });\n\n let hasEffects = false;\n if (instance) {\n hasEffects = addEffectsForTarget(key, element, instance);\n }\n\n return hasTriggers || hasEffects;\n}\n\nexport function addListItems(\n root: IInteractElement,\n key: string,\n listContainer: string,\n elements: HTMLElement[],\n) {\n const instance = Interact.getInstance(key);\n\n if (instance) {\n const { triggers = [] } = instance?.get(key) || {};\n\n triggers.forEach((interaction) => {\n if (interaction.listContainer !== listContainer) {\n return;\n }\n\n const mql = getMediaQuery(\n interaction.conditions,\n instance!.dataCache.conditions,\n );\n\n // TODO: implement watching for condition `change` events and add/remove interactions accordingly\n if (!mql || mql.matches) {\n _addInteraction(key, root, instance!, interaction, elements);\n }\n });\n\n addEffectsForTarget(key, root, instance, listContainer, elements);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -7,7 +7,16 @@ var _utilities = require("./utilities");
7
7
  const handlerMap = new WeakMap();
8
8
  function addAnimationEndHandler(source, target, effect, __, globalOptions) {
9
9
  const animation = (0, _motion.getAnimation)(target, (0, _utilities.effectToAnimationOptions)(effect), undefined, globalOptions == null ? void 0 : globalOptions.reducedMotion);
10
+ if (!animation) {
11
+ return;
12
+ }
13
+ const {
14
+ selectorCondition
15
+ } = globalOptions || {};
10
16
  const handler = () => {
17
+ if (selectorCondition && !target.matches(selectorCondition)) {
18
+ return;
19
+ }
11
20
  animation.play();
12
21
  };
13
22
  const cleanup = () => {
@@ -1 +1 @@
1
- {"version":3,"names":["_motion","require","_utilities","handlerMap","WeakMap","addAnimationEndHandler","source","target","effect","__","globalOptions","animation","getAnimation","effectToAnimationOptions","undefined","reducedMotion","handler","play","cleanup","cancel","removeEventListener","handlerObj","addHandlerToMap","addEventListener","removeAnimationEndHandler","element","removeElementFromHandlerMap","_default","exports","default","add","remove"],"sources":["../../../src/handlers/animationEnd.ts"],"sourcesContent":["import type { AnimationGroup } from '@wix/motion';\nimport { getAnimation } from '@wix/motion';\nimport type {\n AnimationEndParams,\n TimeEffect,\n HandlerObjectMap,\n InteractionGlobalOptions,\n} from '../types';\nimport {\n effectToAnimationOptions,\n addHandlerToMap,\n removeElementFromHandlerMap,\n} from './utilities';\n\nconst handlerMap = new WeakMap() as HandlerObjectMap;\n\nfunction addAnimationEndHandler(\n source: HTMLElement,\n target: HTMLElement,\n effect: TimeEffect,\n __: AnimationEndParams,\n globalOptions?: InteractionGlobalOptions,\n): void {\n const animation = getAnimation(\n target,\n effectToAnimationOptions(effect),\n undefined,\n globalOptions?.reducedMotion,\n ) as AnimationGroup;\n\n const handler = () => {\n animation.play();\n };\n const cleanup = () => {\n animation.cancel();\n source.removeEventListener('animationend', handler);\n };\n\n const handlerObj = { source, target, cleanup };\n addHandlerToMap(handlerMap, source, handlerObj);\n addHandlerToMap(handlerMap, target, handlerObj);\n\n source.addEventListener('animationend', handler);\n}\n\nfunction removeAnimationEndHandler(element: HTMLElement): void {\n removeElementFromHandlerMap(handlerMap, element);\n}\n\nexport default {\n add: addAnimationEndHandler,\n remove: removeAnimationEndHandler,\n};\n"],"mappings":";;;;AACA,IAAAA,OAAA,GAAAC,OAAA;AAOA,IAAAC,UAAA,GAAAD,OAAA;AAMA,MAAME,UAAU,GAAG,IAAIC,OAAO,CAAC,CAAqB;AAEpD,SAASC,sBAAsBA,CAC7BC,MAAmB,EACnBC,MAAmB,EACnBC,MAAkB,EAClBC,EAAsB,EACtBC,aAAwC,EAClC;EACN,MAAMC,SAAS,GAAG,IAAAC,oBAAY,EAC5BL,MAAM,EACN,IAAAM,mCAAwB,EAACL,MAAM,CAAC,EAChCM,SAAS,EACTJ,aAAa,oBAAbA,aAAa,CAAEK,aACjB,CAAmB;EAEnB,MAAMC,OAAO,GAAGA,CAAA,KAAM;IACpBL,SAAS,CAACM,IAAI,CAAC,CAAC;EAClB,CAAC;EACD,MAAMC,OAAO,GAAGA,CAAA,KAAM;IACpBP,SAAS,CAACQ,MAAM,CAAC,CAAC;IAClBb,MAAM,CAACc,mBAAmB,CAAC,cAAc,EAAEJ,OAAO,CAAC;EACrD,CAAC;EAED,MAAMK,UAAU,GAAG;IAAEf,MAAM;IAAEC,MAAM;IAAEW;EAAQ,CAAC;EAC9C,IAAAI,0BAAe,EAACnB,UAAU,EAAEG,MAAM,EAAEe,UAAU,CAAC;EAC/C,IAAAC,0BAAe,EAACnB,UAAU,EAAEI,MAAM,EAAEc,UAAU,CAAC;EAE/Cf,MAAM,CAACiB,gBAAgB,CAAC,cAAc,EAAEP,OAAO,CAAC;AAClD;AAEA,SAASQ,yBAAyBA,CAACC,OAAoB,EAAQ;EAC7D,IAAAC,sCAA2B,EAACvB,UAAU,EAAEsB,OAAO,CAAC;AAClD;AAAC,IAAAE,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEc;EACbC,GAAG,EAAEzB,sBAAsB;EAC3B0B,MAAM,EAAEP;AACV,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_motion","require","_utilities","handlerMap","WeakMap","addAnimationEndHandler","source","target","effect","__","globalOptions","animation","getAnimation","effectToAnimationOptions","undefined","reducedMotion","selectorCondition","handler","matches","play","cleanup","cancel","removeEventListener","handlerObj","addHandlerToMap","addEventListener","removeAnimationEndHandler","element","removeElementFromHandlerMap","_default","exports","default","add","remove"],"sources":["../../../src/handlers/animationEnd.ts"],"sourcesContent":["import type { AnimationGroup } from '@wix/motion';\nimport { getAnimation } from '@wix/motion';\nimport type {\n AnimationEndParams,\n TimeEffect,\n HandlerObjectMap,\n InteractionGlobalOptions,\n} from '../types';\nimport {\n effectToAnimationOptions,\n addHandlerToMap,\n removeElementFromHandlerMap,\n} from './utilities';\n\nconst handlerMap = new WeakMap() as HandlerObjectMap;\n\nfunction addAnimationEndHandler(\n source: HTMLElement,\n target: HTMLElement,\n effect: TimeEffect,\n __: AnimationEndParams,\n globalOptions?: InteractionGlobalOptions,\n): void {\n const animation = getAnimation(\n target,\n effectToAnimationOptions(effect),\n undefined,\n globalOptions?.reducedMotion,\n ) as AnimationGroup;\n\n if (!animation) {\n return;\n }\n\n const { selectorCondition } = globalOptions || {};\n const handler = () => {\n if (selectorCondition && !target.matches(selectorCondition)) {\n return;\n }\n animation.play();\n };\n const cleanup = () => {\n animation.cancel();\n source.removeEventListener('animationend', handler);\n };\n\n const handlerObj = { source, target, cleanup };\n addHandlerToMap(handlerMap, source, handlerObj);\n addHandlerToMap(handlerMap, target, handlerObj);\n\n source.addEventListener('animationend', handler);\n}\n\nfunction removeAnimationEndHandler(element: HTMLElement): void {\n removeElementFromHandlerMap(handlerMap, element);\n}\n\nexport default {\n add: addAnimationEndHandler,\n remove: removeAnimationEndHandler,\n};\n"],"mappings":";;;;AACA,IAAAA,OAAA,GAAAC,OAAA;AAOA,IAAAC,UAAA,GAAAD,OAAA;AAMA,MAAME,UAAU,GAAG,IAAIC,OAAO,CAAC,CAAqB;AAEpD,SAASC,sBAAsBA,CAC7BC,MAAmB,EACnBC,MAAmB,EACnBC,MAAkB,EAClBC,EAAsB,EACtBC,aAAwC,EAClC;EACN,MAAMC,SAAS,GAAG,IAAAC,oBAAY,EAC5BL,MAAM,EACN,IAAAM,mCAAwB,EAACL,MAAM,CAAC,EAChCM,SAAS,EACTJ,aAAa,oBAAbA,aAAa,CAAEK,aACjB,CAAmB;EAEnB,IAAI,CAACJ,SAAS,EAAE;IACd;EACF;EAEA,MAAM;IAAEK;EAAkB,CAAC,GAAGN,aAAa,IAAI,CAAC,CAAC;EACjD,MAAMO,OAAO,GAAGA,CAAA,KAAM;IACpB,IAAID,iBAAiB,IAAI,CAACT,MAAM,CAACW,OAAO,CAACF,iBAAiB,CAAC,EAAE;MAC3D;IACF;IACAL,SAAS,CAACQ,IAAI,CAAC,CAAC;EAClB,CAAC;EACD,MAAMC,OAAO,GAAGA,CAAA,KAAM;IACpBT,SAAS,CAACU,MAAM,CAAC,CAAC;IAClBf,MAAM,CAACgB,mBAAmB,CAAC,cAAc,EAAEL,OAAO,CAAC;EACrD,CAAC;EAED,MAAMM,UAAU,GAAG;IAAEjB,MAAM;IAAEC,MAAM;IAAEa;EAAQ,CAAC;EAC9C,IAAAI,0BAAe,EAACrB,UAAU,EAAEG,MAAM,EAAEiB,UAAU,CAAC;EAC/C,IAAAC,0BAAe,EAACrB,UAAU,EAAEI,MAAM,EAAEgB,UAAU,CAAC;EAE/CjB,MAAM,CAACmB,gBAAgB,CAAC,cAAc,EAAER,OAAO,CAAC;AAClD;AAEA,SAASS,yBAAyBA,CAACC,OAAoB,EAAQ;EAC7D,IAAAC,sCAA2B,EAACzB,UAAU,EAAEwB,OAAO,CAAC;AAClD;AAAC,IAAAE,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEc;EACbC,GAAG,EAAE3B,sBAAsB;EAC3B4B,MAAM,EAAEP;AACV,CAAC","ignoreList":[]}
@@ -7,9 +7,18 @@ var _utilities = require("./utilities");
7
7
  const handlerMap = new WeakMap();
8
8
  function createTimeEffectHandler(element, effect, options, globalOptions) {
9
9
  const animation = (0, _motion.getAnimation)(element, (0, _utilities.effectToAnimationOptions)(effect), undefined, globalOptions == null ? void 0 : globalOptions.reducedMotion);
10
+ if (!animation) {
11
+ return;
12
+ }
10
13
  let initialPlay = true;
11
14
  const type = options.type || 'alternate';
15
+ const {
16
+ selectorCondition
17
+ } = globalOptions || {};
12
18
  return event => {
19
+ if (selectorCondition && !element.matches(selectorCondition)) {
20
+ return;
21
+ }
13
22
  if (type === 'alternate') {
14
23
  if (initialPlay) {
15
24
  initialPlay = false;
@@ -46,9 +55,12 @@ function createTransitionHandler(element, {
46
55
  effectId,
47
56
  listContainer,
48
57
  listItemSelector
49
- }, options) {
58
+ }, options, selectorCondition) {
50
59
  const shouldSetStateOnElement = !!listContainer;
51
60
  return event => {
61
+ if (selectorCondition && !element.matches(selectorCondition)) {
62
+ return;
63
+ }
52
64
  const interactElement = element.closest('interact-element');
53
65
  if (!interactElement) {
54
66
  return;
@@ -64,13 +76,17 @@ function addClickHandler(source, target, effect, options = {}, globalOptions) {
64
76
  let handler;
65
77
  let once = false;
66
78
  if (effect.transition || effect.transitionProperties) {
67
- handler = createTransitionHandler(target, effect, options);
79
+ handler = createTransitionHandler(target, effect, options, globalOptions == null ? void 0 : globalOptions.selectorCondition);
68
80
  } else {
69
81
  handler = createTimeEffectHandler(target, effect, options, {
70
- reducedMotion: globalOptions == null ? void 0 : globalOptions.reducedMotion
82
+ reducedMotion: globalOptions == null ? void 0 : globalOptions.reducedMotion,
83
+ selectorCondition: globalOptions == null ? void 0 : globalOptions.selectorCondition
71
84
  });
72
85
  once = options.type === 'once';
73
86
  }
87
+ if (!handler) {
88
+ return;
89
+ }
74
90
  const cleanup = () => {
75
91
  source.removeEventListener('click', handler);
76
92
  if (globalOptions != null && globalOptions.allowA11yTriggers) {
@@ -1 +1 @@
1
- {"version":3,"names":["_motion","require","_utilities","handlerMap","WeakMap","createTimeEffectHandler","element","effect","options","globalOptions","animation","getAnimation","effectToAnimationOptions","undefined","reducedMotion","initialPlay","type","event","play","reverse","playState","pause","progress","isCSS","onFinish","dataset","motionEnter","createTransitionHandler","effectId","listContainer","listItemSelector","shouldSetStateOnElement","interactElement","closest","item","toggleEffect","method","addClickHandler","source","target","handler","once","transition","transitionProperties","cleanup","removeEventListener","allowA11yTriggers","handlerObj","addHandlerToMap","addEventListener","e","pointerType","passive","tabIndex","code","preventDefault","removeClickHandler","removeElementFromHandlerMap","_default","exports","default","add","remove"],"sources":["../../../src/handlers/click.ts"],"sourcesContent":["import { getAnimation } from '@wix/motion';\nimport type { AnimationGroup } from '@wix/motion';\nimport type {\n TimeEffect,\n TransitionEffect,\n StateParams,\n HandlerObjectMap,\n IInteractElement,\n PointerTriggerParams,\n EffectBase,\n InteractionGlobalOptions,\n} from '../types';\nimport {\n effectToAnimationOptions,\n addHandlerToMap,\n removeElementFromHandlerMap,\n} from './utilities';\n\nconst handlerMap = new WeakMap() as HandlerObjectMap;\n\nfunction createTimeEffectHandler(\n element: HTMLElement,\n effect: TimeEffect & EffectBase,\n options: PointerTriggerParams,\n globalOptions: InteractionGlobalOptions,\n) {\n const animation = getAnimation(\n element,\n effectToAnimationOptions(effect),\n undefined,\n globalOptions?.reducedMotion,\n ) as AnimationGroup;\n let initialPlay = true;\n const type = options.type || 'alternate';\n\n return (event: MouseEvent | KeyboardEvent) => {\n if (type === 'alternate') {\n if (initialPlay) {\n initialPlay = false;\n animation.play();\n } else {\n animation.reverse();\n }\n } else if (type === 'state') {\n if (initialPlay) {\n initialPlay = false;\n animation.play();\n } else {\n if (animation.playState === 'running') {\n animation.pause();\n } else if (animation.playState !== 'finished') {\n // 'idle' OR 'paused'\n animation.play();\n }\n }\n } else {\n // type === 'repeat'\n // type === 'once'\n animation.progress(0);\n\n if (animation.isCSS) {\n animation.onFinish(() => {\n element.dataset.motionEnter = 'done';\n });\n }\n\n animation.play();\n }\n };\n}\n\nfunction createTransitionHandler(\n element: HTMLElement,\n {\n effectId,\n listContainer,\n listItemSelector,\n }: TransitionEffect & EffectBase & { effectId: string },\n options: StateParams,\n) {\n const shouldSetStateOnElement = !!listContainer;\n\n return (event: MouseEvent | KeyboardEvent) => {\n const interactElement = element.closest(\n 'interact-element',\n ) as IInteractElement;\n if (!interactElement) {\n return;\n }\n\n let item;\n if (shouldSetStateOnElement) {\n item = element.closest(\n `${listContainer} > ${listItemSelector || ''}:has(:scope)`,\n ) as HTMLElement | null;\n }\n\n interactElement.toggleEffect(effectId, options.method || 'toggle', item);\n };\n}\n\nfunction addClickHandler(\n source: HTMLElement,\n target: HTMLElement,\n effect: (TimeEffect | TransitionEffect) & EffectBase,\n options: StateParams | PointerTriggerParams = {} as StateParams,\n globalOptions?: InteractionGlobalOptions,\n) {\n let handler: (event: MouseEvent | KeyboardEvent) => void;\n let once = false;\n\n if (\n (effect as TransitionEffect).transition ||\n (effect as TransitionEffect).transitionProperties\n ) {\n handler = createTransitionHandler(\n target,\n effect as TransitionEffect & EffectBase & { effectId: string },\n options as StateParams,\n );\n } else {\n handler = createTimeEffectHandler(\n target,\n effect as TimeEffect & EffectBase,\n options as PointerTriggerParams,\n { reducedMotion: globalOptions?.reducedMotion },\n );\n once = (options as PointerTriggerParams).type === 'once';\n }\n\n const cleanup = () => {\n source.removeEventListener('click', handler);\n if (globalOptions?.allowA11yTriggers) {\n source.removeEventListener('keydown', handler);\n }\n };\n\n const handlerObj = { source, target, cleanup };\n\n addHandlerToMap(handlerMap, source, handlerObj);\n addHandlerToMap(handlerMap, target, handlerObj);\n\n source.addEventListener(\n 'click',\n (e) => {\n if ((e as PointerEvent).pointerType) {\n handler(e);\n }\n },\n { passive: true, once },\n );\n\n if (globalOptions?.allowA11yTriggers) {\n source.tabIndex = 0;\n\n source.addEventListener(\n 'keydown',\n (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n event.preventDefault();\n handler(event);\n } else if (event.code === 'Enter') {\n handler(event);\n }\n },\n { once },\n );\n }\n}\n\nfunction removeClickHandler(element: HTMLElement) {\n removeElementFromHandlerMap(handlerMap, element);\n}\n\nexport default {\n add: addClickHandler,\n remove: removeClickHandler,\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_motion","require","_utilities","handlerMap","WeakMap","createTimeEffectHandler","element","effect","options","globalOptions","animation","getAnimation","effectToAnimationOptions","undefined","reducedMotion","initialPlay","type","selectorCondition","event","matches","play","reverse","playState","pause","progress","isCSS","onFinish","dataset","motionEnter","createTransitionHandler","effectId","listContainer","listItemSelector","shouldSetStateOnElement","interactElement","closest","item","toggleEffect","method","addClickHandler","source","target","handler","once","transition","transitionProperties","cleanup","removeEventListener","allowA11yTriggers","handlerObj","addHandlerToMap","addEventListener","e","pointerType","passive","tabIndex","code","preventDefault","removeClickHandler","removeElementFromHandlerMap","_default","exports","default","add","remove"],"sources":["../../../src/handlers/click.ts"],"sourcesContent":["import { getAnimation } from '@wix/motion';\nimport type { AnimationGroup } from '@wix/motion';\nimport type {\n TimeEffect,\n TransitionEffect,\n StateParams,\n HandlerObjectMap,\n IInteractElement,\n PointerTriggerParams,\n EffectBase,\n InteractionGlobalOptions,\n} from '../types';\nimport {\n effectToAnimationOptions,\n addHandlerToMap,\n removeElementFromHandlerMap,\n} from './utilities';\n\nconst handlerMap = new WeakMap() as HandlerObjectMap;\n\nfunction createTimeEffectHandler(\n element: HTMLElement,\n effect: TimeEffect & EffectBase,\n options: PointerTriggerParams,\n globalOptions: InteractionGlobalOptions,\n) {\n const animation = getAnimation(\n element,\n effectToAnimationOptions(effect),\n undefined,\n globalOptions?.reducedMotion,\n ) as AnimationGroup;\n\n if (!animation) {\n return;\n }\n\n let initialPlay = true;\n const type = options.type || 'alternate';\n const { selectorCondition } = globalOptions || {};\n return (event: MouseEvent | KeyboardEvent) => {\n if (selectorCondition && !element.matches(selectorCondition)) {\n return;\n }\n\n if (type === 'alternate') {\n if (initialPlay) {\n initialPlay = false;\n animation.play();\n } else {\n animation.reverse();\n }\n } else if (type === 'state') {\n if (initialPlay) {\n initialPlay = false;\n animation.play();\n } else {\n if (animation.playState === 'running') {\n animation.pause();\n } else if (animation.playState !== 'finished') {\n // 'idle' OR 'paused'\n animation.play();\n }\n }\n } else {\n // type === 'repeat'\n // type === 'once'\n animation.progress(0);\n\n if (animation.isCSS) {\n animation.onFinish(() => {\n element.dataset.motionEnter = 'done';\n });\n }\n\n animation.play();\n }\n };\n}\n\nfunction createTransitionHandler(\n element: HTMLElement,\n {\n effectId,\n listContainer,\n listItemSelector,\n }: TransitionEffect & EffectBase & { effectId: string },\n options: StateParams,\n selectorCondition?: string,\n) {\n const shouldSetStateOnElement = !!listContainer;\n\n return (event: MouseEvent | KeyboardEvent) => {\n if (selectorCondition && !element.matches(selectorCondition)) {\n return;\n }\n const interactElement = element.closest(\n 'interact-element',\n ) as IInteractElement;\n if (!interactElement) {\n return;\n }\n\n let item;\n if (shouldSetStateOnElement) {\n item = element.closest(\n `${listContainer} > ${listItemSelector || ''}:has(:scope)`,\n ) as HTMLElement | null;\n }\n\n interactElement.toggleEffect(effectId, options.method || 'toggle', item);\n };\n}\n\nfunction addClickHandler(\n source: HTMLElement,\n target: HTMLElement,\n effect: (TimeEffect | TransitionEffect) & EffectBase,\n options: StateParams | PointerTriggerParams = {} as StateParams,\n globalOptions?: InteractionGlobalOptions,\n) {\n let handler: ((event: MouseEvent | KeyboardEvent) => void) | undefined;\n let once = false;\n\n if (\n (effect as TransitionEffect).transition ||\n (effect as TransitionEffect).transitionProperties\n ) {\n handler = createTransitionHandler(\n target,\n effect as TransitionEffect & EffectBase & { effectId: string },\n options as StateParams,\n globalOptions?.selectorCondition,\n );\n } else {\n handler = createTimeEffectHandler(\n target,\n effect as TimeEffect & EffectBase,\n options as PointerTriggerParams,\n {\n reducedMotion: globalOptions?.reducedMotion,\n selectorCondition: globalOptions?.selectorCondition,\n },\n );\n once = (options as PointerTriggerParams).type === 'once';\n }\n\n if (!handler) {\n return;\n }\n\n const cleanup = () => {\n source.removeEventListener('click', handler!);\n if (globalOptions?.allowA11yTriggers) {\n source.removeEventListener('keydown', handler!);\n }\n };\n\n const handlerObj = { source, target, cleanup };\n\n addHandlerToMap(handlerMap, source, handlerObj);\n addHandlerToMap(handlerMap, target, handlerObj);\n\n source.addEventListener(\n 'click',\n (e) => {\n if ((e as PointerEvent).pointerType) {\n handler!(e);\n }\n },\n { passive: true, once },\n );\n\n if (globalOptions?.allowA11yTriggers) {\n source.tabIndex = 0;\n\n source.addEventListener(\n 'keydown',\n (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n event.preventDefault();\n handler!(event);\n } else if (event.code === 'Enter') {\n handler!(event);\n }\n },\n { once },\n );\n }\n}\n\nfunction removeClickHandler(element: HTMLElement) {\n removeElementFromHandlerMap(handlerMap, element);\n}\n\nexport default {\n add: addClickHandler,\n remove: removeClickHandler,\n};\n"],"mappings":"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","ignoreList":[]}
@@ -7,9 +7,18 @@ var _utilities = require("./utilities");
7
7
  const handlerMap = new WeakMap();
8
8
  function createTimeEffectHandler(element, effect, options, globalOptions) {
9
9
  const animation = (0, _motion.getAnimation)(element, (0, _utilities.effectToAnimationOptions)(effect), undefined, globalOptions == null ? void 0 : globalOptions.reducedMotion);
10
+ if (!animation) {
11
+ return;
12
+ }
10
13
  const type = options.type || 'alternate';
14
+ const {
15
+ selectorCondition
16
+ } = globalOptions || {};
11
17
  let initialPlay = true;
12
18
  return event => {
19
+ if (selectorCondition && !element.matches(selectorCondition)) {
20
+ return;
21
+ }
13
22
  if (event.type === 'mouseenter' || event.type === 'focusin') {
14
23
  if (type === 'alternate') {
15
24
  if (initialPlay) {
@@ -52,11 +61,14 @@ function createTransitionHandler(element, {
52
61
  effectId,
53
62
  listContainer,
54
63
  listItemSelector
55
- }, options) {
64
+ }, options, selectorCondition) {
56
65
  const method = options.method || 'toggle';
57
66
  const isToggle = method === 'toggle';
58
67
  const shouldSetStateOnElement = !!listContainer;
59
68
  return event => {
69
+ if (selectorCondition && !element.matches(selectorCondition)) {
70
+ return;
71
+ }
60
72
  const interactElement = element.closest('interact-element');
61
73
  if (!interactElement) {
62
74
  return;
@@ -78,14 +90,18 @@ function addHoverHandler(source, target, effect, options = {}, globalOptions) {
78
90
  let isStateTrigger = false;
79
91
  let once = false;
80
92
  if (effect.transition || effect.transitionProperties) {
81
- handler = createTransitionHandler(target, effect, options);
93
+ handler = createTransitionHandler(target, effect, options, globalOptions == null ? void 0 : globalOptions.selectorCondition);
82
94
  isStateTrigger = true;
83
95
  } else {
84
96
  handler = createTimeEffectHandler(target, effect, options, {
85
- reducedMotion: globalOptions == null ? void 0 : globalOptions.reducedMotion
97
+ reducedMotion: globalOptions == null ? void 0 : globalOptions.reducedMotion,
98
+ selectorCondition: globalOptions == null ? void 0 : globalOptions.selectorCondition
86
99
  });
87
100
  once = options.type === 'once';
88
101
  }
102
+ if (!handler) {
103
+ return;
104
+ }
89
105
  const cleanup = () => {
90
106
  source.removeEventListener('mouseenter', handler);
91
107
  source.removeEventListener('mouseleave', handler);
@@ -1 +1 @@
1
- {"version":3,"names":["_motion","require","_utilities","handlerMap","WeakMap","createTimeEffectHandler","element","effect","options","globalOptions","animation","getAnimation","effectToAnimationOptions","undefined","reducedMotion","type","initialPlay","event","play","reverse","playState","progress","isCSS","onFinish","dataset","motionEnter","cancel","pause","createTransitionHandler","effectId","listContainer","listItemSelector","method","isToggle","shouldSetStateOnElement","interactElement","closest","item","method_","toggleEffect","addHoverHandler","source","target","handler","isStateTrigger","once","transition","transitionProperties","cleanup","removeEventListener","allowA11yTriggers","handlerObj","addHandlerToMap","tabIndex","addEventListener","contains","relatedTarget","passive","addLeave","removeHoverHandler","removeElementFromHandlerMap","_default","exports","default","add","remove"],"sources":["../../../src/handlers/hover.ts"],"sourcesContent":["import type { AnimationGroup } from '@wix/motion';\nimport { getAnimation } from '@wix/motion';\nimport type {\n TimeEffect,\n TransitionEffect,\n StateParams,\n HandlerObjectMap,\n IInteractElement,\n PointerTriggerParams,\n EffectBase,\n InteractionGlobalOptions,\n} from '../types';\nimport {\n effectToAnimationOptions,\n addHandlerToMap,\n removeElementFromHandlerMap,\n} from './utilities';\n\nconst handlerMap = new WeakMap() as HandlerObjectMap;\n\nfunction createTimeEffectHandler(\n element: HTMLElement,\n effect: TimeEffect & EffectBase,\n options: PointerTriggerParams,\n globalOptions: InteractionGlobalOptions,\n) {\n const animation = getAnimation(\n element,\n effectToAnimationOptions(effect),\n undefined,\n globalOptions?.reducedMotion,\n ) as AnimationGroup;\n const type = options.type || 'alternate';\n let initialPlay = true;\n\n return (event: MouseEvent | FocusEvent) => {\n if (event.type === 'mouseenter' || event.type === 'focusin') {\n if (type === 'alternate') {\n if (initialPlay) {\n initialPlay = false;\n animation.play();\n } else {\n animation.reverse();\n }\n } else if (type === 'state') {\n if (animation.playState !== 'finished') {\n // 'idle' OR 'paused'\n animation.play();\n }\n } else {\n // type === 'repeat'\n // type === 'once'\n animation.progress(0);\n\n if (animation.isCSS) {\n animation.onFinish(() => {\n element.dataset.motionEnter = 'done';\n });\n }\n\n animation.play();\n }\n } else if (event.type === 'mouseleave' || event.type === 'focusout') {\n if (type === 'alternate') {\n animation.reverse();\n } else if (type === 'repeat') {\n animation.cancel();\n delete element.dataset.motionEnter;\n } else if (type === 'state') {\n if (animation.playState === 'running') {\n animation.pause();\n }\n }\n }\n };\n}\n\nfunction createTransitionHandler(\n element: HTMLElement,\n {\n effectId,\n listContainer,\n listItemSelector,\n }: TransitionEffect & EffectBase & { effectId: string },\n options: StateParams,\n) {\n const method = options.method || 'toggle';\n const isToggle = method === 'toggle';\n const shouldSetStateOnElement = !!listContainer;\n\n return (event: MouseEvent | FocusEvent) => {\n const interactElement = element.closest(\n 'interact-element',\n ) as IInteractElement;\n if (!interactElement) {\n return;\n }\n\n let item;\n if (shouldSetStateOnElement) {\n item = element.closest(\n `${listContainer} > ${listItemSelector || ''}:has(:scope)`,\n ) as HTMLElement | null;\n }\n\n if (event.type === 'mouseenter' || event.type === 'focusin') {\n const method_ = isToggle ? 'add' : method;\n interactElement.toggleEffect(effectId, method_, item);\n } else if (\n (event.type === 'mouseleave' || event.type === 'focusout') &&\n isToggle\n ) {\n interactElement.toggleEffect(effectId, 'remove', item);\n }\n };\n}\n\nfunction addHoverHandler(\n source: HTMLElement,\n target: HTMLElement,\n effect: (TransitionEffect | TimeEffect) & EffectBase,\n options: StateParams | PointerTriggerParams = {},\n globalOptions: InteractionGlobalOptions,\n) {\n let handler: (event: MouseEvent | FocusEvent) => void;\n let isStateTrigger = false;\n let once = false;\n\n if (\n (effect as TransitionEffect).transition ||\n (effect as TransitionEffect).transitionProperties\n ) {\n handler = createTransitionHandler(\n target,\n effect as TransitionEffect & EffectBase & { effectId: string },\n options as StateParams,\n );\n isStateTrigger = true;\n } else {\n handler = createTimeEffectHandler(\n target,\n effect as TimeEffect & EffectBase,\n options as PointerTriggerParams,\n { reducedMotion: globalOptions?.reducedMotion },\n );\n once = (options as PointerTriggerParams).type === 'once';\n }\n\n const cleanup = () => {\n source.removeEventListener('mouseenter', handler);\n source.removeEventListener('mouseleave', handler);\n if (globalOptions?.allowA11yTriggers) {\n source.removeEventListener('focusin', handler);\n source.removeEventListener('focusout', handler);\n }\n };\n\n const handlerObj = { source, target, cleanup };\n\n addHandlerToMap(handlerMap, source, handlerObj);\n addHandlerToMap(handlerMap, target, handlerObj);\n\n if (globalOptions?.allowA11yTriggers) {\n source.tabIndex = 0;\n source.addEventListener(\n 'focusin',\n (event) => {\n if (!source.contains(event.relatedTarget as HTMLElement)) {\n handler(event);\n }\n },\n { once },\n );\n }\n\n source.addEventListener('mouseenter', handler, { passive: true, once });\n\n const addLeave = isStateTrigger\n ? ((options as StateParams).method || 'toggle') === 'toggle'\n : (options as PointerTriggerParams).type !== 'once';\n\n if (addLeave) {\n source.addEventListener('mouseleave', handler, { passive: true });\n\n if (globalOptions?.allowA11yTriggers) {\n source.addEventListener(\n 'focusout',\n (event) => {\n if (!source.contains(event.relatedTarget as HTMLElement)) {\n handler(event);\n }\n },\n { once },\n );\n }\n }\n}\n\nfunction removeHoverHandler(element: HTMLElement) {\n removeElementFromHandlerMap(handlerMap, element);\n}\n\nexport default {\n add: addHoverHandler,\n remove: removeHoverHandler,\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_motion","require","_utilities","handlerMap","WeakMap","createTimeEffectHandler","element","effect","options","globalOptions","animation","getAnimation","effectToAnimationOptions","undefined","reducedMotion","type","selectorCondition","initialPlay","event","matches","play","reverse","playState","progress","isCSS","onFinish","dataset","motionEnter","cancel","pause","createTransitionHandler","effectId","listContainer","listItemSelector","method","isToggle","shouldSetStateOnElement","interactElement","closest","item","method_","toggleEffect","addHoverHandler","source","target","handler","isStateTrigger","once","transition","transitionProperties","cleanup","removeEventListener","allowA11yTriggers","handlerObj","addHandlerToMap","tabIndex","addEventListener","contains","relatedTarget","passive","addLeave","removeHoverHandler","removeElementFromHandlerMap","_default","exports","default","add","remove"],"sources":["../../../src/handlers/hover.ts"],"sourcesContent":["import type { AnimationGroup } from '@wix/motion';\nimport { getAnimation } from '@wix/motion';\nimport type {\n TimeEffect,\n TransitionEffect,\n StateParams,\n HandlerObjectMap,\n IInteractElement,\n PointerTriggerParams,\n EffectBase,\n InteractionGlobalOptions,\n} from '../types';\nimport {\n effectToAnimationOptions,\n addHandlerToMap,\n removeElementFromHandlerMap,\n} from './utilities';\n\nconst handlerMap = new WeakMap() as HandlerObjectMap;\n\nfunction createTimeEffectHandler(\n element: HTMLElement,\n effect: TimeEffect & EffectBase,\n options: PointerTriggerParams,\n globalOptions: InteractionGlobalOptions,\n) {\n const animation = getAnimation(\n element,\n effectToAnimationOptions(effect),\n undefined,\n globalOptions?.reducedMotion,\n ) as AnimationGroup;\n\n if (!animation) {\n return;\n }\n\n const type = options.type || 'alternate';\n const { selectorCondition } = globalOptions || {};\n\n let initialPlay = true;\n\n return (event: MouseEvent | FocusEvent) => {\n if (selectorCondition && !element.matches(selectorCondition)) {\n return;\n }\n if (event.type === 'mouseenter' || event.type === 'focusin') {\n if (type === 'alternate') {\n if (initialPlay) {\n initialPlay = false;\n animation.play();\n } else {\n animation.reverse();\n }\n } else if (type === 'state') {\n if (animation.playState !== 'finished') {\n // 'idle' OR 'paused'\n animation.play();\n }\n } else {\n // type === 'repeat'\n // type === 'once'\n animation.progress(0);\n\n if (animation.isCSS) {\n animation.onFinish(() => {\n element.dataset.motionEnter = 'done';\n });\n }\n\n animation.play();\n }\n } else if (event.type === 'mouseleave' || event.type === 'focusout') {\n if (type === 'alternate') {\n animation.reverse();\n } else if (type === 'repeat') {\n animation.cancel();\n delete element.dataset.motionEnter;\n } else if (type === 'state') {\n if (animation.playState === 'running') {\n animation.pause();\n }\n }\n }\n };\n}\n\nfunction createTransitionHandler(\n element: HTMLElement,\n {\n effectId,\n listContainer,\n listItemSelector,\n }: TransitionEffect & EffectBase & { effectId: string },\n options: StateParams,\n selectorCondition?: string,\n) {\n const method = options.method || 'toggle';\n const isToggle = method === 'toggle';\n const shouldSetStateOnElement = !!listContainer;\n\n return (event: MouseEvent | FocusEvent) => {\n if (selectorCondition && !element.matches(selectorCondition)) {\n return;\n }\n\n const interactElement = element.closest(\n 'interact-element',\n ) as IInteractElement;\n\n if (!interactElement) {\n return;\n }\n\n let item;\n if (shouldSetStateOnElement) {\n item = element.closest(\n `${listContainer} > ${listItemSelector || ''}:has(:scope)`,\n ) as HTMLElement | null;\n }\n\n if (event.type === 'mouseenter' || event.type === 'focusin') {\n const method_ = isToggle ? 'add' : method;\n interactElement.toggleEffect(effectId, method_, item);\n } else if (\n (event.type === 'mouseleave' || event.type === 'focusout') &&\n isToggle\n ) {\n interactElement.toggleEffect(effectId, 'remove', item);\n }\n };\n}\n\nfunction addHoverHandler(\n source: HTMLElement,\n target: HTMLElement,\n effect: (TransitionEffect | TimeEffect) & EffectBase,\n options: StateParams | PointerTriggerParams = {},\n globalOptions: InteractionGlobalOptions,\n) {\n let handler: ((event: MouseEvent | FocusEvent) => void) | undefined;\n let isStateTrigger = false;\n let once = false;\n\n if (\n (effect as TransitionEffect).transition ||\n (effect as TransitionEffect).transitionProperties\n ) {\n handler = createTransitionHandler(\n target,\n effect as TransitionEffect & EffectBase & { effectId: string },\n options as StateParams,\n globalOptions?.selectorCondition,\n );\n isStateTrigger = true;\n } else {\n handler = createTimeEffectHandler(\n target,\n effect as TimeEffect & EffectBase,\n options as PointerTriggerParams,\n {\n reducedMotion: globalOptions?.reducedMotion,\n selectorCondition: globalOptions?.selectorCondition,\n },\n );\n once = (options as PointerTriggerParams).type === 'once';\n }\n\n if (!handler) {\n return;\n }\n\n const cleanup = () => {\n source.removeEventListener('mouseenter', handler!);\n source.removeEventListener('mouseleave', handler!);\n if (globalOptions?.allowA11yTriggers) {\n source.removeEventListener('focusin', handler!);\n source.removeEventListener('focusout', handler!);\n }\n };\n\n const handlerObj = { source, target, cleanup };\n\n addHandlerToMap(handlerMap, source, handlerObj);\n addHandlerToMap(handlerMap, target, handlerObj);\n\n if (globalOptions?.allowA11yTriggers) {\n source.tabIndex = 0;\n source.addEventListener(\n 'focusin',\n (event) => {\n if (!source.contains(event.relatedTarget as HTMLElement)) {\n handler!(event);\n }\n },\n { once },\n );\n }\n\n source.addEventListener('mouseenter', handler!, { passive: true, once });\n\n const addLeave = isStateTrigger\n ? ((options as StateParams).method || 'toggle') === 'toggle'\n : (options as PointerTriggerParams).type !== 'once';\n\n if (addLeave) {\n source.addEventListener('mouseleave', handler!, { passive: true });\n\n if (globalOptions?.allowA11yTriggers) {\n source.addEventListener(\n 'focusout',\n (event) => {\n if (!source.contains(event.relatedTarget as HTMLElement)) {\n handler!(event);\n }\n },\n { once },\n );\n }\n }\n}\n\nfunction removeHoverHandler(element: HTMLElement) {\n removeElementFromHandlerMap(handlerMap, element);\n}\n\nexport default {\n add: addHoverHandler,\n remove: removeHoverHandler,\n};\n"],"mappings":"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","ignoreList":[]}
@@ -81,17 +81,26 @@ function getObserver(options, isSafeMode = false) {
81
81
  return observer;
82
82
  }
83
83
  function addViewEnterHandler(source, target, effect, options = {}, globalOptions) {
84
+ const animation = (0, _motion.getAnimation)(target, (0, _utilities.effectToAnimationOptions)(effect), undefined, globalOptions == null ? void 0 : globalOptions.reducedMotion);
85
+ if (!animation) {
86
+ return;
87
+ }
84
88
  const observer = getObserver({
85
89
  ...viewEnterOptions,
86
90
  ...options
87
91
  });
88
- const animation = (0, _motion.getAnimation)(target, (0, _utilities.effectToAnimationOptions)(effect), undefined, globalOptions == null ? void 0 : globalOptions.reducedMotion);
89
92
  if (animation != null && animation.isCSS && options.type === 'once') {
90
93
  animation.onFinish(() => {
91
94
  target.dataset.motionEnter = 'done';
92
95
  });
93
96
  }
97
+ const {
98
+ selectorCondition
99
+ } = globalOptions || {};
94
100
  const handler = () => {
101
+ if (selectorCondition && !target.matches(selectorCondition)) {
102
+ return;
103
+ }
95
104
  animation.play(() => {
96
105
  if (!animation.isCSS) {
97
106
  target.dataset.motionEnter = 'done';