148 lines
4.6 KiB
JavaScript
148 lines
4.6 KiB
JavaScript
/**
|
|
* interact.js 1.10.27
|
|
*
|
|
* Copyright (c) 2012-present Taye Adeyemi <dev@taye.me>
|
|
* Released under the MIT License.
|
|
* https://raw.github.com/taye/interact.js/main/LICENSE
|
|
*/
|
|
|
|
import domObjects from "../utils/domObjects.js";
|
|
import { parentNode } from "../utils/domUtils.js";
|
|
import extend from "../utils/extend.js";
|
|
import is from "../utils/is.js";
|
|
import isNonNativeEvent from "../utils/isNonNativeEvent.js";
|
|
import normalizeListeners from "../utils/normalizeListeners.js";
|
|
import * as win from "../utils/window.js";
|
|
var CheckName = /*#__PURE__*/function (CheckName) {
|
|
CheckName["touchAction"] = "touchAction";
|
|
CheckName["boxSizing"] = "boxSizing";
|
|
CheckName["noListeners"] = "noListeners";
|
|
return CheckName;
|
|
}(CheckName || {});
|
|
const prefix = '[interact.js] ';
|
|
const links = {
|
|
touchAction: 'https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action',
|
|
boxSizing: 'https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing'
|
|
};
|
|
function install(scope) {
|
|
let {
|
|
logger
|
|
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
const {
|
|
Interactable,
|
|
defaults
|
|
} = scope;
|
|
scope.logger = logger || console;
|
|
defaults.base.devTools = {
|
|
ignore: {}
|
|
};
|
|
Interactable.prototype.devTools = function (options) {
|
|
if (options) {
|
|
extend(this.options.devTools, options);
|
|
return this;
|
|
}
|
|
return this.options.devTools;
|
|
};
|
|
|
|
// can't set native events on non string targets without `addEventListener` prop
|
|
const {
|
|
_onOff
|
|
} = Interactable.prototype;
|
|
Interactable.prototype._onOff = function (method, typeArg, listenerArg, options, filter) {
|
|
if (is.string(this.target) || this.target.addEventListener) {
|
|
return _onOff.call(this, method, typeArg, listenerArg, options, filter);
|
|
}
|
|
if (is.object(typeArg) && !is.array(typeArg)) {
|
|
options = listenerArg;
|
|
listenerArg = null;
|
|
}
|
|
const normalizedListeners = normalizeListeners(typeArg, listenerArg, filter);
|
|
for (const type in normalizedListeners) {
|
|
if (isNonNativeEvent(type, scope.actions)) continue;
|
|
scope.logger.warn(prefix + `Can't add native "${type}" event listener to target without \`addEventListener(type, listener, options)\` prop.`);
|
|
}
|
|
return _onOff.call(this, method, normalizedListeners, options);
|
|
};
|
|
}
|
|
const checks = [{
|
|
name: CheckName.touchAction,
|
|
perform(_ref) {
|
|
let {
|
|
element
|
|
} = _ref;
|
|
return !!element && !parentHasStyle(element, 'touchAction', /pan-|pinch|none/);
|
|
},
|
|
getInfo(_ref2) {
|
|
let {
|
|
element
|
|
} = _ref2;
|
|
return [element, links.touchAction];
|
|
},
|
|
text: 'Consider adding CSS "touch-action: none" to this element\n'
|
|
}, {
|
|
name: CheckName.boxSizing,
|
|
perform(interaction) {
|
|
const {
|
|
element
|
|
} = interaction;
|
|
return interaction.prepared.name === 'resize' && element instanceof domObjects.HTMLElement && !hasStyle(element, 'boxSizing', /border-box/);
|
|
},
|
|
text: 'Consider adding CSS "box-sizing: border-box" to this resizable element',
|
|
getInfo(_ref3) {
|
|
let {
|
|
element
|
|
} = _ref3;
|
|
return [element, links.boxSizing];
|
|
}
|
|
}, {
|
|
name: CheckName.noListeners,
|
|
perform(interaction) {
|
|
var _interaction$interact;
|
|
const actionName = interaction.prepared.name;
|
|
const moveListeners = ((_interaction$interact = interaction.interactable) == null ? void 0 : _interaction$interact.events.types[`${actionName}move`]) || [];
|
|
return !moveListeners.length;
|
|
},
|
|
getInfo(interaction) {
|
|
return [interaction.prepared.name, interaction.interactable];
|
|
},
|
|
text: 'There are no listeners set for this action'
|
|
}];
|
|
function hasStyle(element, prop, styleRe) {
|
|
const value = element.style[prop] || win.window.getComputedStyle(element)[prop];
|
|
return styleRe.test((value || '').toString());
|
|
}
|
|
function parentHasStyle(element, prop, styleRe) {
|
|
let parent = element;
|
|
while (is.element(parent)) {
|
|
if (hasStyle(parent, prop, styleRe)) {
|
|
return true;
|
|
}
|
|
parent = parentNode(parent);
|
|
}
|
|
return false;
|
|
}
|
|
const id = 'dev-tools';
|
|
const defaultExport = {
|
|
id,
|
|
install,
|
|
listeners: {
|
|
'interactions:action-start': (_ref4, scope) => {
|
|
let {
|
|
interaction
|
|
} = _ref4;
|
|
for (const check of checks) {
|
|
const options = interaction.interactable && interaction.interactable.options;
|
|
if (!(options && options.devTools && options.devTools.ignore[check.name]) && check.perform(interaction)) {
|
|
scope.logger.warn(prefix + check.text, ...check.getInfo(interaction));
|
|
}
|
|
}
|
|
}
|
|
},
|
|
checks,
|
|
CheckName,
|
|
links,
|
|
prefix
|
|
};
|
|
export { defaultExport as default };
|
|
//# sourceMappingURL=plugin.js.map
|