@wix/interact 1.103.0 → 1.105.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.
@@ -27,6 +27,7 @@ class Interact {
27
27
  (0, _defineProperty2.default)(this, "addedInteractions", void 0);
28
28
  (0, _defineProperty2.default)(this, "listInteractionsCache", void 0);
29
29
  (0, _defineProperty2.default)(this, "elements", void 0);
30
+ (0, _defineProperty2.default)(this, "mediaQueryListeners", void 0);
30
31
  this.dataCache = {
31
32
  effects: {},
32
33
  conditions: {},
@@ -35,6 +36,7 @@ class Interact {
35
36
  this.addedInteractions = {};
36
37
  this.listInteractionsCache = {};
37
38
  this.elements = new Set();
39
+ this.mediaQueryListeners = new Map();
38
40
  }
39
41
  init(config) {
40
42
  if (typeof window === 'undefined' || !window.customElements) {
@@ -50,6 +52,10 @@ class Interact {
50
52
  for (const element of this.elements) {
51
53
  element.disconnect();
52
54
  }
55
+ for (const [, listener] of this.mediaQueryListeners.entries()) {
56
+ listener.mql.removeEventListener('change', listener.handler);
57
+ }
58
+ this.mediaQueryListeners.clear();
53
59
  this.addedInteractions = {};
54
60
  this.listInteractionsCache = {};
55
61
  this.elements.clear();
@@ -67,6 +73,7 @@ class Interact {
67
73
  deleteElement(key) {
68
74
  const element = Interact.elementCache.get(key);
69
75
  this.clearInteractionStateForKey(key);
76
+ this.clearMediaQueryListenersForKey(key);
70
77
  if (element) {
71
78
  this.elements.delete(element);
72
79
  Interact.elementCache.delete(key);
@@ -88,6 +95,25 @@ class Interact {
88
95
  delete this.addedInteractions[interactionId];
89
96
  });
90
97
  }
98
+ clearMediaQueryListenersForKey(key) {
99
+ for (const [id, listener] of this.mediaQueryListeners.entries()) {
100
+ if (listener.key === key) {
101
+ listener.mql.removeEventListener('change', listener.handler);
102
+ this.mediaQueryListeners.delete(id);
103
+ }
104
+ }
105
+ }
106
+ setupMediaQueryListener(id, mql, key, handler) {
107
+ if (this.mediaQueryListeners.has(id)) {
108
+ return;
109
+ }
110
+ mql.addEventListener('change', handler);
111
+ this.mediaQueryListeners.set(id, {
112
+ mql,
113
+ handler,
114
+ key
115
+ });
116
+ }
91
117
  static create(config) {
92
118
  const instance = new Interact();
93
119
  Interact.instances.push(instance);
@@ -1 +1 @@
1
- {"version":3,"names":["_utilities","require","_InteractElement","_utils","_handlers","_interopRequireDefault","_Interact","registerInteractElement","customElements","get","interactElement","getInteractElement","define","_convertToKeyTemplate","key","replace","Interact","constructor","_defineProperty2","default","dataCache","effects","conditions","interactions","addedInteractions","listInteractionsCache","elements","Set","init","config","window","parseConfig","didRegister","elementCache","forEach","element","connect","destroy","disconnect","clear","instances","splice","indexOf","setElement","add","deleteElement","clearInteractionStateForKey","delete","has","processedKey","_this$get","interactionIds","interactionId_","interactionId","getInterpolatedKey","create","instance","push","length","setup","options","scrollOptionsGetter","TRIGGER_TO_HANDLER_MODULE_MAP","viewProgress","registerOptionsGetter","pointerOptionsGetter","pointerMove","viewEnter","setOptions","allowA11yTriggers","undefined","getInstance","find","getElement","set","exports","Map","interactionIdCounter","getSelector","d","asCombinator","addItemFilter","listContainer","itemFilter","listItemSelector","selector","_config$interactions","interaction_","source","interactionIdx","effects_","rest","console","error","triggers","selectors","Array","from","reverse","interaction","effect","target","effectId","referencedEffect","generateId"],"sources":["../../../src/core/Interact.ts"],"sourcesContent":["import {\n InteractCache,\n IInteractElement,\n InteractConfig,\n EffectRef,\n Effect,\n Interaction,\n ViewEnterParams,\n ViewEnterHandlerModule,\n} from '../types';\nimport { getInterpolatedKey } from './utilities';\nimport { getInteractElement } from '../InteractElement';\nimport { generateId } from '../utils';\nimport TRIGGER_TO_HANDLER_MODULE_MAP from '../handlers';\n\nfunction registerInteractElement() {\n if (!customElements.get('interact-element')) {\n const interactElement = getInteractElement();\n customElements.define('interact-element', interactElement);\n\n return true;\n }\n\n return false;\n}\n\nfunction _convertToKeyTemplate(key: string) {\n return key.replace(/\\[([-\\w]+)]/g, '[]');\n}\n\nexport class Interact {\n dataCache: InteractCache;\n addedInteractions: { [interactionId: string]: boolean };\n listInteractionsCache: {\n [listContainer: string]: { [interactionId: string]: boolean };\n };\n elements: Set<IInteractElement>;\n static forceReducedMotion: boolean = false;\n static allowA11yTriggers: boolean = true;\n static instances: Interact[] = [];\n static elementCache = new Map<string, IInteractElement>();\n\n constructor() {\n this.dataCache = { effects: {}, conditions: {}, interactions: {} };\n this.addedInteractions = {};\n this.listInteractionsCache = {};\n this.elements = new Set();\n }\n\n init(config: InteractConfig): void {\n if (typeof window === 'undefined' || !window.customElements) {\n return;\n }\n\n this.dataCache = parseConfig(config);\n\n const didRegister = registerInteractElement();\n\n if (!didRegister) {\n Interact.elementCache.forEach((element: IInteractElement, key) =>\n element.connect(key),\n );\n }\n }\n\n destroy(): void {\n for (const element of this.elements) {\n element.disconnect();\n }\n this.addedInteractions = {};\n this.listInteractionsCache = {};\n this.elements.clear();\n this.dataCache = { effects: {}, conditions: {}, interactions: {} };\n Interact.instances.splice(Interact.instances.indexOf(this), 1);\n }\n\n setElement(key: string, element: IInteractElement) {\n this.elements.add(element);\n\n Interact.setElement(key, element);\n }\n\n deleteElement(key: string) {\n const element = Interact.elementCache.get(key);\n\n this.clearInteractionStateForKey(key);\n\n if (element) {\n this.elements.delete(element);\n Interact.elementCache.delete(key);\n }\n }\n\n has(key: string): boolean {\n return !!this.get(key);\n }\n\n get(key: string): InteractCache['interactions'][string] | undefined {\n const processedKey = _convertToKeyTemplate(key);\n return this.dataCache.interactions[processedKey];\n }\n\n clearInteractionStateForKey(key: string): void {\n const interactionIds = this.get(key)?.interactionIds || [];\n\n interactionIds.forEach((interactionId_) => {\n const interactionId = getInterpolatedKey(interactionId_, key);\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this.addedInteractions[interactionId];\n });\n }\n\n static create(config: InteractConfig): Interact {\n const instance = new Interact();\n Interact.instances.push(instance);\n\n instance.init(config);\n\n return instance;\n }\n\n static destroy(): void {\n Interact.elementCache.forEach((element: IInteractElement) => {\n element.disconnect();\n });\n Interact.instances.length = 0;\n Interact.elementCache.clear();\n }\n\n static setup(options: {\n scrollOptionsGetter?: () => Partial<scrollConfig>;\n pointerOptionsGetter?: () => Partial<PointerConfig>;\n viewEnter?: Partial<ViewEnterParams>;\n allowA11yTriggers?: boolean;\n }): void {\n if (options.scrollOptionsGetter) {\n TRIGGER_TO_HANDLER_MODULE_MAP.viewProgress.registerOptionsGetter?.(\n options.scrollOptionsGetter,\n );\n }\n\n if (options.pointerOptionsGetter) {\n TRIGGER_TO_HANDLER_MODULE_MAP.pointerMove.registerOptionsGetter?.(\n options.pointerOptionsGetter,\n );\n }\n\n if (options.viewEnter) {\n (\n TRIGGER_TO_HANDLER_MODULE_MAP.viewEnter as ViewEnterHandlerModule\n ).setOptions(options.viewEnter);\n }\n\n if (options.allowA11yTriggers !== undefined) {\n Interact.allowA11yTriggers = options.allowA11yTriggers;\n }\n }\n\n static getInstance(key: string): Interact | undefined {\n return Interact.instances.find((instance) => instance.has(key));\n }\n\n static getElement(key: string | undefined): IInteractElement | undefined {\n return key ? Interact.elementCache.get(key) : undefined;\n }\n\n static setElement(key: string, element: IInteractElement): void {\n Interact.elementCache.set(key, element);\n }\n}\n\nlet interactionIdCounter = 0;\n\nexport function getSelector(\n d: Interaction | Effect,\n {\n asCombinator = false,\n addItemFilter = false,\n }: { asCombinator?: boolean; addItemFilter?: boolean } = {},\n): string {\n if (d.listContainer) {\n const itemFilter = `${\n addItemFilter && d.listItemSelector ? ` > ${d.listItemSelector}` : ''\n }`;\n\n if (d.selector) {\n return `${d.listContainer}${itemFilter} ${d.selector}`;\n }\n\n return `${d.listContainer}${itemFilter || ' > *'}`;\n } else if (d.selector) {\n return d.selector;\n }\n\n // TODO: consider moving :scope to be configurable since it may lead to unexpected results in some cases\n return asCombinator ? '> :first-child' : ':scope > :first-child';\n}\n\n/**\n * Parses the config object and caches interactions, effects, and conditions\n */\nfunction parseConfig(config: InteractConfig): InteractCache {\n const conditions = config.conditions || {};\n const interactions: InteractCache['interactions'] = {};\n\n config.interactions?.forEach((interaction_) => {\n const source = interaction_.key;\n const interactionIdx = ++interactionIdCounter;\n const { effects: effects_, ...rest } = interaction_;\n\n if (!source) {\n console.error(\n `Interaction ${interactionIdx} is missing a key for source element.`,\n );\n return;\n }\n\n if (!interactions[source]) {\n interactions[source] = {\n triggers: [],\n effects: {},\n interactionIds: new Set(),\n selectors: new Set(),\n };\n }\n\n /*\n * Cache interaction trigger by source element\n */\n const effects = Array.from(effects_);\n effects.reverse(); // reverse to ensure the first effect is the one that will be applied first\n const interaction = { ...rest, effects };\n\n interactions[source].triggers.push(interaction);\n interactions[source].selectors.add(getSelector(interaction));\n\n const listContainer = interaction.listContainer;\n\n effects.forEach((effect) => {\n /*\n * Target cascade order is the first of:\n * -> Config.interactions.effects.effect.key\n * -> Config.effects.effect.key\n * -> Config.interactions.interaction.key\n */\n let target = effect.key;\n\n if (!target && (effect as EffectRef).effectId) {\n const referencedEffect = config.effects[(effect as EffectRef).effectId];\n\n if (referencedEffect) {\n target = referencedEffect.key;\n }\n }\n\n if (!(effect as EffectRef).effectId) {\n (effect as EffectRef).effectId = generateId();\n }\n\n // if no target is specified, use the source element as the target\n target = target || source;\n effect.key = target;\n const effectId = (effect as EffectRef).effectId;\n\n if (listContainer && effect.listContainer) {\n // we do not support having 2 separate lists for same interaction\n if (target !== source || effect.listContainer !== listContainer) {\n return;\n }\n }\n\n const interactionId = `${source}::${target}::${effectId}::${interactionIdx}`;\n effect.interactionId = interactionId;\n interactions[source].interactionIds.add(interactionId);\n\n if (target === source) {\n // if target is the source element, no need to add an interaction to `effects`\n return;\n }\n\n /*\n * Cache interaction effect by target element\n */\n if (!interactions[target]) {\n interactions[target] = {\n triggers: [],\n effects: {\n [interactionId]: [],\n },\n interactionIds: new Set(),\n selectors: new Set(),\n };\n } else if (!interactions[target].effects[interactionId]) {\n interactions[target].effects[interactionId] = [];\n interactions[target].interactionIds.add(interactionId);\n }\n\n interactions[target].effects[interactionId].push({ ...rest, effect });\n interactions[target].selectors.add(getSelector(effect));\n });\n });\n\n return {\n effects: config.effects || {},\n conditions,\n interactions,\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_utilities","require","_InteractElement","_utils","_handlers","_interopRequireDefault","_Interact","registerInteractElement","customElements","get","interactElement","getInteractElement","define","_convertToKeyTemplate","key","replace","Interact","constructor","_defineProperty2","default","dataCache","effects","conditions","interactions","addedInteractions","listInteractionsCache","elements","Set","mediaQueryListeners","Map","init","config","window","parseConfig","didRegister","elementCache","forEach","element","connect","destroy","disconnect","listener","entries","mql","removeEventListener","handler","clear","instances","splice","indexOf","setElement","add","deleteElement","clearInteractionStateForKey","clearMediaQueryListenersForKey","delete","has","processedKey","_this$get","interactionIds","interactionId_","interactionId","getInterpolatedKey","id","setupMediaQueryListener","addEventListener","set","create","instance","push","length","setup","options","scrollOptionsGetter","TRIGGER_TO_HANDLER_MODULE_MAP","viewProgress","registerOptionsGetter","pointerOptionsGetter","pointerMove","viewEnter","setOptions","allowA11yTriggers","undefined","getInstance","find","getElement","exports","interactionIdCounter","getSelector","d","asCombinator","addItemFilter","listContainer","itemFilter","listItemSelector","selector","_config$interactions","interaction_","source","interactionIdx","effects_","rest","console","error","triggers","selectors","Array","from","reverse","interaction","effect","target","effectId","referencedEffect","generateId"],"sources":["../../../src/core/Interact.ts"],"sourcesContent":["import {\n InteractCache,\n IInteractElement,\n InteractConfig,\n EffectRef,\n Effect,\n Interaction,\n ViewEnterParams,\n ViewEnterHandlerModule,\n} from '../types';\nimport { getInterpolatedKey } from './utilities';\nimport { getInteractElement } from '../InteractElement';\nimport { generateId } from '../utils';\nimport TRIGGER_TO_HANDLER_MODULE_MAP from '../handlers';\n\nfunction registerInteractElement() {\n if (!customElements.get('interact-element')) {\n const interactElement = getInteractElement();\n customElements.define('interact-element', interactElement);\n\n return true;\n }\n\n return false;\n}\n\nfunction _convertToKeyTemplate(key: string) {\n return key.replace(/\\[([-\\w]+)]/g, '[]');\n}\n\nexport class Interact {\n dataCache: InteractCache;\n addedInteractions: { [interactionId: string]: boolean };\n listInteractionsCache: {\n [listContainer: string]: { [interactionId: string]: boolean };\n };\n elements: Set<IInteractElement>;\n mediaQueryListeners: Map<\n string,\n {\n mql: MediaQueryList;\n handler: (e: MediaQueryListEvent | MediaQueryList) => void;\n key: string;\n }\n >;\n static forceReducedMotion: boolean = false;\n static allowA11yTriggers: boolean = true;\n static instances: Interact[] = [];\n static elementCache = new Map<string, IInteractElement>();\n\n constructor() {\n this.dataCache = { effects: {}, conditions: {}, interactions: {} };\n this.addedInteractions = {};\n this.listInteractionsCache = {};\n this.elements = new Set();\n this.mediaQueryListeners = new Map();\n }\n\n init(config: InteractConfig): void {\n if (typeof window === 'undefined' || !window.customElements) {\n return;\n }\n\n this.dataCache = parseConfig(config);\n\n const didRegister = registerInteractElement();\n\n if (!didRegister) {\n Interact.elementCache.forEach((element: IInteractElement, key) =>\n element.connect(key),\n );\n }\n }\n\n destroy(): void {\n for (const element of this.elements) {\n element.disconnect();\n }\n for (const [, listener] of this.mediaQueryListeners.entries()) {\n listener.mql.removeEventListener('change', listener.handler);\n }\n this.mediaQueryListeners.clear();\n this.addedInteractions = {};\n this.listInteractionsCache = {};\n this.elements.clear();\n this.dataCache = { effects: {}, conditions: {}, interactions: {} };\n Interact.instances.splice(Interact.instances.indexOf(this), 1);\n }\n\n setElement(key: string, element: IInteractElement) {\n this.elements.add(element);\n\n Interact.setElement(key, element);\n }\n\n deleteElement(key: string) {\n const element = Interact.elementCache.get(key);\n\n this.clearInteractionStateForKey(key);\n this.clearMediaQueryListenersForKey(key);\n\n if (element) {\n this.elements.delete(element);\n Interact.elementCache.delete(key);\n }\n }\n\n has(key: string): boolean {\n return !!this.get(key);\n }\n\n get(key: string): InteractCache['interactions'][string] | undefined {\n const processedKey = _convertToKeyTemplate(key);\n return this.dataCache.interactions[processedKey];\n }\n\n clearInteractionStateForKey(key: string): void {\n const interactionIds = this.get(key)?.interactionIds || [];\n\n interactionIds.forEach((interactionId_) => {\n const interactionId = getInterpolatedKey(interactionId_, key);\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this.addedInteractions[interactionId];\n });\n }\n\n clearMediaQueryListenersForKey(key: string): void {\n for (const [id, listener] of this.mediaQueryListeners.entries()) {\n if (listener.key === key) {\n listener.mql.removeEventListener('change', listener.handler);\n this.mediaQueryListeners.delete(id);\n }\n }\n }\n\n setupMediaQueryListener(\n id: string,\n mql: MediaQueryList,\n key: string,\n handler: () => void,\n ) {\n if (this.mediaQueryListeners.has(id)) {\n return;\n }\n\n mql.addEventListener('change', handler);\n\n this.mediaQueryListeners.set(id, {\n mql,\n handler,\n key,\n });\n }\n\n static create(config: InteractConfig): Interact {\n const instance = new Interact();\n Interact.instances.push(instance);\n\n instance.init(config);\n\n return instance;\n }\n\n static destroy(): void {\n Interact.elementCache.forEach((element: IInteractElement) => {\n element.disconnect();\n });\n Interact.instances.length = 0;\n Interact.elementCache.clear();\n }\n\n static setup(options: {\n scrollOptionsGetter?: () => Partial<scrollConfig>;\n pointerOptionsGetter?: () => Partial<PointerConfig>;\n viewEnter?: Partial<ViewEnterParams>;\n allowA11yTriggers?: boolean;\n }): void {\n if (options.scrollOptionsGetter) {\n TRIGGER_TO_HANDLER_MODULE_MAP.viewProgress.registerOptionsGetter?.(\n options.scrollOptionsGetter,\n );\n }\n\n if (options.pointerOptionsGetter) {\n TRIGGER_TO_HANDLER_MODULE_MAP.pointerMove.registerOptionsGetter?.(\n options.pointerOptionsGetter,\n );\n }\n\n if (options.viewEnter) {\n (\n TRIGGER_TO_HANDLER_MODULE_MAP.viewEnter as ViewEnterHandlerModule\n ).setOptions(options.viewEnter);\n }\n\n if (options.allowA11yTriggers !== undefined) {\n Interact.allowA11yTriggers = options.allowA11yTriggers;\n }\n }\n\n static getInstance(key: string): Interact | undefined {\n return Interact.instances.find((instance) => instance.has(key));\n }\n\n static getElement(key: string | undefined): IInteractElement | undefined {\n return key ? Interact.elementCache.get(key) : undefined;\n }\n\n static setElement(key: string, element: IInteractElement): void {\n Interact.elementCache.set(key, element);\n }\n}\n\nlet interactionIdCounter = 0;\n\nexport function getSelector(\n d: Interaction | Effect,\n {\n asCombinator = false,\n addItemFilter = false,\n }: { asCombinator?: boolean; addItemFilter?: boolean } = {},\n): string {\n if (d.listContainer) {\n const itemFilter = `${\n addItemFilter && d.listItemSelector ? ` > ${d.listItemSelector}` : ''\n }`;\n\n if (d.selector) {\n return `${d.listContainer}${itemFilter} ${d.selector}`;\n }\n\n return `${d.listContainer}${itemFilter || ' > *'}`;\n } else if (d.selector) {\n return d.selector;\n }\n\n // TODO: consider moving :scope to be configurable since it may lead to unexpected results in some cases\n return asCombinator ? '> :first-child' : ':scope > :first-child';\n}\n\n/**\n * Parses the config object and caches interactions, effects, and conditions\n */\nfunction parseConfig(config: InteractConfig): InteractCache {\n const conditions = config.conditions || {};\n const interactions: InteractCache['interactions'] = {};\n\n config.interactions?.forEach((interaction_) => {\n const source = interaction_.key;\n const interactionIdx = ++interactionIdCounter;\n const { effects: effects_, ...rest } = interaction_;\n\n if (!source) {\n console.error(\n `Interaction ${interactionIdx} is missing a key for source element.`,\n );\n return;\n }\n\n if (!interactions[source]) {\n interactions[source] = {\n triggers: [],\n effects: {},\n interactionIds: new Set(),\n selectors: new Set(),\n };\n }\n\n /*\n * Cache interaction trigger by source element\n */\n const effects = Array.from(effects_);\n effects.reverse(); // reverse to ensure the first effect is the one that will be applied first\n const interaction = { ...rest, effects };\n\n interactions[source].triggers.push(interaction);\n interactions[source].selectors.add(getSelector(interaction));\n\n const listContainer = interaction.listContainer;\n\n effects.forEach((effect) => {\n /*\n * Target cascade order is the first of:\n * -> Config.interactions.effects.effect.key\n * -> Config.effects.effect.key\n * -> Config.interactions.interaction.key\n */\n let target = effect.key;\n\n if (!target && (effect as EffectRef).effectId) {\n const referencedEffect = config.effects[(effect as EffectRef).effectId];\n\n if (referencedEffect) {\n target = referencedEffect.key;\n }\n }\n\n if (!(effect as EffectRef).effectId) {\n (effect as EffectRef).effectId = generateId();\n }\n\n // if no target is specified, use the source element as the target\n target = target || source;\n effect.key = target;\n const effectId = (effect as EffectRef).effectId;\n\n if (listContainer && effect.listContainer) {\n // we do not support having 2 separate lists for same interaction\n if (target !== source || effect.listContainer !== listContainer) {\n return;\n }\n }\n\n const interactionId = `${source}::${target}::${effectId}::${interactionIdx}`;\n effect.interactionId = interactionId;\n interactions[source].interactionIds.add(interactionId);\n\n if (target === source) {\n // if target is the source element, no need to add an interaction to `effects`\n return;\n }\n\n /*\n * Cache interaction effect by target element\n */\n if (!interactions[target]) {\n interactions[target] = {\n triggers: [],\n effects: {\n [interactionId]: [],\n },\n interactionIds: new Set(),\n selectors: new Set(),\n };\n } else if (!interactions[target].effects[interactionId]) {\n interactions[target].effects[interactionId] = [];\n interactions[target].interactionIds.add(interactionId);\n }\n\n interactions[target].effects[interactionId].push({ ...rest, effect });\n interactions[target].selectors.add(getSelector(effect));\n });\n });\n\n return {\n effects: config.effects || {},\n conditions,\n interactions,\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -74,9 +74,13 @@ function _addInteraction(sourceKey, sourceRoot, instance, interaction, elements)
74
74
  // Skip this interaction if it has already been added
75
75
  return;
76
76
  }
77
-
78
- // TODO: implement watching for condition `change` events and add/remove interactions accordingly
79
77
  const mql = (0, _utils.getMediaQuery)(effectOptions.conditions || [], instance.dataCache.conditions);
78
+ if (mql) {
79
+ instance.setupMediaQueryListener(interactionId, mql, sourceKey, () => {
80
+ sourceRoot.disconnect();
81
+ sourceRoot.connect();
82
+ });
83
+ }
80
84
  if (!mql || mql.matches) {
81
85
  interactionVariations[interactionId] = true;
82
86
  const target = targetKey_ && (0, _utilities.getInterpolatedKey)(targetKey_, sourceKey);
@@ -133,9 +137,13 @@ function addEffectsForTarget(targetKey, element, instance, listContainer, elemen
133
137
  // skip this effect if a listContainer was provided and it's not matching this effect.listContainer
134
138
  return false;
135
139
  }
136
-
137
- // TODO: implement watching for condition `change` events and add/remove interactions accordingly
138
140
  const mql = (0, _utils.getMediaQuery)(effectOptions.conditions || [], instance.dataCache.conditions);
141
+ if (mql) {
142
+ instance.setupMediaQueryListener(interactionId, mql, targetKey, () => {
143
+ element.disconnect();
144
+ element.connect();
145
+ });
146
+ }
139
147
  if (!mql || mql.matches) {
140
148
  const sourceKey = interaction.key && (0, _utilities.getInterpolatedKey)(interaction.key, targetKey);
141
149
  const sourceElement = _Interact.Interact.getElement(sourceKey);
@@ -210,10 +218,15 @@ function add(element, key) {
210
218
  } = (instance == null ? void 0 : instance.get(key)) || {};
211
219
  const hasTriggers = triggers.length > 0;
212
220
  instance.setElement(key, element);
213
- triggers.forEach(interaction => {
221
+ triggers.forEach((interaction, index) => {
214
222
  const mql = (0, _utils.getMediaQuery)(interaction.conditions, instance.dataCache.conditions);
215
-
216
- // TODO: implement watching for condition `change` events and add/remove interactions accordingly
223
+ if (mql) {
224
+ const interactionId = `${key}::trigger::${index}`;
225
+ instance.setupMediaQueryListener(interactionId, mql, key, () => {
226
+ element.disconnect();
227
+ element.connect();
228
+ });
229
+ }
217
230
  if (!mql || mql.matches) {
218
231
  if (interaction.listContainer) {
219
232
  element.watchChildList(interaction.listContainer);
@@ -233,13 +246,18 @@ function addListItems(root, key, listContainer, elements) {
233
246
  const {
234
247
  triggers = []
235
248
  } = (instance == null ? void 0 : instance.get(key)) || {};
236
- triggers.forEach(interaction => {
249
+ triggers.forEach((interaction, index) => {
237
250
  if (interaction.listContainer !== listContainer) {
238
251
  return;
239
252
  }
240
253
  const mql = (0, _utils.getMediaQuery)(interaction.conditions, instance.dataCache.conditions);
241
-
242
- // TODO: implement watching for condition `change` events and add/remove interactions accordingly
254
+ if (mql) {
255
+ const interactionId = `${key}::listTrigger::${listContainer}::${index}`;
256
+ instance.setupMediaQueryListener(interactionId, mql, key, () => {
257
+ root.disconnect();
258
+ root.connect();
259
+ });
260
+ }
243
261
  if (!mql || mql.matches) {
244
262
  _addInteraction(key, root, instance, interaction, elements);
245
263
  }
@@ -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","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":[]}
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","setupMediaQueryListener","disconnect","connect","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 const mql = getMediaQuery(\n effectOptions.conditions || [],\n instance.dataCache.conditions,\n );\n\n if (mql) {\n instance.setupMediaQueryListener(interactionId, mql, sourceKey, () => {\n sourceRoot.disconnect();\n sourceRoot.connect();\n });\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 const mql = getMediaQuery(\n effectOptions.conditions || [],\n instance!.dataCache.conditions,\n );\n\n if (mql) {\n instance!.setupMediaQueryListener(interactionId, mql, targetKey, () => {\n element.disconnect();\n element.connect();\n });\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, index) => {\n const mql = getMediaQuery(\n interaction.conditions,\n instance!.dataCache.conditions,\n );\n\n if (mql) {\n const interactionId = `${key}::trigger::${index}`;\n instance!.setupMediaQueryListener(interactionId, mql, key, () => {\n element.disconnect();\n element.connect();\n });\n }\n\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, index) => {\n if (interaction.listContainer !== listContainer) {\n return;\n }\n\n const mql = getMediaQuery(\n interaction.conditions,\n instance!.dataCache.conditions,\n );\n\n if (mql) {\n const interactionId = `${key}::listTrigger::${listContainer}::${index}`;\n instance!.setupMediaQueryListener(interactionId, mql, key, () => {\n root.disconnect();\n root.connect();\n });\n }\n\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":[]}
@@ -39,6 +39,7 @@ jest.mock('fizban', () => ({
39
39
  end: jest.fn()
40
40
  }))
41
41
  }));
42
+ let mockMQLs;
42
43
  describe('interact', () => {
43
44
  let element;
44
45
  let mockConfig;
@@ -327,6 +328,7 @@ describe('interact', () => {
327
328
  }
328
329
 
329
330
  // Mock matchMedia for condition testing
331
+ mockMQLs = new Map();
330
332
  mockMatchMedia();
331
333
  });
332
334
  function mockMatchMedia(matchingQueries) {
@@ -335,7 +337,10 @@ describe('interact', () => {
335
337
  }
336
338
  const queryRule = `(${matchingQueries.join(') and (')})`;
337
339
  const mockMQL = query => {
338
- return {
340
+ if (mockMQLs.has(query)) {
341
+ return mockMQLs.get(query);
342
+ }
343
+ const mql = {
339
344
  matches: queryRule === query,
340
345
  media: query,
341
346
  onchange: null,
@@ -343,9 +348,12 @@ describe('interact', () => {
343
348
  removeEventListener: jest.fn(),
344
349
  dispatchEvent: jest.fn()
345
350
  };
351
+ mockMQLs.set(query, mql);
352
+ return mql;
346
353
  };
347
354
  Object.defineProperty(window, 'matchMedia', {
348
355
  writable: true,
356
+ configurable: true,
349
357
  value: jest.fn().mockImplementation(mockMQL)
350
358
  });
351
359
  }
@@ -2734,5 +2742,211 @@ describe('interact', () => {
2734
2742
  });
2735
2743
  });
2736
2744
  });
2745
+ describe('media query listeners', () => {
2746
+ let instance;
2747
+ beforeEach(() => {
2748
+ mockMQLs.clear();
2749
+ mockMatchMedia();
2750
+ });
2751
+ afterEach(() => {
2752
+ Interact.destroy();
2753
+ });
2754
+ function createMockInteractElement(key) {
2755
+ const el = document.createElement('interact-element');
2756
+ const div = document.createElement('div');
2757
+ el.append(div);
2758
+ el.dataset.interactKey = key;
2759
+ el.connected = false;
2760
+ el._internals = null;
2761
+ el._observers = new WeakMap();
2762
+ el.sheet = null;
2763
+ el.disconnect = jest.fn(function () {
2764
+ const k = el.dataset.interactKey;
2765
+ if (k) {
2766
+ remove(k);
2767
+ }
2768
+ el.sheet = null;
2769
+ el.connected = false;
2770
+ });
2771
+ el.connect = jest.fn(function () {
2772
+ if (el.connected) {
2773
+ return;
2774
+ }
2775
+ const k = el.dataset.interactKey;
2776
+ if (k) {
2777
+ el.connected = add(el, k);
2778
+ }
2779
+ });
2780
+ el.renderStyle = jest.fn();
2781
+ el.toggleEffect = jest.fn();
2782
+ el.watchChildList = jest.fn();
2783
+ return el;
2784
+ }
2785
+ const createResponsiveConfig = () => ({
2786
+ conditions: {
2787
+ desktop: {
2788
+ type: 'media',
2789
+ predicate: 'min-width: 768px'
2790
+ }
2791
+ },
2792
+ interactions: [{
2793
+ trigger: 'click',
2794
+ key: 'responsive-button',
2795
+ conditions: ['desktop'],
2796
+ effects: [{
2797
+ key: 'responsive-button',
2798
+ effectId: 'test-effect'
2799
+ }]
2800
+ }],
2801
+ effects: {
2802
+ 'test-effect': {
2803
+ namedEffect: {
2804
+ type: 'FadeIn',
2805
+ power: 'medium'
2806
+ },
2807
+ duration: 500
2808
+ }
2809
+ }
2810
+ });
2811
+ it('should set up a media query listener when interaction has conditions', () => {
2812
+ const config = createResponsiveConfig();
2813
+ instance = Interact.create(config);
2814
+ const testElement = createMockInteractElement('responsive-button');
2815
+ add(testElement, 'responsive-button');
2816
+ expect(window.matchMedia).toHaveBeenCalledWith('(min-width: 768px)');
2817
+ expect(instance.mediaQueryListeners.size).toBe(1);
2818
+ expect(instance.mediaQueryListeners.has('responsive-button::trigger::0')).toBe(true);
2819
+ const mql = mockMQLs.get('(min-width: 768px)');
2820
+ expect(mql == null ? void 0 : mql.addEventListener).toHaveBeenCalledWith('change', expect.any(Function));
2821
+ });
2822
+ it('should reconcile when media query changes', () => {
2823
+ const config = createResponsiveConfig();
2824
+ instance = Interact.create(config);
2825
+ const testElement = createMockInteractElement('responsive-button');
2826
+ add(testElement, 'responsive-button');
2827
+ const listenerEntry = instance.mediaQueryListeners.get('responsive-button::trigger::0');
2828
+ expect(listenerEntry).toBeDefined();
2829
+ const clearStateSpy = jest.spyOn(instance, 'clearInteractionStateForKey');
2830
+ listenerEntry.handler({
2831
+ matches: true,
2832
+ media: '(min-width: 768px)'
2833
+ });
2834
+
2835
+ // disconnect triggers remove which calls clearInteractionStateForKey
2836
+ expect(clearStateSpy).toHaveBeenCalledWith('responsive-button');
2837
+ });
2838
+ it('should properly remove event listeners when instance is destroyed', () => {
2839
+ const config = createResponsiveConfig();
2840
+ instance = Interact.create(config);
2841
+ const testElement = createMockInteractElement('responsive-button');
2842
+ add(testElement, 'responsive-button');
2843
+ const mql = mockMQLs.get('(min-width: 768px)');
2844
+ expect(mql).toBeDefined();
2845
+ expect(mql.addEventListener).toHaveBeenCalled();
2846
+ instance.destroy();
2847
+ expect(mql.removeEventListener).toHaveBeenCalledWith('change', expect.any(Function));
2848
+ expect(instance.mediaQueryListeners.size).toBe(0);
2849
+ });
2850
+ it('should not create duplicate listeners when add() is called twice', () => {
2851
+ const config = createResponsiveConfig();
2852
+ instance = Interact.create(config);
2853
+ const testElement = createMockInteractElement('responsive-button');
2854
+ add(testElement, 'responsive-button');
2855
+ // Reset addedInteractions so add() processes interactions again
2856
+ instance.addedInteractions = {};
2857
+ add(testElement, 'responsive-button');
2858
+ expect(instance.mediaQueryListeners.size).toBe(1);
2859
+ const mql = mockMQLs.get('(min-width: 768px)');
2860
+ expect(mql == null ? void 0 : mql.addEventListener).toHaveBeenCalledTimes(1);
2861
+ });
2862
+ it('should remove listeners when element is deleted', () => {
2863
+ const config = createResponsiveConfig();
2864
+ instance = Interact.create(config);
2865
+ const testElement = createMockInteractElement('responsive-button');
2866
+ add(testElement, 'responsive-button');
2867
+ const mql = mockMQLs.get('(min-width: 768px)');
2868
+ expect(instance.mediaQueryListeners.size).toBe(1);
2869
+ instance.deleteElement('responsive-button');
2870
+ expect(mql.removeEventListener).toHaveBeenCalledWith('change', expect.any(Function));
2871
+ expect(instance.mediaQueryListeners.size).toBe(0);
2872
+ });
2873
+ it('should switch interactions when media query changes', () => {
2874
+ const config = {
2875
+ conditions: {
2876
+ desktop: {
2877
+ type: 'media',
2878
+ predicate: 'min-width: 1024px'
2879
+ },
2880
+ mobile: {
2881
+ type: 'media',
2882
+ predicate: 'max-width: 767px'
2883
+ }
2884
+ },
2885
+ interactions: [{
2886
+ trigger: 'click',
2887
+ key: 'responsive-element',
2888
+ conditions: ['desktop'],
2889
+ effects: [{
2890
+ key: 'responsive-element',
2891
+ effectId: 'desktop-effect'
2892
+ }]
2893
+ }, {
2894
+ trigger: 'hover',
2895
+ key: 'responsive-element',
2896
+ conditions: ['mobile'],
2897
+ effects: [{
2898
+ key: 'responsive-element',
2899
+ effectId: 'mobile-effect'
2900
+ }]
2901
+ }],
2902
+ effects: {
2903
+ 'desktop-effect': {
2904
+ namedEffect: {
2905
+ type: 'FadeIn',
2906
+ power: 'medium'
2907
+ },
2908
+ duration: 500
2909
+ },
2910
+ 'mobile-effect': {
2911
+ namedEffect: {
2912
+ type: 'BounceIn',
2913
+ direction: 'center',
2914
+ power: 'hard'
2915
+ },
2916
+ duration: 300
2917
+ }
2918
+ }
2919
+ };
2920
+ mockMatchMedia(['min-width: 1024px']);
2921
+ instance = Interact.create(config);
2922
+ const testElement = createMockInteractElement('responsive-element');
2923
+ // Handlers are added to the child div (firstElementChild), not the root
2924
+ const childDiv = testElement.firstElementChild;
2925
+ const addEventListenerSpy = jest.spyOn(childDiv, 'addEventListener');
2926
+ add(testElement, 'responsive-element');
2927
+
2928
+ // Desktop interaction (click) should be added
2929
+ expect(addEventListenerSpy).toHaveBeenCalledWith('click', expect.any(Function), expect.any(Object));
2930
+ expect(addEventListenerSpy).not.toHaveBeenCalledWith('mouseenter', expect.any(Function), expect.any(Object));
2931
+ addEventListenerSpy.mockClear();
2932
+
2933
+ // Simulate media query change to mobile
2934
+ const desktopMql = mockMQLs.get('(min-width: 1024px)');
2935
+ const mobileMql = mockMQLs.get('(max-width: 767px)');
2936
+ desktopMql.matches = false;
2937
+ mobileMql.matches = true;
2938
+
2939
+ // Trigger the media query change handler
2940
+ const listenerEntry = instance.mediaQueryListeners.get('responsive-element::trigger::0');
2941
+ expect(listenerEntry).toBeDefined();
2942
+ listenerEntry.handler({
2943
+ matches: false,
2944
+ media: '(min-width: 1024px)'
2945
+ });
2946
+
2947
+ // After reconciliation, the hover (mobile) handler should be added
2948
+ expect(addEventListenerSpy).toHaveBeenCalledWith('mouseenter', expect.any(Function), expect.any(Object));
2949
+ });
2950
+ });
2737
2951
  });
2738
2952
  //# sourceMappingURL=interact.spec.js.map