@fe6/water-pro
Version:
An enterprise-class UI design language and Vue-based implementation
198 lines (158 loc) • 6.97 kB
JavaScript
;
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = Moveable;
var _ = _interopRequireWildcard(require("../utils/utils"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
var clamp = function clamp(v) {
return Math.max(Math.min(v, 1), 0);
};
function Moveable(opt) {
var that = {
// Assign default values
options: _extends({
lock: null,
onchange: function onchange() {
return 0;
},
onstop: function onstop() {
return 0;
}
}, opt),
_keyboard: function _keyboard(e) {
var options = that.options;
var type = e.type,
key = e.key; // Check to see if the Movable is focused and then move it based on arrow key inputs
// For improved accessibility
if (document.activeElement === options.wrapper) {
var lock = that.options.lock;
var up = key === 'ArrowUp';
var right = key === 'ArrowRight';
var down = key === 'ArrowDown';
var left = key === 'ArrowLeft';
if (type === 'keydown' && (up || right || down || left)) {
var xm = 0;
var ym = 0;
if (lock === 'v') {
xm = up || right ? 1 : -1;
} else if (lock === 'h') {
xm = up || right ? -1 : 1;
} else {
ym = up ? -1 : down ? 1 : 0;
xm = left ? -1 : right ? 1 : 0;
}
that.update(clamp(that.cache.x + 0.01 * xm), clamp(that.cache.y + 0.01 * ym));
e.preventDefault();
} else if (key.startsWith('Arrow')) {
that.options.onstop();
e.preventDefault();
}
}
},
_tapstart: function _tapstart(evt) {
_.on(document, ['mouseup', 'touchend', 'touchcancel'], that._tapstop);
_.on(document, ['mousemove', 'touchmove'], that._tapmove);
if (evt.cancelable) {
evt.preventDefault();
} // Trigger
that._tapmove(evt);
},
_tapmove: function _tapmove(evt) {
var options = that.options,
cache = that.cache;
var lock = options.lock,
element = options.element,
wrapper = options.wrapper;
var b = wrapper.getBoundingClientRect();
var x = 0;
var y = 0;
if (evt) {
var touch = evt && evt.touches && evt.touches[0];
x = evt ? (touch || evt).clientX : 0;
y = evt ? (touch || evt).clientY : 0; // Reset to bounds
if (x < b.left) {
x = b.left;
} else if (x > b.left + b.width) {
x = b.left + b.width;
}
if (y < b.top) {
y = b.top;
} else if (y > b.top + b.height) {
y = b.top + b.height;
} // Normalize
x -= b.left;
y -= b.top;
} else if (cache) {
x = cache.x * b.width;
y = cache.y * b.height;
}
if (lock !== 'h') {
element.style.left = "calc(".concat(x / b.width * 100, "% - ").concat(element.offsetWidth / 2, "px)");
}
if (lock !== 'v') {
element.style.top = "calc(".concat(y / b.height * 100, "% - ").concat(element.offsetHeight / 2, "px)");
}
that.cache = {
x: x / b.width,
y: y / b.height
};
var cx = clamp(x / b.width);
var cy = clamp(y / b.height);
switch (lock) {
case 'v':
return options.onchange(cx);
case 'h':
return options.onchange(cy);
default:
return options.onchange(cx, cy);
}
},
_tapstop: function _tapstop() {
that.options.onstop();
_.off(document, ['mouseup', 'touchend', 'touchcancel'], that._tapstop);
_.off(document, ['mousemove', 'touchmove'], that._tapmove);
},
trigger: function trigger() {
that._tapmove();
},
update: function update() {
var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var _that$options$wrapper = that.options.wrapper.getBoundingClientRect(),
left = _that$options$wrapper.left,
top = _that$options$wrapper.top,
width = _that$options$wrapper.width,
height = _that$options$wrapper.height;
if (that.options.lock === 'h') {
y = x;
}
that._tapmove({
clientX: left + width * x,
clientY: top + height * y
});
},
destroy: function destroy() {
var options = that.options,
_tapstart = that._tapstart,
_keyboard = that._keyboard;
_.off(document, ['keydown', 'keyup'], _keyboard);
_.off([options.wrapper, options.element], 'mousedown', _tapstart);
_.off([options.wrapper, options.element], 'touchstart', _tapstart, {
passive: false
});
}
}; // Initilize
var options = that.options,
_tapstart = that._tapstart,
_keyboard = that._keyboard;
_.on([options.wrapper, options.element], 'mousedown', _tapstart);
_.on([options.wrapper, options.element], 'touchstart', _tapstart, {
passive: false
});
_.on(document, ['keydown', 'keyup'], _keyboard);
return that;
}