@wix/interact 1.90.0 → 1.92.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 (51) hide show
  1. package/dist/cjs/__tests__/interact.spec.js +130 -1
  2. package/dist/cjs/__tests__/interact.spec.js.map +1 -1
  3. package/dist/cjs/core/Interact.js +4 -0
  4. package/dist/cjs/core/Interact.js.map +1 -1
  5. package/dist/cjs/core/add.js +4 -1
  6. package/dist/cjs/core/add.js.map +1 -1
  7. package/dist/cjs/handlers/animationEnd.js +2 -2
  8. package/dist/cjs/handlers/animationEnd.js.map +1 -1
  9. package/dist/cjs/handlers/click.js +29 -7
  10. package/dist/cjs/handlers/click.js.map +1 -1
  11. package/dist/cjs/handlers/hover.js +33 -8
  12. package/dist/cjs/handlers/hover.js.map +1 -1
  13. package/dist/cjs/handlers/index.js +12 -1
  14. package/dist/cjs/handlers/index.js.map +1 -1
  15. package/dist/cjs/handlers/pointerMove.js +3 -3
  16. package/dist/cjs/handlers/pointerMove.js.map +1 -1
  17. package/dist/cjs/handlers/viewEnter.js +2 -2
  18. package/dist/cjs/handlers/viewEnter.js.map +1 -1
  19. package/dist/cjs/handlers/viewProgress.js +2 -2
  20. package/dist/cjs/handlers/viewProgress.js.map +1 -1
  21. package/dist/cjs/types.js.map +1 -1
  22. package/dist/esm/__tests__/interact.spec.js +130 -1
  23. package/dist/esm/__tests__/interact.spec.js.map +1 -1
  24. package/dist/esm/core/Interact.js +4 -0
  25. package/dist/esm/core/Interact.js.map +1 -1
  26. package/dist/esm/core/add.js +4 -1
  27. package/dist/esm/core/add.js.map +1 -1
  28. package/dist/esm/handlers/animationEnd.js +2 -5
  29. package/dist/esm/handlers/animationEnd.js.map +1 -1
  30. package/dist/esm/handlers/click.js +29 -13
  31. package/dist/esm/handlers/click.js.map +1 -1
  32. package/dist/esm/handlers/hover.js +33 -14
  33. package/dist/esm/handlers/hover.js.map +1 -1
  34. package/dist/esm/handlers/index.js +12 -1
  35. package/dist/esm/handlers/index.js.map +1 -1
  36. package/dist/esm/handlers/pointerMove.js +3 -6
  37. package/dist/esm/handlers/pointerMove.js.map +1 -1
  38. package/dist/esm/handlers/viewEnter.js +2 -5
  39. package/dist/esm/handlers/viewEnter.js.map +1 -1
  40. package/dist/esm/handlers/viewProgress.js +2 -5
  41. package/dist/esm/handlers/viewProgress.js.map +1 -1
  42. package/dist/esm/types.js.map +1 -1
  43. package/dist/types/core/Interact.d.ts +2 -0
  44. package/dist/types/handlers/animationEnd.d.ts +2 -2
  45. package/dist/types/handlers/click.d.ts +2 -2
  46. package/dist/types/handlers/hover.d.ts +2 -2
  47. package/dist/types/handlers/pointerMove.d.ts +2 -2
  48. package/dist/types/handlers/viewEnter.d.ts +2 -2
  49. package/dist/types/handlers/viewProgress.d.ts +2 -2
  50. package/dist/types/types.d.ts +8 -2
  51. package/package.json +2 -2
@@ -396,8 +396,9 @@ describe('interact', () => {
396
396
  jest.clearAllMocks();
397
397
  // Clear Interact instances to ensure test isolation
398
398
  _Interact.Interact.destroy();
399
- // Reset forceReducedMotion to default
399
+ // Reset static flags to default
400
400
  _Interact.Interact.forceReducedMotion = false;
401
+ _Interact.Interact.allowA11yTriggers = false;
401
402
  });
402
403
  describe('init Interact instance', () => {
403
404
  it('should initialize with valid config', () => {
@@ -1797,5 +1798,133 @@ describe('interact', () => {
1797
1798
  expect(spy).toHaveBeenCalledWith(pointerOptionsGetter);
1798
1799
  });
1799
1800
  });
1801
+ describe('a11y - accessible triggers', () => {
1802
+ let a11yElement;
1803
+ function getA11yConfig(trigger, key) {
1804
+ return {
1805
+ interactions: [{
1806
+ trigger,
1807
+ key,
1808
+ effects: [{
1809
+ effectId: 'test-effect'
1810
+ }]
1811
+ }],
1812
+ effects: {
1813
+ 'test-effect': {
1814
+ namedEffect: {
1815
+ type: 'BounceIn',
1816
+ power: 'medium'
1817
+ },
1818
+ duration: 500
1819
+ }
1820
+ }
1821
+ };
1822
+ }
1823
+ afterEach(() => {
1824
+ _Interact.Interact.destroy();
1825
+ });
1826
+ describe('activate trigger', () => {
1827
+ it('should add both click and keydown listeners', () => {
1828
+ _Interact.Interact.create(getA11yConfig('activate', 'activate-div'));
1829
+ a11yElement = document.createElement('interact-element');
1830
+ const div = document.createElement('div');
1831
+ a11yElement.append(div);
1832
+ const addEventListenerSpy = jest.spyOn(div, 'addEventListener');
1833
+ (0, _add.add)(a11yElement, 'activate-div');
1834
+ expect(addEventListenerSpy).toHaveBeenCalledWith('click', expect.any(Function), expect.any(Object));
1835
+ expect(addEventListenerSpy).toHaveBeenCalledWith('keydown', expect.any(Function), expect.any(Object));
1836
+ });
1837
+ it('should not double-invoke handler when Enter triggers both keydown and click', () => {
1838
+ const {
1839
+ getWebAnimation
1840
+ } = require('@wix/motion');
1841
+ const mockPlay = getWebAnimation().play;
1842
+ mockPlay.mockClear();
1843
+ _Interact.Interact.create(getA11yConfig('activate', 'activate-handler-test'));
1844
+ a11yElement = document.createElement('interact-element');
1845
+ const button = document.createElement('button');
1846
+ a11yElement.append(button);
1847
+ (0, _add.add)(a11yElement, 'activate-handler-test');
1848
+
1849
+ // Simulate browser behavior: Enter key triggers keydown AND synthesized click with no pointerType
1850
+ button.dispatchEvent(new KeyboardEvent('keydown', {
1851
+ code: 'Enter',
1852
+ bubbles: true
1853
+ }));
1854
+ button.dispatchEvent(new MouseEvent('click', {
1855
+ bubbles: true
1856
+ }));
1857
+ expect(mockPlay).toHaveBeenCalledTimes(1);
1858
+ });
1859
+ });
1860
+ describe('interest trigger', () => {
1861
+ it('should add focusin listener alongside mouseenter', () => {
1862
+ _Interact.Interact.create(getA11yConfig('interest', 'interest-test'));
1863
+ a11yElement = document.createElement('interact-element');
1864
+ const div = document.createElement('div');
1865
+ a11yElement.append(div);
1866
+ const addEventListenerSpy = jest.spyOn(div, 'addEventListener');
1867
+ (0, _add.add)(a11yElement, 'interest-test');
1868
+ expect(addEventListenerSpy).toHaveBeenCalledWith('mouseenter', expect.any(Function), expect.any(Object));
1869
+ expect(addEventListenerSpy).toHaveBeenCalledWith('focusin', expect.any(Function), expect.any(Object));
1870
+ });
1871
+ });
1872
+ describe('click trigger with allowA11yTriggers flag', () => {
1873
+ it('should NOT add keydown listener when flag is false', () => {
1874
+ _Interact.Interact.create(getA11yConfig('click', 'click-no-flag'));
1875
+ _Interact.Interact.setup({
1876
+ allowA11yTriggers: false
1877
+ });
1878
+ a11yElement = document.createElement('interact-element');
1879
+ const div = document.createElement('div');
1880
+ a11yElement.append(div);
1881
+ const addEventListenerSpy = jest.spyOn(div, 'addEventListener');
1882
+ (0, _add.add)(a11yElement, 'click-no-flag');
1883
+ expect(addEventListenerSpy).toHaveBeenCalledWith('click', expect.any(Function), expect.any(Object));
1884
+ expect(addEventListenerSpy).not.toHaveBeenCalledWith('keydown', expect.any(Function), expect.any(Object));
1885
+ });
1886
+ it('should add keydown listener when flag is true', () => {
1887
+ _Interact.Interact.setup({
1888
+ allowA11yTriggers: true
1889
+ });
1890
+ _Interact.Interact.create(getA11yConfig('click', 'click-with-flag'));
1891
+ a11yElement = document.createElement('interact-element');
1892
+ const div = document.createElement('div');
1893
+ a11yElement.append(div);
1894
+ const addEventListenerSpy = jest.spyOn(div, 'addEventListener');
1895
+ (0, _add.add)(a11yElement, 'click-with-flag');
1896
+ expect(addEventListenerSpy).toHaveBeenCalledWith('click', expect.any(Function), expect.any(Object));
1897
+ expect(addEventListenerSpy).toHaveBeenCalledWith('keydown', expect.any(Function), expect.any(Object));
1898
+ });
1899
+ });
1900
+ describe('hover trigger with allowA11yTriggers flag', () => {
1901
+ it('should NOT add focusin listener when flag is false', () => {
1902
+ _Interact.Interact.setup({
1903
+ allowA11yTriggers: false
1904
+ });
1905
+ _Interact.Interact.create(getA11yConfig('hover', 'hover-no-flag'));
1906
+ a11yElement = document.createElement('interact-element');
1907
+ const div = document.createElement('div');
1908
+ a11yElement.append(div);
1909
+ const addEventListenerSpy = jest.spyOn(div, 'addEventListener');
1910
+ (0, _add.add)(a11yElement, 'hover-no-flag');
1911
+ expect(addEventListenerSpy).toHaveBeenCalledWith('mouseenter', expect.any(Function), expect.any(Object));
1912
+ expect(addEventListenerSpy).not.toHaveBeenCalledWith('focusin', expect.any(Function), expect.any(Object));
1913
+ });
1914
+ it('should add focusin listener when flag is true', () => {
1915
+ _Interact.Interact.setup({
1916
+ allowA11yTriggers: true
1917
+ });
1918
+ _Interact.Interact.create(getA11yConfig('hover', 'hover-with-flag'));
1919
+ a11yElement = document.createElement('interact-element');
1920
+ const div = document.createElement('div');
1921
+ a11yElement.append(div);
1922
+ const addEventListenerSpy = jest.spyOn(div, 'addEventListener');
1923
+ (0, _add.add)(a11yElement, 'hover-with-flag');
1924
+ expect(addEventListenerSpy).toHaveBeenCalledWith('mouseenter', expect.any(Function), expect.any(Object));
1925
+ expect(addEventListenerSpy).toHaveBeenCalledWith('focusin', expect.any(Function), expect.any(Object));
1926
+ });
1927
+ });
1928
+ });
1800
1929
  });
1801
1930
  //# sourceMappingURL=interact.spec.js.map