diff --git a/.gitignore b/.gitignore index 6b5fe07c..ed064843 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ node_modules/ *.DS_Store .DS_Store doc/ -dist/ + packages/*/dist demo/dist/ release/ diff --git a/dist/scene.cjs.js b/dist/scene.cjs.js new file mode 100644 index 00000000..e77432bc --- /dev/null +++ b/dist/scene.cjs.js @@ -0,0 +1,3887 @@ +/* +Copyright (c) 2016 Daybrush +name: scenejs +license: MIT +author: Daybrush +repository: https://github.com/daybrush/scenejs.git +version: 1.2.0 +*/ +'use strict'; + +var utils = require('@daybrush/utils'); +var ListMap = require('list-map'); + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. All rights reserved. +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at http://www.apache.org/licenses/LICENSE-2.0 + +THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED +WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +MERCHANTABLITY OR NON-INFRINGEMENT. + +See the Apache Version 2.0 License for specific language governing permissions +and limitations under the License. +***************************************************************************** */ + +/* global Reflect, Promise */ +var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + }; + + return extendStatics(d, b); +}; + +function __extends(d, b) { + extendStatics(d, b); + + function __() { + this.constructor = d; + } + + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} +function __decorate(decorators, target, key, desc) { + var c = arguments.length, + r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, + d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} + +function cubic(y1, y2, t) { + var t2 = 1 - t; // Bezier Curve Formula + + return t * t * t + 3 * t * t * t2 * y2 + 3 * t * t2 * t2 * y1; +} + +function solveFromX(x1, x2, x) { + // x 0 ~ 1 + // t 0 ~ 1 + var t = x; + var solveX = x; + var dx = 1; + + while (Math.abs(dx) > 1 / 1000) { + // 예상 t초에 의한 _x값 + solveX = cubic(x1, x2, t); + dx = solveX - x; // 차이가 미세하면 그 값을 t로 지정 + + if (Math.abs(dx) < 1 / 1000) { + return t; + } + + t -= dx / 2; + } + + return t; +} +/** + * @namespace easing + */ + +/** +* Cubic Bezier curve. +* @memberof easing +* @func bezier +* @param {number} [x1] - point1's x +* @param {number} [y1] - point1's y +* @param {number} [x2] - point2's x +* @param {number} [y2] - point2's y +* @return {function} the curve function +* @example +import {bezier} from "scenejs"; +Scene.bezier(0, 0, 1, 1) // LINEAR +Scene.bezier(0.25, 0.1, 0.25, 1) // EASE +*/ + + +function bezier(x1, y1, x2, y2) { + /* + x = f(t) + calculate inverse function by x + t = f-1(x) + */ + var func = function (x) { + var t = solveFromX(x1, x2, Math.max(Math.min(1, x), 0)); + return cubic(y1, y2, t); + }; + + func.easingName = "cubic-bezier(" + x1 + "," + y1 + "," + x2 + "," + y2 + ")"; + return func; +} +/** +* Specifies a stepping function +* @see {@link https://www.w3schools.com/cssref/css3_pr_animation-timing-function.asp|CSS3 Timing Function} +* @memberof easing +* @func steps +* @param {number} count - point1's x +* @param {"start" | "end"} postion - point1's y +* @return {function} the curve function +* @example +import {steps} from "scenejs"; +Scene.steps(1, "start") // Scene.STEP_START +Scene.steps(1, "end") // Scene.STEP_END +*/ + +function steps(count, position) { + var func = function (time) { + var level = 1 / count; + + if (time >= 1) { + return 1; + } + + return (position === "start" ? level : 0) + Math.floor(time / level) * level; + }; + + func.easingName = "steps(" + count + ", " + position + ")"; + return func; +} +/** +* Equivalent to steps(1, start) +* @memberof easing +* @name STEP_START +* @static +* @type {function} +* @example +import {STEP_START} from "scenejs"; +Scene.STEP_START // steps(1, start) +*/ + +var STEP_START = +/*#__PURE__#*/ +steps(1, "start"); +/** +* Equivalent to steps(1, end) +* @memberof easing +* @name STEP_END +* @static +* @type {function} +* @example +import {STEP_END} from "scenejs"; +Scene.STEP_END // steps(1, end) +*/ + +var STEP_END = +/*#__PURE__#*/ +steps(1, "end"); +/** +* Linear Speed (0, 0, 1, 1) +* @memberof easing +* @name LINEAR +* @static +* @type {function} +* @example +import {LINEAR} from "scenejs"; +Scene.LINEAR +*/ + +var LINEAR = +/*#__PURE__#*/ +bezier(0, 0, 1, 1); +/** +* Ease Speed (0.25, 0.1, 0.25, 1) +* @memberof easing +* @name EASE +* @static +* @type {function} +* @example +import {EASE} from "scenejs"; +Scene.EASE +*/ + +var EASE = +/*#__PURE__#*/ +bezier(0.25, 0.1, 0.25, 1); +/** +* Ease In Speed (0.42, 0, 1, 1) +* @memberof easing +* @name EASE_IN +* @static +* @type {function} +* @example +import {EASE_IN} from "scenejs"; +Scene.EASE_IN +*/ + +var EASE_IN = +/*#__PURE__#*/ +bezier(0.42, 0, 1, 1); +/** +* Ease Out Speed (0, 0, 0.58, 1) +* @memberof easing +* @name EASE_OUT +* @static +* @type {function} +* @example +import {EASE_OUT} from "scenejs"; +Scene.EASE_OUT +*/ + +var EASE_OUT = +/*#__PURE__#*/ +bezier(0, 0, 0.58, 1); +/** +* Ease In Out Speed (0.42, 0, 0.58, 1) +* @memberof easing +* @name EASE_IN_OUT +* @static +* @type {function} +* @example +import {EASE_IN_OUT} from "scenejs"; +Scene.EASE_IN_OUT +*/ + +var EASE_IN_OUT = +/*#__PURE__#*/ +bezier(0.42, 0, 0.58, 1); + +var _a; +var PREFIX = "__SCENEJS_"; +var DATA_SCENE_ID = "data-scene-id"; +var TIMING_FUNCTION = "animation-timing-function"; +var ROLES = { + transform: {}, + filter: {}, + attribute: {}, + html: true +}; +var ALIAS = { + easing: [TIMING_FUNCTION] +}; +var FIXED = (_a = {}, _a[TIMING_FUNCTION] = true, _a.contents = true, _a.html = true, _a); +var MAXIMUM = 1000000; +var THRESHOLD = 0.000001; +var DURATION = "duration"; +var FILL_MODE = "fillMode"; +var DIRECTION = "direction"; +var ITERATION_COUNT = "iterationCount"; +var DELAY = "delay"; +var EASING = "easing"; +var PLAY_SPEED = "playSpeed"; +var EASING_NAME = "easingName"; +var ITERATION_TIME = "iterationTime"; +var PAUSED = "paused"; +var ENDED = "ended"; +var TIMEUPDATE = "timeupdate"; +var ANIMATE = "animate"; +var PLAY = "play"; +var RUNNING = "running"; +var ITERATION = "iteration"; +var START_ANIMATION = "startAnimation"; +var PAUSE_ANIMATION = "pauseAnimation"; +var ALTERNATE = "alternate"; +var REVERSE = "reverse"; +var ALTERNATE_REVERSE = "alternate-reverse"; +var NORMAL = "normal"; +var INFINITE = "infinite"; +var PLAY_STATE = "playState"; +var PLAY_CSS = "playCSS"; +var PREV_TIME = "prevTime"; +var TICK_TIME = "tickTime"; +var CURRENT_TIME = "currentTime"; +var SELECTOR = "selector"; +var TRANSFORM_NAME = "transform"; +var EASINGS = { + "linear": LINEAR, + "ease": EASE, + "ease-in": EASE_IN, + "ease-out": EASE_OUT, + "ease-in-out": EASE_IN_OUT, + "step-start": STEP_START, + "step-end": STEP_END +}; +/** +* option name list +* @name Scene.OPTIONS +* @memberof Scene +* @static +* @type {$ts:OptionType} +* @example +* Scene.OPTIONS // ["duration", "fillMode", "direction", "iterationCount", "delay", "easing", "playSpeed"] +*/ + +var OPTIONS = [DURATION, FILL_MODE, DIRECTION, ITERATION_COUNT, DELAY, EASING, PLAY_SPEED]; +/** +* Event name list +* @name Scene.EVENTS +* @memberof Scene +* @static +* @type {$ts:EventType} +* @example +* Scene.EVENTS // ["paused", "ended", "timeupdate", "animate", "play", "iteration"]; +*/ + +var EVENTS = [PAUSED, ENDED, TIMEUPDATE, ANIMATE, PLAY, ITERATION]; + +/** +* attach and trigger event handlers. +*/ + +var EventTrigger = +/*#__PURE__*/ +function () { + /** + * @example + const et = new Scene.EventTrigger(); + const scene = new Scene(); + scene.on("call", e => { + console.log(e.param); + }); + et.on("call", e => { + console.log(e.param); + }); + scene.trigger("call", {param: 1}); + et.trigger("call", {param: 1}); + */ + function EventTrigger() { + this.events = {}; + } + + var __proto = EventTrigger.prototype; + + __proto._on = function (name, callback, once) { + var _this = this; + + var events = this.events; + + if (utils.isObject(name)) { + for (var n in name) { + this._on(n, name[n], once); + } + + return; + } + + if (!(name in events)) { + events[name] = []; + } + + if (!callback) { + return; + } + + if (utils.isArray(callback)) { + callback.forEach(function (func) { + return _this._on(name, func, once); + }); + return; + } + + events[name].push(once ? function callback2() { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + callback.apply(void 0, args); + this.off(name, callback2); + } : callback); + }; + /** + * Attach an event handler function for one or more events to target + * @param - event's name + * @param - function to execute when the event is triggered. + * @return {EventTrigger} An Instance itself. + * @example + target.on("animate", function() { + console.log("animate"); + }); + target.trigger("animate"); + */ + + + __proto.on = function (name, callback) { + this._on(name, callback); + + return this; + }; + /** + * Dettach an event handler function for one or more events to target + * @param - event's name + * @param - function to execute when the event is triggered. + * @return {EventTrigger} An Instance itself. + * @example + const callback = function() { + console.log("animate"); + }; + target.on("animate", callback); + target.off("animate", callback); + target.off("animate"); + */ + + + __proto.off = function (name, callback) { + if (!name) { + this.events = {}; + } else if (!callback) { + this.events[name] = []; + } else { + var callbacks = this.events[name]; + + if (!callbacks) { + return this; + } + + var index = callbacks.indexOf(callback); + + if (index !== -1) { + callbacks.splice(index, 1); + } + } + + return this; + }; + /** + * execute event handler + * @param - event's name + * @param - event handler's additional parameter + * @return {EventTrigger} An Instance itself. + * @example + target.on("animate", function(a1, a2) { + console.log("animate", a1, a2); + }); + target.trigger("animate", [1, 2]); // log => "animate", 1, 2 + */ + + + __proto.trigger = function (name) { + var _this = this; + + var data = []; + + for (var _i = 1; _i < arguments.length; _i++) { + data[_i - 1] = arguments[_i]; + } + + var events = this.events; + + if (!(name in events)) { + return this; + } + + var args = data || []; + !args[0] && (args[0] = {}); + var event = events[name]; + var target = args[0]; + target.type = name; + target.currentTarget = this; + !target.target && (target.target = this); + utils.toArray(events[name]).forEach(function (callback) { + callback.apply(_this, data); + }); + return this; + }; + + __proto.once = function (name, callback) { + this._on(name, callback, true); + + return this; + }; + + return EventTrigger; +}(); + +/** +* Make string, array to PropertyObject for the dot product +*/ + +var PropertyObject = +/*#__PURE__*/ +function () { + /** + * @param - This value is in the array format. + * @param - options + * @example + var obj = new PropertyObject([100,100,100,0.5], { + "separator" : ",", + "prefix" : "rgba(", + "suffix" : ")" + }); + */ + function PropertyObject(value, options) { + this.prefix = ""; + this.suffix = ""; + this.model = ""; + this.type = ""; + this.separator = ","; + options && this.setOptions(options); + this.value = utils.isString(value) ? value.split(this.separator) : value; + } + + var __proto = PropertyObject.prototype; + + __proto.setOptions = function (newOptions) { + for (var name in newOptions) { + this[name] = newOptions[name]; + } + + return this; + }; + /** + * the number of values. + * @example + const obj1 = new PropertyObject("1,2,3", ","); + console.log(obj1.length); + // 3 + */ + + + __proto.size = function () { + return this.value.length; + }; + /** + * retrieve one of values at the index + * @param {Number} index - index + * @return {Object} one of values at the index + * @example + const obj1 = new PropertyObject("1,2,3", ","); + console.log(obj1.get(0)); + // 1 + */ + + + __proto.get = function (index) { + return this.value[index]; + }; + /** + * Set the value at that index + * @param {Number} index - index + * @param {Object} value - text, a number, object to set + * @return {PropertyObject} An instance itself + * @example + const obj1 = new PropertyObject("1,2,3", ","); + obj1.set(0, 2); + console.log(obj1.toValue()); + // 2,2,3 + */ + + + __proto.set = function (index, value) { + this.value[index] = value; + return this; + }; + /** + * create a copy of an instance itself. + * @return {PropertyObject} clone + * @example + const obj1 = new PropertyObject("1,2,3", ","); + const obj2 = obj1.clone(); + */ + + + __proto.clone = function () { + var _a = this, + separator = _a.separator, + prefix = _a.prefix, + suffix = _a.suffix, + model = _a.model, + type = _a.type; + + var arr = this.value.map(function (v) { + return v instanceof PropertyObject ? v.clone() : v; + }); + return new PropertyObject(arr, { + separator: separator, + prefix: prefix, + suffix: suffix, + model: model, + type: type + }); + }; + /** + * Make Property Object to String + * @return {String} Make Property Object to String + * @example + //rgba(100, 100, 100, 0.5) + const obj4 = new PropertyObject([100,100,100,0.5], { + "separator" : ",", + "prefix" : "rgba(", + "suffix" : ")", + }); + console.log(obj4.toValue()); + // "rgba(100,100,100,0.5)" + */ + + + __proto.toValue = function () { + return this.prefix + this.join() + this.suffix; + }; + /** + * Make Property Object's array to String + * @return {String} Join the elements of an array into a string + * @example + //rgba(100, 100, 100, 0.5) + var obj4 = new PropertyObject([100,100,100,0.5], { + "separator" : ",", + "prefix" : "rgba(", + "suffix" : ")" + }); + obj4.join(); // => "100,100,100,0.5" + */ + + + __proto.join = function () { + return this.value.map(function (v) { + return v instanceof PropertyObject ? v.toValue() : v; + }).join(this.separator); + }; + /** + * executes a provided function once per array element. + * @param {Function} callback - Function to execute for each element, taking three arguments + * @param {All} [callback.currentValue] The current element being processed in the array. + * @param {Number} [callback.index] The index of the current element being processed in the array. + * @param {Array} [callback.array] the array. + * @return {PropertyObject} An instance itself + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach|MDN Array.forEach()} reference to MDN document. + * @example + //rgba(100, 100, 100, 0.5) + var obj4 = new PropertyObject([100,100,100,0.5], { + "separator" : ",", + "prefix" : "rgba(", + "suffix" : ")" + }); + obj4.forEach(t => { + console.log(t); + }); // => "100,100,100,0.5" + */ + + + __proto.forEach = function (func) { + this.value.forEach(func); + return this; + }; + + return PropertyObject; +}(); + +/** +* @namespace +* @name Property +*/ +function splitStyle(str) { + var properties = utils.splitText(str, ";"); + var obj = {}; + var length = properties.length; + + for (var i = 0; i < length; ++i) { + var matches = utils.splitText(properties[i], ":"); + + if (matches.length < 2 || !matches[1]) { + --length; + continue; + } + + obj[matches[0].trim()] = toPropertyObject(matches[1].trim()); + } + + return { + styles: obj, + length: length + }; +} +/** +* convert array to PropertyObject[type=color]. +* default model "rgba" +* @memberof Property +* @function arrayToColorObject +* @param {Array|PropertyObject} value ex) [0, 0, 0, 1] +* @return {PropertyObject} PropertyObject[type=color] +* @example +arrayToColorObject([0, 0, 0]) +// => PropertyObject(type="color", model="rgba", value=[0, 0, 0, 1], separator=",") +*/ + +function arrayToColorObject(arr) { + var model = utils.RGBA; + + if (arr.length === 3) { + arr[3] = 1; + } + + return new PropertyObject(arr, { + model: model, + separator: ",", + type: "color", + prefix: model + "(", + suffix: ")" + }); +} +/** +* convert text with parentheses to object. +* @memberof Property +* @function stringToBracketObject +* @param {String} value ex) "rgba(0,0,0,1)" +* @return {PropertyObject} PropertyObject +* @example +stringToBracketObject("abcde(0, 0, 0,1)") +// => PropertyObject(model="abcde", value=[0, 0, 0,1], separator=",") +*/ + +function stringToBracketObject(text) { + // [prefix, value, other] + var _a = utils.splitBracket(text), + model = _a.prefix, + value = _a.value, + afterModel = _a.suffix; + + if (typeof value === "undefined") { + return text; + } + + if (utils.COLOR_MODELS.indexOf(model) > -1) { + return arrayToColorObject(utils.stringToRGBA(text)); + } // divide comma(,) + + + var obj = toPropertyObject(value, model); + var arr = [value]; + var separator = ","; + var prefix = model + "("; + var suffix = ")" + afterModel; + + if (obj instanceof PropertyObject) { + separator = obj.separator; + arr = obj.value; + prefix += obj.prefix; + suffix = obj.suffix + suffix; + } + + return new PropertyObject(arr, { + separator: separator, + model: model, + prefix: prefix, + suffix: suffix + }); +} +function arrayToPropertyObject(arr, separator) { + return new PropertyObject(arr, { + type: "array", + separator: separator + }); +} +/** +* convert text with parentheses to PropertyObject[type=color]. +* If the values are not RGBA model, change them RGBA mdoel. +* @memberof Property +* @function stringToColorObject +* @param {String|PropertyObject} value ex) "rgba(0,0,0,1)" +* @return {PropertyObject} PropertyObject[type=color] +* @example +stringToColorObject("rgba(0, 0, 0,1)") +// => PropertyObject(type="color", model="rgba", value=[0, 0, 0,1], separator=",") +*/ + +function stringToColorObject(value) { + var result = utils.stringToRGBA(value); + return result ? arrayToColorObject(result) : value; +} +function toPropertyObject(value, model) { + if (!utils.isString(value)) { + if (utils.isArray(value)) { + return arrayToPropertyObject(value, ","); + } + + return value; + } + + var values = utils.splitComma(value); + + if (values.length > 1) { + return arrayToPropertyObject(values.map(function (v) { + return toPropertyObject(v); + }), ","); + } + + values = utils.splitSpace(value); + + if (values.length > 1) { + return arrayToPropertyObject(values.map(function (v) { + return toPropertyObject(v); + }), " "); + } + + values = /^(['"])([^'"]*)(['"])$/g.exec(value); + + if (values && values[1] === values[3]) { + // Quotes + return new PropertyObject([toPropertyObject(values[2])], { + prefix: values[1], + suffix: values[1] + }); + } else if (value.indexOf("(") !== -1) { + // color + return stringToBracketObject(value); + } else if (value.charAt(0) === "#" && model !== "url") { + return stringToColorObject(value); + } + + return value; +} +function toObject(object, result) { + if (result === void 0) { + result = {}; + } + + var model = object.model; + + if (model) { + object.setOptions({ + model: "", + suffix: "", + prefix: "" + }); + var value = object.size() > 1 ? object : object.get(0); + result[model] = value; + } else { + object.forEach(function (obj) { + toObject(obj, result); + }); + } + + return result; +} + +function isPropertyObject(value) { + return value instanceof PropertyObject; +} +function setAlias(name, alias) { + ALIAS[name] = alias; +} +function setRole(names, isProperty, isFixedProperty) { + var length = names.length; + var roles = ROLES; + var fixed = FIXED; + + for (var i = 0; i < length - 1; ++i) { + !roles[names[i]] && (roles[names[i]] = {}); + roles = roles[names[i]]; + + if (isFixedProperty) { + !fixed[names[i]] && (fixed[names[i]] = {}); + fixed = fixed[names[i]]; + } + } + + isFixedProperty && (fixed[names[length - 1]] = true); + roles[names[length - 1]] = isProperty ? true : {}; +} +function getType(value) { + var type = typeof value; + + if (type === utils.OBJECT) { + if (utils.isArray(value)) { + return utils.ARRAY; + } else if (isPropertyObject(value)) { + return utils.PROPERTY; + } + } else if (type === utils.STRING || type === utils.NUMBER) { + return "value"; + } + + return type; +} +function isPureObject(obj) { + return utils.isObject(obj) && obj.constructor === Object; +} +function getNames(names, stack) { + var arr = []; + + if (isPureObject(names)) { + for (var name in names) { + stack.push(name); + arr = arr.concat(getNames(names[name], stack)); + stack.pop(); + } + } else { + arr.push(stack.slice()); + } + + return arr; +} +function updateFrame(names, properties) { + for (var name in properties) { + var value = properties[name]; + + if (!isPureObject(value)) { + names[name] = true; + continue; + } + + if (!utils.isObject(names[name])) { + names[name] = {}; + } + + updateFrame(names[name], properties[name]); + } + + return names; +} +function toFixed(num) { + return Math.round(num * MAXIMUM) / MAXIMUM; +} +function getValueByNames(names, properties, length) { + if (length === void 0) { + length = names.length; + } + + var value = properties; + + for (var i = 0; i < length; ++i) { + if (!utils.isObject(value)) { + return undefined; + } + + value = value[names[i]]; + } + + return value; +} +function isInProperties(roles, args, isCheckTrue) { + var length = args.length; + var role = roles; + + if (length === 0) { + return false; + } + + for (var i = 0; i < length; ++i) { + if (role === true) { + return false; + } + + role = role[args[i]]; + + if (!role || !isCheckTrue && role === true) { + return false; + } + } + + return true; +} +function isRole(args, isCheckTrue) { + return isInProperties(ROLES, args, isCheckTrue); +} +function isFixed(args) { + return isInProperties(FIXED, args, true); +} +function setPlayCSS(item, isActivate) { + item.state[PLAY_CSS] = isActivate; +} +function isPausedCSS(item) { + return item.state[PLAY_CSS] && item.isPaused(); +} +function isEndedCSS(item) { + return !item.isEnded() && item.state[PLAY_CSS]; +} +function exportCSS(id, css) { + var styleId = PREFIX + "STYLE_" + toId(id); + var styleElement = utils.$("#" + styleId); + + if (styleElement) { + styleElement.innerText = css; + } else { + utils.document.body.insertAdjacentHTML("beforeend", ""); + } +} +function makeId(selector) { + for (;;) { + var id = "" + Math.floor(Math.random() * 10000000); + + if (!utils.IS_WINDOW || !selector) { + return id; + } + + var checkElement = utils.$("[data-scene-id=\"" + id + "\"]"); + + if (!checkElement) { + return id; + } + } +} +function getRealId(item) { + return item.getId() || item.setId(makeId(false)).getId(); +} +function toId(text) { + return ("" + text).match(/[0-9a-zA-Z]+/g).join(""); +} +function playCSS(item, isExportCSS, playClassName, properties) { + if (properties === void 0) { + properties = {}; + } + + if (!utils.ANIMATION || item.getPlayState() === RUNNING) { + return; + } + + var className = playClassName || START_ANIMATION; + + if (isPausedCSS(item)) { + item.addPlayClass(true, className, properties); + } else { + if (item.isEnded()) { + item.setTime(0); + } + + isExportCSS && item.exportCSS({ + className: className + }); + var el = item.addPlayClass(false, className, properties); + + if (!el) { + return; + } + + addAnimationEvent(item, el); + setPlayCSS(item, true); + } + + item.setPlayState(RUNNING); +} +function addAnimationEvent(item, el) { + var state = item.state; + var duration = item.getDuration(); + var isZeroDuration = !duration || !isFinite(duration); + + var animationend = function () { + setPlayCSS(item, false); + item.finish(); + }; + + var animationstart = function () { + item.trigger(PLAY); + }; + + item.once(ENDED, function () { + utils.removeEvent(el, "animationcancel", animationend); + utils.removeEvent(el, "animationend", animationend); + utils.removeEvent(el, "animationiteration", animationiteration); + utils.removeEvent(el, "animationstart", animationstart); + }); + + var animationiteration = function (_a) { + var elapsedTime = _a.elapsedTime; + var currentTime = elapsedTime; + var iterationCount = isZeroDuration ? 0 : currentTime / duration; + state[CURRENT_TIME] = currentTime; + item.setIteration(iterationCount); + }; + + utils.addEvent(el, "animationcancel", animationend); + utils.addEvent(el, "animationend", animationend); + utils.addEvent(el, "animationiteration", animationiteration); + utils.addEvent(el, "animationstart", animationstart); +} +function getEasing(curveArray) { + var easing; + + if (utils.isString(curveArray)) { + if (curveArray in EASINGS) { + easing = EASINGS[curveArray]; + } else { + var obj = toPropertyObject(curveArray); + + if (utils.isString(obj)) { + return 0; + } else { + if (obj.model === "cubic-bezier") { + curveArray = obj.value.map(function (v) { + return parseFloat(v); + }); + easing = bezier(curveArray[0], curveArray[1], curveArray[2], curveArray[3]); + } else if (obj.model === "steps") { + easing = steps(parseFloat(obj.value[0]), obj.value[1]); + } else { + return 0; + } + } + } + } else if (utils.isArray(curveArray)) { + easing = bezier(curveArray[0], curveArray[1], curveArray[2], curveArray[3]); + } else { + easing = curveArray; + } + + return easing; +} + +function GetterSetter(getter, setter, parent) { + return function (constructor) { + var prototype = constructor.prototype; + getter.forEach(function (name) { + prototype[utils.camelize("get " + name)] = function () { + return this[parent][name]; + }; + }); + setter.forEach(function (name) { + prototype[utils.camelize("set " + name)] = function (value) { + this[parent][name] = value; + return this; + }; + }); + }; +} + +function isDirectionReverse(iteration, iteraiontCount, direction) { + if (direction === REVERSE) { + return true; + } else if (iteraiontCount !== INFINITE && iteration === iteraiontCount && iteraiontCount % 1 === 0) { + return direction === (iteration % 2 >= 1 ? ALTERNATE_REVERSE : ALTERNATE); + } + + return direction === (iteration % 2 >= 1 ? ALTERNATE : ALTERNATE_REVERSE); +} +/** +* @typedef {Object} AnimatorState The Animator options. Properties used in css animation. +* @property {number} [duration] The duration property defines how long an animation should take to complete one cycle. +* @property {"none"|"forwards"|"backwards"|"both"} [fillMode] The fillMode property specifies a style for the element when the animation is not playing (before it starts, after it ends, or both). +* @property {"infinite"|number} [iterationCount] The iterationCount property specifies the number of times an animation should be played. +* @property {array|function} [easing] The easing(timing-function) specifies the speed curve of an animation. +* @property {number} [delay] The delay property specifies a delay for the start of an animation. +* @property {"normal"|"reverse"|"alternate"|"alternate-reverse"} [direction] The direction property defines whether an animation should be played forwards, backwards or in alternate cycles. +*/ + +var setters = ["id", ITERATION_COUNT, DELAY, FILL_MODE, DIRECTION, PLAY_SPEED, DURATION, PLAY_SPEED, ITERATION_TIME, PLAY_STATE]; +var getters = setters.concat([EASING, EASING_NAME]); +/** +* play video, animation, the others +* @extends EventTrigger +* @see {@link https://www.w3schools.com/css/css3_animations.asp|CSS3 Animation} +*/ + +var Animator = +/*#__PURE__*/ +function (_super) { + __extends(Animator, _super); + /** + * @param - animator's options + * @example + const animator = new Animator({ + delay: 2, + diretion: "alternate", + duration: 2, + fillMode: "forwards", + iterationCount: 3, + easing: Scene.easing.EASE, + }); + */ + + + function Animator(options) { + var _this = _super.call(this) || this; + + _this.timerId = 0; + _this.state = { + id: "", + easing: 0, + easingName: "linear", + iterationCount: 1, + delay: 0, + fillMode: "forwards", + direction: NORMAL, + playSpeed: 1, + currentTime: 0, + iterationTime: -1, + iteration: 0, + tickTime: 0, + prevTime: 0, + playState: PAUSED, + duration: 0 + }; + + _this.setOptions(options); + + return _this; + } + /** + * set animator's easing. + * @param curverArray - The speed curve of an animation. + * @return {Animator} An instance itself. + * @example + animator.({ + delay: 2, + diretion: "alternate", + duration: 2, + fillMode: "forwards", + iterationCount: 3, + easing: Scene.easing.EASE, + }); + */ + + + var __proto = Animator.prototype; + + __proto.setEasing = function (curveArray) { + var easing = getEasing(curveArray); + var easingName = easing && easing[EASING_NAME] || "linear"; + var state = this.state; + state[EASING] = easing; + state[EASING_NAME] = easingName; + return this; + }; + /** + * set animator's options. + * @see {@link https://www.w3schools.com/css/css3_animations.asp|CSS3 Animation} + * @param - animator's options + * @return {Animator} An instance itself. + * @example + animator.({ + delay: 2, + diretion: "alternate", + duration: 2, + fillMode: "forwards", + iterationCount: 3, + easing: Scene.eaasing.EASE, + }); + */ + + + __proto.setOptions = function (options) { + if (options === void 0) { + options = {}; + } + + for (var name in options) { + var value = options[name]; + + if (name === EASING) { + this.setEasing(value); + continue; + } else if (name === DURATION) { + value && this.setDuration(value); + continue; + } + + if (OPTIONS.indexOf(name) > -1) { + this.state[name] = value; + } + } + + return this; + }; + /** + * Get the animator's total duration including delay + * @return {number} Total duration + * @example + animator.getTotalDuration(); + */ + + + __proto.getTotalDuration = function () { + return this.getActiveDuration(true); + }; + /** + * Get the animator's total duration excluding delay + * @return {number} Total duration excluding delay + * @example + animator.getActiveDuration(); + */ + + + __proto.getActiveDuration = function (delay) { + var state = this.state; + var count = state[ITERATION_COUNT]; + + if (count === INFINITE) { + return Infinity; + } + + return (delay ? state[DELAY] : 0) + this.getDuration() * count; + }; + /** + * Check if the animator has reached the end. + * @return {boolean} ended + * @example + animator.isEnded(); // true or false + */ + + + __proto.isEnded = function () { + if (this.state[TICK_TIME] === 0 && this.state[PLAY_STATE] === PAUSED) { + return true; + } else if (this.getTime() < this.getActiveDuration()) { + return false; + } + + return true; + }; + /** + *Check if the animator is paused: + * @return {boolean} paused + * @example + animator.isPaused(); // true or false + */ + + + __proto.isPaused = function () { + return this.state[PLAY_STATE] === PAUSED; + }; + + __proto.start = function (delay) { + if (delay === void 0) { + delay = this.state[DELAY]; + } + + var state = this.state; + state[PLAY_STATE] = RUNNING; + + if (state[TICK_TIME] >= delay) { + /** + * This event is fired when play animator. + * @event Animator#play + */ + this.trigger(PLAY); + return true; + } + + return false; + }; + /** + * play animator + * @return {Animator} An instance itself. + */ + + + __proto.play = function (toTime) { + var _this = this; + + var state = this.state; + var delay = state[DELAY]; + var currentTime = this.getTime(); + state[PLAY_STATE] = RUNNING; + + if (this.isEnded() && (currentTime === 0 || currentTime >= this.getActiveDuration())) { + this.setTime(-delay, true); + } + + this.timerId = utils.requestAnimationFrame(function (time) { + state[PREV_TIME] = time; + + _this.tick(time, toTime); + }); + this.start(); + return this; + }; + /** + * pause animator + * @return {Animator} An instance itself. + */ + + + __proto.pause = function () { + var state = this.state; + + if (state[PLAY_STATE] !== PAUSED) { + state[PLAY_STATE] = PAUSED; + /** + * This event is fired when animator is paused. + * @event Animator#paused + */ + + this.trigger(PAUSED); + } + + utils.cancelAnimationFrame(this.timerId); + return this; + }; + /** + * end animator + * @return {Animator} An instance itself. + */ + + + __proto.finish = function () { + this.setTime(0); + this.state[TICK_TIME] = 0; + this.end(); + return this; + }; + /** + * end animator + * @return {Animator} An instance itself. + */ + + + __proto.end = function () { + this.pause(); + /** + * This event is fired when animator is ended. + * @event Animator#ended + */ + + this.trigger(ENDED); + return this; + }; + /** + * set currentTime + * @param {Number|String} time - currentTime + * @return {Animator} An instance itself. + * @example + animator.setTime("from"); // 0 + animator.setTime("to"); // 100% + animator.setTime("50%"); + animator.setTime(10); + animator.getTime() // 10 + */ + + + __proto.setTime = function (time, isTick, isParent) { + var activeDuration = this.getActiveDuration(); + var state = this.state; + var prevTime = state[TICK_TIME]; + var delay = state[DELAY]; + var currentTime = isTick ? time : this.getUnitTime(time); + state[TICK_TIME] = delay + currentTime; + + if (currentTime < 0) { + currentTime = 0; + } else if (currentTime > activeDuration) { + currentTime = activeDuration; + } + + state[CURRENT_TIME] = currentTime; + this.calculate(); + + if (isTick && !isParent) { + var tickTime = state[TICK_TIME]; + + if (prevTime < delay && time >= 0) { + this.start(0); + } + + if (tickTime < prevTime || this.isEnded()) { + this.end(); + return; + } + } + + if (this.isDelay()) { + return this; + } + /** + * This event is fired when the animator updates the time. + * @event Animator#timeupdate + * @param {Object} param The object of data to be sent to an event. + * @param {Number} param.currentTime The total time that the animator is running. + * @param {Number} param.time The iteration time during duration that the animator is running. + * @param {Number} param.iterationCount The iteration count that the animator is running. + */ + + + this.trigger(TIMEUPDATE, { + currentTime: currentTime, + time: this.getIterationTime(), + iterationCount: state[ITERATION] + }); + return this; + }; + /** + * Get the animator's current time + * @return {number} current time + * @example + animator.getTime(); + */ + + + __proto.getTime = function () { + return this.state[CURRENT_TIME]; + }; + + __proto.getUnitTime = function (time) { + if (utils.isString(time)) { + var duration = this.getDuration() || 100; + + if (time === "from") { + return 0; + } else if (time === "to") { + return duration; + } + + var _a = utils.splitUnit(time), + unit = _a.unit, + value = _a.value; + + if (unit === "%") { + !this.getDuration() && this.setDuration(duration); + return toFixed(parseFloat(time) / 100 * duration); + } else if (unit === ">") { + return value + THRESHOLD; + } else { + return value; + } + } else { + return toFixed(time); + } + }; + /** + * Check if the current state of animator is delayed. + * @return {boolean} check delay state + */ + + + __proto.isDelay = function () { + var state = this.state; + var delay = state[DELAY]; + var tickTime = state[TICK_TIME]; + return delay > 0 && tickTime < delay; + }; + + __proto.setIteration = function (iterationCount) { + var state = this.state; + var passIterationCount = Math.floor(iterationCount); + var maxIterationCount = state[ITERATION_COUNT] === INFINITE ? Infinity : state[ITERATION_COUNT]; + + if (state[ITERATION] < passIterationCount && passIterationCount < maxIterationCount) { + /** + * The event is fired when an iteration of an animation ends. + * @event Animator#iteration + * @param {Object} param The object of data to be sent to an event. + * @param {Number} param.currentTime The total time that the animator is running. + * @param {Number} param.iterationCount The iteration count that the animator is running. + */ + this.trigger("iteration", { + currentTime: state[CURRENT_TIME], + iterationCount: passIterationCount + }); + } + + state[ITERATION] = iterationCount; + return this; + }; + + __proto.calculate = function () { + var state = this.state; + var iterationCount = state[ITERATION_COUNT]; + var fillMode = state[FILL_MODE]; + var direction = state[DIRECTION]; + var duration = this.getDuration(); + var time = this.getTime(); + var iteration = duration === 0 ? 0 : time / duration; + var currentIterationTime = duration ? time % duration : 0; + + if (!duration) { + this.setIterationTime(0); + return this; + } + + this.setIteration(iteration); // direction : normal, reverse, alternate, alternate-reverse + // fillMode : forwards, backwards, both, none + + var isReverse = isDirectionReverse(iteration, iterationCount, direction); + var isFiniteDuration = isFinite(duration); + + if (isFiniteDuration && isReverse) { + currentIterationTime = duration - currentIterationTime; + } + + if (isFiniteDuration && iterationCount !== INFINITE) { + var isForwards = fillMode === "both" || fillMode === "forwards"; // fill forwards + + if (iteration >= iterationCount) { + currentIterationTime = duration * (isForwards ? iterationCount % 1 || 1 : 0); + isReverse && (currentIterationTime = duration - currentIterationTime); + } + } + + this.setIterationTime(currentIterationTime); + return this; + }; + + __proto.tick = function (now, to) { + var _this = this; + + if (this.isPaused()) { + return; + } + + var state = this.state; + var playSpeed = state[PLAY_SPEED]; + var prevTime = state[PREV_TIME]; + var delay = state[DELAY]; + var tickTime = state[TICK_TIME]; + var currentTime = tickTime + Math.min(1000, now - prevTime) / 1000 * playSpeed; + state[PREV_TIME] = now; + this.setTime(currentTime - delay, true); + + if (to && to * 1000 < now) { + this.pause(); + } + + if (state[PLAY_STATE] === PAUSED) { + return; + } + + this.timerId = utils.requestAnimationFrame(function (time) { + _this.tick(time, to); + }); + }; + + Animator = __decorate([GetterSetter(getters, setters, "state")], Animator); + return Animator; +}(EventTrigger); + +function toInnerProperties(obj) { + if (!obj) { + return ""; + } + + var arrObj = []; + + for (var name in obj) { + arrObj.push(name.replace(/\d$/g, "") + "(" + obj[name] + ")"); + } + + return arrObj.join(" "); +} +/* eslint-disable */ + + +function clone(target, toValue) { + if (toValue === void 0) { + toValue = false; + } + + return merge({}, target, toValue); +} + +function merge(to, from, toValue) { + if (toValue === void 0) { + toValue = false; + } + + for (var name in from) { + var value = from[name]; + var type = getType(value); + + if (type === utils.PROPERTY) { + to[name] = toValue ? value.toValue() : value.clone(); + } else if (type === utils.FUNCTION) { + to[name] = toValue ? getValue([name], value) : value; + } else if (type === utils.ARRAY) { + to[name] = value.slice(); + } else if (type === utils.OBJECT) { + if (utils.isObject(to[name]) && !isPropertyObject(to[name])) { + merge(to[name], value, toValue); + } else { + to[name] = clone(value, toValue); + } + } else { + to[name] = from[name]; + } + } + + return to; +} +/* eslint-enable */ + + +function getPropertyName(args) { + return args[0] in ALIAS ? ALIAS[args[0]] : args; +} + +function getValue(names, value) { + var type = getType(value); + + if (type === utils.PROPERTY) { + return value.toValue(); + } else if (type === utils.FUNCTION) { + if (names[0] !== TIMING_FUNCTION) { + return getValue(names, value()); + } + } else if (type === utils.OBJECT) { + return clone(value, true); + } + + return value; +} +/** +* Animation's Frame +*/ + + +var Frame = +/*#__PURE__*/ +function () { + /** + * @param - properties + * @example + const frame = new Scene.Frame({ + display: "none" + transform: { + translate: "50px", + scale: "5, 5", + } + }); + */ + function Frame(properties) { + if (properties === void 0) { + properties = {}; + } + + this.properties = {}; + this.set(properties); + } + /** + * get property value + * @param {...Number|String|PropertyObject} args - property name or value + * @example + frame.get("display") // => "none", "block", .... + frame.get("transform", "translate") // => "10px,10px" + */ + + + var __proto = Frame.prototype; + + __proto.get = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var value = this.raw.apply(this, args); + return getValue(getPropertyName(args), value); + }; + + __proto.raw = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + return getValueByNames(getPropertyName(args), this.properties); + }; + /** + * remove property value + * @param {...String} args - property name + * @return {Frame} An instance itself + * @example + frame.remove("display") + */ + + + __proto.remove = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var params = getPropertyName(args); + var length = params.length; + + if (!length) { + return this; + } + + var value = getValueByNames(params, this.properties, length - 1); + + if (utils.isObject(value)) { + delete value[params[length - 1]]; + } + + return this; + }; + /** + * set property + * @param {...Number|String|PropertyObject} args - property names or values + * @return {Frame} An instance itself + * @example + // one parameter + frame.set({ + display: "none", + transform: { + translate: "10px, 10px", + scale: "1", + }, + filter: { + brightness: "50%", + grayscale: "100%" + } + }); + // two parameters + frame.set("transform", { + translate: "10px, 10px", + scale: "1", + }); + // three parameters + frame.set("transform", "translate", "50px"); + */ + + + __proto.set = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var self = this; + var length = args.length; + var params = args.slice(0, -1); + var value = args[length - 1]; + var firstParam = params[0]; + + if (length === 1 && value instanceof Frame) { + self.merge(value); + } else if (firstParam in ALIAS) { + self._set(ALIAS[firstParam], value); + } else if (length === 2 && utils.isArray(firstParam)) { + self._set(firstParam, value); + } else if (isPropertyObject(value)) { + if (isRole(params)) { + self.set.apply(self, params.concat([toObject(value)])); + } else { + self._set(params, value); + } + } else if (utils.isArray(value)) { + self._set(params, value); + } else if (utils.isObject(value)) { + if (!self.has.apply(self, params) && isRole(params)) { + self._set(params, {}); + } + + for (var name in value) { + self.set.apply(self, params.concat([name, value[name]])); + } + } else if (utils.isString(value)) { + if (isRole(params, true)) { + if (isFixed(params) || !isRole(params)) { + this._set(params, value); + } else { + var obj = toPropertyObject(value); + + if (utils.isObject(obj)) { + self.set.apply(self, params.concat([obj])); + } + } + + return this; + } else { + var _a = splitStyle(value), + styles = _a.styles, + stylesLength = _a.length; + + for (var name in styles) { + self.set.apply(self, params.concat([name, styles[name]])); + } + + if (stylesLength) { + return this; + } + } + + self._set(params, value); + } else { + self._set(params, value); + } + + return self; + }; + /** + * Gets the names of properties. + * @return the names of properties. + * @example + // one parameter + frame.set({ + display: "none", + transform: { + translate: "10px, 10px", + scale: "1", + }, + }); + // [["display"], ["transform", "translate"], ["transform", "scale"]] + console.log(frame.getNames()); + */ + + + __proto.getNames = function () { + return getNames(this.properties, []); + }; + /** + * check that has property. + * @param {...String} args - property name + * @example + frame.has("property", "display") // => true or false + */ + + + __proto.has = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var params = getPropertyName(args); + var length = params.length; + + if (!length) { + return false; + } + + return !utils.isUndefined(getValueByNames(params, this.properties, length)); + }; + /** + * clone frame. + * @return {Frame} An instance of clone + * @example + frame.clone(); + */ + + + __proto.clone = function () { + var frame = new Frame(); + return frame.merge(this); + }; + /** + * merge one frame to other frame. + * @param - target frame. + * @return {Frame} An instance itself + * @example + frame.merge(frame2); + */ + + + __proto.merge = function (frame) { + var properties = this.properties; + var frameProperties = frame.properties; + + if (frameProperties) { + merge(properties, frameProperties); + } + + return this; + }; + /** + * Specifies an css object that coverted the frame. + * @return {object} cssObject + */ + + + __proto.toCSSObject = function () { + var properties = this.get(); + var cssObject = {}; + + for (var name in properties) { + if (isRole([name], true)) { + continue; + } + + var value = properties[name]; + + if (name === TIMING_FUNCTION) { + cssObject[TIMING_FUNCTION.replace("animation", utils.ANIMATION)] = (utils.isString(value) ? value : value[EASING_NAME]) || "initial"; + } else { + cssObject[name] = value; + } + } + + var transform = toInnerProperties(properties[TRANSFORM_NAME]); + var filter = toInnerProperties(properties.filter); + utils.TRANSFORM && transform && (cssObject[utils.TRANSFORM] = transform); + utils.FILTER && filter && (cssObject[utils.FILTER] = filter); + return cssObject; + }; + /** + * Specifies an css text that coverted the frame. + * @return {string} cssText + */ + + + __proto.toCSS = function () { + var cssObject = this.toCSSObject(); + var cssArray = []; + + for (var name in cssObject) { + cssArray.push(name + ":" + cssObject[name] + ";"); + } + + return cssArray.join(""); + }; + /** + * Remove All Properties + * @return {Frame} An instance itself + */ + + + __proto.clear = function () { + this.properties = {}; + return this; + }; + + __proto._set = function (args, value) { + var properties = this.properties; + var length = args.length; + + for (var i = 0; i < length - 1; ++i) { + var name = args[i]; + !(name in properties) && (properties[name] = {}); + properties = properties[name]; + } + + if (!length) { + return; + } + + if (length === 1 && args[0] === TIMING_FUNCTION) { + properties[TIMING_FUNCTION] = getEasing(value); + } else { + var lastParam = args[length - 1]; + properties[lastParam] = utils.isString(value) && !isFixed(args) ? toPropertyObject(value, lastParam) : value; + } + }; + + return Frame; +}(); + +function dotArray(a1, a2, b1, b2) { + var length = a2.length; + return a1.map(function (v1, i) { + if (i >= length) { + return v1; + } else { + return dot(v1, a2[i], b1, b2); + } + }); +} + +function dotColor(color1, color2, b1, b2) { + // convert array to PropertyObject(type=color) + var value1 = color1.value; + var value2 = color2.value; // If the model name is not same, the inner product is impossible. + + var model1 = color1.model; + var model2 = color2.model; + + if (model1 !== model2) { + // It is recognized as a string. + return dot(color1.toValue(), color2.toValue(), b1, b2); + } + + if (value1.length === 3) { + value1[3] = 1; + } + + if (value2.length === 3) { + value2[3] = 1; + } + + var v = dotArray(value1, value2, b1, b2); + var colorModel = model1; + + for (var i = 0; i < 3; ++i) { + v[i] = parseInt(v[i], 10); + } + + var object = new PropertyObject(v, { + type: "color", + model: colorModel, + prefix: colorModel + "(", + suffix: ")" + }); + return object; +} + +function dotObject(a1, a2, b1, b2) { + var a1Type = a1.type; + + if (a1Type === "color") { + return dotColor(a1, a2, b1, b2); + } + + var value1 = a1.value; + var value2 = a2.value; + var arr = dotArray(value1, value2, b1, b2); + return new PropertyObject(arr, { + type: a1Type, + separator: a1.separator || a2.separator, + prefix: a1.prefix || a2.prefix, + suffix: a1.suffix || a2.suffix, + model: a1.model || a2.model + }); +} +/** +* The dot product of a1 and a2 for the b1 and b2. +* @memberof Dot +* @function dot +* @param {String|Number|PropertyObject} a1 value1 +* @param {String|Number|PropertyObject} a2 value2 +* @param {Number} b1 b1 ratio +* @param {Number} b2 b2 ratio +* @return {String} Not Array, Not Separator, Only Number & Unit +* @return {PropertyObject} Array with Separator. +* @example +dot(1, 3, 0.3, 0.7); +// => 1.6 +*/ + + +function dot(a1, a2, b1, b2) { + if (b2 === 0) { + return a2; + } else if (b1 === 0 || b1 + b2 === 0) { + // prevent division by zero. + return a1; + } // dot Object + + + var type1 = getType(a1); + var type2 = getType(a2); + var isFunction1 = type1 === utils.FUNCTION; + var isFunction2 = type2 === utils.FUNCTION; + + if (isFunction1 || isFunction2) { + return function () { + return dot(isFunction1 ? toPropertyObject(a1()) : a1, isFunction2 ? toPropertyObject(a2()) : a2, b1, b2); + }; + } else if (type1 === type2) { + if (type1 === utils.PROPERTY) { + return dotObject(a1, a2, b1, b2); + } else if (type1 === utils.ARRAY) { + return dotArray(a1, a2, b1, b2); + } else if (type1 !== "value") { + return a1; + } + } else { + return a1; + } + + var v1 = utils.splitUnit("" + a1); + var v2 = utils.splitUnit("" + a2); + var v; // 숫자가 아닐경우 첫번째 값을 반환 b2가 0일경우 두번째 값을 반환 + + if (isNaN(v1.value) || isNaN(v2.value)) { + return a1; + } else { + v = utils.dot(v1.value, v2.value, b1, b2); + } + + var prefix = v1.prefix || v2.prefix; + var unit = v1.unit || v2.unit; + + if (!prefix && !unit) { + return v; + } + + return prefix + v + unit; +} +function dotValue(time, prevTime, nextTime, prevValue, nextValue, easing) { + if (time === prevTime) { + return prevValue; + } else if (time === nextTime) { + return nextValue; + } else if (!easing) { + return dot(prevValue, nextValue, time - prevTime, nextTime - time); + } + + var ratio = easing((time - prevTime) / (nextTime - prevTime)); + var value = dot(prevValue, nextValue, ratio, 1 - ratio); + return value; +} + +function getNearTimeIndex(times, time) { + var length = times.length; + + for (var i = 0; i < length; ++i) { + if (times[i] === time) { + return [i, i]; + } else if (times[i] > time) { + return [i > 0 ? i - 1 : 0, i]; + } + } + + return [length - 1, length - 1]; +} + +function makeAnimationProperties(properties) { + var cssArray = []; + + for (var name in properties) { + cssArray.push(utils.ANIMATION + "-" + utils.decamelize(name) + ":" + properties[name] + ";"); + } + + return cssArray.join(""); +} + +function addTime(times, time) { + var length = times.length; + + for (var i = 0; i < length; ++i) { + if (time < times[i]) { + times.splice(i, 0, time); + return; + } + } + + times[length] = time; +} + +function addEntry(entries, time, keytime) { + var prevEntry = entries[entries.length - 1]; + (!prevEntry || prevEntry[0] !== time || prevEntry[1] !== keytime) && entries.push([toFixed(time), toFixed(keytime)]); +} + +function getEntries(times, states) { + var entries = times.map(function (time) { + return [time, time]; + }); + var nextEntries = []; + states.forEach(function (state) { + var iterationCount = state[ITERATION_COUNT]; + var delay = state[DELAY]; + var playSpeed = state[PLAY_SPEED]; + var direction = state[DIRECTION]; + var intCount = Math.ceil(iterationCount); + var currentDuration = entries[entries.length - 1][0]; + var length = entries.length; + var lastTime = currentDuration * iterationCount; + + for (var i = 0; i < intCount; ++i) { + var isReverse = direction === REVERSE || direction === ALTERNATE && i % 2 || direction === ALTERNATE_REVERSE && !(i % 2); + + for (var j = 0; j < length; ++j) { + var entry = entries[isReverse ? length - j - 1 : j]; + var time = entry[1]; + var currentTime = currentDuration * i + (isReverse ? currentDuration - entry[0] : entry[0]); + var prevEntry = entries[isReverse ? length - j : j - 1]; + + if (currentTime > lastTime) { + if (j !== 0) { + var prevTime = currentDuration * i + (isReverse ? currentDuration - prevEntry[0] : prevEntry[0]); + var divideTime = utils.dot(prevEntry[1], time, lastTime - prevTime, currentTime - lastTime); + addEntry(nextEntries, (delay + currentDuration * iterationCount) / playSpeed, divideTime); + } + + break; + } else if (currentTime === lastTime && nextEntries.length && nextEntries[nextEntries.length - 1][0] === lastTime + delay) { + break; + } + + addEntry(nextEntries, (delay + currentTime) / playSpeed, time); + } + } // delay time + + + delay && nextEntries.unshift([0, nextEntries[0][1]]); + entries = nextEntries; + nextEntries = []; + }); + return entries; +} +/** +* manage Frame Keyframes and play keyframes. +* @extends Animator +* @example +const item = new SceneItem({ + 0: { + display: "none", + }, + 1: { + display: "block", + opacity: 0, + }, + 2: { + opacity: 1, + } +}); +*/ + +var SceneItem = +/*#__PURE__*/ +function (_super) { + __extends(SceneItem, _super); + /** + * @param - properties + * @param - options + * @example + const item = new SceneItem({ + 0: { + display: "none", + }, + 1: { + display: "block", + opacity: 0, + }, + 2: { + opacity: 1, + } + }); + */ + + + function SceneItem(properties, options) { + var _this = _super.call(this) || this; + + _this.times = []; + _this.items = {}; + _this.names = {}; + _this.elements = []; + _this.needUpdate = true; + + _this.load(properties, options); + + return _this; + } + + var __proto = SceneItem.prototype; + + __proto.getDuration = function () { + var times = this.times; + var length = times.length; + return (length === 0 ? 0 : times[length - 1]) || this.state[DURATION]; + }; + /** + * get size of list + * @return {Number} length of list + */ + + + __proto.size = function () { + return this.times.length; + }; + + __proto.setDuration = function (duration) { + if (!duration) { + return this; + } + + var originalDuration = this.getDuration(); + + if (originalDuration > 0) { + var ratio_1 = duration / originalDuration; + + var _a = this, + times = _a.times, + items_1 = _a.items; + + var obj_1 = {}; + this.times = times.map(function (time) { + var time2 = toFixed(time * ratio_1); + obj_1[time2] = items_1[time]; + return time2; + }); + this.items = obj_1; + } else { + this.newFrame(duration); + } + + return this; + }; + + __proto.setId = function (id) { + var state = this.state; + var elements = this.elements; + var length = elements.length; + state.id = id || makeId(!!length); + + if (length && !state[SELECTOR]) { + var sceneId_1 = toId(this.getId()); + state[SELECTOR] = "[" + DATA_SCENE_ID + "=\"" + sceneId_1 + "\"]"; + elements.forEach(function (element) { + element.setAttribute(DATA_SCENE_ID, sceneId_1); + }); + } + + return this; + }; + /** + * Set properties to the sceneItem at that time + * @param {Number} time - time + * @param {...String|Object} [properties] - property names or values + * @return {SceneItem} An instance itself + * @example + item.set(0, "a", "b") // item.getFrame(0).set("a", "b") + console.log(item.get(0, "a")); // "b" + */ + + + __proto.set = function (time) { + var _this = this; + + var args = []; + + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + + if (time instanceof SceneItem) { + return this.set(0, time); + } else if (utils.isArray(time)) { + var length = time.length; + + for (var i = 0; i < length; ++i) { + var t = length === 1 ? 0 : this.getUnitTime(i / (length - 1) * 100 + "%"); + this.set(t, time[i]); + } + } else if (utils.isObject(time)) { + var _loop_1 = function (t) { + var value = time[t]; + utils.splitComma(t).forEach(function (eachTime) { + var realTime = _this.getUnitTime(eachTime); + + if (isNaN(realTime)) { + getNames(value, [eachTime]).forEach(function (names) { + var _a; + + var innerValue = getValueByNames(names.slice(1), value); + var arr = utils.isArray(innerValue) ? innerValue : [getValueByNames(names, _this.target), innerValue]; + var length = arr.length; + + for (var i = 0; i < length; ++i) { + (_a = _this.newFrame(i / (length - 1) * 100 + "%")).set.apply(_a, names.concat([arr[i]])); + } + }); + } else { + _this.set(realTime, value); + } + }); + }; + + for (var t in time) { + _loop_1(t); + } + } else if (!utils.isUndefined(time)) { + var value_1 = args[0]; + utils.splitComma(time + "").forEach(function (eachTime) { + var realTime = _this.getUnitTime(eachTime); + + if (value_1 instanceof SceneItem) { + var delay = value_1.getDelay(); + var frames = value_1.toObject(!_this.hasFrame(realTime + delay)); + var duration = value_1.getDuration(); + var direction = value_1.getDirection(); + var isReverse = direction.indexOf("reverse") > -1; + + for (var frameTime in frames) { + var nextTime = isReverse ? duration - parseFloat(frameTime) : parseFloat(frameTime); + + _this.set(realTime + nextTime, frames[frameTime]); + } + } else if (args.length === 1 && utils.isArray(value_1)) { + value_1.forEach(function (item) { + _this.set(realTime, item); + }); + } else { + var frame = _this.newFrame(realTime); + + frame.set.apply(frame, args); + } + }); + } + + this.needUpdate = true; + return this; + }; + /** + * Get properties of the sceneItem at that time + * @param {Number} time - time + * @param {...String|Object} args property's name or properties + * @return {Number|String|PropertyObejct} property value + * @example + item.get(0, "a"); // item.getFrame(0).get("a"); + item.get(0, "transform", "translate"); // item.getFrame(0).get("transform", "translate"); + */ + + + __proto.get = function (time) { + var args = []; + + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + + var frame = this.getFrame(time); + return frame && frame.get.apply(frame, args); + }; + /** + * remove properties to the sceneItem at that time + * @param {Number} time - time + * @param {...String|Object} [properties] - property names or values + * @return {SceneItem} An instance itself + * @example + item.remove(0, "a"); + */ + + + __proto.remove = function (time) { + var args = []; + + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + + if (args.length) { + var frame = this.getFrame(time); + frame && frame.remove.apply(frame, args); + } else { + this.removeFrame(time); + } + + this.needUpdate = true; + return this; + }; + /** + * Append the item or object at the last time. + * @param - the scene item or item object + * @return An instance itself + * @example + item.append(new SceneItem({ + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + } + })); + item.append({ + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + } + }); + item.set(item.getDuration(), { + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + } + }); + */ + + + __proto.append = function (item) { + if (item instanceof SceneItem) { + this.set(this.getDuration(), item); + } else { + this.append(new SceneItem(item)); + } + + return this; + }; + /** + * Push the front frames for the time and prepend the scene item or item object. + * @param - the scene item or item object + * @return An instance itself + */ + + + __proto.prepend = function (item) { + if (item instanceof SceneItem) { + var unshiftTime = item.getDuration() + item.getDelay(); + var firstFrame = this.getFrame(0); // remove first frame + + this.removeFrame(0); + this.unshift(unshiftTime); + this.set(0, item); + this.set(unshiftTime + THRESHOLD, firstFrame); + } else { + this.prepend(new SceneItem(item)); + } + + return this; + }; + /** + * Push out the amount of time. + * @param - time to push + * @example + item.get(0); // frame 0 + item.unshift(3); + item.get(3) // frame 0 + */ + + + __proto.unshift = function (time) { + var _a = this, + times = _a.times, + items = _a.items; + + var obj = {}; + this.times = times.map(function (t) { + var time2 = toFixed(time + t); + obj[time2] = items[t]; + return time2; + }); + this.items = obj; + return this; + }; + /** + * Get the frames in the item in object form. + * @return {} + * @example + item.toObject(); + // {0: {display: "none"}, 1: {display: "block"}} + */ + + + __proto.toObject = function (isStartZero) { + if (isStartZero === void 0) { + isStartZero = true; + } + + var obj = {}; + var delay = this.getDelay(); + this.forEach(function (frame, time) { + obj[(!time && !isStartZero ? THRESHOLD : 0) + delay + time] = frame.clone(); + }); + return obj; + }; + /** + * Specifies an element to synchronize items' keyframes. + * @param {string} selectors - Selectors to find elements in items. + * @return {SceneItem} An instance itself + * @example + item.setSelector("#id.class"); + */ + + + __proto.setSelector = function (target) { + if (utils.isFunction(target)) { + this.setElement(target(this.getId())); + } else { + this.setElement(target); + } + + return this; + }; + /** + * Get the elements connected to SceneItem. + */ + + + __proto.getElements = function () { + return this.elements; + }; + /** + * Specifies an element to synchronize item's keyframes. + * @param - elements to synchronize item's keyframes. + * @param - Make sure that you have peusdo. + * @return {SceneItem} An instance itself + * @example + item.setElement(document.querySelector("#id.class")); + item.setElement(document.querySelectorAll(".class")); + */ + + + __proto.setElements = function (target) { + return this.setElement(target); + }; + /** + * Specifies an element to synchronize item's keyframes. + * @param - elements to synchronize item's keyframes. + * @param - Make sure that you have peusdo. + * @return {SceneItem} An instance itself + * @example + item.setElement(document.querySelector("#id.class")); + item.setElement(document.querySelectorAll(".class")); + */ + + + __proto.setElement = function (target) { + var state = this.state; + var elements = []; + + if (!target) { + return this; + } else if (target === true || utils.isString(target)) { + var selector = target === true ? "" + state.id : target; + var matches = /([\s\S]+)(:+[a-zA-Z]+)$/g.exec(selector); + elements = utils.toArray(utils.$(matches ? matches[1] : selector, true)); + state[SELECTOR] = selector; + } else { + elements = target instanceof Element ? [target] : utils.toArray(target); + } + + if (!elements.length) { + return this; + } + + this.elements = elements; + this.setId(this.getId()); + this.target = elements[0].style; + + this.targetFunc = function (frame) { + var attributes = frame.get("attribute"); + + if (attributes) { + var _loop_2 = function (name) { + elements.forEach(function (el) { + el.setAttribute(name, attributes[name]); + }); + }; + + for (var name in attributes) { + _loop_2(name); + } + } + + if (frame.has("html")) { + var html_1 = frame.get("html"); + elements.forEach(function (el) { + el.innerHTML = html_1; + }); + } + + var cssText = frame.toCSS(); + + if (state.cssText !== cssText) { + state.cssText = cssText; + elements.forEach(function (el) { + el.style.cssText += cssText; + }); + return frame; + } + }; + + return this; + }; + + __proto.setTarget = function (target) { + this.target = target; + + this.targetFunc = function (frame) { + var obj = frame.get(); + + for (var name in obj) { + target[name] = obj[name]; + } + }; + + return this; + }; + /** + * add css styles of items's element to the frame at that time. + * @param {Array} properties - elements to synchronize item's keyframes. + * @return {SceneItem} An instance itself + * @example + item.setElement(document.querySelector("#id.class")); + item.setCSS(0, ["opacity"]); + item.setCSS(0, ["opacity", "width", "height"]); + */ + + + __proto.setCSS = function (time, properties) { + this.set(time, utils.fromCSS(this.elements, properties)); + return this; + }; + + __proto.setTime = function (time, isTick, isParent, parentEasing) { + _super.prototype.setTime.call(this, time, isTick, isParent); + + var iterationTime = this.getIterationTime(); + var easing = this.getEasing() || parentEasing; + var frame = this.getNowFrame(iterationTime, easing); + var currentTime = this.getTime(); + this.temp = frame; + /** + * This event is fired when timeupdate and animate. + * @event SceneItem#animate + * @param {Number} param.currentTime The total time that the animator is running. + * @param {Number} param.time The iteration time during duration that the animator is running. + * @param {Frame} param.frame frame of that time. + */ + + this.trigger("animate", { + frame: frame, + currentTime: currentTime, + time: iterationTime + }); + this.targetFunc && this.targetFunc(frame); + return this; + }; + /** + * update property names used in frames. + * @return {SceneItem} An instance itself + * @example + item.update(); + */ + + + __proto.update = function () { + var names = {}; + this.forEach(function (frame) { + updateFrame(names, frame.properties); + }); + this.names = names; + this.needUpdate = false; + return this; + }; + /** + * Create and add a frame to the sceneItem at that time + * @param {Number} time - frame's time + * @return {Frame} Created frame. + * @example + item.newFrame(time); + */ + + + __proto.newFrame = function (time) { + var frame = this.getFrame(time); + + if (frame) { + return frame; + } + + frame = new Frame(); + this.setFrame(time, frame); + return frame; + }; + /** + * Add a frame to the sceneItem at that time + * @param {Number} time - frame's time + * @return {SceneItem} An instance itself + * @example + item.setFrame(time, frame); + */ + + + __proto.setFrame = function (time, frame) { + var realTime = this.getUnitTime(time); + this.items[realTime] = frame; + addTime(this.times, realTime); + this.needUpdate = true; + return this; + }; + /** + * get sceneItem's frame at that time + * @param {Number} time - frame's time + * @return {Frame} sceneItem's frame at that time + * @example + const frame = item.getFrame(time); + */ + + + __proto.getFrame = function (time) { + return this.items[this.getUnitTime(time)]; + }; + /** + * remove sceneItem's frame at that time + * @param - frame's time + * @return {SceneItem} An instance itself + * @example + item.removeFrame(time); + */ + + + __proto.removeFrame = function (time) { + var realTime = this.getUnitTime(time); + var items = this.items; + var index = this.times.indexOf(realTime); + delete items[realTime]; // remove time + + if (index > -1) { + this.times.splice(index, 1); + } + + this.needUpdate = true; + return this; + }; + /** + * check if the item has a frame at that time + * @param {Number} time - frame's time + * @return {Boolean} true: the item has a frame // false: not + * @example + if (item.hasFrame(10)) { + // has + } else { + // not + } + */ + + + __proto.hasFrame = function (time) { + return this.getUnitTime(time) in this.items; + }; + /** + * Check if keyframes has propery's name + * @param - property's time + * @return {boolean} true: if has property, false: not + * @example + item.hasName(["transform", "translate"]); // true or not + */ + + + __proto.hasName = function (args) { + this.needUpdate && this.update(); + return isInProperties(this.names, args, true); + }; + /** + * merge frame of the previous time at the next time. + * @param - The time of the frame to merge + * @param - The target frame + * @return {SceneItem} An instance itself + * @example + // getFrame(1) contains getFrame(0) + item.merge(0, 1); + */ + + + __proto.mergeFrame = function (time, frame) { + if (frame) { + var toFrame = this.newFrame(time); + toFrame.merge(frame); + } + + return this; + }; + /** + * Get frame of the current time + * @param {Number} time - the current time + * @param {function} easing - the speed curve of an animation + * @return {Frame} frame of the current time + * @example + let item = new SceneItem({ + 0: { + display: "none", + }, + 1: { + display: "block", + opacity: 0, + }, + 2: { + opacity: 1, + } + }); + // opacity: 0.7; display:"block"; + const frame = item.getNowFrame(1.7); + */ + + + __proto.getNowFrame = function (time, easing, isAccurate) { + var _this = this; + + this.needUpdate && this.update(); + var frame = new Frame(); + + var _a = getNearTimeIndex(this.times, time), + left = _a[0], + right = _a[1]; + + var realEasing = this.getEasing() || easing; + var nameObject = this.names; + + if (this.hasName([TIMING_FUNCTION])) { + var nowEasing = this.getNowValue(time, [TIMING_FUNCTION], left, right, false, 0, true); + utils.isFunction(nowEasing) && (realEasing = nowEasing); + } + + if (isAccurate) { + var prevFrame = this.getFrame(time); + var prevNames = updateFrame({}, prevFrame.properties); + + for (var name in ROLES) { + if (name in prevNames) { + prevNames[name] = nameObject[name]; + } + } + + nameObject = prevNames; + } + + var names = getNames(nameObject, []); + names.forEach(function (properties) { + var value = _this.getNowValue(time, properties, left, right, isAccurate, realEasing, isFixed(properties)); + + if (utils.isUndefined(value)) { + return; + } + + frame.set(properties, value); + }); + return frame; + }; + + __proto.load = function (properties, options) { + if (properties === void 0) { + properties = {}; + } + + if (options === void 0) { + options = properties.options; + } + + var _a; + + options && this.setOptions(options); + + if (utils.isArray(properties)) { + this.set(properties); + } else if (properties.keyframes) { + this.set(properties.keyframes); + } else { + for (var time in properties) { + if (time !== "options") { + this.set((_a = {}, _a[time] = properties[time], _a)); + } + } + } + + if (options && options[DURATION]) { + this.setDuration(options[DURATION]); + } + + return this; + }; + /** + * clone SceneItem. + * @return {SceneItem} An instance of clone + * @example + * item.clone(); + */ + + + __proto.clone = function () { + var item = new SceneItem(); + item.setOptions(this.state); + this.forEach(function (frame, time) { + item.setFrame(time, frame.clone()); + }); + return item; + }; + /** + * executes a provided function once for each scene item. + * @param - Function to execute for each element, taking three arguments + * @return {Keyframes} An instance itself + */ + + + __proto.forEach = function (callback) { + var times = this.times; + var items = this.items; + times.forEach(function (time) { + callback(items[time], time, items); + }); + return this; + }; + + __proto.setOptions = function (options) { + if (options === void 0) { + options = {}; + } + + _super.prototype.setOptions.call(this, options); + + var id = options.id, + selector = options.selector, + elements = options.elements, + element = options.element, + target = options.target; + id && this.setId(id); + + if (target) { + this.setTarget(target); + } else if (selector) { + this.setSelector(selector); + } else if (elements || element) { + this.setElement(elements || element); + } + + return this; + }; + + __proto.toCSS = function (playCondition, parentDuration, states) { + if (playCondition === void 0) { + playCondition = { + className: START_ANIMATION + }; + } + + if (parentDuration === void 0) { + parentDuration = this.getDuration(); + } + + if (states === void 0) { + states = []; + } + + var itemState = this.state; + var selector = itemState[SELECTOR]; + + if (!selector) { + return ""; + } + + var originalDuration = this.getDuration(); + itemState[DURATION] = originalDuration; + states.push(itemState); + var reversedStates = utils.toArray(states).reverse(); + var id = toId(getRealId(this)); + var superParent = states[0]; + var infiniteIndex = utils.findIndex(reversedStates, function (state) { + return state[ITERATION_COUNT] === INFINITE || !isFinite(state[DURATION]); + }, states.length - 1); + var finiteStates = reversedStates.slice(0, infiniteIndex); + var duration = parentDuration || finiteStates.reduce(function (prev, cur) { + return (cur[DELAY] + prev * cur[ITERATION_COUNT]) / cur[PLAY_SPEED]; + }, originalDuration); + var delay = reversedStates.slice(infiniteIndex).reduce(function (prev, cur) { + return (prev + cur[DELAY]) / cur[PLAY_SPEED]; + }, 0); + var easingName = utils.find(reversedStates, function (state) { + return state[EASING] && state[EASING_NAME]; + }, itemState)[EASING_NAME]; + var iterationCount = reversedStates[infiniteIndex][ITERATION_COUNT]; + var fillMode = superParent[FILL_MODE]; + var direction = reversedStates[infiniteIndex][DIRECTION]; + var cssText = makeAnimationProperties({ + fillMode: fillMode, + direction: direction, + iterationCount: iterationCount, + delay: delay + "s", + name: PREFIX + "KEYFRAMES_" + id, + duration: duration / superParent[PLAY_SPEED] + "s", + timingFunction: easingName + }); + var selectors = utils.splitComma(selector).map(function (sel) { + var matches = /([\s\S]+)(:+[a-zA-Z]+)$/g.exec(sel); + + if (matches) { + return [matches[1], matches[2]]; + } else { + return [sel, ""]; + } + }); + var className = playCondition.className; + var selectorCallback = playCondition.selector; + var preselector = utils.isFunction(selectorCallback) ? selectorCallback(this, selector) : selectorCallback; + return "\n " + (preselector || selectors.map(function (_a) { + var sel = _a[0], + peusdo = _a[1]; + return sel + "." + className + peusdo; + })) + " {" + cssText + "}\n " + selectors.map(function (_a) { + var sel = _a[0], + peusdo = _a[1]; + return sel + "." + PAUSE_ANIMATION + peusdo; + }) + " {" + utils.ANIMATION + "-play-state: paused;}\n @" + utils.KEYFRAMES + " " + PREFIX + "KEYFRAMES_" + id + "{" + this._toKeyframes(duration, finiteStates, direction) + "}"; + }; + /** + * Export the CSS of the items to the style. + * @param - Add a selector or className to play. + * @return {SceneItem} An instance itself + */ + + + __proto.exportCSS = function (playCondition, duration, options) { + if (!this.elements.length) { + return ""; + } + + var css = this.toCSS(playCondition, duration, options); + var isParent = options && !utils.isUndefined(options[ITERATION_COUNT]); + !isParent && exportCSS(getRealId(this), css); + return this; + }; + + __proto.pause = function () { + _super.prototype.pause.call(this); + + isPausedCSS(this) && this.pauseCSS(); + return this; + }; + + __proto.pauseCSS = function () { + this.elements.forEach(function (element) { + utils.addClass(element, PAUSE_ANIMATION); + }); + return this; + }; + + __proto.endCSS = function () { + this.elements.forEach(function (element) { + utils.removeClass(element, PAUSE_ANIMATION); + utils.removeClass(element, START_ANIMATION); + }); + setPlayCSS(this, false); + return this; + }; + + __proto.end = function () { + isEndedCSS(this) && this.endCSS(); + + _super.prototype.end.call(this); + + return this; + }; + /** + * Play using the css animation and keyframes. + * @param - Check if you want to export css. + * @param [playClassName="startAnimation"] - Add a class name to play. + * @param - The shorthand properties for six of the animation properties. + * @see {@link https://www.w3schools.com/cssref/css3_pr_animation.asp} + * @example + item.playCSS(); + item.playCSS(false, "startAnimation", { + direction: "reverse", + fillMode: "forwards", + }); + */ + + + __proto.playCSS = function (isExportCSS, playClassName, properties) { + if (isExportCSS === void 0) { + isExportCSS = true; + } + + if (properties === void 0) { + properties = {}; + } + + playCSS(this, isExportCSS, playClassName, properties); + return this; + }; + + __proto.addPlayClass = function (isPaused, playClassName, properties) { + if (properties === void 0) { + properties = {}; + } + + var elements = this.elements; + var length = elements.length; + var cssText = makeAnimationProperties(properties); + + if (!length) { + return; + } + + if (isPaused) { + elements.forEach(function (element) { + utils.removeClass(element, PAUSE_ANIMATION); + }); + } else { + elements.forEach(function (element) { + element.style.cssText += cssText; + + if (utils.hasClass(element, START_ANIMATION)) { + utils.removeClass(element, START_ANIMATION); + utils.requestAnimationFrame(function () { + utils.requestAnimationFrame(function () { + utils.addClass(element, START_ANIMATION); + }); + }); + } else { + utils.addClass(element, START_ANIMATION); + } + }); + } + + return elements[0]; + }; + /** + * Remove All Frames + * @return {SceneItem} An instance itself + */ + + + __proto.clear = function () { + this.times = []; + this.items = {}; + this.names = {}; + this.temp = null; + this.needUpdate = true; + return this; + }; + + __proto.getNowValue = function (time, properties, left, right, isAccurate, easing, usePrevValue) { + var times = this.times; + var length = times.length; + var prevTime; + var nextTime; + var prevFrame; + var nextFrame; + var isUndefinedLeft = utils.isUndefined(left); + var isUndefinedRight = utils.isUndefined(right); + + if (isUndefinedLeft || isUndefinedRight) { + var indicies = getNearTimeIndex(times, time); + isUndefinedLeft && (left = indicies[0]); + isUndefinedRight && (right = indicies[1]); + } + + for (var i = left; i >= 0; --i) { + var frame = this.getFrame(times[i]); + + if (frame.has.apply(frame, properties)) { + prevTime = times[i]; + prevFrame = frame; + break; + } + } + + var prevValue = prevFrame && prevFrame.raw.apply(prevFrame, properties); + + if (isAccurate && !isRole([properties[0]])) { + return prevTime === time ? prevValue : undefined; + } + + if (usePrevValue) { + return prevValue; + } + + for (var i = right; i < length; ++i) { + var frame = this.getFrame(times[i]); + + if (frame.has.apply(frame, properties)) { + nextTime = times[i]; + nextFrame = frame; + break; + } + } + + var nextValue = nextFrame && nextFrame.raw.apply(nextFrame, properties); + + if (!prevFrame || utils.isUndefined(prevValue)) { + return nextValue; + } + + if (!nextFrame || utils.isUndefined(nextValue) || prevValue === nextValue) { + return prevValue; + } + + return dotValue(time, Math.max(prevTime, 0), nextTime, prevValue, nextValue, easing); + }; + + __proto._toKeyframes = function (duration, states, direction) { + var _this = this; + + var frames = {}; + var times = this.times.slice(); + + if (!times.length) { + return ""; + } + + var originalDuration = this.getDuration(); + !this.getFrame(0) && times.unshift(0); + !this.getFrame(originalDuration) && times.push(originalDuration); + var entries = getEntries(times, states); + var lastEntry = entries[entries.length - 1]; // end delay time + + lastEntry[0] < duration && addEntry(entries, duration, lastEntry[1]); + var prevTime = -1; + return entries.map(function (_a) { + var time = _a[0], + keytime = _a[1]; + + if (!frames[keytime]) { + frames[keytime] = (!_this.hasFrame(keytime) || keytime === 0 || keytime === originalDuration ? _this.getNowFrame(keytime) : _this.getNowFrame(keytime, 0, true)).toCSS(); + } + + var frameTime = time / duration * 100; + + if (frameTime - prevTime < THRESHOLD) { + frameTime += THRESHOLD; + } + + prevTime = frameTime; + return Math.min(frameTime, 100) + "%{\n " + (time === 0 && !isDirectionReverse(0, 1, direction) ? "" : frames[keytime]) + "\n }"; + }).join(""); + }; + + return SceneItem; +}(Animator); + +/** + * manage sceneItems and play Scene. + * @sort 1 + */ + +var Scene = +/*#__PURE__*/ +function (_super) { + __extends(Scene, _super); + /** + * @param - properties + * @param - options + * @example + const scene = new Scene({ + item1: { + 0: { + display: "none", + }, + 1: { + display: "block", + opacity: 0, + }, + 2: { + opacity: 1, + }, + }, + item2: { + 2: { + opacity: 1, + }, + } + }); + */ + + + function Scene(properties, options) { + var _this = _super.call(this) || this; + + _this.items = new ListMap(); + + _this.load(properties, options); + + return _this; + } + + var __proto = Scene.prototype; + + __proto.getDuration = function () { + var time = 0; + this.forEach(function (item) { + time = Math.max(time, item.getTotalDuration() / item.getPlaySpeed()); + }); + return time || this.state[DURATION]; + }; + + __proto.setDuration = function (duration) { + var items = this.items; + var sceneDuration = this.getDuration(); + + if (duration === 0 || !isFinite(sceneDuration)) { + return this; + } + + if (sceneDuration === 0) { + this.forEach(function (item) { + item.setDuration(duration); + }); + } else { + var ratio_1 = duration / sceneDuration; + this.forEach(function (item) { + item.setDelay(item.getDelay() * ratio_1); + item.setDuration(item.getDuration() * ratio_1); + }); + } + + _super.prototype.setDuration.call(this, duration); + + return this; + }; + /** + * get item in scene by name + * @param - The item's name + * @return {Scene | SceneItem} item + * @example + const item = scene.getItem("item1") + */ + + + __proto.getItem = function (name) { + return this.items.get(name); + }; + /** + * create item in scene + * @param {} name - name of item to create + * @param {} options - The option object of SceneItem + * @return {} Newly created item + * @example + const item = scene.newItem("item1") + */ + + + __proto.newItem = function (name, options) { + if (options === void 0) { + options = {}; + } + + if (this.items.has(name)) { + return this.items.get(name); + } + + var item = new SceneItem(); + this.setItem(name, item); + item.setOptions(options); + return item; + }; + /** + * remove item in scene + * @param - name of item to remove + * @return An instance itself + * @example + const item = scene.newItem("item1") + scene.removeItem("item1"); + */ + + + __proto.removeItem = function (name) { + this.items.remove(name); + return this; + }; + /** + * add a sceneItem to the scene + * @param - name of item to create + * @param - sceneItem + * @example + const item = scene.newItem("item1") + */ + + + __proto.setItem = function (name, item) { + item.setId(name); + this.items.set(name, item); + return this; + }; + + __proto.setTime = function (time, isTick, isParent, parentEasing) { + _super.prototype.setTime.call(this, time, isTick, isParent); + + var iterationTime = this.getIterationTime(); + var easing = this.getEasing() || parentEasing; + var frames = {}; + this.forEach(function (item) { + item.setTime(iterationTime * item.getPlaySpeed() - item.getDelay(), isTick, true, easing); + frames[item.getId()] = item.temp; + }); + this.temp = frames; + /** + * This event is fired when timeupdate and animate. + * @event Scene#animate + * @param {object} param The object of data to be sent to an event. + * @param {number} param.currentTime The total time that the animator is running. + * @param {number} param.time The iteration time during duration that the animator is running. + * @param {object} param.frames frames of that time. + * @example + const scene = new Scene({ + a: { + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + } + }, + b: { + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + } + } + }).on("animate", e => { + console.log(e.frames); + // {a: Frame, b: Frame} + console.log(e.frames.a.get("opacity")); + }); + */ + + this.trigger("animate", { + frames: frames, + currentTime: this.getTime(), + time: iterationTime + }); + return this; + }; + /** + * executes a provided function once for each scene item. + * @param - Function to execute for each element, taking three arguments + * @return {Scene} An instance itself + */ + + + __proto.forEach = function (func) { + var items = this.items; + items.forEach(function (item, id, index, obj) { + func(item, id, index, obj); + }); + return this; + }; + + __proto.toCSS = function (playCondition, duration, parentStates) { + if (duration === void 0) { + duration = this.getDuration(); + } + + if (parentStates === void 0) { + parentStates = []; + } + + var totalDuration = !duration || !isFinite(duration) ? 0 : duration; + var styles = []; + var state = this.state; + state[DURATION] = this.getDuration(); + this.forEach(function (item) { + styles.push(item.toCSS(playCondition, totalDuration, parentStates.concat(state))); + }); + return styles.join(""); + }; + /** + * Export the CSS of the items to the style. + * @param - Add a selector or className to play. + * @return {Scene} An instance itself + */ + + + __proto.exportCSS = function (playCondition, duration, parentStates) { + var css = this.toCSS(playCondition, duration, parentStates); + (!parentStates || !parentStates.length) && exportCSS(getRealId(this), css); + return this; + }; + + __proto.append = function (item) { + item.setDelay(item.getDelay() + this.getDuration()); + this.setItem(getRealId(item), item); + }; + + __proto.pauseCSS = function () { + return this.forEach(function (item) { + item.pauseCSS(); + }); + }; + + __proto.pause = function () { + _super.prototype.pause.call(this); + + isPausedCSS(this) && this.pauseCSS(); + this.forEach(function (item) { + item.pause(); + }); + return this; + }; + + __proto.endCSS = function () { + this.forEach(function (item) { + item.endCSS(); + }); + setPlayCSS(this, false); + }; + + __proto.end = function () { + isEndedCSS(this) && this.endCSS(); + + _super.prototype.end.call(this); + + return this; + }; + + __proto.addPlayClass = function (isPaused, playClassName, properties) { + if (properties === void 0) { + properties = {}; + } + + var animtionElement; + this.forEach(function (item) { + var el = item.addPlayClass(isPaused, playClassName, properties); + !animtionElement && (animtionElement = el); + }); + return animtionElement; + }; + /** + * Play using the css animation and keyframes. + * @param - Check if you want to export css. + * @param [playClassName="startAnimation"] - Add a class name to play. + * @param - The shorthand properties for six of the animation properties. + * @return {Scene} An instance itself + * @see {@link https://www.w3schools.com/cssref/css3_pr_animation.asp} + * @example + scene.playCSS(); + scene.playCSS(false, { + direction: "reverse", + fillMode: "forwards", + }); + */ + + + __proto.playCSS = function (isExportCSS, playClassName, properties) { + if (isExportCSS === void 0) { + isExportCSS = true; + } + + if (properties === void 0) { + properties = {}; + } + + playCSS(this, isExportCSS, playClassName, properties); + return this; + }; + /** + * Set properties to the Scene. + * @param - properties + * @return An instance itself + * @example + scene.set({ + ".a": { + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + }, + }, + }); + // 0 + console.log(scene.getItem(".a").get(0, "opacity")); + // 1 + console.log(scene.getItem(".a").get(1, "opacity")); + */ + + + __proto.set = function (properties) { + this.load(properties); + return this; + }; + + __proto.load = function (properties, options) { + if (properties === void 0) { + properties = {}; + } + + if (options === void 0) { + options = properties.options; + } + + if (!properties) { + return this; + } + + var selector = options && options[SELECTOR] || this.state[SELECTOR]; + + for (var name in properties) { + if (name === "options") { + continue; + } + + var object = properties[name]; + var item = void 0; + + if (object instanceof Scene || object instanceof SceneItem) { + this.setItem(name, object); + item = object; + } else if (utils.isFunction(object) && selector) { + var elements = utils.IS_WINDOW ? utils.$("" + (utils.isFunction(selector) ? selector(name) : name), true) : []; + var length = elements.length; + var scene = new Scene(); + + for (var i = 0; i < length; ++i) { + scene.newItem(i).setId().setElement(elements[i]).load(object(i, elements[i])); + } + + this.setItem(name, scene); + continue; + } else { + item = this.newItem(name); + item.load(object); + } + + selector && item.setSelector(selector); + } + + this.setOptions(options); + }; + + __proto.setOptions = function (options) { + if (options === void 0) { + options = {}; + } + + _super.prototype.setOptions.call(this, options); + + var selector = options.selector; + + if (selector) { + this.state[SELECTOR] = selector; + } + + return this; + }; + + __proto.setSelector = function (target) { + var state = this.state; + var selector = target || state[SELECTOR]; + state[SELECTOR] = selector; + var isItFunction = utils.isFunction(target); + + if (selector) { + this.forEach(function (item, name) { + item.setSelector(isItFunction ? target(name) : selector); + }); + } + + return this; + }; + + __proto.start = function (delay) { + if (delay === void 0) { + delay = this.state[DELAY]; + } + + var result = _super.prototype.start.call(this, delay); + + if (result) { + this.forEach(function (item) { + item.start(0); + }); + } else { + this.forEach(function (item) { + item.setPlayState(RUNNING); + }); + } + + return result; + }; + /** + * version info + * @type {string} + * @example + * Scene.VERSION // 1.2.0 + */ + + + Scene.VERSION = "1.2.0"; + return Scene; +}(Animator); + +function animate(properties, options) { + return new Scene(properties, options).play(); +} +function animateItem(properties, options) { + return new SceneItem(properties, options).play(); +} + + + +var others = ({ + SceneItem: SceneItem, + Frame: Frame, + Animator: Animator, + 'default': Scene, + OPTIONS: OPTIONS, + EVENTS: EVENTS, + FIXED: FIXED, + ROLES: ROLES, + setRole: setRole, + setAlias: setAlias, + bezier: bezier, + steps: steps, + STEP_START: STEP_START, + STEP_END: STEP_END, + LINEAR: LINEAR, + EASE: EASE, + EASE_IN: EASE_IN, + EASE_OUT: EASE_OUT, + EASE_IN_OUT: EASE_IN_OUT, + animate: animate, + animateItem: animateItem +}); + +for (var name in others) { + Scene[name] = others[name]; +} + +module.exports = Scene; +//# sourceMappingURL=scene.cjs.js.map diff --git a/dist/scene.cjs.js.map b/dist/scene.cjs.js.map new file mode 100644 index 00000000..2b0a7d5a --- /dev/null +++ b/dist/scene.cjs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scene.cjs.js","sources":["../src/easing.ts","../src/consts.ts","../src/EventTrigger.ts","../src/PropertyObject.ts","../src/utils/property.ts","../src/utils.ts","../src/Animator.ts","../src/Frame.ts","../src/utils/dot.ts","../src/SceneItem.ts","../src/Scene.ts","../src/presets.ts","../src/index.umd.ts"],"sourcesContent":["import { EasingFunction } from \"./types\";\n\nfunction cubic(y1: number, y2: number, t: number) {\n const t2 = 1 - t;\n\n // Bezier Curve Formula\n return t * t * t + 3 * t * t * t2 * y2 + 3 * t * t2 * t2 * y1;\n}\nfunction solveFromX(x1: number, x2: number, x: number) {\n // x 0 ~ 1\n // t 0 ~ 1\n let t = x;\n let solveX = x;\n let dx = 1;\n\n while (Math.abs(dx) > 1 / 1000) {\n // 예상 t초에 의한 _x값\n solveX = cubic(x1, x2, t);\n dx = solveX - x;\n // 차이가 미세하면 그 값을 t로 지정\n if (Math.abs(dx) < 1 / 1000) {\n return t;\n }\n t -= dx / 2;\n }\n return t;\n}\n/**\n * @namespace easing\n */\n/**\n* Cubic Bezier curve.\n* @memberof easing\n* @func bezier\n* @param {number} [x1] - point1's x\n* @param {number} [y1] - point1's y\n* @param {number} [x2] - point2's x\n* @param {number} [y2] - point2's y\n* @return {function} the curve function\n* @example\nimport {bezier} from \"scenejs\";\nScene.bezier(0, 0, 1, 1) // LINEAR\nScene.bezier(0.25, 0.1, 0.25, 1) // EASE\n*/\nexport function bezier(x1: number, y1: number, x2: number, y2: number) {\n /*\n\t\tx = f(t)\n\t\tcalculate inverse function by x\n\t\tt = f-1(x)\n\t*/\n const func: EasingFunction = (x: number) => {\n const t = solveFromX(x1, x2, Math.max(Math.min(1, x), 0));\n\n return cubic(y1, y2, t);\n };\n\n func.easingName = `cubic-bezier(${x1},${y1},${x2},${y2})`;\n return func;\n}\n/**\n* Specifies a stepping function\n* @see {@link https://www.w3schools.com/cssref/css3_pr_animation-timing-function.asp|CSS3 Timing Function}\n* @memberof easing\n* @func steps\n* @param {number} count - point1's x\n* @param {\"start\" | \"end\"} postion - point1's y\n* @return {function} the curve function\n* @example\nimport {steps} from \"scenejs\";\nScene.steps(1, \"start\") // Scene.STEP_START\nScene.steps(1, \"end\") // Scene.STEP_END\n*/\nexport function steps(count: number, position: \"start\" | \"end\") {\n const func: EasingFunction = (time: number) => {\n const level = 1 / count;\n\n if (time >= 1) {\n return 1;\n }\n return (position === \"start\" ? level : 0) + Math.floor(time / level) * level;\n };\n\n func.easingName = `steps(${count}, ${position})`;\n\n return func;\n}\n\n/**\n* Equivalent to steps(1, start)\n* @memberof easing\n* @name STEP_START\n* @static\n* @type {function}\n* @example\nimport {STEP_START} from \"scenejs\";\nScene.STEP_START // steps(1, start)\n*/\nexport const STEP_START = /*#__PURE__#*/steps(1, \"start\");\n/**\n* Equivalent to steps(1, end)\n* @memberof easing\n* @name STEP_END\n* @static\n* @type {function}\n* @example\nimport {STEP_END} from \"scenejs\";\nScene.STEP_END // steps(1, end)\n*/\nexport const STEP_END = /*#__PURE__#*/steps(1, \"end\");\n/**\n* Linear Speed (0, 0, 1, 1)\n* @memberof easing\n* @name LINEAR\n* @static\n* @type {function}\n* @example\nimport {LINEAR} from \"scenejs\";\nScene.LINEAR\n*/\nexport const LINEAR = /*#__PURE__#*/bezier(0, 0, 1, 1);\n/**\n* Ease Speed (0.25, 0.1, 0.25, 1)\n* @memberof easing\n* @name EASE\n* @static\n* @type {function}\n* @example\nimport {EASE} from \"scenejs\";\nScene.EASE\n*/\nexport const EASE = /*#__PURE__#*/bezier(0.25, 0.1, 0.25, 1);\n/**\n* Ease In Speed (0.42, 0, 1, 1)\n* @memberof easing\n* @name EASE_IN\n* @static\n* @type {function}\n* @example\nimport {EASE_IN} from \"scenejs\";\nScene.EASE_IN\n*/\nexport const EASE_IN = /*#__PURE__#*/bezier(0.42, 0, 1, 1);\n/**\n* Ease Out Speed (0, 0, 0.58, 1)\n* @memberof easing\n* @name EASE_OUT\n* @static\n* @type {function}\n* @example\nimport {EASE_OUT} from \"scenejs\";\nScene.EASE_OUT\n*/\nexport const EASE_OUT = /*#__PURE__#*/bezier(0, 0, 0.58, 1);\n/**\n* Ease In Out Speed (0.42, 0, 0.58, 1)\n* @memberof easing\n* @name EASE_IN_OUT\n* @static\n* @type {function}\n* @example\nimport {EASE_IN_OUT} from \"scenejs\";\nScene.EASE_IN_OUT\n*/\nexport const EASE_IN_OUT = /*#__PURE__#*/bezier(0.42, 0, 0.58, 1);\n","import { IObject } from \"@daybrush/utils\";\nimport { RoleObject, OptionType, EventType, EasingFunction } from \"./types\";\nimport { EASE, EASE_IN, EASE_IN_OUT, LINEAR, EASE_OUT, STEP_START, STEP_END } from \"./easing\";\n\nexport const PREFIX = \"__SCENEJS_\";\nexport const DATA_SCENE_ID = \"data-scene-id\";\nexport const TIMING_FUNCTION = \"animation-timing-function\";\nexport const ROLES: RoleObject = { transform: {}, filter: {}, attribute: {}, html: true };\nexport const ALIAS: IObject = { easing: [TIMING_FUNCTION] };\nexport const FIXED = { [TIMING_FUNCTION]: true, contents: true, html: true };\nexport const MAXIMUM = 1000000;\nexport const THRESHOLD = 0.000001;\n\nexport const DURATION = \"duration\";\nexport const FILL_MODE = \"fillMode\";\nexport const DIRECTION = \"direction\";\nexport const ITERATION_COUNT = \"iterationCount\";\nexport const DELAY = \"delay\";\nexport const EASING = \"easing\";\nexport const PLAY_SPEED = \"playSpeed\";\nexport const EASING_NAME = \"easingName\";\nexport const ITERATION_TIME = \"iterationTime\";\nexport const PAUSED = \"paused\";\nexport const ENDED = \"ended\";\nexport const TIMEUPDATE = \"timeupdate\";\nexport const ANIMATE = \"animate\";\nexport const PLAY = \"play\";\nexport const RUNNING = \"running\";\nexport const ITERATION = \"iteration\";\nexport const START_ANIMATION = \"startAnimation\";\nexport const PAUSE_ANIMATION = \"pauseAnimation\";\nexport const ALTERNATE = \"alternate\";\nexport const REVERSE = \"reverse\";\nexport const ALTERNATE_REVERSE = \"alternate-reverse\";\nexport const NORMAL = \"normal\";\nexport const INFINITE = \"infinite\";\nexport const PLAY_STATE = \"playState\";\nexport const PLAY_CSS = \"playCSS\";\nexport const PREV_TIME = \"prevTime\";\nexport const TICK_TIME = \"tickTime\";\nexport const CURRENT_TIME = \"currentTime\";\nexport const SELECTOR = \"selector\";\nexport const TRANSFORM_NAME = \"transform\";\nexport const EASINGS = {\n \"linear\": LINEAR,\n \"ease\": EASE,\n \"ease-in\": EASE_IN,\n \"ease-out\": EASE_OUT,\n \"ease-in-out\": EASE_IN_OUT,\n \"step-start\": STEP_START,\n \"step-end\": STEP_END,\n};\n\n/**\n* option name list\n* @name Scene.OPTIONS\n* @memberof Scene\n* @static\n* @type {$ts:OptionType}\n* @example\n* Scene.OPTIONS // [\"duration\", \"fillMode\", \"direction\", \"iterationCount\", \"delay\", \"easing\", \"playSpeed\"]\n*/\nexport const OPTIONS: OptionType = [DURATION, FILL_MODE, DIRECTION, ITERATION_COUNT, DELAY, EASING, PLAY_SPEED];\n\n/**\n* Event name list\n* @name Scene.EVENTS\n* @memberof Scene\n* @static\n* @type {$ts:EventType}\n* @example\n* Scene.EVENTS // [\"paused\", \"ended\", \"timeupdate\", \"animate\", \"play\", \"iteration\"];\n*/\nexport const EVENTS: EventType = [PAUSED, ENDED, TIMEUPDATE, ANIMATE, PLAY, ITERATION];\n","import { isObject, isArray, toArray } from \"@daybrush/utils\";\nimport { CallbackType, EventParameter } from \"./types\";\n\n/**\n* attach and trigger event handlers.\n*/\nclass EventTrigger {\n public events: { [name: string]: CallbackType[] };\n /**\n * @example\n const et = new Scene.EventTrigger();\n const scene = new Scene();\n\n scene.on(\"call\", e => {\n console.log(e.param);\n });\n et.on(\"call\", e => {\n console.log(e.param);\n });\n scene.trigger(\"call\", {param: 1});\n et.trigger(\"call\", {param: 1});\n */\n constructor() {\n this.events = {};\n }\n public _on(name: string | EventParameter, callback?: CallbackType | CallbackType[], once?: boolean) {\n const events = this.events;\n\n if (isObject(name)) {\n for (const n in name) {\n this._on(n, name[n], once);\n }\n return;\n }\n if (!(name in events)) {\n events[name] = [];\n }\n if (!callback) {\n return;\n }\n if (isArray(callback)) {\n callback.forEach(func => this._on(name, func, once));\n return;\n }\n events[name].push(once ? function callback2(...args) {\n callback(...args);\n this.off(name, callback2);\n } : callback);\n }\n /**\n * Attach an event handler function for one or more events to target\n * @param - event's name\n * @param - function to execute when the event is triggered.\n * @return {EventTrigger} An Instance itself.\n * @example\n target.on(\"animate\", function() {\n console.log(\"animate\");\n });\n\n target.trigger(\"animate\");\n\n */\n public on(name: string | EventParameter, callback?: CallbackType | CallbackType[]) {\n this._on(name, callback);\n return this;\n }\n /**\n * Dettach an event handler function for one or more events to target\n * @param - event's name\n * @param - function to execute when the event is triggered.\n * @return {EventTrigger} An Instance itself.\n * @example\n const callback = function() {\n console.log(\"animate\");\n };\n target.on(\"animate\", callback);\n\n target.off(\"animate\", callback);\n target.off(\"animate\");\n\n */\n public off(name?: string, callback?: CallbackType) {\n if (!name) {\n this.events = {};\n } else if (!callback) {\n this.events[name] = [];\n } else {\n const callbacks = this.events[name];\n\n if (!callbacks) {\n return this;\n }\n const index = callbacks.indexOf(callback);\n\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n }\n return this;\n }\n /**\n * execute event handler\n * @param - event's name\n * @param - event handler's additional parameter\n * @return {EventTrigger} An Instance itself.\n * @example\n target.on(\"animate\", function(a1, a2) {\n console.log(\"animate\", a1, a2);\n });\n\n target.trigger(\"animate\", [1, 2]); // log => \"animate\", 1, 2\n\n */\n public trigger(name: string, ...data: any[]) {\n const events = this.events;\n\n if (!(name in events)) {\n return this;\n }\n\n const args = data || [];\n\n !args[0] && (args[0] = {});\n const event = events[name];\n const target = args[0];\n\n target.type = name;\n target.currentTarget = this;\n !target.target && (target.target = this);\n toArray(events[name]).forEach(callback => {\n callback.apply(this, data);\n });\n\n return this;\n }\n public once(name: string | EventParameter, callback?: CallbackType | CallbackType[]) {\n this._on(name, callback, true);\n return this;\n }\n}\nexport default EventTrigger;\n","import { isString } from \"@daybrush/utils\";\nimport { PropertyObjectState } from \"./types\";\n\n/**\n* Make string, array to PropertyObject for the dot product\n*/\nclass PropertyObject implements PropertyObjectState {\n public value: any[];\n public prefix: string = \"\";\n public suffix: string = \"\";\n public model: string = \"\";\n public type: string = \"\";\n public separator: string = \",\";\n\n /**\n * @param - This value is in the array format.\n * @param - options\n * @example\n var obj = new PropertyObject([100,100,100,0.5], {\n \"separator\" : \",\",\n \"prefix\" : \"rgba(\",\n \"suffix\" : \")\"\n });\n */\n constructor(value: string | any[], options?: Partial) {\n options && this.setOptions(options);\n this.value = isString(value) ? value.split(this.separator) : value;\n }\n public setOptions(newOptions: Partial) {\n for (const name in newOptions) {\n this[name as keyof PropertyObjectState] = newOptions[name as keyof PropertyObjectState];\n }\n return this;\n }\n /**\n * the number of values.\n * @example\n const obj1 = new PropertyObject(\"1,2,3\", \",\");\n\n console.log(obj1.length);\n // 3\n */\n public size() {\n return this.value.length;\n }\n /**\n * retrieve one of values at the index\n * @param {Number} index - index\n * @return {Object} one of values at the index\n * @example\n const obj1 = new PropertyObject(\"1,2,3\", \",\");\n\n console.log(obj1.get(0));\n // 1\n */\n public get(index: number) {\n return this.value[index];\n }\n /**\n * Set the value at that index\n * @param {Number} index - index\n * @param {Object} value - text, a number, object to set\n * @return {PropertyObject} An instance itself\n * @example\n const obj1 = new PropertyObject(\"1,2,3\", \",\");\n obj1.set(0, 2);\n console.log(obj1.toValue());\n // 2,2,3\n */\n public set(index: number, value: any) {\n this.value[index] = value;\n return this;\n }\n /**\n * create a copy of an instance itself.\n * @return {PropertyObject} clone\n * @example\n const obj1 = new PropertyObject(\"1,2,3\", \",\");\n const obj2 = obj1.clone();\n */\n public clone(): PropertyObject {\n const {\n separator,\n prefix,\n suffix,\n model,\n type,\n } = this;\n const arr = this.value.map(v => ((v instanceof PropertyObject) ? v.clone() : v));\n return new PropertyObject(arr, {\n separator,\n prefix,\n suffix,\n model,\n type,\n });\n }\n /**\n * Make Property Object to String\n * @return {String} Make Property Object to String\n * @example\n //rgba(100, 100, 100, 0.5)\n const obj4 = new PropertyObject([100,100,100,0.5], {\n \"separator\" : \",\",\n \"prefix\" : \"rgba(\",\n \"suffix\" : \")\",\n });\n console.log(obj4.toValue());\n // \"rgba(100,100,100,0.5)\"\n */\n public toValue(): string {\n return this.prefix + this.join() + this.suffix;\n }\n /**\n * Make Property Object's array to String\n * @return {String} Join the elements of an array into a string\n * @example\n //rgba(100, 100, 100, 0.5)\n var obj4 = new PropertyObject([100,100,100,0.5], {\n \"separator\" : \",\",\n \"prefix\" : \"rgba(\",\n \"suffix\" : \")\"\n });\n obj4.join(); // => \"100,100,100,0.5\"\n */\n public join() {\n return this.value.map(v => ((v instanceof PropertyObject) ? v.toValue() : v)).join(this.separator);\n }\n /**\n * executes a provided function once per array element.\n * @param {Function} callback - Function to execute for each element, taking three arguments\n * @param {All} [callback.currentValue] The current element being processed in the array.\n * @param {Number} [callback.index] The index of the current element being processed in the array.\n * @param {Array} [callback.array] the array.\n * @return {PropertyObject} An instance itself\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach|MDN Array.forEach()} reference to MDN document.\n * @example\n //rgba(100, 100, 100, 0.5)\n var obj4 = new PropertyObject([100,100,100,0.5], {\n \"separator\" : \",\",\n \"prefix\" : \"rgba(\",\n \"suffix\" : \")\"\n });\n\n obj4.forEach(t => {\n console.log(t);\n }); // => \"100,100,100,0.5\"\n */\n public forEach(func: (value?: any, index?: number, array?: any[]) => void) {\n this.value.forEach(func);\n return this;\n }\n}\nexport default PropertyObject;\n","/**\n* @namespace\n* @name Property\n*/\n\nimport PropertyObject from \"../PropertyObject\";\nimport {\n COLOR_MODELS, isString,\n splitComma, splitSpace, stringToRGBA,\n RGBA, splitBracket, IObject, isArray, splitText\n} from \"@daybrush/utils\";\nimport { NameType } from \"../types\";\n\nexport function splitStyle(str: string) {\n\n const properties = splitText(str, \";\");\n const obj: IObject = {};\n let length = properties.length;\n\n for (let i = 0; i < length; ++i) {\n const matches = splitText(properties[i], \":\");\n\n if (matches.length < 2 || !matches[1]) {\n --length;\n continue;\n }\n obj[matches[0].trim()] = toPropertyObject(matches[1].trim());\n }\n return { styles: obj, length };\n}\n/**\n* convert array to PropertyObject[type=color].\n* default model \"rgba\"\n* @memberof Property\n* @function arrayToColorObject\n* @param {Array|PropertyObject} value ex) [0, 0, 0, 1]\n* @return {PropertyObject} PropertyObject[type=color]\n* @example\narrayToColorObject([0, 0, 0])\n// => PropertyObject(type=\"color\", model=\"rgba\", value=[0, 0, 0, 1], separator=\",\")\n*/\nexport function arrayToColorObject(arr: number[]) {\n const model = RGBA;\n\n if (arr.length === 3) {\n arr[3] = 1;\n }\n return new PropertyObject(arr, {\n model,\n separator: \",\",\n type: \"color\",\n prefix: `${model}(`,\n suffix: \")\",\n });\n}\n/**\n* convert text with parentheses to object.\n* @memberof Property\n* @function stringToBracketObject\n* @param {String} value ex) \"rgba(0,0,0,1)\"\n* @return {PropertyObject} PropertyObject\n* @example\nstringToBracketObject(\"abcde(0, 0, 0,1)\")\n// => PropertyObject(model=\"abcde\", value=[0, 0, 0,1], separator=\",\")\n*/\nexport function stringToBracketObject(text: string) {\n // [prefix, value, other]\n const { prefix: model, value, suffix: afterModel } = splitBracket(text);\n\n if (typeof value === \"undefined\") {\n return text;\n }\n if (COLOR_MODELS.indexOf(model) > -1) {\n return arrayToColorObject(stringToRGBA(text));\n }\n // divide comma(,)\n const obj = toPropertyObject(value, model);\n\n let arr = [value];\n let separator = \",\";\n let prefix = `${model}(`;\n let suffix = `)${afterModel}`;\n\n if (obj instanceof PropertyObject) {\n separator = obj.separator;\n arr = obj.value;\n prefix += obj.prefix;\n suffix = obj.suffix + suffix;\n }\n return new PropertyObject(arr, {\n separator,\n model,\n prefix,\n suffix,\n });\n}\n\nexport function arrayToPropertyObject(arr: any[], separator: string) {\n return new PropertyObject(arr, {\n type: \"array\",\n separator,\n });\n}\n\n/**\n* convert text with parentheses to PropertyObject[type=color].\n* If the values are not RGBA model, change them RGBA mdoel.\n* @memberof Property\n* @function stringToColorObject\n* @param {String|PropertyObject} value ex) \"rgba(0,0,0,1)\"\n* @return {PropertyObject} PropertyObject[type=color]\n* @example\nstringToColorObject(\"rgba(0, 0, 0,1)\")\n// => PropertyObject(type=\"color\", model=\"rgba\", value=[0, 0, 0,1], separator=\",\")\n*/\nexport function stringToColorObject(value: string): string | PropertyObject {\n const result = stringToRGBA(value);\n\n return result ? arrayToColorObject(result) : value;\n}\n/**\n* convert CSS Value to PropertyObject\n* @memberof Property\n* @function toPropertyObject\n* @param {String} value it's text contains the array.\n* @return {String} Not Array, Not Separator, Only Number & Unit\n* @return {PropertyObject} Array with Separator.\n* @see referenced regular expression {@link http://stackoverflow.com/questions/20215440/parse-css-gradient-rule-with-javascript-regex}\n* @example\ntoPropertyObject(\"1px solid #000\");\n// => PropertyObject([\"1px\", \"solid\", rgba(0, 0, 0, 1)])\n*/\nexport function toPropertyObject(value: any[], model?: NameType): PropertyObject;\nexport function toPropertyObject(value: IObject, model?: NameType): IObject;\nexport function toPropertyObject(value: string, model?: NameType): PropertyObject | string;\nexport function toPropertyObject(value: string | IObject | any[], model?: NameType) {\n if (!isString(value)) {\n if (isArray(value)) {\n return arrayToPropertyObject(value, \",\");\n }\n return value;\n }\n let values: any = splitComma(value);\n\n if (values.length > 1) {\n return arrayToPropertyObject(values.map(v => toPropertyObject(v)), \",\");\n }\n values = splitSpace(value);\n\n if (values.length > 1) {\n return arrayToPropertyObject(values.map(v => toPropertyObject(v)), \" \");\n }\n values = /^(['\"])([^'\"]*)(['\"])$/g.exec(value);\n\n if (values && values[1] === values[3]) {\n // Quotes\n return new PropertyObject([toPropertyObject(values[2])], {\n prefix: values[1],\n suffix: values[1],\n });\n } else if (value.indexOf(\"(\") !== -1) {\n // color\n return stringToBracketObject(value);\n } else if (value.charAt(0) === \"#\" && model !== \"url\") {\n return stringToColorObject(value);\n }\n return value;\n}\nexport function toObject(object: PropertyObject, result: IObject = {}) {\n const model = object.model;\n\n if (model) {\n object.setOptions({\n model: \"\",\n suffix: \"\",\n prefix: \"\",\n });\n const value = object.size() > 1 ? object : object.get(0);\n\n result[model] = value;\n } else {\n object.forEach(obj => {\n toObject(obj, result);\n });\n }\n return result;\n}\n","import {\n ROLES, MAXIMUM, FIXED, ALIAS,\n PAUSED, RUNNING, PLAY, ENDED, PREFIX, PLAY_CSS, CURRENT_TIME, START_ANIMATION, EASINGS\n} from \"./consts\";\nimport PropertyObject from \"./PropertyObject\";\nimport Scene from \"./Scene\";\nimport SceneItem from \"./SceneItem\";\nimport {\n isArray, ANIMATION, ARRAY, OBJECT,\n PROPERTY, STRING, NUMBER, IS_WINDOW, IObject, $, document, isObject, addEvent, removeEvent, isString,\n} from \"@daybrush/utils\";\nimport { EasingType, EasingFunction, NameType } from \"./types\";\nimport { toPropertyObject } from \"./utils/property\";\nimport { bezier, steps } from \"./easing\";\n\nexport function isPropertyObject(value: any): value is PropertyObject {\n return value instanceof PropertyObject;\n}\nexport function setAlias(name: string, alias: string[]) {\n ALIAS[name] = alias;\n}\nexport function setRole(names: string[], isProperty?: boolean, isFixedProperty?: boolean) {\n const length = names.length;\n let roles: any = ROLES;\n let fixed: any = FIXED;\n\n for (let i = 0; i < length - 1; ++i) {\n !roles[names[i]] && (roles[names[i]] = {});\n roles = roles[names[i]];\n if (isFixedProperty) {\n !fixed[names[i]] && (fixed[names[i]] = {});\n fixed = fixed[names[i]];\n }\n }\n isFixedProperty && (fixed[names[length - 1]] = true);\n roles[names[length - 1]] = isProperty ? true : {};\n}\nexport function getType(value: any) {\n const type = typeof value;\n\n if (type === OBJECT) {\n if (isArray(value)) {\n return ARRAY;\n } else if (isPropertyObject(value)) {\n return PROPERTY;\n }\n } else if (type === STRING || type === NUMBER) {\n return \"value\";\n }\n return type;\n}\nexport function isPureObject(obj: any): obj is object {\n return isObject(obj) && obj.constructor === Object;\n}\nexport function getNames(names: IObject, stack: string[]) {\n let arr: string[][] = [];\n\n if (isPureObject(names)) {\n for (const name in names) {\n stack.push(name);\n arr = arr.concat(getNames(names[name], stack));\n stack.pop();\n }\n } else {\n arr.push(stack.slice());\n }\n return arr;\n}\nexport function updateFrame(names: IObject, properties: IObject) {\n for (const name in properties) {\n const value = properties[name];\n\n if (!isPureObject(value)) {\n names[name] = true;\n continue;\n }\n if (!isObject(names[name])) {\n names[name] = {};\n }\n updateFrame(names[name], properties[name]);\n }\n return names;\n}\nexport function toFixed(num: number) {\n return Math.round(num * MAXIMUM) / MAXIMUM;\n}\nexport function getValueByNames(\n names: Array,\n properties: IObject, length: number = names.length) {\n let value = properties;\n\n for (let i = 0; i < length; ++i) {\n if (!isObject(value)) {\n return undefined;\n }\n value = value[names[i]];\n }\n return value;\n}\nexport function isInProperties(roles: IObject, args: NameType[], isCheckTrue?: boolean) {\n const length = args.length;\n let role: any = roles;\n\n if (length === 0) {\n return false;\n }\n for (let i = 0; i < length; ++i) {\n if (role === true) {\n return false;\n }\n role = role[args[i]];\n if (!role || (!isCheckTrue && role === true)) {\n return false;\n }\n }\n return true;\n}\nexport function isRole(args: NameType[], isCheckTrue?: boolean) {\n return isInProperties(ROLES, args, isCheckTrue);\n}\nexport function isFixed(args: NameType[]) {\n return isInProperties(FIXED, args, true);\n}\n\nexport interface IterationInterface {\n currentTime: number;\n iterationCount: number;\n elapsedTime: number;\n}\nexport function setPlayCSS(item: Scene | SceneItem, isActivate: boolean) {\n item.state[PLAY_CSS] = isActivate;\n}\nexport function isPausedCSS(item: Scene | SceneItem) {\n return item.state[PLAY_CSS] && item.isPaused();\n}\nexport function isEndedCSS(item: Scene | SceneItem) {\n return !item.isEnded() && item.state[PLAY_CSS];\n}\n\nexport function exportCSS(id: number | string, css: string) {\n const styleId = `${PREFIX}STYLE_${toId(id)}`;\n const styleElement: HTMLElement = $(`#${styleId}`);\n\n if (styleElement) {\n styleElement.innerText = css;\n } else {\n document.body.insertAdjacentHTML(\"beforeend\",\n ``);\n }\n}\nexport function makeId(selector?: boolean) {\n for (; ;) {\n const id = `${Math.floor(Math.random() * 10000000)}`;\n\n if (!IS_WINDOW || !selector) {\n return id;\n }\n const checkElement = $(`[data-scene-id=\"${id}\"]`);\n\n if (!checkElement) {\n return id;\n }\n }\n}\nexport function getRealId(item: Scene | SceneItem) {\n return item.getId() || item.setId(makeId(false)).getId();\n}\nexport function toId(text: number | string) {\n return `${text}`.match(/[0-9a-zA-Z]+/g).join(\"\");\n}\nexport function playCSS(\n item: Scene | SceneItem, isExportCSS?: boolean,\n playClassName?: string, properties: object = {}) {\n if (!ANIMATION || item.getPlayState() === RUNNING) {\n return;\n }\n const className = playClassName || START_ANIMATION;\n\n if (isPausedCSS(item)) {\n item.addPlayClass(true, className, properties);\n } else {\n if (item.isEnded()) {\n item.setTime(0);\n }\n isExportCSS && item.exportCSS({ className });\n const el = item.addPlayClass(false, className, properties);\n\n if (!el) {\n return;\n }\n addAnimationEvent(item, el);\n setPlayCSS(item, true);\n }\n item.setPlayState(RUNNING);\n}\n\nexport function addAnimationEvent(item: Scene | SceneItem, el: Element) {\n const state = item.state;\n const duration = item.getDuration();\n const isZeroDuration = !duration || !isFinite(duration);\n const animationend = () => {\n setPlayCSS(item, false);\n item.finish();\n };\n const animationstart = () => {\n item.trigger(PLAY);\n };\n item.once(ENDED, () => {\n removeEvent(el, \"animationcancel\", animationend);\n removeEvent(el, \"animationend\", animationend);\n removeEvent(el, \"animationiteration\", animationiteration);\n removeEvent(el, \"animationstart\", animationstart);\n });\n const animationiteration = ({ elapsedTime }: any) => {\n const currentTime = elapsedTime;\n const iterationCount = isZeroDuration ? 0 : (currentTime / duration);\n\n state[CURRENT_TIME] = currentTime;\n item.setIteration(iterationCount);\n };\n addEvent(el, \"animationcancel\", animationend);\n addEvent(el, \"animationend\", animationend);\n addEvent(el, \"animationiteration\", animationiteration);\n addEvent(el, \"animationstart\", animationstart);\n}\n\nexport function getEasing(curveArray: string | number[] | EasingFunction): EasingType {\n let easing: EasingType;\n\n if (isString(curveArray)) {\n if (curveArray in EASINGS) {\n easing = EASINGS[curveArray];\n } else {\n const obj = toPropertyObject(curveArray);\n\n if (isString(obj)) {\n return 0;\n } else {\n if (obj.model === \"cubic-bezier\") {\n curveArray = obj.value.map(v => parseFloat(v));\n easing = bezier(curveArray[0], curveArray[1], curveArray[2], curveArray[3]);\n } else if (obj.model === \"steps\") {\n easing = steps(parseFloat(obj.value[0]), obj.value[1]);\n } else {\n return 0;\n }\n }\n }\n } else if (isArray(curveArray)) {\n easing = bezier(curveArray[0], curveArray[1], curveArray[2], curveArray[3]);\n } else {\n easing = curveArray;\n }\n\n return easing;\n}\n","import {\n THRESHOLD,\n ALTERNATE, ALTERNATE_REVERSE, REVERSE, INFINITE, NORMAL,\n ITERATION_COUNT, DELAY, FILL_MODE, DIRECTION, PLAY_SPEED,\n DURATION, EASING, ITERATION_TIME, EASING_NAME, PAUSED,\n RUNNING, PLAY, TIMEUPDATE, ENDED, PLAY_STATE, PREV_TIME, TICK_TIME, CURRENT_TIME, ITERATION, OPTIONS, EASINGS\n} from \"./consts\";\nimport EventTrigger from \"./EventTrigger\";\nimport { bezier, steps } from \"./easing\";\nimport { toFixed, getEasing } from \"./utils\";\nimport { splitUnit, isString, camelize, requestAnimationFrame, isArray, cancelAnimationFrame } from \"@daybrush/utils\";\nimport {\n IterationCountType, DirectionType, AnimatorState,\n EasingFunction, FillModeType, PlayStateType, EasingType, AnimatorOptions,\n} from \"./types\";\nimport { toPropertyObject } from \"./utils/property\";\n\nfunction GetterSetter {}>(\n getter: string[], setter: string[], parent: string) {\n return (constructor: T) => {\n const prototype = constructor.prototype;\n\n getter.forEach(name => {\n prototype[camelize(`get ${name}`)] = function() {\n return this[parent][name];\n };\n });\n setter.forEach(name => {\n prototype[camelize(`set ${name}`)] = function(value: any) {\n this[parent][name] = value;\n return this;\n };\n });\n };\n}\nexport function isDirectionReverse(iteration: number, iteraiontCount: IterationCountType, direction: DirectionType) {\n if (direction === REVERSE) {\n return true;\n } else if (iteraiontCount !== INFINITE && iteration === iteraiontCount && iteraiontCount % 1 === 0) {\n return direction === (iteration % 2 >= 1 ? ALTERNATE_REVERSE : ALTERNATE);\n }\n return direction === (iteration % 2 >= 1 ? ALTERNATE : ALTERNATE_REVERSE);\n}\n/**\n* @typedef {Object} AnimatorState The Animator options. Properties used in css animation.\n* @property {number} [duration] The duration property defines how long an animation should take to complete one cycle.\n* @property {\"none\"|\"forwards\"|\"backwards\"|\"both\"} [fillMode] The fillMode property specifies a style for the element when the animation is not playing (before it starts, after it ends, or both).\n* @property {\"infinite\"|number} [iterationCount] The iterationCount property specifies the number of times an animation should be played.\n* @property {array|function} [easing] The easing(timing-function) specifies the speed curve of an animation.\n* @property {number} [delay] The delay property specifies a delay for the start of an animation.\n* @property {\"normal\"|\"reverse\"|\"alternate\"|\"alternate-reverse\"} [direction] The direction property defines whether an animation should be played forwards, backwards or in alternate cycles.\n*/\n\nconst setters = [\"id\", ITERATION_COUNT, DELAY, FILL_MODE,\n DIRECTION, PLAY_SPEED, DURATION, PLAY_SPEED, ITERATION_TIME, PLAY_STATE];\nconst getters = [...setters, EASING, EASING_NAME];\n\n/**\n* play video, animation, the others\n* @extends EventTrigger\n* @see {@link https://www.w3schools.com/css/css3_animations.asp|CSS3 Animation}\n*/\n@GetterSetter(getters, setters, \"state\")\nclass Animator\n extends EventTrigger {\n public state: U;\n private timerId: number = 0;\n\n /**\n * @param - animator's options\n * @example\n const animator = new Animator({\n delay: 2,\n diretion: \"alternate\",\n duration: 2,\n fillMode: \"forwards\",\n iterationCount: 3,\n easing: Scene.easing.EASE,\n });\n */\n constructor(options?: Partial) {\n super();\n this.state = {\n id: \"\",\n easing: 0,\n easingName: \"linear\",\n iterationCount: 1,\n delay: 0,\n fillMode: \"forwards\",\n direction: NORMAL,\n playSpeed: 1,\n currentTime: 0,\n iterationTime: -1,\n iteration: 0,\n tickTime: 0,\n prevTime: 0,\n playState: PAUSED,\n duration: 0,\n } as U;\n this.setOptions(options);\n }\n /**\n * set animator's easing.\n * @param curverArray - The speed curve of an animation.\n * @return {Animator} An instance itself.\n * @example\n animator.({\n delay: 2,\n diretion: \"alternate\",\n duration: 2,\n fillMode: \"forwards\",\n iterationCount: 3,\n easing: Scene.easing.EASE,\n });\n */\n public setEasing(curveArray: string | number[] | EasingFunction): this {\n const easing: EasingType = getEasing(curveArray);\n const easingName = easing && easing[EASING_NAME] || \"linear\";\n const state = this.state;\n\n state[EASING] = easing;\n state[EASING_NAME] = easingName;\n return this;\n }\n /**\n * set animator's options.\n * @see {@link https://www.w3schools.com/css/css3_animations.asp|CSS3 Animation}\n * @param - animator's options\n * @return {Animator} An instance itself.\n * @example\n animator.({\n delay: 2,\n diretion: \"alternate\",\n duration: 2,\n fillMode: \"forwards\",\n iterationCount: 3,\n easing: Scene.eaasing.EASE,\n });\n */\n public setOptions(options: Partial = {}): this {\n for (const name in options) {\n const value = options[name];\n\n if (name === EASING) {\n this.setEasing(value);\n continue;\n } else if (name === DURATION) {\n value && this.setDuration(value);\n continue;\n }\n if (OPTIONS.indexOf(name as any) > -1) {\n this.state[name] = value;\n }\n }\n\n return this;\n }\n /**\n * Get the animator's total duration including delay\n * @return {number} Total duration\n * @example\n animator.getTotalDuration();\n */\n public getTotalDuration(): number {\n return this.getActiveDuration(true);\n }\n /**\n * Get the animator's total duration excluding delay\n * @return {number} Total duration excluding delay\n * @example\n animator.getActiveDuration();\n */\n public getActiveDuration(delay?: boolean): number {\n const state = this.state;\n const count = state[ITERATION_COUNT];\n if (count === INFINITE) {\n return Infinity;\n }\n return (delay ? state[DELAY] : 0) + this.getDuration() * count;\n }\n /**\n * Check if the animator has reached the end.\n * @return {boolean} ended\n * @example\n animator.isEnded(); // true or false\n */\n public isEnded(): boolean {\n if (this.state[TICK_TIME] === 0 && this.state[PLAY_STATE] === PAUSED) {\n return true;\n } else if (this.getTime() < this.getActiveDuration()) {\n return false;\n }\n return true;\n }\n /**\n *Check if the animator is paused:\n * @return {boolean} paused\n * @example\n animator.isPaused(); // true or false\n */\n public isPaused(): boolean {\n return this.state[PLAY_STATE] === PAUSED;\n }\n public start(delay: number = this.state[DELAY]): boolean {\n const state = this.state;\n\n state[PLAY_STATE] = RUNNING;\n if (state[TICK_TIME] >= delay) {\n /**\n * This event is fired when play animator.\n * @event Animator#play\n */\n this.trigger(PLAY);\n return true;\n }\n return false;\n }\n /**\n * play animator\n * @return {Animator} An instance itself.\n */\n public play(toTime?: number) {\n const state = this.state;\n const delay = state[DELAY];\n const currentTime = this.getTime();\n\n state[PLAY_STATE] = RUNNING;\n\n if (this.isEnded() && (currentTime === 0 || currentTime >= this.getActiveDuration())) {\n this.setTime(-delay, true);\n }\n\n this.timerId = requestAnimationFrame((time: number) => {\n state[PREV_TIME] = time;\n this.tick(time, toTime);\n });\n this.start();\n return this;\n }\n /**\n * pause animator\n * @return {Animator} An instance itself.\n */\n public pause(): this {\n const state = this.state;\n\n if (state[PLAY_STATE] !== PAUSED) {\n state[PLAY_STATE] = PAUSED;\n /**\n * This event is fired when animator is paused.\n * @event Animator#paused\n */\n this.trigger(PAUSED);\n }\n cancelAnimationFrame(this.timerId);\n return this;\n }\n /**\n * end animator\n * @return {Animator} An instance itself.\n */\n public finish() {\n this.setTime(0);\n this.state[TICK_TIME] = 0;\n this.end();\n return this;\n }\n /**\n * end animator\n * @return {Animator} An instance itself.\n */\n public end() {\n this.pause();\n /**\n * This event is fired when animator is ended.\n * @event Animator#ended\n */\n this.trigger(ENDED);\n return this;\n }\n /**\n * set currentTime\n * @param {Number|String} time - currentTime\n * @return {Animator} An instance itself.\n * @example\n\n animator.setTime(\"from\"); // 0\n animator.setTime(\"to\"); // 100%\n animator.setTime(\"50%\");\n animator.setTime(10);\n animator.getTime() // 10\n */\n public setTime(time: number | string, isTick?: boolean, isParent?: boolean) {\n const activeDuration = this.getActiveDuration();\n const state = this.state;\n const prevTime = state[TICK_TIME];\n const delay = state[DELAY];\n let currentTime = isTick ? (time as number) : this.getUnitTime(time);\n\n state[TICK_TIME] = delay + currentTime;\n if (currentTime < 0) {\n currentTime = 0;\n } else if (currentTime > activeDuration) {\n currentTime = activeDuration;\n }\n state[CURRENT_TIME] = currentTime;\n this.calculate();\n\n if (isTick && !isParent) {\n const tickTime = state[TICK_TIME];\n\n if (prevTime < delay && time >= 0) {\n this.start(0);\n }\n if (tickTime < prevTime || this.isEnded()) {\n this.end();\n return;\n }\n }\n if (this.isDelay()) {\n return this;\n }\n /**\n * This event is fired when the animator updates the time.\n * @event Animator#timeupdate\n * @param {Object} param The object of data to be sent to an event.\n * @param {Number} param.currentTime The total time that the animator is running.\n * @param {Number} param.time The iteration time during duration that the animator is running.\n * @param {Number} param.iterationCount The iteration count that the animator is running.\n */\n this.trigger(TIMEUPDATE, {\n currentTime,\n time: this.getIterationTime(),\n iterationCount: state[ITERATION],\n });\n\n return this;\n }\n /**\n * Get the animator's current time\n * @return {number} current time\n * @example\n animator.getTime();\n */\n public getTime(): number {\n return this.state[CURRENT_TIME];\n }\n public getUnitTime(time: string | number) {\n if (isString(time)) {\n const duration = this.getDuration() || 100;\n\n if (time === \"from\") {\n return 0;\n } else if (time === \"to\") {\n return duration;\n }\n const { unit, value } = splitUnit(time);\n\n if (unit === \"%\") {\n !this.getDuration() && (this.setDuration(duration));\n return toFixed(parseFloat(time) / 100 * duration);\n } else if (unit === \">\") {\n return value + THRESHOLD;\n } else {\n return value;\n }\n } else {\n return toFixed(time);\n }\n }\n /**\n * Check if the current state of animator is delayed.\n * @return {boolean} check delay state\n */\n public isDelay() {\n const state = this.state;\n const delay = state[DELAY];\n const tickTime = state[TICK_TIME];\n\n return delay > 0 && (tickTime < delay);\n }\n public setIteration(iterationCount: number): this {\n const state = this.state;\n const passIterationCount = Math.floor(iterationCount);\n const maxIterationCount = state[ITERATION_COUNT] === INFINITE ? Infinity : state[ITERATION_COUNT];\n\n if (state[ITERATION] < passIterationCount && passIterationCount < maxIterationCount) {\n /**\n * The event is fired when an iteration of an animation ends.\n * @event Animator#iteration\n * @param {Object} param The object of data to be sent to an event.\n * @param {Number} param.currentTime The total time that the animator is running.\n * @param {Number} param.iterationCount The iteration count that the animator is running.\n */\n this.trigger(\"iteration\", {\n currentTime: state[CURRENT_TIME],\n iterationCount: passIterationCount,\n });\n }\n state[ITERATION] = iterationCount;\n return this;\n }\n protected calculate() {\n const state = this.state;\n const iterationCount = state[ITERATION_COUNT];\n const fillMode = state[FILL_MODE];\n const direction = state[DIRECTION];\n const duration = this.getDuration();\n const time = this.getTime();\n const iteration = duration === 0 ? 0 : time / duration;\n let currentIterationTime = duration ? time % duration : 0;\n\n if (!duration) {\n this.setIterationTime(0);\n return this;\n }\n this.setIteration(iteration);\n\n // direction : normal, reverse, alternate, alternate-reverse\n // fillMode : forwards, backwards, both, none\n const isReverse = isDirectionReverse(iteration, iterationCount, direction);\n\n const isFiniteDuration = isFinite(duration);\n if (isFiniteDuration && isReverse) {\n currentIterationTime = duration - currentIterationTime;\n }\n if (isFiniteDuration && iterationCount !== INFINITE) {\n const isForwards = fillMode === \"both\" || fillMode === \"forwards\";\n\n // fill forwards\n if (iteration >= iterationCount) {\n currentIterationTime = duration * (isForwards ? (iterationCount % 1) || 1 : 0);\n isReverse && (currentIterationTime = duration - currentIterationTime);\n }\n }\n this.setIterationTime(currentIterationTime);\n return this;\n }\n private tick(now: number, to?: number) {\n if (this.isPaused()) {\n return;\n }\n const state = this.state;\n const playSpeed = state[PLAY_SPEED];\n const prevTime = state[PREV_TIME];\n const delay = state[DELAY];\n const tickTime = state[TICK_TIME];\n const currentTime = tickTime + Math.min(1000, now - prevTime) / 1000 * playSpeed;\n\n state[PREV_TIME] = now;\n this.setTime(currentTime - delay, true);\n if (to && to * 1000 < now) {\n this.pause();\n }\n if (state[PLAY_STATE] === PAUSED) {\n return;\n }\n\n this.timerId = requestAnimationFrame((time: number) => {\n this.tick(time, to);\n });\n }\n}\n/**\n * Specifies the unique indicator of the animator\n * @method Animator#setId\n * @param {number | string} - String or number of id to be set in the animator\n * @return {Animator} An instance itself.\n */\n/**\n * Specifies the unique indicator of the animator\n * @method Animator#getId\n * @return {number | string} the indicator of the item.\n */\n/**\n * Get a delay for the start of an animation.\n * @method Animator#getDelay\n * @return {number} delay\n */\n/**\n * Set a delay for the start of an animation.\n * @method Animator#setDelay\n * @param {number} delay - delay\n * @return {Animator} An instance itself.\n */\n/**\n * Get fill mode for the item when the animation is not playing (before it starts, after it ends, or both)\n * @method Animator#getFillMode\n * @return {FillModeType} fillMode\n */\n/**\n * Set fill mode for the item when the animation is not playing (before it starts, after it ends, or both)\n * @method Animator#setFillMode\n * @param {FillModeType} fillMode - fillMode\n * @return {Animator} An instance itself.\n */\n/**\n * Get the number of times an animation should be played.\n * @method Animator#getIterationCount\n * @return {IterationCountType} iterationCount\n */\n/**\n * Set the number of times an animation should be played.\n * @method Animator#setIterationCount\n * @param {IterationCountType} iterationCount - iterationCount\n * @return {Animator} An instance itself.\n */\n/**\n * Get whether an animation should be played forwards, backwards or in alternate cycles.\n * @method Animator#getDirection\n * @return {DirectionType} direction\n */\n/**\n * Set whether an animation should be played forwards, backwards or in alternate cycles.\n * @method Animator#setDirection\n * @param {DirectionType} direction - direction\n * @return {Animator} An instance itself.\n */\n/**\n * Get whether the animation is running or paused.\n * @method Animator#getPlayState\n * @return {PlayStateType} playState\n */\n/**\n * Set whether the animation is running or paused.\n * @method Animator#setPlayState\n * @param {PlayStateType} playState - playState\n * @return {Animator} An instance itself.\n */\n/**\n * Get the animator's play speed\n * @method Animator#getPlaySpeed\n * @return {number} playSpeed\n */\n/**\n * Set the animator's play speed\n * @method Animator#setPlaySpeed\n * @param {number} playSpeed - playSpeed\n * @return {Animator} An instance itself.\n */\n/**\n * Get how long an animation should take to complete one cycle.\n * @method Animator#getDuration\n * @return {number} duration\n */\n/**\n * Set how long an animation should take to complete one cycle.\n * @method Animator#setDuration\n * @param {number} duration - duration\n * @return {Animator} An instance itself.\n */\n/**\n * Get the speed curve of an animation.\n * @method Animator#getEasing\n * @return {EasingType} easing\n */\n/**\n * Get the speed curve's name\n * @method Animator#getEasingName\n * @return {string} the curve's name.\n */\n/**\n\t* Get the animator's current iteration time\n\t* @method Animator#getIterationTime\n\t* @return {number} current iteration time\n\t* @example\nanimator.getIterationTime();\n\t*/\n\n// tslint:disable-next-line:interface-name\ninterface Animator {\n setId(id: number | string): this;\n getId(): number | string;\n getIterationTime(): number;\n setIterationTime(time: number): this;\n setDelay(delay: number): this;\n getDelay(): number;\n setFillMode(fillMode: FillModeType): this;\n getFillMode(): FillModeType;\n setIterationCount(iterationCount: IterationCountType): this;\n getIterationCount(): IterationCountType;\n setDirection(direction: DirectionType): this;\n getDirection(): DirectionType;\n setPlayState(playState: PlayStateType): this;\n getPlayState(): PlayStateType;\n setPlaySpeed(playSpeed: number): this;\n getPlaySpeed(): number;\n setDuration(duration: number): this;\n getDuration(): number;\n getEasing(): EasingType;\n getEasingName(): string;\n}\nexport default Animator;\n","import {\n ALIAS, TIMING_FUNCTION, TRANSFORM_NAME, EASING_NAME\n} from \"./consts\";\nimport { isRole, getType, isPropertyObject, getValueByNames, isFixed, getNames, getEasing } from \"./utils\";\nimport { toPropertyObject, splitStyle, toObject } from \"./utils/property\";\nimport {\n isObject, isArray, isString,\n ANIMATION, TRANSFORM, FILTER, PROPERTY, FUNCTION, ARRAY, OBJECT, IObject, isUndefined\n} from \"@daybrush/utils\";\nimport { NameType } from \"./types\";\n\nfunction toInnerProperties(obj: IObject) {\n if (!obj) {\n return \"\";\n }\n const arrObj = [];\n\n for (const name in obj) {\n arrObj.push(`${name.replace(/\\d$/g, \"\")}(${obj[name]})`);\n }\n return arrObj.join(\" \");\n}\n\n/* eslint-disable */\nfunction clone(target: IObject, toValue = false) {\n return merge({}, target, toValue);\n}\nfunction merge(to: IObject, from: IObject, toValue = false) {\n for (const name in from) {\n const value = from[name];\n const type = getType(value);\n\n if (type === PROPERTY) {\n to[name] = toValue ? value.toValue() : value.clone();\n } else if (type === FUNCTION) {\n to[name] = toValue ? getValue([name], value) : value;\n } else if (type === ARRAY) {\n to[name] = value.slice();\n } else if (type === OBJECT) {\n if (isObject(to[name]) && !isPropertyObject(to[name])) {\n merge(to[name], value, toValue);\n } else {\n to[name] = clone(value, toValue);\n }\n } else {\n to[name] = from[name];\n }\n }\n return to;\n}\n/* eslint-enable */\n\nfunction getPropertyName(args: NameType[]) {\n return args[0] in ALIAS ? ALIAS[args[0]] : args;\n}\nfunction getValue(names: NameType[], value: any): any {\n const type = getType(value);\n\n if (type === PROPERTY) {\n return value.toValue();\n } else if (type === FUNCTION) {\n if (names[0] !== TIMING_FUNCTION) {\n return getValue(names, value());\n }\n } else if (type === OBJECT) {\n return clone(value, true);\n }\n return value;\n}\n/**\n* Animation's Frame\n*/\nclass Frame {\n public properties: IObject;\n /**\n * @param - properties\n * @example\n const frame = new Scene.Frame({\n display: \"none\"\n transform: {\n translate: \"50px\",\n scale: \"5, 5\",\n }\n });\n */\n constructor(properties: any = {}) {\n this.properties = {};\n this.set(properties);\n }\n /**\n * get property value\n * @param {...Number|String|PropertyObject} args - property name or value\n * @example\n frame.get(\"display\") // => \"none\", \"block\", ....\n frame.get(\"transform\", \"translate\") // => \"10px,10px\"\n */\n public get(...args: NameType[]) {\n const value = this.raw(...args);\n\n return getValue(getPropertyName(args), value);\n }\n\n public raw(...args: NameType[]) {\n return getValueByNames(getPropertyName(args), this.properties);\n }\n /**\n * remove property value\n * @param {...String} args - property name\n * @return {Frame} An instance itself\n * @example\n frame.remove(\"display\")\n */\n public remove(...args: NameType[]) {\n const params = getPropertyName(args);\n const length = params.length;\n\n if (!length) {\n return this;\n }\n const value = getValueByNames(params, this.properties, length - 1);\n\n if (isObject(value)) {\n delete value[params[length - 1]];\n }\n return this;\n }\n /**\n * set property\n * @param {...Number|String|PropertyObject} args - property names or values\n * @return {Frame} An instance itself\n * @example\n // one parameter\n frame.set({\n display: \"none\",\n transform: {\n translate: \"10px, 10px\",\n scale: \"1\",\n },\n filter: {\n brightness: \"50%\",\n grayscale: \"100%\"\n }\n });\n\n // two parameters\n frame.set(\"transform\", {\n translate: \"10px, 10px\",\n scale: \"1\",\n });\n\n // three parameters\n frame.set(\"transform\", \"translate\", \"50px\");\n */\n public set(...args: any[]) {\n const self = this;\n const length = args.length;\n const params = args.slice(0, -1);\n const value = args[length - 1];\n const firstParam = params[0];\n\n if (length === 1 && value instanceof Frame) {\n self.merge(value);\n } else if (firstParam in ALIAS) {\n self._set(ALIAS[firstParam], value);\n } else if (length === 2 && isArray(firstParam)) {\n self._set(firstParam, value);\n } else if (isPropertyObject(value)) {\n if (isRole(params)) {\n self.set(...params, toObject(value));\n } else {\n self._set(params, value);\n }\n } else if (isArray(value)) {\n self._set(params, value);\n } else if (isObject(value)) {\n if (!self.has(...params) && isRole(params)) {\n self._set(params, {});\n }\n for (const name in value) {\n self.set(...params, name, value[name]);\n }\n } else if (isString(value)) {\n if (isRole(params, true)) {\n if (isFixed(params) || !isRole(params)) {\n this._set(params, value);\n } else {\n const obj = toPropertyObject(value);\n\n if (isObject(obj)) {\n self.set(...params, obj);\n }\n }\n return this;\n } else {\n const { styles, length: stylesLength } = splitStyle(value);\n\n for (const name in styles) {\n self.set(...params, name, styles[name]);\n }\n if (stylesLength) {\n return this;\n }\n }\n self._set(params, value);\n } else {\n self._set(params, value);\n }\n return self;\n }\n /**\n * Gets the names of properties.\n * @return the names of properties.\n * @example\n // one parameter\n frame.set({\n display: \"none\",\n transform: {\n translate: \"10px, 10px\",\n scale: \"1\",\n },\n });\n\n // [[\"display\"], [\"transform\", \"translate\"], [\"transform\", \"scale\"]]\n console.log(frame.getNames());\n */\n public getNames(): string[][] {\n return getNames(this.properties, []);\n }\n /**\n * check that has property.\n * @param {...String} args - property name\n * @example\n frame.has(\"property\", \"display\") // => true or false\n */\n public has(...args: NameType[]) {\n const params = getPropertyName(args);\n const length = params.length;\n\n if (!length) {\n return false;\n }\n return !isUndefined(getValueByNames(params, this.properties, length));\n }\n /**\n * clone frame.\n * @return {Frame} An instance of clone\n * @example\n frame.clone();\n */\n public clone() {\n const frame = new Frame();\n\n return frame.merge(this);\n }\n /**\n * merge one frame to other frame.\n * @param - target frame.\n * @return {Frame} An instance itself\n * @example\n frame.merge(frame2);\n */\n public merge(frame: Frame) {\n const properties = this.properties;\n const frameProperties = frame.properties;\n\n if (frameProperties) {\n merge(properties, frameProperties);\n }\n return this;\n }\n /**\n * Specifies an css object that coverted the frame.\n * @return {object} cssObject\n */\n public toCSSObject() {\n const properties = this.get();\n const cssObject: IObject = {};\n\n for (const name in properties) {\n if (isRole([name], true)) {\n continue;\n }\n const value = properties[name];\n\n if (name === TIMING_FUNCTION) {\n cssObject[TIMING_FUNCTION.replace(\"animation\", ANIMATION)] =\n (isString(value) ? value : value[EASING_NAME]) || \"initial\";\n } else {\n cssObject[name] = value;\n }\n }\n const transform = toInnerProperties(properties[TRANSFORM_NAME]);\n const filter = toInnerProperties(properties.filter);\n\n TRANSFORM && transform && (cssObject[TRANSFORM] = transform);\n FILTER && filter && (cssObject[FILTER] = filter);\n return cssObject;\n }\n /**\n * Specifies an css text that coverted the frame.\n * @return {string} cssText\n */\n public toCSS() {\n const cssObject = this.toCSSObject();\n const cssArray = [];\n\n for (const name in cssObject) {\n cssArray.push(`${name}:${cssObject[name]};`);\n }\n return cssArray.join(\"\");\n }\n /**\n * Remove All Properties\n * @return {Frame} An instance itself\n */\n public clear() {\n this.properties = {};\n return this;\n }\n private _set(args: NameType[], value: any) {\n let properties = this.properties;\n const length = args.length;\n\n for (let i = 0; i < length - 1; ++i) {\n const name = args[i];\n\n !(name in properties) && (properties[name] = {});\n properties = properties[name];\n }\n if (!length) {\n return;\n }\n if (length === 1 && args[0] === TIMING_FUNCTION) {\n properties[TIMING_FUNCTION] = getEasing(value);\n } else {\n const lastParam = args[length - 1];\n properties[lastParam] = isString(value) && !isFixed(args)\n ? toPropertyObject(value, lastParam)\n : value;\n }\n }\n}\nexport default Frame;\n","\nimport PropertyObject from \"../PropertyObject\";\nimport { getType } from \"../utils\";\nimport { toPropertyObject } from \"./property\";\nimport { splitUnit, PROPERTY, FUNCTION, ARRAY, dot as dotNumber } from \"@daybrush/utils\";\nimport { EasingType } from \"../types\";\n\nfunction dotArray(a1: any[], a2: any, b1: number, b2: number): any {\n const length = a2.length;\n\n return a1.map((v1, i) => {\n if (i >= length) {\n return v1;\n } else {\n return dot(v1, a2[i], b1, b2);\n }\n });\n}\n\nfunction dotColor(color1: PropertyObject, color2: PropertyObject, b1: number, b2: number) {\n // convert array to PropertyObject(type=color)\n const value1 = color1.value;\n const value2 = color2.value;\n // If the model name is not same, the inner product is impossible.\n const model1 = color1.model;\n const model2 = color2.model;\n\n if (model1 !== model2) {\n // It is recognized as a string.\n return dot(color1.toValue(), color2.toValue(), b1, b2);\n }\n if (value1.length === 3) {\n value1[3] = 1;\n }\n if (value2.length === 3) {\n value2[3] = 1;\n }\n const v = dotArray(value1, value2, b1, b2);\n const colorModel = model1;\n\n for (let i = 0; i < 3; ++i) {\n v[i] = parseInt(v[i], 10);\n }\n const object = new PropertyObject(v, {\n type: \"color\",\n model: colorModel,\n prefix: `${colorModel}(`,\n suffix: \")\",\n });\n\n return object;\n}\n\nfunction dotObject(a1: PropertyObject, a2: PropertyObject, b1: number, b2: number) {\n const a1Type = a1.type;\n\n if (a1Type === \"color\") {\n return dotColor(a1, a2, b1, b2);\n }\n const value1 = a1.value;\n const value2 = a2.value;\n const arr = dotArray(value1, value2, b1, b2);\n\n return new PropertyObject(arr, {\n type: a1Type,\n separator: a1.separator || a2.separator,\n prefix: a1.prefix || a2.prefix,\n suffix: a1.suffix || a2.suffix,\n model: a1.model || a2.model,\n });\n}\n/**\n* The dot product of a1 and a2 for the b1 and b2.\n* @memberof Dot\n* @function dot\n* @param {String|Number|PropertyObject} a1 value1\n* @param {String|Number|PropertyObject} a2 value2\n* @param {Number} b1 b1 ratio\n* @param {Number} b2 b2 ratio\n* @return {String} Not Array, Not Separator, Only Number & Unit\n* @return {PropertyObject} Array with Separator.\n* @example\ndot(1, 3, 0.3, 0.7);\n// => 1.6\n*/\nexport function dot(a1: any, a2: any, b1: number, b2: number): any {\n if (b2 === 0) {\n return a2;\n } else if (b1 === 0 || b1 + b2 === 0) {\n // prevent division by zero.\n return a1;\n }\n // dot Object\n\n const type1 = getType(a1);\n const type2 = getType(a2);\n const isFunction1 = type1 === FUNCTION;\n const isFunction2 = type2 === FUNCTION;\n\n if (isFunction1 || isFunction2) {\n return () => {\n return dot(isFunction1 ? toPropertyObject(a1()) : a1, isFunction2 ? toPropertyObject(a2()) : a2, b1, b2);\n };\n } else if (type1 === type2) {\n if (type1 === PROPERTY) {\n return dotObject(a1, a2, b1, b2);\n } else if (type1 === ARRAY) {\n return dotArray(a1, a2, b1, b2);\n } else if (type1 !== \"value\") {\n return a1;\n }\n } else {\n return a1;\n }\n const v1 = splitUnit(`${a1}`);\n const v2 = splitUnit(`${a2}`);\n let v;\n\n // 숫자가 아닐경우 첫번째 값을 반환 b2가 0일경우 두번째 값을 반환\n if (isNaN(v1.value) || isNaN(v2.value)) {\n return a1;\n } else {\n v = dotNumber(v1.value, v2.value, b1, b2);\n }\n const prefix = v1.prefix || v2.prefix;\n const unit = v1.unit || v2.unit;\n\n if (!prefix && !unit) {\n return v;\n }\n return prefix + v + unit;\n}\n\nexport function dotValue(\n time: number,\n prevTime: number,\n nextTime: number,\n prevValue: any,\n nextValue: any,\n easing?: EasingType) {\n if (time === prevTime) {\n return prevValue;\n } else if (time === nextTime) {\n return nextValue;\n } else if (!easing) {\n return dot(prevValue, nextValue, time - prevTime, nextTime - time);\n }\n const ratio = easing((time - prevTime) / (nextTime - prevTime));\n const value = dot(prevValue, nextValue, ratio, 1 - ratio);\n\n return value;\n}\n","import Animator, { isDirectionReverse } from \"./Animator\";\nimport Frame from \"./Frame\";\nimport {\n toFixed,\n isFixed,\n playCSS,\n toId,\n exportCSS,\n getRealId,\n makeId,\n isPausedCSS,\n isRole,\n isInProperties,\n getValueByNames,\n isEndedCSS,\n setPlayCSS,\n getNames,\n updateFrame,\n} from \"./utils\";\nimport { dotValue } from \"./utils/dot\";\nimport {\n START_ANIMATION,\n PREFIX, THRESHOLD,\n TIMING_FUNCTION, ALTERNATE, ALTERNATE_REVERSE, INFINITE,\n REVERSE, EASING, FILL_MODE, DIRECTION, ITERATION_COUNT,\n EASING_NAME, DELAY, PLAY_SPEED, DURATION, PAUSE_ANIMATION, DATA_SCENE_ID, SELECTOR, ROLES, CURRENT_TIME\n} from \"./consts\";\nimport {\n isObject, isArray, isUndefined, decamelize,\n ANIMATION, fromCSS, addClass, removeClass, hasClass,\n KEYFRAMES, requestAnimationFrame, isFunction,\n IObject, $, splitComma, toArray, isString, IArrayFormat,\n dot as dotNumber,\n find,\n findIndex,\n} from \"@daybrush/utils\";\nimport {\n NameType, RoleObject, AnimateElement, AnimatorState,\n SceneItemState, SceneItemOptions, EasingType, PlayCondition, DirectionType\n} from \"./types\";\n\nfunction getNearTimeIndex(times: number[], time: number) {\n const length = times.length;\n\n for (let i = 0; i < length; ++i) {\n if (times[i] === time) {\n return [i, i];\n } else if (times[i] > time) {\n return [i > 0 ? i - 1 : 0, i];\n }\n }\n return [length - 1, length - 1];\n}\nfunction makeAnimationProperties(properties: object) {\n const cssArray = [];\n\n for (const name in properties) {\n cssArray.push(`${ANIMATION}-${decamelize(name)}:${properties[name]};`);\n }\n return cssArray.join(\"\");\n}\nfunction addTime(times: number[], time: number) {\n const length = times.length;\n for (let i = 0; i < length; ++i) {\n if (time < times[i]) {\n times.splice(i, 0, time);\n return;\n }\n }\n times[length] = time;\n}\nfunction addEntry(entries: number[][], time: number, keytime: number) {\n const prevEntry = entries[entries.length - 1];\n\n (!prevEntry || prevEntry[0] !== time || prevEntry[1] !== keytime) &&\n entries.push([toFixed(time), toFixed(keytime)]);\n}\nexport function getEntries(times: number[], states: AnimatorState[]) {\n let entries = times.map(time => ([time, time]));\n let nextEntries = [];\n\n states.forEach(state => {\n const iterationCount = state[ITERATION_COUNT] as number;\n const delay = state[DELAY];\n const playSpeed = state[PLAY_SPEED];\n const direction = state[DIRECTION];\n const intCount = Math.ceil(iterationCount);\n const currentDuration = entries[entries.length - 1][0];\n const length = entries.length;\n const lastTime = currentDuration * iterationCount;\n\n for (let i = 0; i < intCount; ++i) {\n const isReverse =\n direction === REVERSE ||\n direction === ALTERNATE && i % 2 ||\n direction === ALTERNATE_REVERSE && !(i % 2);\n\n for (let j = 0; j < length; ++j) {\n const entry = entries[isReverse ? length - j - 1 : j];\n const time = entry[1];\n const currentTime = currentDuration * i + (isReverse ? currentDuration - entry[0] : entry[0]);\n const prevEntry = entries[isReverse ? length - j : j - 1];\n\n if (currentTime > lastTime) {\n if (j !== 0) {\n const prevTime = currentDuration * i +\n (isReverse ? currentDuration - prevEntry[0] : prevEntry[0]);\n const divideTime = dotNumber(prevEntry[1], time, lastTime - prevTime, currentTime - lastTime);\n\n addEntry(nextEntries, (delay + currentDuration * iterationCount) / playSpeed, divideTime);\n }\n break;\n } else if (\n currentTime === lastTime\n && nextEntries.length\n && nextEntries[nextEntries.length - 1][0] === lastTime + delay\n ) {\n break;\n }\n addEntry(nextEntries, (delay + currentTime) / playSpeed, time);\n }\n }\n // delay time\n delay && nextEntries.unshift([0, nextEntries[0][1]]);\n\n entries = nextEntries;\n nextEntries = [];\n });\n\n return entries;\n}\n/**\n* manage Frame Keyframes and play keyframes.\n* @extends Animator\n* @example\nconst item = new SceneItem({\n\t0: {\n\t\tdisplay: \"none\",\n\t},\n\t1: {\n\t\tdisplay: \"block\",\n\t\topacity: 0,\n\t},\n\t2: {\n\t\topacity: 1,\n\t}\n});\n*/\nclass SceneItem extends Animator {\n public times: number[] = [];\n public items: IObject = {};\n public names: RoleObject = {};\n public elements: AnimateElement[] = [];\n public temp: Frame;\n private needUpdate: boolean = true;\n private target: any;\n private targetFunc: (frame: Frame) => void;\n\n /**\n * @param - properties\n * @param - options\n * @example\n const item = new SceneItem({\n 0: {\n display: \"none\",\n },\n 1: {\n display: \"block\",\n opacity: 0,\n },\n 2: {\n opacity: 1,\n }\n });\n */\n constructor(properties?: any, options?: Partial) {\n super();\n this.load(properties, options);\n }\n public getDuration() {\n const times = this.times;\n const length = times.length;\n\n return (length === 0 ? 0 : times[length - 1]) || this.state[DURATION];\n }\n /**\n * get size of list\n * @return {Number} length of list\n */\n public size() {\n return this.times.length;\n }\n public setDuration(duration: number) {\n if (!duration) {\n return this;\n }\n const originalDuration = this.getDuration();\n\n if (originalDuration > 0) {\n const ratio = duration / originalDuration;\n const { times, items } = this;\n const obj: IObject = {};\n\n this.times = times.map(time => {\n const time2 = toFixed(time * ratio);\n\n obj[time2] = items[time];\n\n return time2;\n });\n this.items = obj;\n } else {\n this.newFrame(duration);\n }\n return this;\n }\n public setId(id?: number | string) {\n const state = this.state;\n const elements = this.elements;\n const length = elements.length;\n\n state.id = id || makeId(!!length);\n\n if (length && !state[SELECTOR]) {\n const sceneId = toId(this.getId());\n\n state[SELECTOR] = `[${DATA_SCENE_ID}=\"${sceneId}\"]`;\n elements.forEach(element => {\n element.setAttribute(DATA_SCENE_ID, sceneId);\n });\n }\n return this;\n }\n\n /**\n * Set properties to the sceneItem at that time\n * @param {Number} time - time\n * @param {...String|Object} [properties] - property names or values\n * @return {SceneItem} An instance itself\n * @example\n item.set(0, \"a\", \"b\") // item.getFrame(0).set(\"a\", \"b\")\n console.log(item.get(0, \"a\")); // \"b\"\n */\n public set(time: any, ...args: any[]) {\n if (time instanceof SceneItem) {\n return this.set(0, time);\n } else if (isArray(time)) {\n const length = time.length;\n\n for (let i = 0; i < length; ++i) {\n const t = length === 1 ? 0 : this.getUnitTime(`${i / (length - 1) * 100}%`);\n\n this.set(t, time[i]);\n }\n } else if (isObject(time)) {\n for (const t in time) {\n const value = time[t];\n\n splitComma(t).forEach(eachTime => {\n const realTime = this.getUnitTime(eachTime);\n\n if (isNaN(realTime)) {\n getNames(value, [eachTime]).forEach(names => {\n const innerValue = getValueByNames(names.slice(1), value);\n const arr = isArray(innerValue) ?\n innerValue : [getValueByNames(names, this.target), innerValue];\n const length = arr.length;\n\n for (let i = 0; i < length; ++i) {\n this.newFrame(`${i / (length - 1) * 100}%`).set(...names, arr[i]);\n }\n });\n } else {\n this.set(realTime, value);\n }\n });\n }\n } else if (!isUndefined(time)) {\n const value = args[0];\n\n splitComma(time + \"\").forEach(eachTime => {\n const realTime = this.getUnitTime(eachTime);\n\n if (value instanceof SceneItem) {\n const delay = value.getDelay();\n const frames = value.toObject(!this.hasFrame(realTime + delay));\n const duration = value.getDuration();\n const direction = value.getDirection();\n const isReverse = direction.indexOf(\"reverse\") > -1;\n\n for (const frameTime in frames) {\n const nextTime = isReverse ? duration - parseFloat(frameTime) : parseFloat(frameTime);\n this.set(realTime + nextTime, frames[frameTime]);\n }\n } else if (args.length === 1 && isArray(value)) {\n value.forEach((item: any) => {\n this.set(realTime, item);\n });\n } else {\n const frame = this.newFrame(realTime);\n\n frame.set(...args);\n }\n });\n }\n this.needUpdate = true;\n return this;\n }\n /**\n * Get properties of the sceneItem at that time\n * @param {Number} time - time\n * @param {...String|Object} args property's name or properties\n * @return {Number|String|PropertyObejct} property value\n * @example\n item.get(0, \"a\"); // item.getFrame(0).get(\"a\");\n item.get(0, \"transform\", \"translate\"); // item.getFrame(0).get(\"transform\", \"translate\");\n */\n public get(time: string | number, ...args: NameType[]) {\n const frame = this.getFrame(time);\n\n return frame && frame.get(...args);\n }\n public remove(time: string | number, ...args: any[]): this;\n /**\n * remove properties to the sceneItem at that time\n * @param {Number} time - time\n * @param {...String|Object} [properties] - property names or values\n * @return {SceneItem} An instance itself\n * @example\n item.remove(0, \"a\");\n */\n public remove(time: string | number, ...args: NameType[]) {\n if (args.length) {\n const frame = this.getFrame(time);\n\n frame && frame.remove(...args);\n } else {\n this.removeFrame(time);\n }\n this.needUpdate = true;\n return this;\n }\n /**\n * Append the item or object at the last time.\n * @param - the scene item or item object\n * @return An instance itself\n * @example\n item.append(new SceneItem({\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n }));\n item.append({\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n });\n item.set(item.getDuration(), {\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n });\n */\n public append(item: SceneItem | IObject) {\n if (item instanceof SceneItem) {\n this.set(this.getDuration(), item);\n } else {\n this.append(new SceneItem(item));\n }\n return this;\n }\n /**\n * Push the front frames for the time and prepend the scene item or item object.\n * @param - the scene item or item object\n * @return An instance itself\n */\n public prepend(item: SceneItem | IObject) {\n if (item instanceof SceneItem) {\n const unshiftTime = item.getDuration() + item.getDelay();\n const firstFrame = this.getFrame(0);\n // remove first frame\n this.removeFrame(0);\n this.unshift(unshiftTime);\n this.set(0, item);\n this.set(unshiftTime + THRESHOLD, firstFrame);\n } else {\n this.prepend(new SceneItem(item));\n }\n return this;\n }\n /**\n * Push out the amount of time.\n * @param - time to push\n * @example\n item.get(0); // frame 0\n item.unshift(3);\n item.get(3) // frame 0\n */\n public unshift(time: number) {\n const { times, items } = this;\n const obj: IObject = {};\n\n this.times = times.map(t => {\n const time2 = toFixed(time + t);\n\n obj[time2] = items[t];\n return time2;\n });\n this.items = obj;\n return this;\n }\n /**\n * Get the frames in the item in object form.\n * @return {}\n * @example\n item.toObject();\n // {0: {display: \"none\"}, 1: {display: \"block\"}}\n */\n public toObject(isStartZero = true): IObject {\n const obj: IObject = {};\n const delay = this.getDelay();\n\n this.forEach((frame: Frame, time: number) => {\n obj[(!time && !isStartZero ? THRESHOLD : 0) + delay + time] = frame.clone();\n });\n return obj;\n }\n /**\n * Specifies an element to synchronize items' keyframes.\n * @param {string} selectors - Selectors to find elements in items.\n * @return {SceneItem} An instance itself\n * @example\nitem.setSelector(\"#id.class\");\n */\n public setSelector(target: string | boolean | ((id: number | string) => string)) {\n if (isFunction(target)) {\n this.setElement(target(this.getId()));\n } else {\n this.setElement(target);\n }\n return this;\n }\n /**\n * Get the elements connected to SceneItem.\n */\n public getElements(): AnimateElement[] {\n return this.elements;\n }\n /**\n * Specifies an element to synchronize item's keyframes.\n * @param - elements to synchronize item's keyframes.\n * @param - Make sure that you have peusdo.\n * @return {SceneItem} An instance itself\n * @example\nitem.setElement(document.querySelector(\"#id.class\"));\nitem.setElement(document.querySelectorAll(\".class\"));\n */\n public setElements(target: boolean | string | AnimateElement | IArrayFormat): this {\n return this.setElement(target);\n }\n /**\n * Specifies an element to synchronize item's keyframes.\n * @param - elements to synchronize item's keyframes.\n * @param - Make sure that you have peusdo.\n * @return {SceneItem} An instance itself\n * @example\nitem.setElement(document.querySelector(\"#id.class\"));\nitem.setElement(document.querySelectorAll(\".class\"));\n */\n public setElement(target: boolean | string | AnimateElement | IArrayFormat) {\n const state = this.state;\n let elements: AnimateElement[] = [];\n\n if (!target) {\n return this;\n } else if (target === true || isString(target)) {\n const selector = target === true ? `${state.id}` : target;\n const matches = /([\\s\\S]+)(:+[a-zA-Z]+)$/g.exec(selector);\n\n elements = toArray($(matches ? matches[1] : selector, true));\n state[SELECTOR] = selector;\n } else {\n elements = (target instanceof Element) ? [target] : toArray(target);\n }\n if (!elements.length) {\n return this;\n }\n this.elements = elements;\n this.setId(this.getId());\n this.target = elements[0].style;\n this.targetFunc = (frame: Frame) => {\n const attributes = frame.get(\"attribute\");\n\n if (attributes) {\n for (const name in attributes) {\n elements.forEach(el => {\n el.setAttribute(name, attributes[name]);\n });\n }\n }\n if (frame.has(\"html\")) {\n const html = frame.get(\"html\");\n\n elements.forEach(el => {\n el.innerHTML = html;\n });\n }\n const cssText = frame.toCSS();\n\n if (state.cssText !== cssText) {\n state.cssText = cssText;\n\n elements.forEach(el => {\n el.style.cssText += cssText;\n });\n return frame;\n }\n };\n return this;\n }\n public setTarget(target: any): this {\n this.target = target;\n this.targetFunc = (frame: Frame) => {\n const obj = frame.get();\n\n for (const name in obj) {\n target[name] = obj[name];\n }\n };\n return this;\n }\n /**\n * add css styles of items's element to the frame at that time.\n * @param {Array} properties - elements to synchronize item's keyframes.\n * @return {SceneItem} An instance itself\n * @example\n item.setElement(document.querySelector(\"#id.class\"));\n item.setCSS(0, [\"opacity\"]);\n item.setCSS(0, [\"opacity\", \"width\", \"height\"]);\n */\n public setCSS(time: number, properties: string[]) {\n this.set(time, fromCSS(this.elements, properties));\n return this;\n }\n public setTime(time: number | string, isTick?: boolean, isParent?: boolean, parentEasing?: EasingType) {\n super.setTime(time, isTick, isParent);\n\n const iterationTime = this.getIterationTime();\n const easing = this.getEasing() || parentEasing;\n const frame = this.getNowFrame(iterationTime, easing);\n const currentTime = this.getTime();\n\n this.temp = frame;\n /**\n * This event is fired when timeupdate and animate.\n * @event SceneItem#animate\n * @param {Number} param.currentTime The total time that the animator is running.\n * @param {Number} param.time The iteration time during duration that the animator is running.\n * @param {Frame} param.frame frame of that time.\n */\n this.trigger(\"animate\", {\n frame,\n currentTime,\n time: iterationTime,\n });\n this.targetFunc && this.targetFunc(frame);\n return this;\n }\n /**\n * update property names used in frames.\n * @return {SceneItem} An instance itself\n * @example\n item.update();\n */\n public update() {\n const names = {};\n this.forEach(frame => {\n updateFrame(names, frame.properties);\n });\n this.names = names;\n this.needUpdate = false;\n return this;\n }\n /**\n * Create and add a frame to the sceneItem at that time\n * @param {Number} time - frame's time\n * @return {Frame} Created frame.\n * @example\n item.newFrame(time);\n */\n public newFrame(time: string | number) {\n let frame = this.getFrame(time);\n\n if (frame) {\n return frame;\n }\n frame = new Frame();\n this.setFrame(time, frame);\n return frame;\n }\n /**\n * Add a frame to the sceneItem at that time\n * @param {Number} time - frame's time\n * @return {SceneItem} An instance itself\n * @example\n item.setFrame(time, frame);\n */\n public setFrame(time: string | number, frame: Frame) {\n const realTime = this.getUnitTime(time);\n\n this.items[realTime] = frame;\n addTime(this.times, realTime);\n this.needUpdate = true;\n return this;\n }\n public getFrame(time: number | string, ...names: any[]): Frame;\n /**\n * get sceneItem's frame at that time\n * @param {Number} time - frame's time\n * @return {Frame} sceneItem's frame at that time\n * @example\n const frame = item.getFrame(time);\n */\n public getFrame(time: number | string) {\n return this.items[this.getUnitTime(time)];\n }\n public removeFrame(time: number | string, ...names: any[]): this;\n /**\n * remove sceneItem's frame at that time\n * @param - frame's time\n * @return {SceneItem} An instance itself\n * @example\n item.removeFrame(time);\n */\n public removeFrame(time: number | string) {\n const realTime = this.getUnitTime(time);\n const items = this.items;\n const index = this.times.indexOf(realTime);\n\n delete items[realTime];\n\n // remove time\n if (index > -1) {\n this.times.splice(index, 1);\n }\n this.needUpdate = true;\n return this;\n }\n /**\n * check if the item has a frame at that time\n * @param {Number} time - frame's time\n * @return {Boolean} true: the item has a frame // false: not\n * @example\n if (item.hasFrame(10)) {\n // has\n } else {\n // not\n }\n */\n public hasFrame(time: number | string) {\n return this.getUnitTime(time) in this.items;\n }\n /**\n * Check if keyframes has propery's name\n * @param - property's time\n * @return {boolean} true: if has property, false: not\n * @example\n item.hasName([\"transform\", \"translate\"]); // true or not\n */\n public hasName(args: string[]) {\n this.needUpdate && this.update();\n return isInProperties(this.names, args, true);\n }\n /**\n * merge frame of the previous time at the next time.\n * @param - The time of the frame to merge\n * @param - The target frame\n * @return {SceneItem} An instance itself\n * @example\n // getFrame(1) contains getFrame(0)\n item.merge(0, 1);\n */\n public mergeFrame(time: number | string, frame: Frame) {\n if (frame) {\n const toFrame = this.newFrame(time);\n\n toFrame.merge(frame);\n }\n return this;\n }\n /**\n * Get frame of the current time\n * @param {Number} time - the current time\n * @param {function} easing - the speed curve of an animation\n * @return {Frame} frame of the current time\n * @example\n let item = new SceneItem({\n 0: {\n display: \"none\",\n },\n 1: {\n display: \"block\",\n opacity: 0,\n },\n 2: {\n opacity: 1,\n }\n });\n // opacity: 0.7; display:\"block\";\n const frame = item.getNowFrame(1.7);\n */\n public getNowFrame(time: number, easing?: EasingType, isAccurate?: boolean) {\n this.needUpdate && this.update();\n const frame = new Frame();\n const [left, right] = getNearTimeIndex(this.times, time);\n let realEasing = this.getEasing() || easing;\n let nameObject = this.names;\n\n if (this.hasName([TIMING_FUNCTION])) {\n const nowEasing = this.getNowValue(time, [TIMING_FUNCTION], left, right, false, 0, true);\n\n isFunction(nowEasing) && (realEasing = nowEasing);\n }\n if (isAccurate) {\n const prevFrame = this.getFrame(time);\n const prevNames = updateFrame({}, prevFrame.properties);\n\n for (const name in ROLES) {\n if (name in prevNames) {\n prevNames[name] = nameObject[name];\n }\n }\n nameObject = prevNames;\n }\n const names = getNames(nameObject, []);\n\n names.forEach(properties => {\n const value = this.getNowValue(time, properties, left, right, isAccurate, realEasing, isFixed(properties));\n\n if (isUndefined(value)) {\n return;\n }\n frame.set(properties, value);\n });\n return frame;\n }\n public load(properties: any = {}, options = properties.options) {\n options && this.setOptions(options);\n\n if (isArray(properties)) {\n this.set(properties);\n } else if (properties.keyframes) {\n this.set(properties.keyframes);\n } else {\n for (const time in properties) {\n if (time !== \"options\") {\n this.set({\n [time]: properties[time],\n });\n }\n }\n }\n if (options && options[DURATION]) {\n this.setDuration(options[DURATION]);\n }\n return this;\n }\n /**\n * clone SceneItem.\n * @return {SceneItem} An instance of clone\n * @example\n * item.clone();\n */\n public clone() {\n const item = new SceneItem();\n\n item.setOptions(this.state);\n this.forEach((frame: Frame, time: number) => {\n item.setFrame(time, frame.clone());\n });\n return item;\n }\n /**\n * executes a provided function once for each scene item.\n * @param - Function to execute for each element, taking three arguments\n * @return {Keyframes} An instance itself\n */\n public forEach(callback: (item: Frame, time: number, items: IObject) => void) {\n const times = this.times;\n const items = this.items;\n\n times.forEach(time => {\n callback(items[time], time, items);\n });\n return this;\n }\n public setOptions(options: Partial = {}) {\n super.setOptions(options);\n const { id, selector, elements, element, target } = options;\n\n id && this.setId(id);\n if (target) {\n this.setTarget(target);\n } else if (selector) {\n this.setSelector(selector);\n } else if (elements || element) {\n this.setElement(elements || element);\n }\n return this;\n }\n public toCSS(\n playCondition: PlayCondition = { className: START_ANIMATION },\n parentDuration = this.getDuration(), states: AnimatorState[] = []) {\n const itemState = this.state;\n const selector = itemState[SELECTOR];\n\n if (!selector) {\n return \"\";\n }\n const originalDuration = this.getDuration();\n itemState[DURATION] = originalDuration;\n states.push(itemState);\n\n const reversedStates = toArray(states).reverse();\n const id = toId(getRealId(this));\n const superParent = states[0];\n const infiniteIndex = findIndex(reversedStates, state => {\n return state[ITERATION_COUNT] === INFINITE || !isFinite(state[DURATION]);\n }, states.length - 1);\n const finiteStates = reversedStates.slice(0, infiniteIndex);\n const duration = parentDuration || finiteStates.reduce((prev, cur) => {\n return (cur[DELAY] + prev * (cur[ITERATION_COUNT] as number)) / cur[PLAY_SPEED];\n }, originalDuration);\n const delay = reversedStates.slice(infiniteIndex).reduce((prev, cur) => {\n return (prev + cur[DELAY]) / cur[PLAY_SPEED];\n }, 0);\n const easingName = find(reversedStates, state => (state[EASING] && state[EASING_NAME]), itemState)[EASING_NAME];\n const iterationCount = reversedStates[infiniteIndex][ITERATION_COUNT];\n const fillMode = superParent[FILL_MODE];\n const direction = reversedStates[infiniteIndex][DIRECTION];\n const cssText = makeAnimationProperties({\n fillMode,\n direction,\n iterationCount,\n delay: `${delay}s`,\n name: `${PREFIX}KEYFRAMES_${id}`,\n duration: `${duration / superParent[PLAY_SPEED]}s`,\n timingFunction: easingName,\n });\n const selectors = splitComma(selector).map(sel => {\n const matches = /([\\s\\S]+)(:+[a-zA-Z]+)$/g.exec(sel);\n\n if (matches) {\n return [matches[1], matches[2]];\n } else {\n return [sel, \"\"];\n }\n });\n const className = playCondition.className;\n const selectorCallback = playCondition.selector;\n const preselector = isFunction(selectorCallback) ? selectorCallback(this, selector) : selectorCallback;\n\n return `\n ${preselector || selectors.map(([sel, peusdo]) => `${sel}.${className}${peusdo}`)} {${cssText}}\n ${selectors.map(([sel, peusdo]) => `${sel}.${PAUSE_ANIMATION}${peusdo}`)} {${ANIMATION}-play-state: paused;}\n @${KEYFRAMES} ${PREFIX}KEYFRAMES_${id}{${this._toKeyframes(duration, finiteStates, direction)}}`;\n }\n /**\n * Export the CSS of the items to the style.\n * @param - Add a selector or className to play.\n * @return {SceneItem} An instance itself\n */\n public exportCSS(\n playCondition?: PlayCondition,\n duration?: number, options?: AnimatorState[]) {\n if (!this.elements.length) {\n return \"\";\n }\n const css = this.toCSS(playCondition, duration, options);\n const isParent = options && !isUndefined(options[ITERATION_COUNT]);\n\n !isParent && exportCSS(getRealId(this), css);\n return this;\n }\n public pause() {\n super.pause();\n isPausedCSS(this) && this.pauseCSS();\n return this;\n }\n public pauseCSS() {\n this.elements.forEach(element => {\n addClass(element, PAUSE_ANIMATION);\n });\n return this;\n }\n public endCSS() {\n this.elements.forEach(element => {\n removeClass(element, PAUSE_ANIMATION);\n removeClass(element, START_ANIMATION);\n });\n setPlayCSS(this, false);\n return this;\n }\n public end() {\n isEndedCSS(this) && this.endCSS();\n super.end();\n return this;\n }\n /**\n * Play using the css animation and keyframes.\n * @param - Check if you want to export css.\n * @param [playClassName=\"startAnimation\"] - Add a class name to play.\n * @param - The shorthand properties for six of the animation properties.\n * @see {@link https://www.w3schools.com/cssref/css3_pr_animation.asp}\n * @example\n item.playCSS();\n item.playCSS(false, \"startAnimation\", {\n direction: \"reverse\",\n fillMode: \"forwards\",\n });\n */\n public playCSS(isExportCSS = true, playClassName?: string, properties: object = {}) {\n playCSS(this, isExportCSS, playClassName, properties);\n return this;\n }\n public addPlayClass(isPaused: boolean, playClassName?: string, properties: object = {}) {\n const elements = this.elements;\n const length = elements.length;\n const cssText = makeAnimationProperties(properties);\n\n if (!length) {\n return;\n }\n if (isPaused) {\n elements.forEach(element => {\n removeClass(element, PAUSE_ANIMATION);\n });\n } else {\n elements.forEach(element => {\n element.style.cssText += cssText;\n if (hasClass(element, START_ANIMATION)) {\n removeClass(element, START_ANIMATION);\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n addClass(element, START_ANIMATION);\n });\n });\n } else {\n addClass(element, START_ANIMATION);\n }\n });\n }\n return elements[0];\n }\n /**\n * Remove All Frames\n * @return {SceneItem} An instance itself\n */\n public clear() {\n this.times = [];\n this.items = {};\n this.names = {};\n this.temp = null;\n this.needUpdate = true;\n return this;\n }\n public getNowValue(\n time: number,\n properties: string[],\n left?: number,\n right?: number,\n isAccurate?: boolean,\n easing?: EasingType,\n usePrevValue?: boolean,\n ) {\n const times = this.times;\n const length = times.length;\n\n let prevTime: number;\n let nextTime: number;\n let prevFrame: Frame;\n let nextFrame: Frame;\n const isUndefinedLeft = isUndefined(left);\n const isUndefinedRight = isUndefined(right);\n if (isUndefinedLeft || isUndefinedRight) {\n const indicies = getNearTimeIndex(times, time);\n isUndefinedLeft && (left = indicies[0]);\n isUndefinedRight && (right = indicies[1]);\n }\n\n for (let i = left; i >= 0; --i) {\n const frame = this.getFrame(times[i]);\n\n if (frame.has(...properties)) {\n prevTime = times[i];\n prevFrame = frame;\n break;\n }\n }\n const prevValue = prevFrame && prevFrame.raw(...properties);\n\n if (isAccurate && !isRole([properties[0]])) {\n return prevTime === time ? prevValue : undefined;\n }\n if (usePrevValue) {\n return prevValue;\n }\n for (let i = right; i < length; ++i) {\n const frame = this.getFrame(times[i]);\n\n if (frame.has(...properties)) {\n nextTime = times[i];\n nextFrame = frame;\n break;\n }\n }\n const nextValue = nextFrame && nextFrame.raw(...properties);\n\n if (!prevFrame || isUndefined(prevValue)) {\n return nextValue;\n }\n if (!nextFrame || isUndefined(nextValue) || prevValue === nextValue) {\n return prevValue;\n }\n return dotValue(time, Math.max(prevTime, 0), nextTime, prevValue, nextValue, easing);\n }\n private _toKeyframes(duration: number, states: AnimatorState[], direction: DirectionType) {\n const frames: IObject = {};\n const times = this.times.slice();\n\n if (!times.length) {\n return \"\";\n }\n const originalDuration = this.getDuration();\n (!this.getFrame(0)) && times.unshift(0);\n (!this.getFrame(originalDuration)) && times.push(originalDuration);\n const entries = getEntries(times, states);\n const lastEntry = entries[entries.length - 1];\n\n // end delay time\n lastEntry[0] < duration && addEntry(entries, duration, lastEntry[1]);\n let prevTime = -1;\n\n return entries.map(([time, keytime]) => {\n if (!frames[keytime]) {\n frames[keytime] =\n (!this.hasFrame(keytime) || keytime === 0 || keytime === originalDuration ?\n this.getNowFrame(keytime) : this.getNowFrame(keytime, 0, true)).toCSS();\n }\n\n let frameTime = time / duration * 100;\n\n if (frameTime - prevTime < THRESHOLD) {\n frameTime += THRESHOLD;\n }\n prevTime = frameTime;\n return `${Math.min(frameTime, 100)}%{\n ${time === 0 && !isDirectionReverse(0, 1, direction) ? \"\" : frames[keytime]}\n }`;\n }).join(\"\");\n }\n}\n\nexport default SceneItem;\n","import Animator from \"./Animator\";\nimport SceneItem from \"./SceneItem\";\nimport { SELECTOR, DURATION, DELAY, RUNNING } from \"./consts\";\nimport { playCSS, exportCSS, getRealId, isPausedCSS, isEndedCSS, setPlayCSS } from \"./utils\";\nimport { isFunction, IS_WINDOW, IObject, $, IArrayFormat } from \"@daybrush/utils\";\nimport {\n AnimateElement, SceneState, SceneOptions, EasingType,\n AnimatorState, SceneItemOptions, PlayCondition\n} from \"./types\";\nimport Frame from \"./Frame\";\nimport ListMap from \"list-map\";\n\n/**\n * manage sceneItems and play Scene.\n * @sort 1\n */\nclass Scene extends Animator {\n /**\n * version info\n * @type {string}\n * @example\n * Scene.VERSION // #__VERSION__#\n */\n public static VERSION: string = \"#__VERSION__#\";\n public items: ListMap = new ListMap();\n public temp: IObject;\n /**\n * @param - properties\n * @param - options\n * @example\n const scene = new Scene({\n item1: {\n 0: {\n display: \"none\",\n },\n 1: {\n display: \"block\",\n opacity: 0,\n },\n 2: {\n opacity: 1,\n },\n },\n item2: {\n 2: {\n opacity: 1,\n },\n }\n });\n */\n constructor(properties?: {options?: Partial} & IObject, options?: Partial) {\n super();\n this.load(properties, options);\n }\n public getDuration() {\n let time = 0;\n\n this.forEach(item => {\n time = Math.max(time, item.getTotalDuration() / item.getPlaySpeed());\n });\n return time || this.state[DURATION];\n }\n public setDuration(duration: number) {\n const items = this.items;\n const sceneDuration = this.getDuration();\n\n if (duration === 0 || !isFinite(sceneDuration)) {\n return this;\n }\n if (sceneDuration === 0) {\n this.forEach(item => {\n item.setDuration(duration);\n });\n } else {\n const ratio = duration / sceneDuration;\n\n this.forEach(item => {\n item.setDelay(item.getDelay() * ratio);\n item.setDuration(item.getDuration() * ratio);\n });\n }\n super.setDuration(duration);\n return this;\n }\n public getItem(name: number | string): T;\n /**\n * get item in scene by name\n * @param - The item's name\n * @return {Scene | SceneItem} item\n * @example\n const item = scene.getItem(\"item1\")\n */\n public getItem(name: number | string) {\n return this.items.get(name);\n }\n /**\n * create item in scene\n * @param {} name - name of item to create\n * @param {} options - The option object of SceneItem\n * @return {} Newly created item\n * @example\n const item = scene.newItem(\"item1\")\n */\n public newItem(name: number | string, options: Partial = {}): Scene | SceneItem {\n if (this.items.has(name)) {\n return this.items.get(name);\n }\n const item = new SceneItem();\n\n this.setItem(name, item);\n item.setOptions(options);\n\n return item;\n }\n /**\n * remove item in scene\n * @param - name of item to remove\n * @return An instance itself\n * @example\n const item = scene.newItem(\"item1\")\n\n scene.removeItem(\"item1\");\n */\n public removeItem(name: number | string): this {\n this.items.remove(name);\n return this;\n }\n /**\n * add a sceneItem to the scene\n * @param - name of item to create\n * @param - sceneItem\n * @example\n const item = scene.newItem(\"item1\")\n */\n public setItem(name: number | string, item: Scene | SceneItem) {\n item.setId(name);\n this.items.set(name, item);\n return this;\n }\n public setTime(time: number | string, isTick?: boolean, isParent?: boolean, parentEasing?: EasingType) {\n super.setTime(time, isTick, isParent);\n\n const iterationTime = this.getIterationTime();\n const easing = this.getEasing() || parentEasing;\n const frames: IObject = {};\n\n this.forEach(item => {\n item.setTime(iterationTime * item.getPlaySpeed() - item.getDelay(), isTick, true, easing);\n\n frames[item.getId()] = item.temp;\n });\n this.temp = frames;\n\n /**\n * This event is fired when timeupdate and animate.\n * @event Scene#animate\n * @param {object} param The object of data to be sent to an event.\n * @param {number} param.currentTime The total time that the animator is running.\n * @param {number} param.time The iteration time during duration that the animator is running.\n * @param {object} param.frames frames of that time.\n * @example\nconst scene = new Scene({\n a: {\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n },\n b: {\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n }\n}).on(\"animate\", e => {\n console.log(e.frames);\n // {a: Frame, b: Frame}\n console.log(e.frames.a.get(\"opacity\"));\n});\n */\n this.trigger(\"animate\", {\n frames,\n currentTime: this.getTime(),\n time: iterationTime,\n });\n\n return this;\n }\n /**\n * executes a provided function once for each scene item.\n * @param - Function to execute for each element, taking three arguments\n * @return {Scene} An instance itself\n */\n public forEach(\n func: (\n item: Scene | SceneItem,\n id: string | number,\n index: number,\n items: IObject,\n ) => void,\n ) {\n const items = this.items;\n\n items.forEach((item, id, index, obj) => {\n func(item, id, index, obj);\n });\n return this;\n }\n public toCSS(\n playCondition?: PlayCondition,\n duration: number = this.getDuration(), parentStates: AnimatorState[] = []) {\n const totalDuration = !duration || !isFinite(duration) ? 0 : duration;\n const styles: string[] = [];\n const state = this.state;\n\n state[DURATION] = this.getDuration();\n\n this.forEach(item => {\n styles.push(item.toCSS(playCondition, totalDuration, parentStates.concat(state)));\n });\n return styles.join(\"\");\n }\n /**\n * Export the CSS of the items to the style.\n * @param - Add a selector or className to play.\n * @return {Scene} An instance itself\n */\n public exportCSS(\n playCondition?: PlayCondition, duration?: number, parentStates?: AnimatorState[]) {\n const css = this.toCSS(playCondition, duration, parentStates);\n\n (!parentStates || !parentStates.length) && exportCSS(getRealId(this), css);\n return this;\n }\n public append(item: SceneItem | Scene) {\n item.setDelay(item.getDelay() + this.getDuration());\n this.setItem(getRealId(item), item);\n }\n public pauseCSS() {\n return this.forEach(item => {\n item.pauseCSS();\n });\n }\n public pause() {\n super.pause();\n\n isPausedCSS(this) && this.pauseCSS();\n this.forEach(item => {\n item.pause();\n });\n return this;\n }\n public endCSS() {\n this.forEach(item => {\n item.endCSS();\n });\n setPlayCSS(this, false);\n }\n public end() {\n isEndedCSS(this) && this.endCSS();\n super.end();\n return this;\n }\n public addPlayClass(isPaused: boolean, playClassName?: string, properties: object = {}) {\n let animtionElement: AnimateElement;\n\n this.forEach(item => {\n const el = item.addPlayClass(isPaused, playClassName, properties);\n\n !animtionElement && (animtionElement = el);\n });\n return animtionElement;\n }\n /**\n * Play using the css animation and keyframes.\n * @param - Check if you want to export css.\n * @param [playClassName=\"startAnimation\"] - Add a class name to play.\n * @param - The shorthand properties for six of the animation properties.\n * @return {Scene} An instance itself\n * @see {@link https://www.w3schools.com/cssref/css3_pr_animation.asp}\n * @example\n scene.playCSS();\n scene.playCSS(false, {\n direction: \"reverse\",\n fillMode: \"forwards\",\n });\n */\n public playCSS(isExportCSS = true, playClassName?: string, properties: Partial = {}) {\n playCSS(this, isExportCSS, playClassName, properties);\n return this;\n }\n public set(properties: any, ...args: any[]): this;\n /**\n * Set properties to the Scene.\n * @param - properties\n * @return An instance itself\n * @example\nscene.set({\n \".a\": {\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n },\n },\n});\n// 0\nconsole.log(scene.getItem(\".a\").get(0, \"opacity\"));\n// 1\nconsole.log(scene.getItem(\".a\").get(1, \"opacity\"));\n */\n public set(properties: any) {\n this.load(properties);\n return this;\n }\n public load(properties: any = {}, options = properties.options) {\n if (!properties) {\n return this;\n }\n const selector = options && options[SELECTOR] || this.state[SELECTOR];\n for (const name in properties) {\n if (name === \"options\") {\n continue;\n }\n const object = properties[name];\n let item;\n\n if (object instanceof Scene || object instanceof SceneItem) {\n this.setItem(name, object);\n item = object;\n } else if (isFunction(object) && selector) {\n const elements =\n IS_WINDOW\n ? $(`${isFunction(selector) ? selector(name) : name}`, true) as IArrayFormat\n : ([] as AnimateElement[]);\n const length = elements.length;\n const scene = new Scene();\n\n for (let i = 0; i < length; ++i) {\n (scene.newItem(i) as SceneItem).setId().setElement(elements[i]).load(object(i, elements[i]));\n }\n this.setItem(name, scene);\n continue;\n } else {\n item = this.newItem(name);\n item.load(object);\n }\n selector && item.setSelector(selector);\n }\n this.setOptions(options);\n }\n public setOptions(options: Partial = {}): this {\n super.setOptions(options);\n\n const selector = options.selector;\n\n if (selector) {\n this.state[SELECTOR] = selector;\n }\n return this;\n }\n public setSelector(target?: string | boolean | ((id: number | string) => string)) {\n const state = this.state;\n const selector = target || state[SELECTOR];\n\n state[SELECTOR] = selector;\n const isItFunction = isFunction(target);\n if (selector) {\n this.forEach((item, name) => {\n item.setSelector(isItFunction ? (target as (id: number | string) => string)(name) : selector);\n });\n }\n return this;\n }\n public start(delay: number = this.state[DELAY]): boolean {\n const result = super.start(delay);\n\n if (result) {\n this.forEach(item => {\n item.start(0);\n });\n } else {\n this.forEach(item => {\n item.setPlayState(RUNNING);\n });\n }\n return result;\n }\n}\n\nexport default Scene;\n","import { IObject } from \"@daybrush/utils\";\nimport Scene from \"./Scene\";\nimport SceneItem from \"./SceneItem\";\nimport { SceneOptions, SceneItemOptions } from \"./types\";\n\nexport function animate(properties?: IObject, options?: Partial) {\n return new Scene(properties, options).play();\n}\nexport function animateItem(properties?: IObject, options?: Partial) {\n return new SceneItem(properties, options).play();\n}\n","import Scene, * as others from \"./index\";\n\nfor (const name in others) {\n (Scene as any)[name] = (others as any)[name];\n}\n\nexport default Scene;\n"],"names":["y1","y2","t","t2","x1","x2","x","solveX","dx","Math","abs","cubic","func","solveFromX","max","min","easingName","count","position","time","level","floor","STEP_START","steps","STEP_END","LINEAR","bezier","EASE","EASE_IN","EASE_OUT","EASE_IN_OUT","PREFIX","DATA_SCENE_ID","TIMING_FUNCTION","ROLES","transform","filter","attribute","html","ALIAS","easing","FIXED","_a","MAXIMUM","THRESHOLD","DURATION","FILL_MODE","DIRECTION","ITERATION_COUNT","DELAY","EASING","PLAY_SPEED","EASING_NAME","ITERATION_TIME","PAUSED","ENDED","TIMEUPDATE","ANIMATE","PLAY","RUNNING","ITERATION","START_ANIMATION","PAUSE_ANIMATION","ALTERNATE","REVERSE","ALTERNATE_REVERSE","NORMAL","INFINITE","PLAY_STATE","PLAY_CSS","PREV_TIME","TICK_TIME","CURRENT_TIME","SELECTOR","TRANSFORM_NAME","EASINGS","OPTIONS","EVENTS","events","name","callback","once","isObject","n","_on","isArray","forEach","_this","push","_i","args","off","callback2","callbacks","index","indexOf","splice","data","event","target","type","currentTarget","toArray","apply","value","options","setOptions","isString","split","separator","newOptions","length","prefix","suffix","model","arr","map","v","PropertyObject","clone","join","toValue","str","properties","splitText","obj","i","matches","trim","toPropertyObject","styles","RGBA","text","afterModel","COLOR_MODELS","arrayToColorObject","stringToRGBA","result","arrayToPropertyObject","values","splitComma","splitSpace","exec","stringToBracketObject","charAt","stringToColorObject","object","size","get","toObject","alias","names","isProperty","isFixedProperty","roles","fixed","OBJECT","ARRAY","isPropertyObject","PROPERTY","STRING","NUMBER","constructor","Object","stack","isPureObject","concat","getNames","pop","slice","updateFrame","num","round","undefined","isCheckTrue","role","isInProperties","item","isActivate","state","isPaused","isEnded","id","css","styleId","toId","styleElement","$","innerText","document","body","insertAdjacentHTML","selector","random","IS_WINDOW","checkElement","getId","setId","makeId","match","isExportCSS","playClassName","ANIMATION","getPlayState","className","isPausedCSS","addPlayClass","setTime","exportCSS","el","addAnimationEvent","setPlayCSS","setPlayState","duration","getDuration","isZeroDuration","isFinite","animationend","finish","animationstart","trigger","removeEvent","animationiteration","elapsedTime","currentTime","iterationCount","setIteration","addEvent","curveArray","parseFloat","getter","setter","parent","prototype","camelize","iteration","iteraiontCount","direction","setters","getters","tslib_1","_super","delay","fillMode","playSpeed","iterationTime","tickTime","prevTime","playState","getEasing","setEasing","setDuration","getActiveDuration","Infinity","getTime","toTime","timerId","requestAnimationFrame","tick","start","cancelAnimationFrame","end","pause","isTick","isParent","activeDuration","getUnitTime","calculate","isDelay","getIterationTime","unit","toFixed","passIterationCount","maxIterationCount","currentIterationTime","setIterationTime","isReverse","isDirectionReverse","isFiniteDuration","isForwards","now","to","Animator","GetterSetter","EventTrigger","arrObj","replace","merge","from","getType","FUNCTION","getValue","set","raw","getPropertyName","getValueByNames","params","self","firstParam","Frame","_set","isRole","has","isFixed","stylesLength","isUndefined","frame","frameProperties","cssObject","toInnerProperties","TRANSFORM","FILTER","toCSSObject","cssArray","lastParam","a1","a2","b1","b2","v1","dot","color1","color2","value1","value2","model1","model2","dotArray","colorModel","parseInt","a1Type","dotColor","type1","type2","isFunction1","isFunction2","dotObject","splitUnit","v2","isNaN","dotNumber","nextTime","prevValue","nextValue","ratio","times","decamelize","entries","keytime","prevEntry","states","nextEntries","intCount","ceil","currentDuration","lastTime","j","entry","divideTime","addEntry","unshift","load","originalDuration","ratio_1","items_1","obj_1","time2","items","newFrame","elements","sceneId_1","element","setAttribute","SceneItem","eachTime","realTime","innerValue","value_1","getDelay","frames","hasFrame","getDirection","frameTime","needUpdate","getFrame","remove","removeFrame","append","unshiftTime","firstFrame","prepend","isStartZero","isFunction","setElement","Element","style","targetFunc","attributes","html_1","innerHTML","cssText","toCSS","fromCSS","parentEasing","getNowFrame","temp","setFrame","addTime","update","toFrame","isAccurate","left","right","realEasing","nameObject","hasName","nowEasing","getNowValue","prevFrame","prevNames","keyframes","setTarget","setSelector","playCondition","parentDuration","itemState","reversedStates","reverse","getRealId","superParent","infiniteIndex","findIndex","finiteStates","reduce","prev","cur","find","makeAnimationProperties","timingFunction","selectors","sel","selectorCallback","preselector","peusdo","KEYFRAMES","_toKeyframes","pauseCSS","addClass","removeClass","isEndedCSS","endCSS","playCSS","hasClass","usePrevValue","nextFrame","isUndefinedLeft","isUndefinedRight","indicies","getNearTimeIndex","dotValue","getEntries","lastEntry","ListMap","getTotalDuration","getPlaySpeed","sceneDuration","setDelay","setItem","parentStates","totalDuration","animtionElement","Scene","scene","newItem","isItFunction","play","others"],"mappings":"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"} \ No newline at end of file diff --git a/dist/scene.esm.js b/dist/scene.esm.js new file mode 100644 index 00000000..8548e668 --- /dev/null +++ b/dist/scene.esm.js @@ -0,0 +1,3856 @@ +/* +Copyright (c) 2016 Daybrush +name: scenejs +license: MIT +author: Daybrush +repository: https://github.com/daybrush/scenejs.git +version: 1.2.0 +*/ +import { isObject, isArray, toArray, isString, splitText, splitComma, splitSpace, RGBA, splitBracket, COLOR_MODELS, stringToRGBA, $, document, IS_WINDOW, ANIMATION, removeEvent, addEvent, OBJECT, ARRAY, PROPERTY, STRING, NUMBER, requestAnimationFrame, cancelAnimationFrame, splitUnit, camelize, isUndefined, TRANSFORM, FILTER, FUNCTION, dot as dot$1, isFunction, fromCSS, findIndex, find, KEYFRAMES, addClass, removeClass, hasClass, decamelize } from '@daybrush/utils'; +import ListMap from 'list-map'; + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. All rights reserved. +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at http://www.apache.org/licenses/LICENSE-2.0 + +THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED +WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +MERCHANTABLITY OR NON-INFRINGEMENT. + +See the Apache Version 2.0 License for specific language governing permissions +and limitations under the License. +***************************************************************************** */ + +/* global Reflect, Promise */ +var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + }; + + return extendStatics(d, b); +}; + +function __extends(d, b) { + extendStatics(d, b); + + function __() { + this.constructor = d; + } + + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} +function __decorate(decorators, target, key, desc) { + var c = arguments.length, + r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, + d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} + +function cubic(y1, y2, t) { + var t2 = 1 - t; // Bezier Curve Formula + + return t * t * t + 3 * t * t * t2 * y2 + 3 * t * t2 * t2 * y1; +} + +function solveFromX(x1, x2, x) { + // x 0 ~ 1 + // t 0 ~ 1 + var t = x; + var solveX = x; + var dx = 1; + + while (Math.abs(dx) > 1 / 1000) { + // 예상 t초에 의한 _x값 + solveX = cubic(x1, x2, t); + dx = solveX - x; // 차이가 미세하면 그 값을 t로 지정 + + if (Math.abs(dx) < 1 / 1000) { + return t; + } + + t -= dx / 2; + } + + return t; +} +/** + * @namespace easing + */ + +/** +* Cubic Bezier curve. +* @memberof easing +* @func bezier +* @param {number} [x1] - point1's x +* @param {number} [y1] - point1's y +* @param {number} [x2] - point2's x +* @param {number} [y2] - point2's y +* @return {function} the curve function +* @example +import {bezier} from "scenejs"; +Scene.bezier(0, 0, 1, 1) // LINEAR +Scene.bezier(0.25, 0.1, 0.25, 1) // EASE +*/ + + +function bezier(x1, y1, x2, y2) { + /* + x = f(t) + calculate inverse function by x + t = f-1(x) + */ + var func = function (x) { + var t = solveFromX(x1, x2, Math.max(Math.min(1, x), 0)); + return cubic(y1, y2, t); + }; + + func.easingName = "cubic-bezier(" + x1 + "," + y1 + "," + x2 + "," + y2 + ")"; + return func; +} +/** +* Specifies a stepping function +* @see {@link https://www.w3schools.com/cssref/css3_pr_animation-timing-function.asp|CSS3 Timing Function} +* @memberof easing +* @func steps +* @param {number} count - point1's x +* @param {"start" | "end"} postion - point1's y +* @return {function} the curve function +* @example +import {steps} from "scenejs"; +Scene.steps(1, "start") // Scene.STEP_START +Scene.steps(1, "end") // Scene.STEP_END +*/ + +function steps(count, position) { + var func = function (time) { + var level = 1 / count; + + if (time >= 1) { + return 1; + } + + return (position === "start" ? level : 0) + Math.floor(time / level) * level; + }; + + func.easingName = "steps(" + count + ", " + position + ")"; + return func; +} +/** +* Equivalent to steps(1, start) +* @memberof easing +* @name STEP_START +* @static +* @type {function} +* @example +import {STEP_START} from "scenejs"; +Scene.STEP_START // steps(1, start) +*/ + +var STEP_START = +/*#__PURE__#*/ +steps(1, "start"); +/** +* Equivalent to steps(1, end) +* @memberof easing +* @name STEP_END +* @static +* @type {function} +* @example +import {STEP_END} from "scenejs"; +Scene.STEP_END // steps(1, end) +*/ + +var STEP_END = +/*#__PURE__#*/ +steps(1, "end"); +/** +* Linear Speed (0, 0, 1, 1) +* @memberof easing +* @name LINEAR +* @static +* @type {function} +* @example +import {LINEAR} from "scenejs"; +Scene.LINEAR +*/ + +var LINEAR = +/*#__PURE__#*/ +bezier(0, 0, 1, 1); +/** +* Ease Speed (0.25, 0.1, 0.25, 1) +* @memberof easing +* @name EASE +* @static +* @type {function} +* @example +import {EASE} from "scenejs"; +Scene.EASE +*/ + +var EASE = +/*#__PURE__#*/ +bezier(0.25, 0.1, 0.25, 1); +/** +* Ease In Speed (0.42, 0, 1, 1) +* @memberof easing +* @name EASE_IN +* @static +* @type {function} +* @example +import {EASE_IN} from "scenejs"; +Scene.EASE_IN +*/ + +var EASE_IN = +/*#__PURE__#*/ +bezier(0.42, 0, 1, 1); +/** +* Ease Out Speed (0, 0, 0.58, 1) +* @memberof easing +* @name EASE_OUT +* @static +* @type {function} +* @example +import {EASE_OUT} from "scenejs"; +Scene.EASE_OUT +*/ + +var EASE_OUT = +/*#__PURE__#*/ +bezier(0, 0, 0.58, 1); +/** +* Ease In Out Speed (0.42, 0, 0.58, 1) +* @memberof easing +* @name EASE_IN_OUT +* @static +* @type {function} +* @example +import {EASE_IN_OUT} from "scenejs"; +Scene.EASE_IN_OUT +*/ + +var EASE_IN_OUT = +/*#__PURE__#*/ +bezier(0.42, 0, 0.58, 1); + +var _a; +var PREFIX = "__SCENEJS_"; +var DATA_SCENE_ID = "data-scene-id"; +var TIMING_FUNCTION = "animation-timing-function"; +var ROLES = { + transform: {}, + filter: {}, + attribute: {}, + html: true +}; +var ALIAS = { + easing: [TIMING_FUNCTION] +}; +var FIXED = (_a = {}, _a[TIMING_FUNCTION] = true, _a.contents = true, _a.html = true, _a); +var MAXIMUM = 1000000; +var THRESHOLD = 0.000001; +var DURATION = "duration"; +var FILL_MODE = "fillMode"; +var DIRECTION = "direction"; +var ITERATION_COUNT = "iterationCount"; +var DELAY = "delay"; +var EASING = "easing"; +var PLAY_SPEED = "playSpeed"; +var EASING_NAME = "easingName"; +var ITERATION_TIME = "iterationTime"; +var PAUSED = "paused"; +var ENDED = "ended"; +var TIMEUPDATE = "timeupdate"; +var ANIMATE = "animate"; +var PLAY = "play"; +var RUNNING = "running"; +var ITERATION = "iteration"; +var START_ANIMATION = "startAnimation"; +var PAUSE_ANIMATION = "pauseAnimation"; +var ALTERNATE = "alternate"; +var REVERSE = "reverse"; +var ALTERNATE_REVERSE = "alternate-reverse"; +var NORMAL = "normal"; +var INFINITE = "infinite"; +var PLAY_STATE = "playState"; +var PLAY_CSS = "playCSS"; +var PREV_TIME = "prevTime"; +var TICK_TIME = "tickTime"; +var CURRENT_TIME = "currentTime"; +var SELECTOR = "selector"; +var TRANSFORM_NAME = "transform"; +var EASINGS = { + "linear": LINEAR, + "ease": EASE, + "ease-in": EASE_IN, + "ease-out": EASE_OUT, + "ease-in-out": EASE_IN_OUT, + "step-start": STEP_START, + "step-end": STEP_END +}; +/** +* option name list +* @name Scene.OPTIONS +* @memberof Scene +* @static +* @type {$ts:OptionType} +* @example +* Scene.OPTIONS // ["duration", "fillMode", "direction", "iterationCount", "delay", "easing", "playSpeed"] +*/ + +var OPTIONS = [DURATION, FILL_MODE, DIRECTION, ITERATION_COUNT, DELAY, EASING, PLAY_SPEED]; +/** +* Event name list +* @name Scene.EVENTS +* @memberof Scene +* @static +* @type {$ts:EventType} +* @example +* Scene.EVENTS // ["paused", "ended", "timeupdate", "animate", "play", "iteration"]; +*/ + +var EVENTS = [PAUSED, ENDED, TIMEUPDATE, ANIMATE, PLAY, ITERATION]; + +/** +* attach and trigger event handlers. +*/ + +var EventTrigger = +/*#__PURE__*/ +function () { + /** + * @example + const et = new Scene.EventTrigger(); + const scene = new Scene(); + scene.on("call", e => { + console.log(e.param); + }); + et.on("call", e => { + console.log(e.param); + }); + scene.trigger("call", {param: 1}); + et.trigger("call", {param: 1}); + */ + function EventTrigger() { + this.events = {}; + } + + var __proto = EventTrigger.prototype; + + __proto._on = function (name, callback, once) { + var _this = this; + + var events = this.events; + + if (isObject(name)) { + for (var n in name) { + this._on(n, name[n], once); + } + + return; + } + + if (!(name in events)) { + events[name] = []; + } + + if (!callback) { + return; + } + + if (isArray(callback)) { + callback.forEach(function (func) { + return _this._on(name, func, once); + }); + return; + } + + events[name].push(once ? function callback2() { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + callback.apply(void 0, args); + this.off(name, callback2); + } : callback); + }; + /** + * Attach an event handler function for one or more events to target + * @param - event's name + * @param - function to execute when the event is triggered. + * @return {EventTrigger} An Instance itself. + * @example + target.on("animate", function() { + console.log("animate"); + }); + target.trigger("animate"); + */ + + + __proto.on = function (name, callback) { + this._on(name, callback); + + return this; + }; + /** + * Dettach an event handler function for one or more events to target + * @param - event's name + * @param - function to execute when the event is triggered. + * @return {EventTrigger} An Instance itself. + * @example + const callback = function() { + console.log("animate"); + }; + target.on("animate", callback); + target.off("animate", callback); + target.off("animate"); + */ + + + __proto.off = function (name, callback) { + if (!name) { + this.events = {}; + } else if (!callback) { + this.events[name] = []; + } else { + var callbacks = this.events[name]; + + if (!callbacks) { + return this; + } + + var index = callbacks.indexOf(callback); + + if (index !== -1) { + callbacks.splice(index, 1); + } + } + + return this; + }; + /** + * execute event handler + * @param - event's name + * @param - event handler's additional parameter + * @return {EventTrigger} An Instance itself. + * @example + target.on("animate", function(a1, a2) { + console.log("animate", a1, a2); + }); + target.trigger("animate", [1, 2]); // log => "animate", 1, 2 + */ + + + __proto.trigger = function (name) { + var _this = this; + + var data = []; + + for (var _i = 1; _i < arguments.length; _i++) { + data[_i - 1] = arguments[_i]; + } + + var events = this.events; + + if (!(name in events)) { + return this; + } + + var args = data || []; + !args[0] && (args[0] = {}); + var event = events[name]; + var target = args[0]; + target.type = name; + target.currentTarget = this; + !target.target && (target.target = this); + toArray(events[name]).forEach(function (callback) { + callback.apply(_this, data); + }); + return this; + }; + + __proto.once = function (name, callback) { + this._on(name, callback, true); + + return this; + }; + + return EventTrigger; +}(); + +/** +* Make string, array to PropertyObject for the dot product +*/ + +var PropertyObject = +/*#__PURE__*/ +function () { + /** + * @param - This value is in the array format. + * @param - options + * @example + var obj = new PropertyObject([100,100,100,0.5], { + "separator" : ",", + "prefix" : "rgba(", + "suffix" : ")" + }); + */ + function PropertyObject(value, options) { + this.prefix = ""; + this.suffix = ""; + this.model = ""; + this.type = ""; + this.separator = ","; + options && this.setOptions(options); + this.value = isString(value) ? value.split(this.separator) : value; + } + + var __proto = PropertyObject.prototype; + + __proto.setOptions = function (newOptions) { + for (var name in newOptions) { + this[name] = newOptions[name]; + } + + return this; + }; + /** + * the number of values. + * @example + const obj1 = new PropertyObject("1,2,3", ","); + console.log(obj1.length); + // 3 + */ + + + __proto.size = function () { + return this.value.length; + }; + /** + * retrieve one of values at the index + * @param {Number} index - index + * @return {Object} one of values at the index + * @example + const obj1 = new PropertyObject("1,2,3", ","); + console.log(obj1.get(0)); + // 1 + */ + + + __proto.get = function (index) { + return this.value[index]; + }; + /** + * Set the value at that index + * @param {Number} index - index + * @param {Object} value - text, a number, object to set + * @return {PropertyObject} An instance itself + * @example + const obj1 = new PropertyObject("1,2,3", ","); + obj1.set(0, 2); + console.log(obj1.toValue()); + // 2,2,3 + */ + + + __proto.set = function (index, value) { + this.value[index] = value; + return this; + }; + /** + * create a copy of an instance itself. + * @return {PropertyObject} clone + * @example + const obj1 = new PropertyObject("1,2,3", ","); + const obj2 = obj1.clone(); + */ + + + __proto.clone = function () { + var _a = this, + separator = _a.separator, + prefix = _a.prefix, + suffix = _a.suffix, + model = _a.model, + type = _a.type; + + var arr = this.value.map(function (v) { + return v instanceof PropertyObject ? v.clone() : v; + }); + return new PropertyObject(arr, { + separator: separator, + prefix: prefix, + suffix: suffix, + model: model, + type: type + }); + }; + /** + * Make Property Object to String + * @return {String} Make Property Object to String + * @example + //rgba(100, 100, 100, 0.5) + const obj4 = new PropertyObject([100,100,100,0.5], { + "separator" : ",", + "prefix" : "rgba(", + "suffix" : ")", + }); + console.log(obj4.toValue()); + // "rgba(100,100,100,0.5)" + */ + + + __proto.toValue = function () { + return this.prefix + this.join() + this.suffix; + }; + /** + * Make Property Object's array to String + * @return {String} Join the elements of an array into a string + * @example + //rgba(100, 100, 100, 0.5) + var obj4 = new PropertyObject([100,100,100,0.5], { + "separator" : ",", + "prefix" : "rgba(", + "suffix" : ")" + }); + obj4.join(); // => "100,100,100,0.5" + */ + + + __proto.join = function () { + return this.value.map(function (v) { + return v instanceof PropertyObject ? v.toValue() : v; + }).join(this.separator); + }; + /** + * executes a provided function once per array element. + * @param {Function} callback - Function to execute for each element, taking three arguments + * @param {All} [callback.currentValue] The current element being processed in the array. + * @param {Number} [callback.index] The index of the current element being processed in the array. + * @param {Array} [callback.array] the array. + * @return {PropertyObject} An instance itself + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach|MDN Array.forEach()} reference to MDN document. + * @example + //rgba(100, 100, 100, 0.5) + var obj4 = new PropertyObject([100,100,100,0.5], { + "separator" : ",", + "prefix" : "rgba(", + "suffix" : ")" + }); + obj4.forEach(t => { + console.log(t); + }); // => "100,100,100,0.5" + */ + + + __proto.forEach = function (func) { + this.value.forEach(func); + return this; + }; + + return PropertyObject; +}(); + +/** +* @namespace +* @name Property +*/ +function splitStyle(str) { + var properties = splitText(str, ";"); + var obj = {}; + var length = properties.length; + + for (var i = 0; i < length; ++i) { + var matches = splitText(properties[i], ":"); + + if (matches.length < 2 || !matches[1]) { + --length; + continue; + } + + obj[matches[0].trim()] = toPropertyObject(matches[1].trim()); + } + + return { + styles: obj, + length: length + }; +} +/** +* convert array to PropertyObject[type=color]. +* default model "rgba" +* @memberof Property +* @function arrayToColorObject +* @param {Array|PropertyObject} value ex) [0, 0, 0, 1] +* @return {PropertyObject} PropertyObject[type=color] +* @example +arrayToColorObject([0, 0, 0]) +// => PropertyObject(type="color", model="rgba", value=[0, 0, 0, 1], separator=",") +*/ + +function arrayToColorObject(arr) { + var model = RGBA; + + if (arr.length === 3) { + arr[3] = 1; + } + + return new PropertyObject(arr, { + model: model, + separator: ",", + type: "color", + prefix: model + "(", + suffix: ")" + }); +} +/** +* convert text with parentheses to object. +* @memberof Property +* @function stringToBracketObject +* @param {String} value ex) "rgba(0,0,0,1)" +* @return {PropertyObject} PropertyObject +* @example +stringToBracketObject("abcde(0, 0, 0,1)") +// => PropertyObject(model="abcde", value=[0, 0, 0,1], separator=",") +*/ + +function stringToBracketObject(text) { + // [prefix, value, other] + var _a = splitBracket(text), + model = _a.prefix, + value = _a.value, + afterModel = _a.suffix; + + if (typeof value === "undefined") { + return text; + } + + if (COLOR_MODELS.indexOf(model) > -1) { + return arrayToColorObject(stringToRGBA(text)); + } // divide comma(,) + + + var obj = toPropertyObject(value, model); + var arr = [value]; + var separator = ","; + var prefix = model + "("; + var suffix = ")" + afterModel; + + if (obj instanceof PropertyObject) { + separator = obj.separator; + arr = obj.value; + prefix += obj.prefix; + suffix = obj.suffix + suffix; + } + + return new PropertyObject(arr, { + separator: separator, + model: model, + prefix: prefix, + suffix: suffix + }); +} +function arrayToPropertyObject(arr, separator) { + return new PropertyObject(arr, { + type: "array", + separator: separator + }); +} +/** +* convert text with parentheses to PropertyObject[type=color]. +* If the values are not RGBA model, change them RGBA mdoel. +* @memberof Property +* @function stringToColorObject +* @param {String|PropertyObject} value ex) "rgba(0,0,0,1)" +* @return {PropertyObject} PropertyObject[type=color] +* @example +stringToColorObject("rgba(0, 0, 0,1)") +// => PropertyObject(type="color", model="rgba", value=[0, 0, 0,1], separator=",") +*/ + +function stringToColorObject(value) { + var result = stringToRGBA(value); + return result ? arrayToColorObject(result) : value; +} +function toPropertyObject(value, model) { + if (!isString(value)) { + if (isArray(value)) { + return arrayToPropertyObject(value, ","); + } + + return value; + } + + var values = splitComma(value); + + if (values.length > 1) { + return arrayToPropertyObject(values.map(function (v) { + return toPropertyObject(v); + }), ","); + } + + values = splitSpace(value); + + if (values.length > 1) { + return arrayToPropertyObject(values.map(function (v) { + return toPropertyObject(v); + }), " "); + } + + values = /^(['"])([^'"]*)(['"])$/g.exec(value); + + if (values && values[1] === values[3]) { + // Quotes + return new PropertyObject([toPropertyObject(values[2])], { + prefix: values[1], + suffix: values[1] + }); + } else if (value.indexOf("(") !== -1) { + // color + return stringToBracketObject(value); + } else if (value.charAt(0) === "#" && model !== "url") { + return stringToColorObject(value); + } + + return value; +} +function toObject(object, result) { + if (result === void 0) { + result = {}; + } + + var model = object.model; + + if (model) { + object.setOptions({ + model: "", + suffix: "", + prefix: "" + }); + var value = object.size() > 1 ? object : object.get(0); + result[model] = value; + } else { + object.forEach(function (obj) { + toObject(obj, result); + }); + } + + return result; +} + +function isPropertyObject(value) { + return value instanceof PropertyObject; +} +function setAlias(name, alias) { + ALIAS[name] = alias; +} +function setRole(names, isProperty, isFixedProperty) { + var length = names.length; + var roles = ROLES; + var fixed = FIXED; + + for (var i = 0; i < length - 1; ++i) { + !roles[names[i]] && (roles[names[i]] = {}); + roles = roles[names[i]]; + + if (isFixedProperty) { + !fixed[names[i]] && (fixed[names[i]] = {}); + fixed = fixed[names[i]]; + } + } + + isFixedProperty && (fixed[names[length - 1]] = true); + roles[names[length - 1]] = isProperty ? true : {}; +} +function getType(value) { + var type = typeof value; + + if (type === OBJECT) { + if (isArray(value)) { + return ARRAY; + } else if (isPropertyObject(value)) { + return PROPERTY; + } + } else if (type === STRING || type === NUMBER) { + return "value"; + } + + return type; +} +function isPureObject(obj) { + return isObject(obj) && obj.constructor === Object; +} +function getNames(names, stack) { + var arr = []; + + if (isPureObject(names)) { + for (var name in names) { + stack.push(name); + arr = arr.concat(getNames(names[name], stack)); + stack.pop(); + } + } else { + arr.push(stack.slice()); + } + + return arr; +} +function updateFrame(names, properties) { + for (var name in properties) { + var value = properties[name]; + + if (!isPureObject(value)) { + names[name] = true; + continue; + } + + if (!isObject(names[name])) { + names[name] = {}; + } + + updateFrame(names[name], properties[name]); + } + + return names; +} +function toFixed(num) { + return Math.round(num * MAXIMUM) / MAXIMUM; +} +function getValueByNames(names, properties, length) { + if (length === void 0) { + length = names.length; + } + + var value = properties; + + for (var i = 0; i < length; ++i) { + if (!isObject(value)) { + return undefined; + } + + value = value[names[i]]; + } + + return value; +} +function isInProperties(roles, args, isCheckTrue) { + var length = args.length; + var role = roles; + + if (length === 0) { + return false; + } + + for (var i = 0; i < length; ++i) { + if (role === true) { + return false; + } + + role = role[args[i]]; + + if (!role || !isCheckTrue && role === true) { + return false; + } + } + + return true; +} +function isRole(args, isCheckTrue) { + return isInProperties(ROLES, args, isCheckTrue); +} +function isFixed(args) { + return isInProperties(FIXED, args, true); +} +function setPlayCSS(item, isActivate) { + item.state[PLAY_CSS] = isActivate; +} +function isPausedCSS(item) { + return item.state[PLAY_CSS] && item.isPaused(); +} +function isEndedCSS(item) { + return !item.isEnded() && item.state[PLAY_CSS]; +} +function exportCSS(id, css) { + var styleId = PREFIX + "STYLE_" + toId(id); + var styleElement = $("#" + styleId); + + if (styleElement) { + styleElement.innerText = css; + } else { + document.body.insertAdjacentHTML("beforeend", ""); + } +} +function makeId(selector) { + for (;;) { + var id = "" + Math.floor(Math.random() * 10000000); + + if (!IS_WINDOW || !selector) { + return id; + } + + var checkElement = $("[data-scene-id=\"" + id + "\"]"); + + if (!checkElement) { + return id; + } + } +} +function getRealId(item) { + return item.getId() || item.setId(makeId(false)).getId(); +} +function toId(text) { + return ("" + text).match(/[0-9a-zA-Z]+/g).join(""); +} +function playCSS(item, isExportCSS, playClassName, properties) { + if (properties === void 0) { + properties = {}; + } + + if (!ANIMATION || item.getPlayState() === RUNNING) { + return; + } + + var className = playClassName || START_ANIMATION; + + if (isPausedCSS(item)) { + item.addPlayClass(true, className, properties); + } else { + if (item.isEnded()) { + item.setTime(0); + } + + isExportCSS && item.exportCSS({ + className: className + }); + var el = item.addPlayClass(false, className, properties); + + if (!el) { + return; + } + + addAnimationEvent(item, el); + setPlayCSS(item, true); + } + + item.setPlayState(RUNNING); +} +function addAnimationEvent(item, el) { + var state = item.state; + var duration = item.getDuration(); + var isZeroDuration = !duration || !isFinite(duration); + + var animationend = function () { + setPlayCSS(item, false); + item.finish(); + }; + + var animationstart = function () { + item.trigger(PLAY); + }; + + item.once(ENDED, function () { + removeEvent(el, "animationcancel", animationend); + removeEvent(el, "animationend", animationend); + removeEvent(el, "animationiteration", animationiteration); + removeEvent(el, "animationstart", animationstart); + }); + + var animationiteration = function (_a) { + var elapsedTime = _a.elapsedTime; + var currentTime = elapsedTime; + var iterationCount = isZeroDuration ? 0 : currentTime / duration; + state[CURRENT_TIME] = currentTime; + item.setIteration(iterationCount); + }; + + addEvent(el, "animationcancel", animationend); + addEvent(el, "animationend", animationend); + addEvent(el, "animationiteration", animationiteration); + addEvent(el, "animationstart", animationstart); +} +function getEasing(curveArray) { + var easing; + + if (isString(curveArray)) { + if (curveArray in EASINGS) { + easing = EASINGS[curveArray]; + } else { + var obj = toPropertyObject(curveArray); + + if (isString(obj)) { + return 0; + } else { + if (obj.model === "cubic-bezier") { + curveArray = obj.value.map(function (v) { + return parseFloat(v); + }); + easing = bezier(curveArray[0], curveArray[1], curveArray[2], curveArray[3]); + } else if (obj.model === "steps") { + easing = steps(parseFloat(obj.value[0]), obj.value[1]); + } else { + return 0; + } + } + } + } else if (isArray(curveArray)) { + easing = bezier(curveArray[0], curveArray[1], curveArray[2], curveArray[3]); + } else { + easing = curveArray; + } + + return easing; +} + +function GetterSetter(getter, setter, parent) { + return function (constructor) { + var prototype = constructor.prototype; + getter.forEach(function (name) { + prototype[camelize("get " + name)] = function () { + return this[parent][name]; + }; + }); + setter.forEach(function (name) { + prototype[camelize("set " + name)] = function (value) { + this[parent][name] = value; + return this; + }; + }); + }; +} + +function isDirectionReverse(iteration, iteraiontCount, direction) { + if (direction === REVERSE) { + return true; + } else if (iteraiontCount !== INFINITE && iteration === iteraiontCount && iteraiontCount % 1 === 0) { + return direction === (iteration % 2 >= 1 ? ALTERNATE_REVERSE : ALTERNATE); + } + + return direction === (iteration % 2 >= 1 ? ALTERNATE : ALTERNATE_REVERSE); +} +/** +* @typedef {Object} AnimatorState The Animator options. Properties used in css animation. +* @property {number} [duration] The duration property defines how long an animation should take to complete one cycle. +* @property {"none"|"forwards"|"backwards"|"both"} [fillMode] The fillMode property specifies a style for the element when the animation is not playing (before it starts, after it ends, or both). +* @property {"infinite"|number} [iterationCount] The iterationCount property specifies the number of times an animation should be played. +* @property {array|function} [easing] The easing(timing-function) specifies the speed curve of an animation. +* @property {number} [delay] The delay property specifies a delay for the start of an animation. +* @property {"normal"|"reverse"|"alternate"|"alternate-reverse"} [direction] The direction property defines whether an animation should be played forwards, backwards or in alternate cycles. +*/ + +var setters = ["id", ITERATION_COUNT, DELAY, FILL_MODE, DIRECTION, PLAY_SPEED, DURATION, PLAY_SPEED, ITERATION_TIME, PLAY_STATE]; +var getters = setters.concat([EASING, EASING_NAME]); +/** +* play video, animation, the others +* @extends EventTrigger +* @see {@link https://www.w3schools.com/css/css3_animations.asp|CSS3 Animation} +*/ + +var Animator = +/*#__PURE__*/ +function (_super) { + __extends(Animator, _super); + /** + * @param - animator's options + * @example + const animator = new Animator({ + delay: 2, + diretion: "alternate", + duration: 2, + fillMode: "forwards", + iterationCount: 3, + easing: Scene.easing.EASE, + }); + */ + + + function Animator(options) { + var _this = _super.call(this) || this; + + _this.timerId = 0; + _this.state = { + id: "", + easing: 0, + easingName: "linear", + iterationCount: 1, + delay: 0, + fillMode: "forwards", + direction: NORMAL, + playSpeed: 1, + currentTime: 0, + iterationTime: -1, + iteration: 0, + tickTime: 0, + prevTime: 0, + playState: PAUSED, + duration: 0 + }; + + _this.setOptions(options); + + return _this; + } + /** + * set animator's easing. + * @param curverArray - The speed curve of an animation. + * @return {Animator} An instance itself. + * @example + animator.({ + delay: 2, + diretion: "alternate", + duration: 2, + fillMode: "forwards", + iterationCount: 3, + easing: Scene.easing.EASE, + }); + */ + + + var __proto = Animator.prototype; + + __proto.setEasing = function (curveArray) { + var easing = getEasing(curveArray); + var easingName = easing && easing[EASING_NAME] || "linear"; + var state = this.state; + state[EASING] = easing; + state[EASING_NAME] = easingName; + return this; + }; + /** + * set animator's options. + * @see {@link https://www.w3schools.com/css/css3_animations.asp|CSS3 Animation} + * @param - animator's options + * @return {Animator} An instance itself. + * @example + animator.({ + delay: 2, + diretion: "alternate", + duration: 2, + fillMode: "forwards", + iterationCount: 3, + easing: Scene.eaasing.EASE, + }); + */ + + + __proto.setOptions = function (options) { + if (options === void 0) { + options = {}; + } + + for (var name in options) { + var value = options[name]; + + if (name === EASING) { + this.setEasing(value); + continue; + } else if (name === DURATION) { + value && this.setDuration(value); + continue; + } + + if (OPTIONS.indexOf(name) > -1) { + this.state[name] = value; + } + } + + return this; + }; + /** + * Get the animator's total duration including delay + * @return {number} Total duration + * @example + animator.getTotalDuration(); + */ + + + __proto.getTotalDuration = function () { + return this.getActiveDuration(true); + }; + /** + * Get the animator's total duration excluding delay + * @return {number} Total duration excluding delay + * @example + animator.getActiveDuration(); + */ + + + __proto.getActiveDuration = function (delay) { + var state = this.state; + var count = state[ITERATION_COUNT]; + + if (count === INFINITE) { + return Infinity; + } + + return (delay ? state[DELAY] : 0) + this.getDuration() * count; + }; + /** + * Check if the animator has reached the end. + * @return {boolean} ended + * @example + animator.isEnded(); // true or false + */ + + + __proto.isEnded = function () { + if (this.state[TICK_TIME] === 0 && this.state[PLAY_STATE] === PAUSED) { + return true; + } else if (this.getTime() < this.getActiveDuration()) { + return false; + } + + return true; + }; + /** + *Check if the animator is paused: + * @return {boolean} paused + * @example + animator.isPaused(); // true or false + */ + + + __proto.isPaused = function () { + return this.state[PLAY_STATE] === PAUSED; + }; + + __proto.start = function (delay) { + if (delay === void 0) { + delay = this.state[DELAY]; + } + + var state = this.state; + state[PLAY_STATE] = RUNNING; + + if (state[TICK_TIME] >= delay) { + /** + * This event is fired when play animator. + * @event Animator#play + */ + this.trigger(PLAY); + return true; + } + + return false; + }; + /** + * play animator + * @return {Animator} An instance itself. + */ + + + __proto.play = function (toTime) { + var _this = this; + + var state = this.state; + var delay = state[DELAY]; + var currentTime = this.getTime(); + state[PLAY_STATE] = RUNNING; + + if (this.isEnded() && (currentTime === 0 || currentTime >= this.getActiveDuration())) { + this.setTime(-delay, true); + } + + this.timerId = requestAnimationFrame(function (time) { + state[PREV_TIME] = time; + + _this.tick(time, toTime); + }); + this.start(); + return this; + }; + /** + * pause animator + * @return {Animator} An instance itself. + */ + + + __proto.pause = function () { + var state = this.state; + + if (state[PLAY_STATE] !== PAUSED) { + state[PLAY_STATE] = PAUSED; + /** + * This event is fired when animator is paused. + * @event Animator#paused + */ + + this.trigger(PAUSED); + } + + cancelAnimationFrame(this.timerId); + return this; + }; + /** + * end animator + * @return {Animator} An instance itself. + */ + + + __proto.finish = function () { + this.setTime(0); + this.state[TICK_TIME] = 0; + this.end(); + return this; + }; + /** + * end animator + * @return {Animator} An instance itself. + */ + + + __proto.end = function () { + this.pause(); + /** + * This event is fired when animator is ended. + * @event Animator#ended + */ + + this.trigger(ENDED); + return this; + }; + /** + * set currentTime + * @param {Number|String} time - currentTime + * @return {Animator} An instance itself. + * @example + animator.setTime("from"); // 0 + animator.setTime("to"); // 100% + animator.setTime("50%"); + animator.setTime(10); + animator.getTime() // 10 + */ + + + __proto.setTime = function (time, isTick, isParent) { + var activeDuration = this.getActiveDuration(); + var state = this.state; + var prevTime = state[TICK_TIME]; + var delay = state[DELAY]; + var currentTime = isTick ? time : this.getUnitTime(time); + state[TICK_TIME] = delay + currentTime; + + if (currentTime < 0) { + currentTime = 0; + } else if (currentTime > activeDuration) { + currentTime = activeDuration; + } + + state[CURRENT_TIME] = currentTime; + this.calculate(); + + if (isTick && !isParent) { + var tickTime = state[TICK_TIME]; + + if (prevTime < delay && time >= 0) { + this.start(0); + } + + if (tickTime < prevTime || this.isEnded()) { + this.end(); + return; + } + } + + if (this.isDelay()) { + return this; + } + /** + * This event is fired when the animator updates the time. + * @event Animator#timeupdate + * @param {Object} param The object of data to be sent to an event. + * @param {Number} param.currentTime The total time that the animator is running. + * @param {Number} param.time The iteration time during duration that the animator is running. + * @param {Number} param.iterationCount The iteration count that the animator is running. + */ + + + this.trigger(TIMEUPDATE, { + currentTime: currentTime, + time: this.getIterationTime(), + iterationCount: state[ITERATION] + }); + return this; + }; + /** + * Get the animator's current time + * @return {number} current time + * @example + animator.getTime(); + */ + + + __proto.getTime = function () { + return this.state[CURRENT_TIME]; + }; + + __proto.getUnitTime = function (time) { + if (isString(time)) { + var duration = this.getDuration() || 100; + + if (time === "from") { + return 0; + } else if (time === "to") { + return duration; + } + + var _a = splitUnit(time), + unit = _a.unit, + value = _a.value; + + if (unit === "%") { + !this.getDuration() && this.setDuration(duration); + return toFixed(parseFloat(time) / 100 * duration); + } else if (unit === ">") { + return value + THRESHOLD; + } else { + return value; + } + } else { + return toFixed(time); + } + }; + /** + * Check if the current state of animator is delayed. + * @return {boolean} check delay state + */ + + + __proto.isDelay = function () { + var state = this.state; + var delay = state[DELAY]; + var tickTime = state[TICK_TIME]; + return delay > 0 && tickTime < delay; + }; + + __proto.setIteration = function (iterationCount) { + var state = this.state; + var passIterationCount = Math.floor(iterationCount); + var maxIterationCount = state[ITERATION_COUNT] === INFINITE ? Infinity : state[ITERATION_COUNT]; + + if (state[ITERATION] < passIterationCount && passIterationCount < maxIterationCount) { + /** + * The event is fired when an iteration of an animation ends. + * @event Animator#iteration + * @param {Object} param The object of data to be sent to an event. + * @param {Number} param.currentTime The total time that the animator is running. + * @param {Number} param.iterationCount The iteration count that the animator is running. + */ + this.trigger("iteration", { + currentTime: state[CURRENT_TIME], + iterationCount: passIterationCount + }); + } + + state[ITERATION] = iterationCount; + return this; + }; + + __proto.calculate = function () { + var state = this.state; + var iterationCount = state[ITERATION_COUNT]; + var fillMode = state[FILL_MODE]; + var direction = state[DIRECTION]; + var duration = this.getDuration(); + var time = this.getTime(); + var iteration = duration === 0 ? 0 : time / duration; + var currentIterationTime = duration ? time % duration : 0; + + if (!duration) { + this.setIterationTime(0); + return this; + } + + this.setIteration(iteration); // direction : normal, reverse, alternate, alternate-reverse + // fillMode : forwards, backwards, both, none + + var isReverse = isDirectionReverse(iteration, iterationCount, direction); + var isFiniteDuration = isFinite(duration); + + if (isFiniteDuration && isReverse) { + currentIterationTime = duration - currentIterationTime; + } + + if (isFiniteDuration && iterationCount !== INFINITE) { + var isForwards = fillMode === "both" || fillMode === "forwards"; // fill forwards + + if (iteration >= iterationCount) { + currentIterationTime = duration * (isForwards ? iterationCount % 1 || 1 : 0); + isReverse && (currentIterationTime = duration - currentIterationTime); + } + } + + this.setIterationTime(currentIterationTime); + return this; + }; + + __proto.tick = function (now, to) { + var _this = this; + + if (this.isPaused()) { + return; + } + + var state = this.state; + var playSpeed = state[PLAY_SPEED]; + var prevTime = state[PREV_TIME]; + var delay = state[DELAY]; + var tickTime = state[TICK_TIME]; + var currentTime = tickTime + Math.min(1000, now - prevTime) / 1000 * playSpeed; + state[PREV_TIME] = now; + this.setTime(currentTime - delay, true); + + if (to && to * 1000 < now) { + this.pause(); + } + + if (state[PLAY_STATE] === PAUSED) { + return; + } + + this.timerId = requestAnimationFrame(function (time) { + _this.tick(time, to); + }); + }; + + Animator = __decorate([GetterSetter(getters, setters, "state")], Animator); + return Animator; +}(EventTrigger); + +function toInnerProperties(obj) { + if (!obj) { + return ""; + } + + var arrObj = []; + + for (var name in obj) { + arrObj.push(name.replace(/\d$/g, "") + "(" + obj[name] + ")"); + } + + return arrObj.join(" "); +} +/* eslint-disable */ + + +function clone(target, toValue) { + if (toValue === void 0) { + toValue = false; + } + + return merge({}, target, toValue); +} + +function merge(to, from, toValue) { + if (toValue === void 0) { + toValue = false; + } + + for (var name in from) { + var value = from[name]; + var type = getType(value); + + if (type === PROPERTY) { + to[name] = toValue ? value.toValue() : value.clone(); + } else if (type === FUNCTION) { + to[name] = toValue ? getValue([name], value) : value; + } else if (type === ARRAY) { + to[name] = value.slice(); + } else if (type === OBJECT) { + if (isObject(to[name]) && !isPropertyObject(to[name])) { + merge(to[name], value, toValue); + } else { + to[name] = clone(value, toValue); + } + } else { + to[name] = from[name]; + } + } + + return to; +} +/* eslint-enable */ + + +function getPropertyName(args) { + return args[0] in ALIAS ? ALIAS[args[0]] : args; +} + +function getValue(names, value) { + var type = getType(value); + + if (type === PROPERTY) { + return value.toValue(); + } else if (type === FUNCTION) { + if (names[0] !== TIMING_FUNCTION) { + return getValue(names, value()); + } + } else if (type === OBJECT) { + return clone(value, true); + } + + return value; +} +/** +* Animation's Frame +*/ + + +var Frame = +/*#__PURE__*/ +function () { + /** + * @param - properties + * @example + const frame = new Scene.Frame({ + display: "none" + transform: { + translate: "50px", + scale: "5, 5", + } + }); + */ + function Frame(properties) { + if (properties === void 0) { + properties = {}; + } + + this.properties = {}; + this.set(properties); + } + /** + * get property value + * @param {...Number|String|PropertyObject} args - property name or value + * @example + frame.get("display") // => "none", "block", .... + frame.get("transform", "translate") // => "10px,10px" + */ + + + var __proto = Frame.prototype; + + __proto.get = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var value = this.raw.apply(this, args); + return getValue(getPropertyName(args), value); + }; + + __proto.raw = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + return getValueByNames(getPropertyName(args), this.properties); + }; + /** + * remove property value + * @param {...String} args - property name + * @return {Frame} An instance itself + * @example + frame.remove("display") + */ + + + __proto.remove = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var params = getPropertyName(args); + var length = params.length; + + if (!length) { + return this; + } + + var value = getValueByNames(params, this.properties, length - 1); + + if (isObject(value)) { + delete value[params[length - 1]]; + } + + return this; + }; + /** + * set property + * @param {...Number|String|PropertyObject} args - property names or values + * @return {Frame} An instance itself + * @example + // one parameter + frame.set({ + display: "none", + transform: { + translate: "10px, 10px", + scale: "1", + }, + filter: { + brightness: "50%", + grayscale: "100%" + } + }); + // two parameters + frame.set("transform", { + translate: "10px, 10px", + scale: "1", + }); + // three parameters + frame.set("transform", "translate", "50px"); + */ + + + __proto.set = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var self = this; + var length = args.length; + var params = args.slice(0, -1); + var value = args[length - 1]; + var firstParam = params[0]; + + if (length === 1 && value instanceof Frame) { + self.merge(value); + } else if (firstParam in ALIAS) { + self._set(ALIAS[firstParam], value); + } else if (length === 2 && isArray(firstParam)) { + self._set(firstParam, value); + } else if (isPropertyObject(value)) { + if (isRole(params)) { + self.set.apply(self, params.concat([toObject(value)])); + } else { + self._set(params, value); + } + } else if (isArray(value)) { + self._set(params, value); + } else if (isObject(value)) { + if (!self.has.apply(self, params) && isRole(params)) { + self._set(params, {}); + } + + for (var name in value) { + self.set.apply(self, params.concat([name, value[name]])); + } + } else if (isString(value)) { + if (isRole(params, true)) { + if (isFixed(params) || !isRole(params)) { + this._set(params, value); + } else { + var obj = toPropertyObject(value); + + if (isObject(obj)) { + self.set.apply(self, params.concat([obj])); + } + } + + return this; + } else { + var _a = splitStyle(value), + styles = _a.styles, + stylesLength = _a.length; + + for (var name in styles) { + self.set.apply(self, params.concat([name, styles[name]])); + } + + if (stylesLength) { + return this; + } + } + + self._set(params, value); + } else { + self._set(params, value); + } + + return self; + }; + /** + * Gets the names of properties. + * @return the names of properties. + * @example + // one parameter + frame.set({ + display: "none", + transform: { + translate: "10px, 10px", + scale: "1", + }, + }); + // [["display"], ["transform", "translate"], ["transform", "scale"]] + console.log(frame.getNames()); + */ + + + __proto.getNames = function () { + return getNames(this.properties, []); + }; + /** + * check that has property. + * @param {...String} args - property name + * @example + frame.has("property", "display") // => true or false + */ + + + __proto.has = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var params = getPropertyName(args); + var length = params.length; + + if (!length) { + return false; + } + + return !isUndefined(getValueByNames(params, this.properties, length)); + }; + /** + * clone frame. + * @return {Frame} An instance of clone + * @example + frame.clone(); + */ + + + __proto.clone = function () { + var frame = new Frame(); + return frame.merge(this); + }; + /** + * merge one frame to other frame. + * @param - target frame. + * @return {Frame} An instance itself + * @example + frame.merge(frame2); + */ + + + __proto.merge = function (frame) { + var properties = this.properties; + var frameProperties = frame.properties; + + if (frameProperties) { + merge(properties, frameProperties); + } + + return this; + }; + /** + * Specifies an css object that coverted the frame. + * @return {object} cssObject + */ + + + __proto.toCSSObject = function () { + var properties = this.get(); + var cssObject = {}; + + for (var name in properties) { + if (isRole([name], true)) { + continue; + } + + var value = properties[name]; + + if (name === TIMING_FUNCTION) { + cssObject[TIMING_FUNCTION.replace("animation", ANIMATION)] = (isString(value) ? value : value[EASING_NAME]) || "initial"; + } else { + cssObject[name] = value; + } + } + + var transform = toInnerProperties(properties[TRANSFORM_NAME]); + var filter = toInnerProperties(properties.filter); + TRANSFORM && transform && (cssObject[TRANSFORM] = transform); + FILTER && filter && (cssObject[FILTER] = filter); + return cssObject; + }; + /** + * Specifies an css text that coverted the frame. + * @return {string} cssText + */ + + + __proto.toCSS = function () { + var cssObject = this.toCSSObject(); + var cssArray = []; + + for (var name in cssObject) { + cssArray.push(name + ":" + cssObject[name] + ";"); + } + + return cssArray.join(""); + }; + /** + * Remove All Properties + * @return {Frame} An instance itself + */ + + + __proto.clear = function () { + this.properties = {}; + return this; + }; + + __proto._set = function (args, value) { + var properties = this.properties; + var length = args.length; + + for (var i = 0; i < length - 1; ++i) { + var name = args[i]; + !(name in properties) && (properties[name] = {}); + properties = properties[name]; + } + + if (!length) { + return; + } + + if (length === 1 && args[0] === TIMING_FUNCTION) { + properties[TIMING_FUNCTION] = getEasing(value); + } else { + var lastParam = args[length - 1]; + properties[lastParam] = isString(value) && !isFixed(args) ? toPropertyObject(value, lastParam) : value; + } + }; + + return Frame; +}(); + +function dotArray(a1, a2, b1, b2) { + var length = a2.length; + return a1.map(function (v1, i) { + if (i >= length) { + return v1; + } else { + return dot(v1, a2[i], b1, b2); + } + }); +} + +function dotColor(color1, color2, b1, b2) { + // convert array to PropertyObject(type=color) + var value1 = color1.value; + var value2 = color2.value; // If the model name is not same, the inner product is impossible. + + var model1 = color1.model; + var model2 = color2.model; + + if (model1 !== model2) { + // It is recognized as a string. + return dot(color1.toValue(), color2.toValue(), b1, b2); + } + + if (value1.length === 3) { + value1[3] = 1; + } + + if (value2.length === 3) { + value2[3] = 1; + } + + var v = dotArray(value1, value2, b1, b2); + var colorModel = model1; + + for (var i = 0; i < 3; ++i) { + v[i] = parseInt(v[i], 10); + } + + var object = new PropertyObject(v, { + type: "color", + model: colorModel, + prefix: colorModel + "(", + suffix: ")" + }); + return object; +} + +function dotObject(a1, a2, b1, b2) { + var a1Type = a1.type; + + if (a1Type === "color") { + return dotColor(a1, a2, b1, b2); + } + + var value1 = a1.value; + var value2 = a2.value; + var arr = dotArray(value1, value2, b1, b2); + return new PropertyObject(arr, { + type: a1Type, + separator: a1.separator || a2.separator, + prefix: a1.prefix || a2.prefix, + suffix: a1.suffix || a2.suffix, + model: a1.model || a2.model + }); +} +/** +* The dot product of a1 and a2 for the b1 and b2. +* @memberof Dot +* @function dot +* @param {String|Number|PropertyObject} a1 value1 +* @param {String|Number|PropertyObject} a2 value2 +* @param {Number} b1 b1 ratio +* @param {Number} b2 b2 ratio +* @return {String} Not Array, Not Separator, Only Number & Unit +* @return {PropertyObject} Array with Separator. +* @example +dot(1, 3, 0.3, 0.7); +// => 1.6 +*/ + + +function dot(a1, a2, b1, b2) { + if (b2 === 0) { + return a2; + } else if (b1 === 0 || b1 + b2 === 0) { + // prevent division by zero. + return a1; + } // dot Object + + + var type1 = getType(a1); + var type2 = getType(a2); + var isFunction1 = type1 === FUNCTION; + var isFunction2 = type2 === FUNCTION; + + if (isFunction1 || isFunction2) { + return function () { + return dot(isFunction1 ? toPropertyObject(a1()) : a1, isFunction2 ? toPropertyObject(a2()) : a2, b1, b2); + }; + } else if (type1 === type2) { + if (type1 === PROPERTY) { + return dotObject(a1, a2, b1, b2); + } else if (type1 === ARRAY) { + return dotArray(a1, a2, b1, b2); + } else if (type1 !== "value") { + return a1; + } + } else { + return a1; + } + + var v1 = splitUnit("" + a1); + var v2 = splitUnit("" + a2); + var v; // 숫자가 아닐경우 첫번째 값을 반환 b2가 0일경우 두번째 값을 반환 + + if (isNaN(v1.value) || isNaN(v2.value)) { + return a1; + } else { + v = dot$1(v1.value, v2.value, b1, b2); + } + + var prefix = v1.prefix || v2.prefix; + var unit = v1.unit || v2.unit; + + if (!prefix && !unit) { + return v; + } + + return prefix + v + unit; +} +function dotValue(time, prevTime, nextTime, prevValue, nextValue, easing) { + if (time === prevTime) { + return prevValue; + } else if (time === nextTime) { + return nextValue; + } else if (!easing) { + return dot(prevValue, nextValue, time - prevTime, nextTime - time); + } + + var ratio = easing((time - prevTime) / (nextTime - prevTime)); + var value = dot(prevValue, nextValue, ratio, 1 - ratio); + return value; +} + +function getNearTimeIndex(times, time) { + var length = times.length; + + for (var i = 0; i < length; ++i) { + if (times[i] === time) { + return [i, i]; + } else if (times[i] > time) { + return [i > 0 ? i - 1 : 0, i]; + } + } + + return [length - 1, length - 1]; +} + +function makeAnimationProperties(properties) { + var cssArray = []; + + for (var name in properties) { + cssArray.push(ANIMATION + "-" + decamelize(name) + ":" + properties[name] + ";"); + } + + return cssArray.join(""); +} + +function addTime(times, time) { + var length = times.length; + + for (var i = 0; i < length; ++i) { + if (time < times[i]) { + times.splice(i, 0, time); + return; + } + } + + times[length] = time; +} + +function addEntry(entries, time, keytime) { + var prevEntry = entries[entries.length - 1]; + (!prevEntry || prevEntry[0] !== time || prevEntry[1] !== keytime) && entries.push([toFixed(time), toFixed(keytime)]); +} + +function getEntries(times, states) { + var entries = times.map(function (time) { + return [time, time]; + }); + var nextEntries = []; + states.forEach(function (state) { + var iterationCount = state[ITERATION_COUNT]; + var delay = state[DELAY]; + var playSpeed = state[PLAY_SPEED]; + var direction = state[DIRECTION]; + var intCount = Math.ceil(iterationCount); + var currentDuration = entries[entries.length - 1][0]; + var length = entries.length; + var lastTime = currentDuration * iterationCount; + + for (var i = 0; i < intCount; ++i) { + var isReverse = direction === REVERSE || direction === ALTERNATE && i % 2 || direction === ALTERNATE_REVERSE && !(i % 2); + + for (var j = 0; j < length; ++j) { + var entry = entries[isReverse ? length - j - 1 : j]; + var time = entry[1]; + var currentTime = currentDuration * i + (isReverse ? currentDuration - entry[0] : entry[0]); + var prevEntry = entries[isReverse ? length - j : j - 1]; + + if (currentTime > lastTime) { + if (j !== 0) { + var prevTime = currentDuration * i + (isReverse ? currentDuration - prevEntry[0] : prevEntry[0]); + var divideTime = dot$1(prevEntry[1], time, lastTime - prevTime, currentTime - lastTime); + addEntry(nextEntries, (delay + currentDuration * iterationCount) / playSpeed, divideTime); + } + + break; + } else if (currentTime === lastTime && nextEntries.length && nextEntries[nextEntries.length - 1][0] === lastTime + delay) { + break; + } + + addEntry(nextEntries, (delay + currentTime) / playSpeed, time); + } + } // delay time + + + delay && nextEntries.unshift([0, nextEntries[0][1]]); + entries = nextEntries; + nextEntries = []; + }); + return entries; +} +/** +* manage Frame Keyframes and play keyframes. +* @extends Animator +* @example +const item = new SceneItem({ + 0: { + display: "none", + }, + 1: { + display: "block", + opacity: 0, + }, + 2: { + opacity: 1, + } +}); +*/ + +var SceneItem = +/*#__PURE__*/ +function (_super) { + __extends(SceneItem, _super); + /** + * @param - properties + * @param - options + * @example + const item = new SceneItem({ + 0: { + display: "none", + }, + 1: { + display: "block", + opacity: 0, + }, + 2: { + opacity: 1, + } + }); + */ + + + function SceneItem(properties, options) { + var _this = _super.call(this) || this; + + _this.times = []; + _this.items = {}; + _this.names = {}; + _this.elements = []; + _this.needUpdate = true; + + _this.load(properties, options); + + return _this; + } + + var __proto = SceneItem.prototype; + + __proto.getDuration = function () { + var times = this.times; + var length = times.length; + return (length === 0 ? 0 : times[length - 1]) || this.state[DURATION]; + }; + /** + * get size of list + * @return {Number} length of list + */ + + + __proto.size = function () { + return this.times.length; + }; + + __proto.setDuration = function (duration) { + if (!duration) { + return this; + } + + var originalDuration = this.getDuration(); + + if (originalDuration > 0) { + var ratio_1 = duration / originalDuration; + + var _a = this, + times = _a.times, + items_1 = _a.items; + + var obj_1 = {}; + this.times = times.map(function (time) { + var time2 = toFixed(time * ratio_1); + obj_1[time2] = items_1[time]; + return time2; + }); + this.items = obj_1; + } else { + this.newFrame(duration); + } + + return this; + }; + + __proto.setId = function (id) { + var state = this.state; + var elements = this.elements; + var length = elements.length; + state.id = id || makeId(!!length); + + if (length && !state[SELECTOR]) { + var sceneId_1 = toId(this.getId()); + state[SELECTOR] = "[" + DATA_SCENE_ID + "=\"" + sceneId_1 + "\"]"; + elements.forEach(function (element) { + element.setAttribute(DATA_SCENE_ID, sceneId_1); + }); + } + + return this; + }; + /** + * Set properties to the sceneItem at that time + * @param {Number} time - time + * @param {...String|Object} [properties] - property names or values + * @return {SceneItem} An instance itself + * @example + item.set(0, "a", "b") // item.getFrame(0).set("a", "b") + console.log(item.get(0, "a")); // "b" + */ + + + __proto.set = function (time) { + var _this = this; + + var args = []; + + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + + if (time instanceof SceneItem) { + return this.set(0, time); + } else if (isArray(time)) { + var length = time.length; + + for (var i = 0; i < length; ++i) { + var t = length === 1 ? 0 : this.getUnitTime(i / (length - 1) * 100 + "%"); + this.set(t, time[i]); + } + } else if (isObject(time)) { + var _loop_1 = function (t) { + var value = time[t]; + splitComma(t).forEach(function (eachTime) { + var realTime = _this.getUnitTime(eachTime); + + if (isNaN(realTime)) { + getNames(value, [eachTime]).forEach(function (names) { + var _a; + + var innerValue = getValueByNames(names.slice(1), value); + var arr = isArray(innerValue) ? innerValue : [getValueByNames(names, _this.target), innerValue]; + var length = arr.length; + + for (var i = 0; i < length; ++i) { + (_a = _this.newFrame(i / (length - 1) * 100 + "%")).set.apply(_a, names.concat([arr[i]])); + } + }); + } else { + _this.set(realTime, value); + } + }); + }; + + for (var t in time) { + _loop_1(t); + } + } else if (!isUndefined(time)) { + var value_1 = args[0]; + splitComma(time + "").forEach(function (eachTime) { + var realTime = _this.getUnitTime(eachTime); + + if (value_1 instanceof SceneItem) { + var delay = value_1.getDelay(); + var frames = value_1.toObject(!_this.hasFrame(realTime + delay)); + var duration = value_1.getDuration(); + var direction = value_1.getDirection(); + var isReverse = direction.indexOf("reverse") > -1; + + for (var frameTime in frames) { + var nextTime = isReverse ? duration - parseFloat(frameTime) : parseFloat(frameTime); + + _this.set(realTime + nextTime, frames[frameTime]); + } + } else if (args.length === 1 && isArray(value_1)) { + value_1.forEach(function (item) { + _this.set(realTime, item); + }); + } else { + var frame = _this.newFrame(realTime); + + frame.set.apply(frame, args); + } + }); + } + + this.needUpdate = true; + return this; + }; + /** + * Get properties of the sceneItem at that time + * @param {Number} time - time + * @param {...String|Object} args property's name or properties + * @return {Number|String|PropertyObejct} property value + * @example + item.get(0, "a"); // item.getFrame(0).get("a"); + item.get(0, "transform", "translate"); // item.getFrame(0).get("transform", "translate"); + */ + + + __proto.get = function (time) { + var args = []; + + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + + var frame = this.getFrame(time); + return frame && frame.get.apply(frame, args); + }; + /** + * remove properties to the sceneItem at that time + * @param {Number} time - time + * @param {...String|Object} [properties] - property names or values + * @return {SceneItem} An instance itself + * @example + item.remove(0, "a"); + */ + + + __proto.remove = function (time) { + var args = []; + + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + + if (args.length) { + var frame = this.getFrame(time); + frame && frame.remove.apply(frame, args); + } else { + this.removeFrame(time); + } + + this.needUpdate = true; + return this; + }; + /** + * Append the item or object at the last time. + * @param - the scene item or item object + * @return An instance itself + * @example + item.append(new SceneItem({ + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + } + })); + item.append({ + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + } + }); + item.set(item.getDuration(), { + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + } + }); + */ + + + __proto.append = function (item) { + if (item instanceof SceneItem) { + this.set(this.getDuration(), item); + } else { + this.append(new SceneItem(item)); + } + + return this; + }; + /** + * Push the front frames for the time and prepend the scene item or item object. + * @param - the scene item or item object + * @return An instance itself + */ + + + __proto.prepend = function (item) { + if (item instanceof SceneItem) { + var unshiftTime = item.getDuration() + item.getDelay(); + var firstFrame = this.getFrame(0); // remove first frame + + this.removeFrame(0); + this.unshift(unshiftTime); + this.set(0, item); + this.set(unshiftTime + THRESHOLD, firstFrame); + } else { + this.prepend(new SceneItem(item)); + } + + return this; + }; + /** + * Push out the amount of time. + * @param - time to push + * @example + item.get(0); // frame 0 + item.unshift(3); + item.get(3) // frame 0 + */ + + + __proto.unshift = function (time) { + var _a = this, + times = _a.times, + items = _a.items; + + var obj = {}; + this.times = times.map(function (t) { + var time2 = toFixed(time + t); + obj[time2] = items[t]; + return time2; + }); + this.items = obj; + return this; + }; + /** + * Get the frames in the item in object form. + * @return {} + * @example + item.toObject(); + // {0: {display: "none"}, 1: {display: "block"}} + */ + + + __proto.toObject = function (isStartZero) { + if (isStartZero === void 0) { + isStartZero = true; + } + + var obj = {}; + var delay = this.getDelay(); + this.forEach(function (frame, time) { + obj[(!time && !isStartZero ? THRESHOLD : 0) + delay + time] = frame.clone(); + }); + return obj; + }; + /** + * Specifies an element to synchronize items' keyframes. + * @param {string} selectors - Selectors to find elements in items. + * @return {SceneItem} An instance itself + * @example + item.setSelector("#id.class"); + */ + + + __proto.setSelector = function (target) { + if (isFunction(target)) { + this.setElement(target(this.getId())); + } else { + this.setElement(target); + } + + return this; + }; + /** + * Get the elements connected to SceneItem. + */ + + + __proto.getElements = function () { + return this.elements; + }; + /** + * Specifies an element to synchronize item's keyframes. + * @param - elements to synchronize item's keyframes. + * @param - Make sure that you have peusdo. + * @return {SceneItem} An instance itself + * @example + item.setElement(document.querySelector("#id.class")); + item.setElement(document.querySelectorAll(".class")); + */ + + + __proto.setElements = function (target) { + return this.setElement(target); + }; + /** + * Specifies an element to synchronize item's keyframes. + * @param - elements to synchronize item's keyframes. + * @param - Make sure that you have peusdo. + * @return {SceneItem} An instance itself + * @example + item.setElement(document.querySelector("#id.class")); + item.setElement(document.querySelectorAll(".class")); + */ + + + __proto.setElement = function (target) { + var state = this.state; + var elements = []; + + if (!target) { + return this; + } else if (target === true || isString(target)) { + var selector = target === true ? "" + state.id : target; + var matches = /([\s\S]+)(:+[a-zA-Z]+)$/g.exec(selector); + elements = toArray($(matches ? matches[1] : selector, true)); + state[SELECTOR] = selector; + } else { + elements = target instanceof Element ? [target] : toArray(target); + } + + if (!elements.length) { + return this; + } + + this.elements = elements; + this.setId(this.getId()); + this.target = elements[0].style; + + this.targetFunc = function (frame) { + var attributes = frame.get("attribute"); + + if (attributes) { + var _loop_2 = function (name) { + elements.forEach(function (el) { + el.setAttribute(name, attributes[name]); + }); + }; + + for (var name in attributes) { + _loop_2(name); + } + } + + if (frame.has("html")) { + var html_1 = frame.get("html"); + elements.forEach(function (el) { + el.innerHTML = html_1; + }); + } + + var cssText = frame.toCSS(); + + if (state.cssText !== cssText) { + state.cssText = cssText; + elements.forEach(function (el) { + el.style.cssText += cssText; + }); + return frame; + } + }; + + return this; + }; + + __proto.setTarget = function (target) { + this.target = target; + + this.targetFunc = function (frame) { + var obj = frame.get(); + + for (var name in obj) { + target[name] = obj[name]; + } + }; + + return this; + }; + /** + * add css styles of items's element to the frame at that time. + * @param {Array} properties - elements to synchronize item's keyframes. + * @return {SceneItem} An instance itself + * @example + item.setElement(document.querySelector("#id.class")); + item.setCSS(0, ["opacity"]); + item.setCSS(0, ["opacity", "width", "height"]); + */ + + + __proto.setCSS = function (time, properties) { + this.set(time, fromCSS(this.elements, properties)); + return this; + }; + + __proto.setTime = function (time, isTick, isParent, parentEasing) { + _super.prototype.setTime.call(this, time, isTick, isParent); + + var iterationTime = this.getIterationTime(); + var easing = this.getEasing() || parentEasing; + var frame = this.getNowFrame(iterationTime, easing); + var currentTime = this.getTime(); + this.temp = frame; + /** + * This event is fired when timeupdate and animate. + * @event SceneItem#animate + * @param {Number} param.currentTime The total time that the animator is running. + * @param {Number} param.time The iteration time during duration that the animator is running. + * @param {Frame} param.frame frame of that time. + */ + + this.trigger("animate", { + frame: frame, + currentTime: currentTime, + time: iterationTime + }); + this.targetFunc && this.targetFunc(frame); + return this; + }; + /** + * update property names used in frames. + * @return {SceneItem} An instance itself + * @example + item.update(); + */ + + + __proto.update = function () { + var names = {}; + this.forEach(function (frame) { + updateFrame(names, frame.properties); + }); + this.names = names; + this.needUpdate = false; + return this; + }; + /** + * Create and add a frame to the sceneItem at that time + * @param {Number} time - frame's time + * @return {Frame} Created frame. + * @example + item.newFrame(time); + */ + + + __proto.newFrame = function (time) { + var frame = this.getFrame(time); + + if (frame) { + return frame; + } + + frame = new Frame(); + this.setFrame(time, frame); + return frame; + }; + /** + * Add a frame to the sceneItem at that time + * @param {Number} time - frame's time + * @return {SceneItem} An instance itself + * @example + item.setFrame(time, frame); + */ + + + __proto.setFrame = function (time, frame) { + var realTime = this.getUnitTime(time); + this.items[realTime] = frame; + addTime(this.times, realTime); + this.needUpdate = true; + return this; + }; + /** + * get sceneItem's frame at that time + * @param {Number} time - frame's time + * @return {Frame} sceneItem's frame at that time + * @example + const frame = item.getFrame(time); + */ + + + __proto.getFrame = function (time) { + return this.items[this.getUnitTime(time)]; + }; + /** + * remove sceneItem's frame at that time + * @param - frame's time + * @return {SceneItem} An instance itself + * @example + item.removeFrame(time); + */ + + + __proto.removeFrame = function (time) { + var realTime = this.getUnitTime(time); + var items = this.items; + var index = this.times.indexOf(realTime); + delete items[realTime]; // remove time + + if (index > -1) { + this.times.splice(index, 1); + } + + this.needUpdate = true; + return this; + }; + /** + * check if the item has a frame at that time + * @param {Number} time - frame's time + * @return {Boolean} true: the item has a frame // false: not + * @example + if (item.hasFrame(10)) { + // has + } else { + // not + } + */ + + + __proto.hasFrame = function (time) { + return this.getUnitTime(time) in this.items; + }; + /** + * Check if keyframes has propery's name + * @param - property's time + * @return {boolean} true: if has property, false: not + * @example + item.hasName(["transform", "translate"]); // true or not + */ + + + __proto.hasName = function (args) { + this.needUpdate && this.update(); + return isInProperties(this.names, args, true); + }; + /** + * merge frame of the previous time at the next time. + * @param - The time of the frame to merge + * @param - The target frame + * @return {SceneItem} An instance itself + * @example + // getFrame(1) contains getFrame(0) + item.merge(0, 1); + */ + + + __proto.mergeFrame = function (time, frame) { + if (frame) { + var toFrame = this.newFrame(time); + toFrame.merge(frame); + } + + return this; + }; + /** + * Get frame of the current time + * @param {Number} time - the current time + * @param {function} easing - the speed curve of an animation + * @return {Frame} frame of the current time + * @example + let item = new SceneItem({ + 0: { + display: "none", + }, + 1: { + display: "block", + opacity: 0, + }, + 2: { + opacity: 1, + } + }); + // opacity: 0.7; display:"block"; + const frame = item.getNowFrame(1.7); + */ + + + __proto.getNowFrame = function (time, easing, isAccurate) { + var _this = this; + + this.needUpdate && this.update(); + var frame = new Frame(); + + var _a = getNearTimeIndex(this.times, time), + left = _a[0], + right = _a[1]; + + var realEasing = this.getEasing() || easing; + var nameObject = this.names; + + if (this.hasName([TIMING_FUNCTION])) { + var nowEasing = this.getNowValue(time, [TIMING_FUNCTION], left, right, false, 0, true); + isFunction(nowEasing) && (realEasing = nowEasing); + } + + if (isAccurate) { + var prevFrame = this.getFrame(time); + var prevNames = updateFrame({}, prevFrame.properties); + + for (var name in ROLES) { + if (name in prevNames) { + prevNames[name] = nameObject[name]; + } + } + + nameObject = prevNames; + } + + var names = getNames(nameObject, []); + names.forEach(function (properties) { + var value = _this.getNowValue(time, properties, left, right, isAccurate, realEasing, isFixed(properties)); + + if (isUndefined(value)) { + return; + } + + frame.set(properties, value); + }); + return frame; + }; + + __proto.load = function (properties, options) { + if (properties === void 0) { + properties = {}; + } + + if (options === void 0) { + options = properties.options; + } + + var _a; + + options && this.setOptions(options); + + if (isArray(properties)) { + this.set(properties); + } else if (properties.keyframes) { + this.set(properties.keyframes); + } else { + for (var time in properties) { + if (time !== "options") { + this.set((_a = {}, _a[time] = properties[time], _a)); + } + } + } + + if (options && options[DURATION]) { + this.setDuration(options[DURATION]); + } + + return this; + }; + /** + * clone SceneItem. + * @return {SceneItem} An instance of clone + * @example + * item.clone(); + */ + + + __proto.clone = function () { + var item = new SceneItem(); + item.setOptions(this.state); + this.forEach(function (frame, time) { + item.setFrame(time, frame.clone()); + }); + return item; + }; + /** + * executes a provided function once for each scene item. + * @param - Function to execute for each element, taking three arguments + * @return {Keyframes} An instance itself + */ + + + __proto.forEach = function (callback) { + var times = this.times; + var items = this.items; + times.forEach(function (time) { + callback(items[time], time, items); + }); + return this; + }; + + __proto.setOptions = function (options) { + if (options === void 0) { + options = {}; + } + + _super.prototype.setOptions.call(this, options); + + var id = options.id, + selector = options.selector, + elements = options.elements, + element = options.element, + target = options.target; + id && this.setId(id); + + if (target) { + this.setTarget(target); + } else if (selector) { + this.setSelector(selector); + } else if (elements || element) { + this.setElement(elements || element); + } + + return this; + }; + + __proto.toCSS = function (playCondition, parentDuration, states) { + if (playCondition === void 0) { + playCondition = { + className: START_ANIMATION + }; + } + + if (parentDuration === void 0) { + parentDuration = this.getDuration(); + } + + if (states === void 0) { + states = []; + } + + var itemState = this.state; + var selector = itemState[SELECTOR]; + + if (!selector) { + return ""; + } + + var originalDuration = this.getDuration(); + itemState[DURATION] = originalDuration; + states.push(itemState); + var reversedStates = toArray(states).reverse(); + var id = toId(getRealId(this)); + var superParent = states[0]; + var infiniteIndex = findIndex(reversedStates, function (state) { + return state[ITERATION_COUNT] === INFINITE || !isFinite(state[DURATION]); + }, states.length - 1); + var finiteStates = reversedStates.slice(0, infiniteIndex); + var duration = parentDuration || finiteStates.reduce(function (prev, cur) { + return (cur[DELAY] + prev * cur[ITERATION_COUNT]) / cur[PLAY_SPEED]; + }, originalDuration); + var delay = reversedStates.slice(infiniteIndex).reduce(function (prev, cur) { + return (prev + cur[DELAY]) / cur[PLAY_SPEED]; + }, 0); + var easingName = find(reversedStates, function (state) { + return state[EASING] && state[EASING_NAME]; + }, itemState)[EASING_NAME]; + var iterationCount = reversedStates[infiniteIndex][ITERATION_COUNT]; + var fillMode = superParent[FILL_MODE]; + var direction = reversedStates[infiniteIndex][DIRECTION]; + var cssText = makeAnimationProperties({ + fillMode: fillMode, + direction: direction, + iterationCount: iterationCount, + delay: delay + "s", + name: PREFIX + "KEYFRAMES_" + id, + duration: duration / superParent[PLAY_SPEED] + "s", + timingFunction: easingName + }); + var selectors = splitComma(selector).map(function (sel) { + var matches = /([\s\S]+)(:+[a-zA-Z]+)$/g.exec(sel); + + if (matches) { + return [matches[1], matches[2]]; + } else { + return [sel, ""]; + } + }); + var className = playCondition.className; + var selectorCallback = playCondition.selector; + var preselector = isFunction(selectorCallback) ? selectorCallback(this, selector) : selectorCallback; + return "\n " + (preselector || selectors.map(function (_a) { + var sel = _a[0], + peusdo = _a[1]; + return sel + "." + className + peusdo; + })) + " {" + cssText + "}\n " + selectors.map(function (_a) { + var sel = _a[0], + peusdo = _a[1]; + return sel + "." + PAUSE_ANIMATION + peusdo; + }) + " {" + ANIMATION + "-play-state: paused;}\n @" + KEYFRAMES + " " + PREFIX + "KEYFRAMES_" + id + "{" + this._toKeyframes(duration, finiteStates, direction) + "}"; + }; + /** + * Export the CSS of the items to the style. + * @param - Add a selector or className to play. + * @return {SceneItem} An instance itself + */ + + + __proto.exportCSS = function (playCondition, duration, options) { + if (!this.elements.length) { + return ""; + } + + var css = this.toCSS(playCondition, duration, options); + var isParent = options && !isUndefined(options[ITERATION_COUNT]); + !isParent && exportCSS(getRealId(this), css); + return this; + }; + + __proto.pause = function () { + _super.prototype.pause.call(this); + + isPausedCSS(this) && this.pauseCSS(); + return this; + }; + + __proto.pauseCSS = function () { + this.elements.forEach(function (element) { + addClass(element, PAUSE_ANIMATION); + }); + return this; + }; + + __proto.endCSS = function () { + this.elements.forEach(function (element) { + removeClass(element, PAUSE_ANIMATION); + removeClass(element, START_ANIMATION); + }); + setPlayCSS(this, false); + return this; + }; + + __proto.end = function () { + isEndedCSS(this) && this.endCSS(); + + _super.prototype.end.call(this); + + return this; + }; + /** + * Play using the css animation and keyframes. + * @param - Check if you want to export css. + * @param [playClassName="startAnimation"] - Add a class name to play. + * @param - The shorthand properties for six of the animation properties. + * @see {@link https://www.w3schools.com/cssref/css3_pr_animation.asp} + * @example + item.playCSS(); + item.playCSS(false, "startAnimation", { + direction: "reverse", + fillMode: "forwards", + }); + */ + + + __proto.playCSS = function (isExportCSS, playClassName, properties) { + if (isExportCSS === void 0) { + isExportCSS = true; + } + + if (properties === void 0) { + properties = {}; + } + + playCSS(this, isExportCSS, playClassName, properties); + return this; + }; + + __proto.addPlayClass = function (isPaused, playClassName, properties) { + if (properties === void 0) { + properties = {}; + } + + var elements = this.elements; + var length = elements.length; + var cssText = makeAnimationProperties(properties); + + if (!length) { + return; + } + + if (isPaused) { + elements.forEach(function (element) { + removeClass(element, PAUSE_ANIMATION); + }); + } else { + elements.forEach(function (element) { + element.style.cssText += cssText; + + if (hasClass(element, START_ANIMATION)) { + removeClass(element, START_ANIMATION); + requestAnimationFrame(function () { + requestAnimationFrame(function () { + addClass(element, START_ANIMATION); + }); + }); + } else { + addClass(element, START_ANIMATION); + } + }); + } + + return elements[0]; + }; + /** + * Remove All Frames + * @return {SceneItem} An instance itself + */ + + + __proto.clear = function () { + this.times = []; + this.items = {}; + this.names = {}; + this.temp = null; + this.needUpdate = true; + return this; + }; + + __proto.getNowValue = function (time, properties, left, right, isAccurate, easing, usePrevValue) { + var times = this.times; + var length = times.length; + var prevTime; + var nextTime; + var prevFrame; + var nextFrame; + var isUndefinedLeft = isUndefined(left); + var isUndefinedRight = isUndefined(right); + + if (isUndefinedLeft || isUndefinedRight) { + var indicies = getNearTimeIndex(times, time); + isUndefinedLeft && (left = indicies[0]); + isUndefinedRight && (right = indicies[1]); + } + + for (var i = left; i >= 0; --i) { + var frame = this.getFrame(times[i]); + + if (frame.has.apply(frame, properties)) { + prevTime = times[i]; + prevFrame = frame; + break; + } + } + + var prevValue = prevFrame && prevFrame.raw.apply(prevFrame, properties); + + if (isAccurate && !isRole([properties[0]])) { + return prevTime === time ? prevValue : undefined; + } + + if (usePrevValue) { + return prevValue; + } + + for (var i = right; i < length; ++i) { + var frame = this.getFrame(times[i]); + + if (frame.has.apply(frame, properties)) { + nextTime = times[i]; + nextFrame = frame; + break; + } + } + + var nextValue = nextFrame && nextFrame.raw.apply(nextFrame, properties); + + if (!prevFrame || isUndefined(prevValue)) { + return nextValue; + } + + if (!nextFrame || isUndefined(nextValue) || prevValue === nextValue) { + return prevValue; + } + + return dotValue(time, Math.max(prevTime, 0), nextTime, prevValue, nextValue, easing); + }; + + __proto._toKeyframes = function (duration, states, direction) { + var _this = this; + + var frames = {}; + var times = this.times.slice(); + + if (!times.length) { + return ""; + } + + var originalDuration = this.getDuration(); + !this.getFrame(0) && times.unshift(0); + !this.getFrame(originalDuration) && times.push(originalDuration); + var entries = getEntries(times, states); + var lastEntry = entries[entries.length - 1]; // end delay time + + lastEntry[0] < duration && addEntry(entries, duration, lastEntry[1]); + var prevTime = -1; + return entries.map(function (_a) { + var time = _a[0], + keytime = _a[1]; + + if (!frames[keytime]) { + frames[keytime] = (!_this.hasFrame(keytime) || keytime === 0 || keytime === originalDuration ? _this.getNowFrame(keytime) : _this.getNowFrame(keytime, 0, true)).toCSS(); + } + + var frameTime = time / duration * 100; + + if (frameTime - prevTime < THRESHOLD) { + frameTime += THRESHOLD; + } + + prevTime = frameTime; + return Math.min(frameTime, 100) + "%{\n " + (time === 0 && !isDirectionReverse(0, 1, direction) ? "" : frames[keytime]) + "\n }"; + }).join(""); + }; + + return SceneItem; +}(Animator); + +/** + * manage sceneItems and play Scene. + * @sort 1 + */ + +var Scene = +/*#__PURE__*/ +function (_super) { + __extends(Scene, _super); + /** + * @param - properties + * @param - options + * @example + const scene = new Scene({ + item1: { + 0: { + display: "none", + }, + 1: { + display: "block", + opacity: 0, + }, + 2: { + opacity: 1, + }, + }, + item2: { + 2: { + opacity: 1, + }, + } + }); + */ + + + function Scene(properties, options) { + var _this = _super.call(this) || this; + + _this.items = new ListMap(); + + _this.load(properties, options); + + return _this; + } + + var __proto = Scene.prototype; + + __proto.getDuration = function () { + var time = 0; + this.forEach(function (item) { + time = Math.max(time, item.getTotalDuration() / item.getPlaySpeed()); + }); + return time || this.state[DURATION]; + }; + + __proto.setDuration = function (duration) { + var items = this.items; + var sceneDuration = this.getDuration(); + + if (duration === 0 || !isFinite(sceneDuration)) { + return this; + } + + if (sceneDuration === 0) { + this.forEach(function (item) { + item.setDuration(duration); + }); + } else { + var ratio_1 = duration / sceneDuration; + this.forEach(function (item) { + item.setDelay(item.getDelay() * ratio_1); + item.setDuration(item.getDuration() * ratio_1); + }); + } + + _super.prototype.setDuration.call(this, duration); + + return this; + }; + /** + * get item in scene by name + * @param - The item's name + * @return {Scene | SceneItem} item + * @example + const item = scene.getItem("item1") + */ + + + __proto.getItem = function (name) { + return this.items.get(name); + }; + /** + * create item in scene + * @param {} name - name of item to create + * @param {} options - The option object of SceneItem + * @return {} Newly created item + * @example + const item = scene.newItem("item1") + */ + + + __proto.newItem = function (name, options) { + if (options === void 0) { + options = {}; + } + + if (this.items.has(name)) { + return this.items.get(name); + } + + var item = new SceneItem(); + this.setItem(name, item); + item.setOptions(options); + return item; + }; + /** + * remove item in scene + * @param - name of item to remove + * @return An instance itself + * @example + const item = scene.newItem("item1") + scene.removeItem("item1"); + */ + + + __proto.removeItem = function (name) { + this.items.remove(name); + return this; + }; + /** + * add a sceneItem to the scene + * @param - name of item to create + * @param - sceneItem + * @example + const item = scene.newItem("item1") + */ + + + __proto.setItem = function (name, item) { + item.setId(name); + this.items.set(name, item); + return this; + }; + + __proto.setTime = function (time, isTick, isParent, parentEasing) { + _super.prototype.setTime.call(this, time, isTick, isParent); + + var iterationTime = this.getIterationTime(); + var easing = this.getEasing() || parentEasing; + var frames = {}; + this.forEach(function (item) { + item.setTime(iterationTime * item.getPlaySpeed() - item.getDelay(), isTick, true, easing); + frames[item.getId()] = item.temp; + }); + this.temp = frames; + /** + * This event is fired when timeupdate and animate. + * @event Scene#animate + * @param {object} param The object of data to be sent to an event. + * @param {number} param.currentTime The total time that the animator is running. + * @param {number} param.time The iteration time during duration that the animator is running. + * @param {object} param.frames frames of that time. + * @example + const scene = new Scene({ + a: { + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + } + }, + b: { + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + } + } + }).on("animate", e => { + console.log(e.frames); + // {a: Frame, b: Frame} + console.log(e.frames.a.get("opacity")); + }); + */ + + this.trigger("animate", { + frames: frames, + currentTime: this.getTime(), + time: iterationTime + }); + return this; + }; + /** + * executes a provided function once for each scene item. + * @param - Function to execute for each element, taking three arguments + * @return {Scene} An instance itself + */ + + + __proto.forEach = function (func) { + var items = this.items; + items.forEach(function (item, id, index, obj) { + func(item, id, index, obj); + }); + return this; + }; + + __proto.toCSS = function (playCondition, duration, parentStates) { + if (duration === void 0) { + duration = this.getDuration(); + } + + if (parentStates === void 0) { + parentStates = []; + } + + var totalDuration = !duration || !isFinite(duration) ? 0 : duration; + var styles = []; + var state = this.state; + state[DURATION] = this.getDuration(); + this.forEach(function (item) { + styles.push(item.toCSS(playCondition, totalDuration, parentStates.concat(state))); + }); + return styles.join(""); + }; + /** + * Export the CSS of the items to the style. + * @param - Add a selector or className to play. + * @return {Scene} An instance itself + */ + + + __proto.exportCSS = function (playCondition, duration, parentStates) { + var css = this.toCSS(playCondition, duration, parentStates); + (!parentStates || !parentStates.length) && exportCSS(getRealId(this), css); + return this; + }; + + __proto.append = function (item) { + item.setDelay(item.getDelay() + this.getDuration()); + this.setItem(getRealId(item), item); + }; + + __proto.pauseCSS = function () { + return this.forEach(function (item) { + item.pauseCSS(); + }); + }; + + __proto.pause = function () { + _super.prototype.pause.call(this); + + isPausedCSS(this) && this.pauseCSS(); + this.forEach(function (item) { + item.pause(); + }); + return this; + }; + + __proto.endCSS = function () { + this.forEach(function (item) { + item.endCSS(); + }); + setPlayCSS(this, false); + }; + + __proto.end = function () { + isEndedCSS(this) && this.endCSS(); + + _super.prototype.end.call(this); + + return this; + }; + + __proto.addPlayClass = function (isPaused, playClassName, properties) { + if (properties === void 0) { + properties = {}; + } + + var animtionElement; + this.forEach(function (item) { + var el = item.addPlayClass(isPaused, playClassName, properties); + !animtionElement && (animtionElement = el); + }); + return animtionElement; + }; + /** + * Play using the css animation and keyframes. + * @param - Check if you want to export css. + * @param [playClassName="startAnimation"] - Add a class name to play. + * @param - The shorthand properties for six of the animation properties. + * @return {Scene} An instance itself + * @see {@link https://www.w3schools.com/cssref/css3_pr_animation.asp} + * @example + scene.playCSS(); + scene.playCSS(false, { + direction: "reverse", + fillMode: "forwards", + }); + */ + + + __proto.playCSS = function (isExportCSS, playClassName, properties) { + if (isExportCSS === void 0) { + isExportCSS = true; + } + + if (properties === void 0) { + properties = {}; + } + + playCSS(this, isExportCSS, playClassName, properties); + return this; + }; + /** + * Set properties to the Scene. + * @param - properties + * @return An instance itself + * @example + scene.set({ + ".a": { + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + }, + }, + }); + // 0 + console.log(scene.getItem(".a").get(0, "opacity")); + // 1 + console.log(scene.getItem(".a").get(1, "opacity")); + */ + + + __proto.set = function (properties) { + this.load(properties); + return this; + }; + + __proto.load = function (properties, options) { + if (properties === void 0) { + properties = {}; + } + + if (options === void 0) { + options = properties.options; + } + + if (!properties) { + return this; + } + + var selector = options && options[SELECTOR] || this.state[SELECTOR]; + + for (var name in properties) { + if (name === "options") { + continue; + } + + var object = properties[name]; + var item = void 0; + + if (object instanceof Scene || object instanceof SceneItem) { + this.setItem(name, object); + item = object; + } else if (isFunction(object) && selector) { + var elements = IS_WINDOW ? $("" + (isFunction(selector) ? selector(name) : name), true) : []; + var length = elements.length; + var scene = new Scene(); + + for (var i = 0; i < length; ++i) { + scene.newItem(i).setId().setElement(elements[i]).load(object(i, elements[i])); + } + + this.setItem(name, scene); + continue; + } else { + item = this.newItem(name); + item.load(object); + } + + selector && item.setSelector(selector); + } + + this.setOptions(options); + }; + + __proto.setOptions = function (options) { + if (options === void 0) { + options = {}; + } + + _super.prototype.setOptions.call(this, options); + + var selector = options.selector; + + if (selector) { + this.state[SELECTOR] = selector; + } + + return this; + }; + + __proto.setSelector = function (target) { + var state = this.state; + var selector = target || state[SELECTOR]; + state[SELECTOR] = selector; + var isItFunction = isFunction(target); + + if (selector) { + this.forEach(function (item, name) { + item.setSelector(isItFunction ? target(name) : selector); + }); + } + + return this; + }; + + __proto.start = function (delay) { + if (delay === void 0) { + delay = this.state[DELAY]; + } + + var result = _super.prototype.start.call(this, delay); + + if (result) { + this.forEach(function (item) { + item.start(0); + }); + } else { + this.forEach(function (item) { + item.setPlayState(RUNNING); + }); + } + + return result; + }; + /** + * version info + * @type {string} + * @example + * Scene.VERSION // 1.2.0 + */ + + + Scene.VERSION = "1.2.0"; + return Scene; +}(Animator); + +function animate(properties, options) { + return new Scene(properties, options).play(); +} +function animateItem(properties, options) { + return new SceneItem(properties, options).play(); +} + +export default Scene; +export { Animator, EASE, EASE_IN, EASE_IN_OUT, EASE_OUT, EVENTS, FIXED, Frame, LINEAR, OPTIONS, ROLES, STEP_END, STEP_START, SceneItem, animate, animateItem, bezier, setAlias, setRole, steps }; +//# sourceMappingURL=scene.esm.js.map diff --git a/dist/scene.esm.js.map b/dist/scene.esm.js.map new file mode 100644 index 00000000..87f9e2aa --- /dev/null +++ b/dist/scene.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scene.esm.js","sources":["../src/easing.ts","../src/consts.ts","../src/EventTrigger.ts","../src/PropertyObject.ts","../src/utils/property.ts","../src/utils.ts","../src/Animator.ts","../src/Frame.ts","../src/utils/dot.ts","../src/SceneItem.ts","../src/Scene.ts","../src/presets.ts"],"sourcesContent":["import { EasingFunction } from \"./types\";\n\nfunction cubic(y1: number, y2: number, t: number) {\n const t2 = 1 - t;\n\n // Bezier Curve Formula\n return t * t * t + 3 * t * t * t2 * y2 + 3 * t * t2 * t2 * y1;\n}\nfunction solveFromX(x1: number, x2: number, x: number) {\n // x 0 ~ 1\n // t 0 ~ 1\n let t = x;\n let solveX = x;\n let dx = 1;\n\n while (Math.abs(dx) > 1 / 1000) {\n // 예상 t초에 의한 _x값\n solveX = cubic(x1, x2, t);\n dx = solveX - x;\n // 차이가 미세하면 그 값을 t로 지정\n if (Math.abs(dx) < 1 / 1000) {\n return t;\n }\n t -= dx / 2;\n }\n return t;\n}\n/**\n * @namespace easing\n */\n/**\n* Cubic Bezier curve.\n* @memberof easing\n* @func bezier\n* @param {number} [x1] - point1's x\n* @param {number} [y1] - point1's y\n* @param {number} [x2] - point2's x\n* @param {number} [y2] - point2's y\n* @return {function} the curve function\n* @example\nimport {bezier} from \"scenejs\";\nScene.bezier(0, 0, 1, 1) // LINEAR\nScene.bezier(0.25, 0.1, 0.25, 1) // EASE\n*/\nexport function bezier(x1: number, y1: number, x2: number, y2: number) {\n /*\n\t\tx = f(t)\n\t\tcalculate inverse function by x\n\t\tt = f-1(x)\n\t*/\n const func: EasingFunction = (x: number) => {\n const t = solveFromX(x1, x2, Math.max(Math.min(1, x), 0));\n\n return cubic(y1, y2, t);\n };\n\n func.easingName = `cubic-bezier(${x1},${y1},${x2},${y2})`;\n return func;\n}\n/**\n* Specifies a stepping function\n* @see {@link https://www.w3schools.com/cssref/css3_pr_animation-timing-function.asp|CSS3 Timing Function}\n* @memberof easing\n* @func steps\n* @param {number} count - point1's x\n* @param {\"start\" | \"end\"} postion - point1's y\n* @return {function} the curve function\n* @example\nimport {steps} from \"scenejs\";\nScene.steps(1, \"start\") // Scene.STEP_START\nScene.steps(1, \"end\") // Scene.STEP_END\n*/\nexport function steps(count: number, position: \"start\" | \"end\") {\n const func: EasingFunction = (time: number) => {\n const level = 1 / count;\n\n if (time >= 1) {\n return 1;\n }\n return (position === \"start\" ? level : 0) + Math.floor(time / level) * level;\n };\n\n func.easingName = `steps(${count}, ${position})`;\n\n return func;\n}\n\n/**\n* Equivalent to steps(1, start)\n* @memberof easing\n* @name STEP_START\n* @static\n* @type {function}\n* @example\nimport {STEP_START} from \"scenejs\";\nScene.STEP_START // steps(1, start)\n*/\nexport const STEP_START = /*#__PURE__#*/steps(1, \"start\");\n/**\n* Equivalent to steps(1, end)\n* @memberof easing\n* @name STEP_END\n* @static\n* @type {function}\n* @example\nimport {STEP_END} from \"scenejs\";\nScene.STEP_END // steps(1, end)\n*/\nexport const STEP_END = /*#__PURE__#*/steps(1, \"end\");\n/**\n* Linear Speed (0, 0, 1, 1)\n* @memberof easing\n* @name LINEAR\n* @static\n* @type {function}\n* @example\nimport {LINEAR} from \"scenejs\";\nScene.LINEAR\n*/\nexport const LINEAR = /*#__PURE__#*/bezier(0, 0, 1, 1);\n/**\n* Ease Speed (0.25, 0.1, 0.25, 1)\n* @memberof easing\n* @name EASE\n* @static\n* @type {function}\n* @example\nimport {EASE} from \"scenejs\";\nScene.EASE\n*/\nexport const EASE = /*#__PURE__#*/bezier(0.25, 0.1, 0.25, 1);\n/**\n* Ease In Speed (0.42, 0, 1, 1)\n* @memberof easing\n* @name EASE_IN\n* @static\n* @type {function}\n* @example\nimport {EASE_IN} from \"scenejs\";\nScene.EASE_IN\n*/\nexport const EASE_IN = /*#__PURE__#*/bezier(0.42, 0, 1, 1);\n/**\n* Ease Out Speed (0, 0, 0.58, 1)\n* @memberof easing\n* @name EASE_OUT\n* @static\n* @type {function}\n* @example\nimport {EASE_OUT} from \"scenejs\";\nScene.EASE_OUT\n*/\nexport const EASE_OUT = /*#__PURE__#*/bezier(0, 0, 0.58, 1);\n/**\n* Ease In Out Speed (0.42, 0, 0.58, 1)\n* @memberof easing\n* @name EASE_IN_OUT\n* @static\n* @type {function}\n* @example\nimport {EASE_IN_OUT} from \"scenejs\";\nScene.EASE_IN_OUT\n*/\nexport const EASE_IN_OUT = /*#__PURE__#*/bezier(0.42, 0, 0.58, 1);\n","import { IObject } from \"@daybrush/utils\";\nimport { RoleObject, OptionType, EventType, EasingFunction } from \"./types\";\nimport { EASE, EASE_IN, EASE_IN_OUT, LINEAR, EASE_OUT, STEP_START, STEP_END } from \"./easing\";\n\nexport const PREFIX = \"__SCENEJS_\";\nexport const DATA_SCENE_ID = \"data-scene-id\";\nexport const TIMING_FUNCTION = \"animation-timing-function\";\nexport const ROLES: RoleObject = { transform: {}, filter: {}, attribute: {}, html: true };\nexport const ALIAS: IObject = { easing: [TIMING_FUNCTION] };\nexport const FIXED = { [TIMING_FUNCTION]: true, contents: true, html: true };\nexport const MAXIMUM = 1000000;\nexport const THRESHOLD = 0.000001;\n\nexport const DURATION = \"duration\";\nexport const FILL_MODE = \"fillMode\";\nexport const DIRECTION = \"direction\";\nexport const ITERATION_COUNT = \"iterationCount\";\nexport const DELAY = \"delay\";\nexport const EASING = \"easing\";\nexport const PLAY_SPEED = \"playSpeed\";\nexport const EASING_NAME = \"easingName\";\nexport const ITERATION_TIME = \"iterationTime\";\nexport const PAUSED = \"paused\";\nexport const ENDED = \"ended\";\nexport const TIMEUPDATE = \"timeupdate\";\nexport const ANIMATE = \"animate\";\nexport const PLAY = \"play\";\nexport const RUNNING = \"running\";\nexport const ITERATION = \"iteration\";\nexport const START_ANIMATION = \"startAnimation\";\nexport const PAUSE_ANIMATION = \"pauseAnimation\";\nexport const ALTERNATE = \"alternate\";\nexport const REVERSE = \"reverse\";\nexport const ALTERNATE_REVERSE = \"alternate-reverse\";\nexport const NORMAL = \"normal\";\nexport const INFINITE = \"infinite\";\nexport const PLAY_STATE = \"playState\";\nexport const PLAY_CSS = \"playCSS\";\nexport const PREV_TIME = \"prevTime\";\nexport const TICK_TIME = \"tickTime\";\nexport const CURRENT_TIME = \"currentTime\";\nexport const SELECTOR = \"selector\";\nexport const TRANSFORM_NAME = \"transform\";\nexport const EASINGS = {\n \"linear\": LINEAR,\n \"ease\": EASE,\n \"ease-in\": EASE_IN,\n \"ease-out\": EASE_OUT,\n \"ease-in-out\": EASE_IN_OUT,\n \"step-start\": STEP_START,\n \"step-end\": STEP_END,\n};\n\n/**\n* option name list\n* @name Scene.OPTIONS\n* @memberof Scene\n* @static\n* @type {$ts:OptionType}\n* @example\n* Scene.OPTIONS // [\"duration\", \"fillMode\", \"direction\", \"iterationCount\", \"delay\", \"easing\", \"playSpeed\"]\n*/\nexport const OPTIONS: OptionType = [DURATION, FILL_MODE, DIRECTION, ITERATION_COUNT, DELAY, EASING, PLAY_SPEED];\n\n/**\n* Event name list\n* @name Scene.EVENTS\n* @memberof Scene\n* @static\n* @type {$ts:EventType}\n* @example\n* Scene.EVENTS // [\"paused\", \"ended\", \"timeupdate\", \"animate\", \"play\", \"iteration\"];\n*/\nexport const EVENTS: EventType = [PAUSED, ENDED, TIMEUPDATE, ANIMATE, PLAY, ITERATION];\n","import { isObject, isArray, toArray } from \"@daybrush/utils\";\nimport { CallbackType, EventParameter } from \"./types\";\n\n/**\n* attach and trigger event handlers.\n*/\nclass EventTrigger {\n public events: { [name: string]: CallbackType[] };\n /**\n * @example\n const et = new Scene.EventTrigger();\n const scene = new Scene();\n\n scene.on(\"call\", e => {\n console.log(e.param);\n });\n et.on(\"call\", e => {\n console.log(e.param);\n });\n scene.trigger(\"call\", {param: 1});\n et.trigger(\"call\", {param: 1});\n */\n constructor() {\n this.events = {};\n }\n public _on(name: string | EventParameter, callback?: CallbackType | CallbackType[], once?: boolean) {\n const events = this.events;\n\n if (isObject(name)) {\n for (const n in name) {\n this._on(n, name[n], once);\n }\n return;\n }\n if (!(name in events)) {\n events[name] = [];\n }\n if (!callback) {\n return;\n }\n if (isArray(callback)) {\n callback.forEach(func => this._on(name, func, once));\n return;\n }\n events[name].push(once ? function callback2(...args) {\n callback(...args);\n this.off(name, callback2);\n } : callback);\n }\n /**\n * Attach an event handler function for one or more events to target\n * @param - event's name\n * @param - function to execute when the event is triggered.\n * @return {EventTrigger} An Instance itself.\n * @example\n target.on(\"animate\", function() {\n console.log(\"animate\");\n });\n\n target.trigger(\"animate\");\n\n */\n public on(name: string | EventParameter, callback?: CallbackType | CallbackType[]) {\n this._on(name, callback);\n return this;\n }\n /**\n * Dettach an event handler function for one or more events to target\n * @param - event's name\n * @param - function to execute when the event is triggered.\n * @return {EventTrigger} An Instance itself.\n * @example\n const callback = function() {\n console.log(\"animate\");\n };\n target.on(\"animate\", callback);\n\n target.off(\"animate\", callback);\n target.off(\"animate\");\n\n */\n public off(name?: string, callback?: CallbackType) {\n if (!name) {\n this.events = {};\n } else if (!callback) {\n this.events[name] = [];\n } else {\n const callbacks = this.events[name];\n\n if (!callbacks) {\n return this;\n }\n const index = callbacks.indexOf(callback);\n\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n }\n return this;\n }\n /**\n * execute event handler\n * @param - event's name\n * @param - event handler's additional parameter\n * @return {EventTrigger} An Instance itself.\n * @example\n target.on(\"animate\", function(a1, a2) {\n console.log(\"animate\", a1, a2);\n });\n\n target.trigger(\"animate\", [1, 2]); // log => \"animate\", 1, 2\n\n */\n public trigger(name: string, ...data: any[]) {\n const events = this.events;\n\n if (!(name in events)) {\n return this;\n }\n\n const args = data || [];\n\n !args[0] && (args[0] = {});\n const event = events[name];\n const target = args[0];\n\n target.type = name;\n target.currentTarget = this;\n !target.target && (target.target = this);\n toArray(events[name]).forEach(callback => {\n callback.apply(this, data);\n });\n\n return this;\n }\n public once(name: string | EventParameter, callback?: CallbackType | CallbackType[]) {\n this._on(name, callback, true);\n return this;\n }\n}\nexport default EventTrigger;\n","import { isString } from \"@daybrush/utils\";\nimport { PropertyObjectState } from \"./types\";\n\n/**\n* Make string, array to PropertyObject for the dot product\n*/\nclass PropertyObject implements PropertyObjectState {\n public value: any[];\n public prefix: string = \"\";\n public suffix: string = \"\";\n public model: string = \"\";\n public type: string = \"\";\n public separator: string = \",\";\n\n /**\n * @param - This value is in the array format.\n * @param - options\n * @example\n var obj = new PropertyObject([100,100,100,0.5], {\n \"separator\" : \",\",\n \"prefix\" : \"rgba(\",\n \"suffix\" : \")\"\n });\n */\n constructor(value: string | any[], options?: Partial) {\n options && this.setOptions(options);\n this.value = isString(value) ? value.split(this.separator) : value;\n }\n public setOptions(newOptions: Partial) {\n for (const name in newOptions) {\n this[name as keyof PropertyObjectState] = newOptions[name as keyof PropertyObjectState];\n }\n return this;\n }\n /**\n * the number of values.\n * @example\n const obj1 = new PropertyObject(\"1,2,3\", \",\");\n\n console.log(obj1.length);\n // 3\n */\n public size() {\n return this.value.length;\n }\n /**\n * retrieve one of values at the index\n * @param {Number} index - index\n * @return {Object} one of values at the index\n * @example\n const obj1 = new PropertyObject(\"1,2,3\", \",\");\n\n console.log(obj1.get(0));\n // 1\n */\n public get(index: number) {\n return this.value[index];\n }\n /**\n * Set the value at that index\n * @param {Number} index - index\n * @param {Object} value - text, a number, object to set\n * @return {PropertyObject} An instance itself\n * @example\n const obj1 = new PropertyObject(\"1,2,3\", \",\");\n obj1.set(0, 2);\n console.log(obj1.toValue());\n // 2,2,3\n */\n public set(index: number, value: any) {\n this.value[index] = value;\n return this;\n }\n /**\n * create a copy of an instance itself.\n * @return {PropertyObject} clone\n * @example\n const obj1 = new PropertyObject(\"1,2,3\", \",\");\n const obj2 = obj1.clone();\n */\n public clone(): PropertyObject {\n const {\n separator,\n prefix,\n suffix,\n model,\n type,\n } = this;\n const arr = this.value.map(v => ((v instanceof PropertyObject) ? v.clone() : v));\n return new PropertyObject(arr, {\n separator,\n prefix,\n suffix,\n model,\n type,\n });\n }\n /**\n * Make Property Object to String\n * @return {String} Make Property Object to String\n * @example\n //rgba(100, 100, 100, 0.5)\n const obj4 = new PropertyObject([100,100,100,0.5], {\n \"separator\" : \",\",\n \"prefix\" : \"rgba(\",\n \"suffix\" : \")\",\n });\n console.log(obj4.toValue());\n // \"rgba(100,100,100,0.5)\"\n */\n public toValue(): string {\n return this.prefix + this.join() + this.suffix;\n }\n /**\n * Make Property Object's array to String\n * @return {String} Join the elements of an array into a string\n * @example\n //rgba(100, 100, 100, 0.5)\n var obj4 = new PropertyObject([100,100,100,0.5], {\n \"separator\" : \",\",\n \"prefix\" : \"rgba(\",\n \"suffix\" : \")\"\n });\n obj4.join(); // => \"100,100,100,0.5\"\n */\n public join() {\n return this.value.map(v => ((v instanceof PropertyObject) ? v.toValue() : v)).join(this.separator);\n }\n /**\n * executes a provided function once per array element.\n * @param {Function} callback - Function to execute for each element, taking three arguments\n * @param {All} [callback.currentValue] The current element being processed in the array.\n * @param {Number} [callback.index] The index of the current element being processed in the array.\n * @param {Array} [callback.array] the array.\n * @return {PropertyObject} An instance itself\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach|MDN Array.forEach()} reference to MDN document.\n * @example\n //rgba(100, 100, 100, 0.5)\n var obj4 = new PropertyObject([100,100,100,0.5], {\n \"separator\" : \",\",\n \"prefix\" : \"rgba(\",\n \"suffix\" : \")\"\n });\n\n obj4.forEach(t => {\n console.log(t);\n }); // => \"100,100,100,0.5\"\n */\n public forEach(func: (value?: any, index?: number, array?: any[]) => void) {\n this.value.forEach(func);\n return this;\n }\n}\nexport default PropertyObject;\n","/**\n* @namespace\n* @name Property\n*/\n\nimport PropertyObject from \"../PropertyObject\";\nimport {\n COLOR_MODELS, isString,\n splitComma, splitSpace, stringToRGBA,\n RGBA, splitBracket, IObject, isArray, splitText\n} from \"@daybrush/utils\";\nimport { NameType } from \"../types\";\n\nexport function splitStyle(str: string) {\n\n const properties = splitText(str, \";\");\n const obj: IObject = {};\n let length = properties.length;\n\n for (let i = 0; i < length; ++i) {\n const matches = splitText(properties[i], \":\");\n\n if (matches.length < 2 || !matches[1]) {\n --length;\n continue;\n }\n obj[matches[0].trim()] = toPropertyObject(matches[1].trim());\n }\n return { styles: obj, length };\n}\n/**\n* convert array to PropertyObject[type=color].\n* default model \"rgba\"\n* @memberof Property\n* @function arrayToColorObject\n* @param {Array|PropertyObject} value ex) [0, 0, 0, 1]\n* @return {PropertyObject} PropertyObject[type=color]\n* @example\narrayToColorObject([0, 0, 0])\n// => PropertyObject(type=\"color\", model=\"rgba\", value=[0, 0, 0, 1], separator=\",\")\n*/\nexport function arrayToColorObject(arr: number[]) {\n const model = RGBA;\n\n if (arr.length === 3) {\n arr[3] = 1;\n }\n return new PropertyObject(arr, {\n model,\n separator: \",\",\n type: \"color\",\n prefix: `${model}(`,\n suffix: \")\",\n });\n}\n/**\n* convert text with parentheses to object.\n* @memberof Property\n* @function stringToBracketObject\n* @param {String} value ex) \"rgba(0,0,0,1)\"\n* @return {PropertyObject} PropertyObject\n* @example\nstringToBracketObject(\"abcde(0, 0, 0,1)\")\n// => PropertyObject(model=\"abcde\", value=[0, 0, 0,1], separator=\",\")\n*/\nexport function stringToBracketObject(text: string) {\n // [prefix, value, other]\n const { prefix: model, value, suffix: afterModel } = splitBracket(text);\n\n if (typeof value === \"undefined\") {\n return text;\n }\n if (COLOR_MODELS.indexOf(model) > -1) {\n return arrayToColorObject(stringToRGBA(text));\n }\n // divide comma(,)\n const obj = toPropertyObject(value, model);\n\n let arr = [value];\n let separator = \",\";\n let prefix = `${model}(`;\n let suffix = `)${afterModel}`;\n\n if (obj instanceof PropertyObject) {\n separator = obj.separator;\n arr = obj.value;\n prefix += obj.prefix;\n suffix = obj.suffix + suffix;\n }\n return new PropertyObject(arr, {\n separator,\n model,\n prefix,\n suffix,\n });\n}\n\nexport function arrayToPropertyObject(arr: any[], separator: string) {\n return new PropertyObject(arr, {\n type: \"array\",\n separator,\n });\n}\n\n/**\n* convert text with parentheses to PropertyObject[type=color].\n* If the values are not RGBA model, change them RGBA mdoel.\n* @memberof Property\n* @function stringToColorObject\n* @param {String|PropertyObject} value ex) \"rgba(0,0,0,1)\"\n* @return {PropertyObject} PropertyObject[type=color]\n* @example\nstringToColorObject(\"rgba(0, 0, 0,1)\")\n// => PropertyObject(type=\"color\", model=\"rgba\", value=[0, 0, 0,1], separator=\",\")\n*/\nexport function stringToColorObject(value: string): string | PropertyObject {\n const result = stringToRGBA(value);\n\n return result ? arrayToColorObject(result) : value;\n}\n/**\n* convert CSS Value to PropertyObject\n* @memberof Property\n* @function toPropertyObject\n* @param {String} value it's text contains the array.\n* @return {String} Not Array, Not Separator, Only Number & Unit\n* @return {PropertyObject} Array with Separator.\n* @see referenced regular expression {@link http://stackoverflow.com/questions/20215440/parse-css-gradient-rule-with-javascript-regex}\n* @example\ntoPropertyObject(\"1px solid #000\");\n// => PropertyObject([\"1px\", \"solid\", rgba(0, 0, 0, 1)])\n*/\nexport function toPropertyObject(value: any[], model?: NameType): PropertyObject;\nexport function toPropertyObject(value: IObject, model?: NameType): IObject;\nexport function toPropertyObject(value: string, model?: NameType): PropertyObject | string;\nexport function toPropertyObject(value: string | IObject | any[], model?: NameType) {\n if (!isString(value)) {\n if (isArray(value)) {\n return arrayToPropertyObject(value, \",\");\n }\n return value;\n }\n let values: any = splitComma(value);\n\n if (values.length > 1) {\n return arrayToPropertyObject(values.map(v => toPropertyObject(v)), \",\");\n }\n values = splitSpace(value);\n\n if (values.length > 1) {\n return arrayToPropertyObject(values.map(v => toPropertyObject(v)), \" \");\n }\n values = /^(['\"])([^'\"]*)(['\"])$/g.exec(value);\n\n if (values && values[1] === values[3]) {\n // Quotes\n return new PropertyObject([toPropertyObject(values[2])], {\n prefix: values[1],\n suffix: values[1],\n });\n } else if (value.indexOf(\"(\") !== -1) {\n // color\n return stringToBracketObject(value);\n } else if (value.charAt(0) === \"#\" && model !== \"url\") {\n return stringToColorObject(value);\n }\n return value;\n}\nexport function toObject(object: PropertyObject, result: IObject = {}) {\n const model = object.model;\n\n if (model) {\n object.setOptions({\n model: \"\",\n suffix: \"\",\n prefix: \"\",\n });\n const value = object.size() > 1 ? object : object.get(0);\n\n result[model] = value;\n } else {\n object.forEach(obj => {\n toObject(obj, result);\n });\n }\n return result;\n}\n","import {\n ROLES, MAXIMUM, FIXED, ALIAS,\n PAUSED, RUNNING, PLAY, ENDED, PREFIX, PLAY_CSS, CURRENT_TIME, START_ANIMATION, EASINGS\n} from \"./consts\";\nimport PropertyObject from \"./PropertyObject\";\nimport Scene from \"./Scene\";\nimport SceneItem from \"./SceneItem\";\nimport {\n isArray, ANIMATION, ARRAY, OBJECT,\n PROPERTY, STRING, NUMBER, IS_WINDOW, IObject, $, document, isObject, addEvent, removeEvent, isString,\n} from \"@daybrush/utils\";\nimport { EasingType, EasingFunction, NameType } from \"./types\";\nimport { toPropertyObject } from \"./utils/property\";\nimport { bezier, steps } from \"./easing\";\n\nexport function isPropertyObject(value: any): value is PropertyObject {\n return value instanceof PropertyObject;\n}\nexport function setAlias(name: string, alias: string[]) {\n ALIAS[name] = alias;\n}\nexport function setRole(names: string[], isProperty?: boolean, isFixedProperty?: boolean) {\n const length = names.length;\n let roles: any = ROLES;\n let fixed: any = FIXED;\n\n for (let i = 0; i < length - 1; ++i) {\n !roles[names[i]] && (roles[names[i]] = {});\n roles = roles[names[i]];\n if (isFixedProperty) {\n !fixed[names[i]] && (fixed[names[i]] = {});\n fixed = fixed[names[i]];\n }\n }\n isFixedProperty && (fixed[names[length - 1]] = true);\n roles[names[length - 1]] = isProperty ? true : {};\n}\nexport function getType(value: any) {\n const type = typeof value;\n\n if (type === OBJECT) {\n if (isArray(value)) {\n return ARRAY;\n } else if (isPropertyObject(value)) {\n return PROPERTY;\n }\n } else if (type === STRING || type === NUMBER) {\n return \"value\";\n }\n return type;\n}\nexport function isPureObject(obj: any): obj is object {\n return isObject(obj) && obj.constructor === Object;\n}\nexport function getNames(names: IObject, stack: string[]) {\n let arr: string[][] = [];\n\n if (isPureObject(names)) {\n for (const name in names) {\n stack.push(name);\n arr = arr.concat(getNames(names[name], stack));\n stack.pop();\n }\n } else {\n arr.push(stack.slice());\n }\n return arr;\n}\nexport function updateFrame(names: IObject, properties: IObject) {\n for (const name in properties) {\n const value = properties[name];\n\n if (!isPureObject(value)) {\n names[name] = true;\n continue;\n }\n if (!isObject(names[name])) {\n names[name] = {};\n }\n updateFrame(names[name], properties[name]);\n }\n return names;\n}\nexport function toFixed(num: number) {\n return Math.round(num * MAXIMUM) / MAXIMUM;\n}\nexport function getValueByNames(\n names: Array,\n properties: IObject, length: number = names.length) {\n let value = properties;\n\n for (let i = 0; i < length; ++i) {\n if (!isObject(value)) {\n return undefined;\n }\n value = value[names[i]];\n }\n return value;\n}\nexport function isInProperties(roles: IObject, args: NameType[], isCheckTrue?: boolean) {\n const length = args.length;\n let role: any = roles;\n\n if (length === 0) {\n return false;\n }\n for (let i = 0; i < length; ++i) {\n if (role === true) {\n return false;\n }\n role = role[args[i]];\n if (!role || (!isCheckTrue && role === true)) {\n return false;\n }\n }\n return true;\n}\nexport function isRole(args: NameType[], isCheckTrue?: boolean) {\n return isInProperties(ROLES, args, isCheckTrue);\n}\nexport function isFixed(args: NameType[]) {\n return isInProperties(FIXED, args, true);\n}\n\nexport interface IterationInterface {\n currentTime: number;\n iterationCount: number;\n elapsedTime: number;\n}\nexport function setPlayCSS(item: Scene | SceneItem, isActivate: boolean) {\n item.state[PLAY_CSS] = isActivate;\n}\nexport function isPausedCSS(item: Scene | SceneItem) {\n return item.state[PLAY_CSS] && item.isPaused();\n}\nexport function isEndedCSS(item: Scene | SceneItem) {\n return !item.isEnded() && item.state[PLAY_CSS];\n}\n\nexport function exportCSS(id: number | string, css: string) {\n const styleId = `${PREFIX}STYLE_${toId(id)}`;\n const styleElement: HTMLElement = $(`#${styleId}`);\n\n if (styleElement) {\n styleElement.innerText = css;\n } else {\n document.body.insertAdjacentHTML(\"beforeend\",\n ``);\n }\n}\nexport function makeId(selector?: boolean) {\n for (; ;) {\n const id = `${Math.floor(Math.random() * 10000000)}`;\n\n if (!IS_WINDOW || !selector) {\n return id;\n }\n const checkElement = $(`[data-scene-id=\"${id}\"]`);\n\n if (!checkElement) {\n return id;\n }\n }\n}\nexport function getRealId(item: Scene | SceneItem) {\n return item.getId() || item.setId(makeId(false)).getId();\n}\nexport function toId(text: number | string) {\n return `${text}`.match(/[0-9a-zA-Z]+/g).join(\"\");\n}\nexport function playCSS(\n item: Scene | SceneItem, isExportCSS?: boolean,\n playClassName?: string, properties: object = {}) {\n if (!ANIMATION || item.getPlayState() === RUNNING) {\n return;\n }\n const className = playClassName || START_ANIMATION;\n\n if (isPausedCSS(item)) {\n item.addPlayClass(true, className, properties);\n } else {\n if (item.isEnded()) {\n item.setTime(0);\n }\n isExportCSS && item.exportCSS({ className });\n const el = item.addPlayClass(false, className, properties);\n\n if (!el) {\n return;\n }\n addAnimationEvent(item, el);\n setPlayCSS(item, true);\n }\n item.setPlayState(RUNNING);\n}\n\nexport function addAnimationEvent(item: Scene | SceneItem, el: Element) {\n const state = item.state;\n const duration = item.getDuration();\n const isZeroDuration = !duration || !isFinite(duration);\n const animationend = () => {\n setPlayCSS(item, false);\n item.finish();\n };\n const animationstart = () => {\n item.trigger(PLAY);\n };\n item.once(ENDED, () => {\n removeEvent(el, \"animationcancel\", animationend);\n removeEvent(el, \"animationend\", animationend);\n removeEvent(el, \"animationiteration\", animationiteration);\n removeEvent(el, \"animationstart\", animationstart);\n });\n const animationiteration = ({ elapsedTime }: any) => {\n const currentTime = elapsedTime;\n const iterationCount = isZeroDuration ? 0 : (currentTime / duration);\n\n state[CURRENT_TIME] = currentTime;\n item.setIteration(iterationCount);\n };\n addEvent(el, \"animationcancel\", animationend);\n addEvent(el, \"animationend\", animationend);\n addEvent(el, \"animationiteration\", animationiteration);\n addEvent(el, \"animationstart\", animationstart);\n}\n\nexport function getEasing(curveArray: string | number[] | EasingFunction): EasingType {\n let easing: EasingType;\n\n if (isString(curveArray)) {\n if (curveArray in EASINGS) {\n easing = EASINGS[curveArray];\n } else {\n const obj = toPropertyObject(curveArray);\n\n if (isString(obj)) {\n return 0;\n } else {\n if (obj.model === \"cubic-bezier\") {\n curveArray = obj.value.map(v => parseFloat(v));\n easing = bezier(curveArray[0], curveArray[1], curveArray[2], curveArray[3]);\n } else if (obj.model === \"steps\") {\n easing = steps(parseFloat(obj.value[0]), obj.value[1]);\n } else {\n return 0;\n }\n }\n }\n } else if (isArray(curveArray)) {\n easing = bezier(curveArray[0], curveArray[1], curveArray[2], curveArray[3]);\n } else {\n easing = curveArray;\n }\n\n return easing;\n}\n","import {\n THRESHOLD,\n ALTERNATE, ALTERNATE_REVERSE, REVERSE, INFINITE, NORMAL,\n ITERATION_COUNT, DELAY, FILL_MODE, DIRECTION, PLAY_SPEED,\n DURATION, EASING, ITERATION_TIME, EASING_NAME, PAUSED,\n RUNNING, PLAY, TIMEUPDATE, ENDED, PLAY_STATE, PREV_TIME, TICK_TIME, CURRENT_TIME, ITERATION, OPTIONS, EASINGS\n} from \"./consts\";\nimport EventTrigger from \"./EventTrigger\";\nimport { bezier, steps } from \"./easing\";\nimport { toFixed, getEasing } from \"./utils\";\nimport { splitUnit, isString, camelize, requestAnimationFrame, isArray, cancelAnimationFrame } from \"@daybrush/utils\";\nimport {\n IterationCountType, DirectionType, AnimatorState,\n EasingFunction, FillModeType, PlayStateType, EasingType, AnimatorOptions,\n} from \"./types\";\nimport { toPropertyObject } from \"./utils/property\";\n\nfunction GetterSetter {}>(\n getter: string[], setter: string[], parent: string) {\n return (constructor: T) => {\n const prototype = constructor.prototype;\n\n getter.forEach(name => {\n prototype[camelize(`get ${name}`)] = function() {\n return this[parent][name];\n };\n });\n setter.forEach(name => {\n prototype[camelize(`set ${name}`)] = function(value: any) {\n this[parent][name] = value;\n return this;\n };\n });\n };\n}\nexport function isDirectionReverse(iteration: number, iteraiontCount: IterationCountType, direction: DirectionType) {\n if (direction === REVERSE) {\n return true;\n } else if (iteraiontCount !== INFINITE && iteration === iteraiontCount && iteraiontCount % 1 === 0) {\n return direction === (iteration % 2 >= 1 ? ALTERNATE_REVERSE : ALTERNATE);\n }\n return direction === (iteration % 2 >= 1 ? ALTERNATE : ALTERNATE_REVERSE);\n}\n/**\n* @typedef {Object} AnimatorState The Animator options. Properties used in css animation.\n* @property {number} [duration] The duration property defines how long an animation should take to complete one cycle.\n* @property {\"none\"|\"forwards\"|\"backwards\"|\"both\"} [fillMode] The fillMode property specifies a style for the element when the animation is not playing (before it starts, after it ends, or both).\n* @property {\"infinite\"|number} [iterationCount] The iterationCount property specifies the number of times an animation should be played.\n* @property {array|function} [easing] The easing(timing-function) specifies the speed curve of an animation.\n* @property {number} [delay] The delay property specifies a delay for the start of an animation.\n* @property {\"normal\"|\"reverse\"|\"alternate\"|\"alternate-reverse\"} [direction] The direction property defines whether an animation should be played forwards, backwards or in alternate cycles.\n*/\n\nconst setters = [\"id\", ITERATION_COUNT, DELAY, FILL_MODE,\n DIRECTION, PLAY_SPEED, DURATION, PLAY_SPEED, ITERATION_TIME, PLAY_STATE];\nconst getters = [...setters, EASING, EASING_NAME];\n\n/**\n* play video, animation, the others\n* @extends EventTrigger\n* @see {@link https://www.w3schools.com/css/css3_animations.asp|CSS3 Animation}\n*/\n@GetterSetter(getters, setters, \"state\")\nclass Animator\n extends EventTrigger {\n public state: U;\n private timerId: number = 0;\n\n /**\n * @param - animator's options\n * @example\n const animator = new Animator({\n delay: 2,\n diretion: \"alternate\",\n duration: 2,\n fillMode: \"forwards\",\n iterationCount: 3,\n easing: Scene.easing.EASE,\n });\n */\n constructor(options?: Partial) {\n super();\n this.state = {\n id: \"\",\n easing: 0,\n easingName: \"linear\",\n iterationCount: 1,\n delay: 0,\n fillMode: \"forwards\",\n direction: NORMAL,\n playSpeed: 1,\n currentTime: 0,\n iterationTime: -1,\n iteration: 0,\n tickTime: 0,\n prevTime: 0,\n playState: PAUSED,\n duration: 0,\n } as U;\n this.setOptions(options);\n }\n /**\n * set animator's easing.\n * @param curverArray - The speed curve of an animation.\n * @return {Animator} An instance itself.\n * @example\n animator.({\n delay: 2,\n diretion: \"alternate\",\n duration: 2,\n fillMode: \"forwards\",\n iterationCount: 3,\n easing: Scene.easing.EASE,\n });\n */\n public setEasing(curveArray: string | number[] | EasingFunction): this {\n const easing: EasingType = getEasing(curveArray);\n const easingName = easing && easing[EASING_NAME] || \"linear\";\n const state = this.state;\n\n state[EASING] = easing;\n state[EASING_NAME] = easingName;\n return this;\n }\n /**\n * set animator's options.\n * @see {@link https://www.w3schools.com/css/css3_animations.asp|CSS3 Animation}\n * @param - animator's options\n * @return {Animator} An instance itself.\n * @example\n animator.({\n delay: 2,\n diretion: \"alternate\",\n duration: 2,\n fillMode: \"forwards\",\n iterationCount: 3,\n easing: Scene.eaasing.EASE,\n });\n */\n public setOptions(options: Partial = {}): this {\n for (const name in options) {\n const value = options[name];\n\n if (name === EASING) {\n this.setEasing(value);\n continue;\n } else if (name === DURATION) {\n value && this.setDuration(value);\n continue;\n }\n if (OPTIONS.indexOf(name as any) > -1) {\n this.state[name] = value;\n }\n }\n\n return this;\n }\n /**\n * Get the animator's total duration including delay\n * @return {number} Total duration\n * @example\n animator.getTotalDuration();\n */\n public getTotalDuration(): number {\n return this.getActiveDuration(true);\n }\n /**\n * Get the animator's total duration excluding delay\n * @return {number} Total duration excluding delay\n * @example\n animator.getActiveDuration();\n */\n public getActiveDuration(delay?: boolean): number {\n const state = this.state;\n const count = state[ITERATION_COUNT];\n if (count === INFINITE) {\n return Infinity;\n }\n return (delay ? state[DELAY] : 0) + this.getDuration() * count;\n }\n /**\n * Check if the animator has reached the end.\n * @return {boolean} ended\n * @example\n animator.isEnded(); // true or false\n */\n public isEnded(): boolean {\n if (this.state[TICK_TIME] === 0 && this.state[PLAY_STATE] === PAUSED) {\n return true;\n } else if (this.getTime() < this.getActiveDuration()) {\n return false;\n }\n return true;\n }\n /**\n *Check if the animator is paused:\n * @return {boolean} paused\n * @example\n animator.isPaused(); // true or false\n */\n public isPaused(): boolean {\n return this.state[PLAY_STATE] === PAUSED;\n }\n public start(delay: number = this.state[DELAY]): boolean {\n const state = this.state;\n\n state[PLAY_STATE] = RUNNING;\n if (state[TICK_TIME] >= delay) {\n /**\n * This event is fired when play animator.\n * @event Animator#play\n */\n this.trigger(PLAY);\n return true;\n }\n return false;\n }\n /**\n * play animator\n * @return {Animator} An instance itself.\n */\n public play(toTime?: number) {\n const state = this.state;\n const delay = state[DELAY];\n const currentTime = this.getTime();\n\n state[PLAY_STATE] = RUNNING;\n\n if (this.isEnded() && (currentTime === 0 || currentTime >= this.getActiveDuration())) {\n this.setTime(-delay, true);\n }\n\n this.timerId = requestAnimationFrame((time: number) => {\n state[PREV_TIME] = time;\n this.tick(time, toTime);\n });\n this.start();\n return this;\n }\n /**\n * pause animator\n * @return {Animator} An instance itself.\n */\n public pause(): this {\n const state = this.state;\n\n if (state[PLAY_STATE] !== PAUSED) {\n state[PLAY_STATE] = PAUSED;\n /**\n * This event is fired when animator is paused.\n * @event Animator#paused\n */\n this.trigger(PAUSED);\n }\n cancelAnimationFrame(this.timerId);\n return this;\n }\n /**\n * end animator\n * @return {Animator} An instance itself.\n */\n public finish() {\n this.setTime(0);\n this.state[TICK_TIME] = 0;\n this.end();\n return this;\n }\n /**\n * end animator\n * @return {Animator} An instance itself.\n */\n public end() {\n this.pause();\n /**\n * This event is fired when animator is ended.\n * @event Animator#ended\n */\n this.trigger(ENDED);\n return this;\n }\n /**\n * set currentTime\n * @param {Number|String} time - currentTime\n * @return {Animator} An instance itself.\n * @example\n\n animator.setTime(\"from\"); // 0\n animator.setTime(\"to\"); // 100%\n animator.setTime(\"50%\");\n animator.setTime(10);\n animator.getTime() // 10\n */\n public setTime(time: number | string, isTick?: boolean, isParent?: boolean) {\n const activeDuration = this.getActiveDuration();\n const state = this.state;\n const prevTime = state[TICK_TIME];\n const delay = state[DELAY];\n let currentTime = isTick ? (time as number) : this.getUnitTime(time);\n\n state[TICK_TIME] = delay + currentTime;\n if (currentTime < 0) {\n currentTime = 0;\n } else if (currentTime > activeDuration) {\n currentTime = activeDuration;\n }\n state[CURRENT_TIME] = currentTime;\n this.calculate();\n\n if (isTick && !isParent) {\n const tickTime = state[TICK_TIME];\n\n if (prevTime < delay && time >= 0) {\n this.start(0);\n }\n if (tickTime < prevTime || this.isEnded()) {\n this.end();\n return;\n }\n }\n if (this.isDelay()) {\n return this;\n }\n /**\n * This event is fired when the animator updates the time.\n * @event Animator#timeupdate\n * @param {Object} param The object of data to be sent to an event.\n * @param {Number} param.currentTime The total time that the animator is running.\n * @param {Number} param.time The iteration time during duration that the animator is running.\n * @param {Number} param.iterationCount The iteration count that the animator is running.\n */\n this.trigger(TIMEUPDATE, {\n currentTime,\n time: this.getIterationTime(),\n iterationCount: state[ITERATION],\n });\n\n return this;\n }\n /**\n * Get the animator's current time\n * @return {number} current time\n * @example\n animator.getTime();\n */\n public getTime(): number {\n return this.state[CURRENT_TIME];\n }\n public getUnitTime(time: string | number) {\n if (isString(time)) {\n const duration = this.getDuration() || 100;\n\n if (time === \"from\") {\n return 0;\n } else if (time === \"to\") {\n return duration;\n }\n const { unit, value } = splitUnit(time);\n\n if (unit === \"%\") {\n !this.getDuration() && (this.setDuration(duration));\n return toFixed(parseFloat(time) / 100 * duration);\n } else if (unit === \">\") {\n return value + THRESHOLD;\n } else {\n return value;\n }\n } else {\n return toFixed(time);\n }\n }\n /**\n * Check if the current state of animator is delayed.\n * @return {boolean} check delay state\n */\n public isDelay() {\n const state = this.state;\n const delay = state[DELAY];\n const tickTime = state[TICK_TIME];\n\n return delay > 0 && (tickTime < delay);\n }\n public setIteration(iterationCount: number): this {\n const state = this.state;\n const passIterationCount = Math.floor(iterationCount);\n const maxIterationCount = state[ITERATION_COUNT] === INFINITE ? Infinity : state[ITERATION_COUNT];\n\n if (state[ITERATION] < passIterationCount && passIterationCount < maxIterationCount) {\n /**\n * The event is fired when an iteration of an animation ends.\n * @event Animator#iteration\n * @param {Object} param The object of data to be sent to an event.\n * @param {Number} param.currentTime The total time that the animator is running.\n * @param {Number} param.iterationCount The iteration count that the animator is running.\n */\n this.trigger(\"iteration\", {\n currentTime: state[CURRENT_TIME],\n iterationCount: passIterationCount,\n });\n }\n state[ITERATION] = iterationCount;\n return this;\n }\n protected calculate() {\n const state = this.state;\n const iterationCount = state[ITERATION_COUNT];\n const fillMode = state[FILL_MODE];\n const direction = state[DIRECTION];\n const duration = this.getDuration();\n const time = this.getTime();\n const iteration = duration === 0 ? 0 : time / duration;\n let currentIterationTime = duration ? time % duration : 0;\n\n if (!duration) {\n this.setIterationTime(0);\n return this;\n }\n this.setIteration(iteration);\n\n // direction : normal, reverse, alternate, alternate-reverse\n // fillMode : forwards, backwards, both, none\n const isReverse = isDirectionReverse(iteration, iterationCount, direction);\n\n const isFiniteDuration = isFinite(duration);\n if (isFiniteDuration && isReverse) {\n currentIterationTime = duration - currentIterationTime;\n }\n if (isFiniteDuration && iterationCount !== INFINITE) {\n const isForwards = fillMode === \"both\" || fillMode === \"forwards\";\n\n // fill forwards\n if (iteration >= iterationCount) {\n currentIterationTime = duration * (isForwards ? (iterationCount % 1) || 1 : 0);\n isReverse && (currentIterationTime = duration - currentIterationTime);\n }\n }\n this.setIterationTime(currentIterationTime);\n return this;\n }\n private tick(now: number, to?: number) {\n if (this.isPaused()) {\n return;\n }\n const state = this.state;\n const playSpeed = state[PLAY_SPEED];\n const prevTime = state[PREV_TIME];\n const delay = state[DELAY];\n const tickTime = state[TICK_TIME];\n const currentTime = tickTime + Math.min(1000, now - prevTime) / 1000 * playSpeed;\n\n state[PREV_TIME] = now;\n this.setTime(currentTime - delay, true);\n if (to && to * 1000 < now) {\n this.pause();\n }\n if (state[PLAY_STATE] === PAUSED) {\n return;\n }\n\n this.timerId = requestAnimationFrame((time: number) => {\n this.tick(time, to);\n });\n }\n}\n/**\n * Specifies the unique indicator of the animator\n * @method Animator#setId\n * @param {number | string} - String or number of id to be set in the animator\n * @return {Animator} An instance itself.\n */\n/**\n * Specifies the unique indicator of the animator\n * @method Animator#getId\n * @return {number | string} the indicator of the item.\n */\n/**\n * Get a delay for the start of an animation.\n * @method Animator#getDelay\n * @return {number} delay\n */\n/**\n * Set a delay for the start of an animation.\n * @method Animator#setDelay\n * @param {number} delay - delay\n * @return {Animator} An instance itself.\n */\n/**\n * Get fill mode for the item when the animation is not playing (before it starts, after it ends, or both)\n * @method Animator#getFillMode\n * @return {FillModeType} fillMode\n */\n/**\n * Set fill mode for the item when the animation is not playing (before it starts, after it ends, or both)\n * @method Animator#setFillMode\n * @param {FillModeType} fillMode - fillMode\n * @return {Animator} An instance itself.\n */\n/**\n * Get the number of times an animation should be played.\n * @method Animator#getIterationCount\n * @return {IterationCountType} iterationCount\n */\n/**\n * Set the number of times an animation should be played.\n * @method Animator#setIterationCount\n * @param {IterationCountType} iterationCount - iterationCount\n * @return {Animator} An instance itself.\n */\n/**\n * Get whether an animation should be played forwards, backwards or in alternate cycles.\n * @method Animator#getDirection\n * @return {DirectionType} direction\n */\n/**\n * Set whether an animation should be played forwards, backwards or in alternate cycles.\n * @method Animator#setDirection\n * @param {DirectionType} direction - direction\n * @return {Animator} An instance itself.\n */\n/**\n * Get whether the animation is running or paused.\n * @method Animator#getPlayState\n * @return {PlayStateType} playState\n */\n/**\n * Set whether the animation is running or paused.\n * @method Animator#setPlayState\n * @param {PlayStateType} playState - playState\n * @return {Animator} An instance itself.\n */\n/**\n * Get the animator's play speed\n * @method Animator#getPlaySpeed\n * @return {number} playSpeed\n */\n/**\n * Set the animator's play speed\n * @method Animator#setPlaySpeed\n * @param {number} playSpeed - playSpeed\n * @return {Animator} An instance itself.\n */\n/**\n * Get how long an animation should take to complete one cycle.\n * @method Animator#getDuration\n * @return {number} duration\n */\n/**\n * Set how long an animation should take to complete one cycle.\n * @method Animator#setDuration\n * @param {number} duration - duration\n * @return {Animator} An instance itself.\n */\n/**\n * Get the speed curve of an animation.\n * @method Animator#getEasing\n * @return {EasingType} easing\n */\n/**\n * Get the speed curve's name\n * @method Animator#getEasingName\n * @return {string} the curve's name.\n */\n/**\n\t* Get the animator's current iteration time\n\t* @method Animator#getIterationTime\n\t* @return {number} current iteration time\n\t* @example\nanimator.getIterationTime();\n\t*/\n\n// tslint:disable-next-line:interface-name\ninterface Animator {\n setId(id: number | string): this;\n getId(): number | string;\n getIterationTime(): number;\n setIterationTime(time: number): this;\n setDelay(delay: number): this;\n getDelay(): number;\n setFillMode(fillMode: FillModeType): this;\n getFillMode(): FillModeType;\n setIterationCount(iterationCount: IterationCountType): this;\n getIterationCount(): IterationCountType;\n setDirection(direction: DirectionType): this;\n getDirection(): DirectionType;\n setPlayState(playState: PlayStateType): this;\n getPlayState(): PlayStateType;\n setPlaySpeed(playSpeed: number): this;\n getPlaySpeed(): number;\n setDuration(duration: number): this;\n getDuration(): number;\n getEasing(): EasingType;\n getEasingName(): string;\n}\nexport default Animator;\n","import {\n ALIAS, TIMING_FUNCTION, TRANSFORM_NAME, EASING_NAME\n} from \"./consts\";\nimport { isRole, getType, isPropertyObject, getValueByNames, isFixed, getNames, getEasing } from \"./utils\";\nimport { toPropertyObject, splitStyle, toObject } from \"./utils/property\";\nimport {\n isObject, isArray, isString,\n ANIMATION, TRANSFORM, FILTER, PROPERTY, FUNCTION, ARRAY, OBJECT, IObject, isUndefined\n} from \"@daybrush/utils\";\nimport { NameType } from \"./types\";\n\nfunction toInnerProperties(obj: IObject) {\n if (!obj) {\n return \"\";\n }\n const arrObj = [];\n\n for (const name in obj) {\n arrObj.push(`${name.replace(/\\d$/g, \"\")}(${obj[name]})`);\n }\n return arrObj.join(\" \");\n}\n\n/* eslint-disable */\nfunction clone(target: IObject, toValue = false) {\n return merge({}, target, toValue);\n}\nfunction merge(to: IObject, from: IObject, toValue = false) {\n for (const name in from) {\n const value = from[name];\n const type = getType(value);\n\n if (type === PROPERTY) {\n to[name] = toValue ? value.toValue() : value.clone();\n } else if (type === FUNCTION) {\n to[name] = toValue ? getValue([name], value) : value;\n } else if (type === ARRAY) {\n to[name] = value.slice();\n } else if (type === OBJECT) {\n if (isObject(to[name]) && !isPropertyObject(to[name])) {\n merge(to[name], value, toValue);\n } else {\n to[name] = clone(value, toValue);\n }\n } else {\n to[name] = from[name];\n }\n }\n return to;\n}\n/* eslint-enable */\n\nfunction getPropertyName(args: NameType[]) {\n return args[0] in ALIAS ? ALIAS[args[0]] : args;\n}\nfunction getValue(names: NameType[], value: any): any {\n const type = getType(value);\n\n if (type === PROPERTY) {\n return value.toValue();\n } else if (type === FUNCTION) {\n if (names[0] !== TIMING_FUNCTION) {\n return getValue(names, value());\n }\n } else if (type === OBJECT) {\n return clone(value, true);\n }\n return value;\n}\n/**\n* Animation's Frame\n*/\nclass Frame {\n public properties: IObject;\n /**\n * @param - properties\n * @example\n const frame = new Scene.Frame({\n display: \"none\"\n transform: {\n translate: \"50px\",\n scale: \"5, 5\",\n }\n });\n */\n constructor(properties: any = {}) {\n this.properties = {};\n this.set(properties);\n }\n /**\n * get property value\n * @param {...Number|String|PropertyObject} args - property name or value\n * @example\n frame.get(\"display\") // => \"none\", \"block\", ....\n frame.get(\"transform\", \"translate\") // => \"10px,10px\"\n */\n public get(...args: NameType[]) {\n const value = this.raw(...args);\n\n return getValue(getPropertyName(args), value);\n }\n\n public raw(...args: NameType[]) {\n return getValueByNames(getPropertyName(args), this.properties);\n }\n /**\n * remove property value\n * @param {...String} args - property name\n * @return {Frame} An instance itself\n * @example\n frame.remove(\"display\")\n */\n public remove(...args: NameType[]) {\n const params = getPropertyName(args);\n const length = params.length;\n\n if (!length) {\n return this;\n }\n const value = getValueByNames(params, this.properties, length - 1);\n\n if (isObject(value)) {\n delete value[params[length - 1]];\n }\n return this;\n }\n /**\n * set property\n * @param {...Number|String|PropertyObject} args - property names or values\n * @return {Frame} An instance itself\n * @example\n // one parameter\n frame.set({\n display: \"none\",\n transform: {\n translate: \"10px, 10px\",\n scale: \"1\",\n },\n filter: {\n brightness: \"50%\",\n grayscale: \"100%\"\n }\n });\n\n // two parameters\n frame.set(\"transform\", {\n translate: \"10px, 10px\",\n scale: \"1\",\n });\n\n // three parameters\n frame.set(\"transform\", \"translate\", \"50px\");\n */\n public set(...args: any[]) {\n const self = this;\n const length = args.length;\n const params = args.slice(0, -1);\n const value = args[length - 1];\n const firstParam = params[0];\n\n if (length === 1 && value instanceof Frame) {\n self.merge(value);\n } else if (firstParam in ALIAS) {\n self._set(ALIAS[firstParam], value);\n } else if (length === 2 && isArray(firstParam)) {\n self._set(firstParam, value);\n } else if (isPropertyObject(value)) {\n if (isRole(params)) {\n self.set(...params, toObject(value));\n } else {\n self._set(params, value);\n }\n } else if (isArray(value)) {\n self._set(params, value);\n } else if (isObject(value)) {\n if (!self.has(...params) && isRole(params)) {\n self._set(params, {});\n }\n for (const name in value) {\n self.set(...params, name, value[name]);\n }\n } else if (isString(value)) {\n if (isRole(params, true)) {\n if (isFixed(params) || !isRole(params)) {\n this._set(params, value);\n } else {\n const obj = toPropertyObject(value);\n\n if (isObject(obj)) {\n self.set(...params, obj);\n }\n }\n return this;\n } else {\n const { styles, length: stylesLength } = splitStyle(value);\n\n for (const name in styles) {\n self.set(...params, name, styles[name]);\n }\n if (stylesLength) {\n return this;\n }\n }\n self._set(params, value);\n } else {\n self._set(params, value);\n }\n return self;\n }\n /**\n * Gets the names of properties.\n * @return the names of properties.\n * @example\n // one parameter\n frame.set({\n display: \"none\",\n transform: {\n translate: \"10px, 10px\",\n scale: \"1\",\n },\n });\n\n // [[\"display\"], [\"transform\", \"translate\"], [\"transform\", \"scale\"]]\n console.log(frame.getNames());\n */\n public getNames(): string[][] {\n return getNames(this.properties, []);\n }\n /**\n * check that has property.\n * @param {...String} args - property name\n * @example\n frame.has(\"property\", \"display\") // => true or false\n */\n public has(...args: NameType[]) {\n const params = getPropertyName(args);\n const length = params.length;\n\n if (!length) {\n return false;\n }\n return !isUndefined(getValueByNames(params, this.properties, length));\n }\n /**\n * clone frame.\n * @return {Frame} An instance of clone\n * @example\n frame.clone();\n */\n public clone() {\n const frame = new Frame();\n\n return frame.merge(this);\n }\n /**\n * merge one frame to other frame.\n * @param - target frame.\n * @return {Frame} An instance itself\n * @example\n frame.merge(frame2);\n */\n public merge(frame: Frame) {\n const properties = this.properties;\n const frameProperties = frame.properties;\n\n if (frameProperties) {\n merge(properties, frameProperties);\n }\n return this;\n }\n /**\n * Specifies an css object that coverted the frame.\n * @return {object} cssObject\n */\n public toCSSObject() {\n const properties = this.get();\n const cssObject: IObject = {};\n\n for (const name in properties) {\n if (isRole([name], true)) {\n continue;\n }\n const value = properties[name];\n\n if (name === TIMING_FUNCTION) {\n cssObject[TIMING_FUNCTION.replace(\"animation\", ANIMATION)] =\n (isString(value) ? value : value[EASING_NAME]) || \"initial\";\n } else {\n cssObject[name] = value;\n }\n }\n const transform = toInnerProperties(properties[TRANSFORM_NAME]);\n const filter = toInnerProperties(properties.filter);\n\n TRANSFORM && transform && (cssObject[TRANSFORM] = transform);\n FILTER && filter && (cssObject[FILTER] = filter);\n return cssObject;\n }\n /**\n * Specifies an css text that coverted the frame.\n * @return {string} cssText\n */\n public toCSS() {\n const cssObject = this.toCSSObject();\n const cssArray = [];\n\n for (const name in cssObject) {\n cssArray.push(`${name}:${cssObject[name]};`);\n }\n return cssArray.join(\"\");\n }\n /**\n * Remove All Properties\n * @return {Frame} An instance itself\n */\n public clear() {\n this.properties = {};\n return this;\n }\n private _set(args: NameType[], value: any) {\n let properties = this.properties;\n const length = args.length;\n\n for (let i = 0; i < length - 1; ++i) {\n const name = args[i];\n\n !(name in properties) && (properties[name] = {});\n properties = properties[name];\n }\n if (!length) {\n return;\n }\n if (length === 1 && args[0] === TIMING_FUNCTION) {\n properties[TIMING_FUNCTION] = getEasing(value);\n } else {\n const lastParam = args[length - 1];\n properties[lastParam] = isString(value) && !isFixed(args)\n ? toPropertyObject(value, lastParam)\n : value;\n }\n }\n}\nexport default Frame;\n","\nimport PropertyObject from \"../PropertyObject\";\nimport { getType } from \"../utils\";\nimport { toPropertyObject } from \"./property\";\nimport { splitUnit, PROPERTY, FUNCTION, ARRAY, dot as dotNumber } from \"@daybrush/utils\";\nimport { EasingType } from \"../types\";\n\nfunction dotArray(a1: any[], a2: any, b1: number, b2: number): any {\n const length = a2.length;\n\n return a1.map((v1, i) => {\n if (i >= length) {\n return v1;\n } else {\n return dot(v1, a2[i], b1, b2);\n }\n });\n}\n\nfunction dotColor(color1: PropertyObject, color2: PropertyObject, b1: number, b2: number) {\n // convert array to PropertyObject(type=color)\n const value1 = color1.value;\n const value2 = color2.value;\n // If the model name is not same, the inner product is impossible.\n const model1 = color1.model;\n const model2 = color2.model;\n\n if (model1 !== model2) {\n // It is recognized as a string.\n return dot(color1.toValue(), color2.toValue(), b1, b2);\n }\n if (value1.length === 3) {\n value1[3] = 1;\n }\n if (value2.length === 3) {\n value2[3] = 1;\n }\n const v = dotArray(value1, value2, b1, b2);\n const colorModel = model1;\n\n for (let i = 0; i < 3; ++i) {\n v[i] = parseInt(v[i], 10);\n }\n const object = new PropertyObject(v, {\n type: \"color\",\n model: colorModel,\n prefix: `${colorModel}(`,\n suffix: \")\",\n });\n\n return object;\n}\n\nfunction dotObject(a1: PropertyObject, a2: PropertyObject, b1: number, b2: number) {\n const a1Type = a1.type;\n\n if (a1Type === \"color\") {\n return dotColor(a1, a2, b1, b2);\n }\n const value1 = a1.value;\n const value2 = a2.value;\n const arr = dotArray(value1, value2, b1, b2);\n\n return new PropertyObject(arr, {\n type: a1Type,\n separator: a1.separator || a2.separator,\n prefix: a1.prefix || a2.prefix,\n suffix: a1.suffix || a2.suffix,\n model: a1.model || a2.model,\n });\n}\n/**\n* The dot product of a1 and a2 for the b1 and b2.\n* @memberof Dot\n* @function dot\n* @param {String|Number|PropertyObject} a1 value1\n* @param {String|Number|PropertyObject} a2 value2\n* @param {Number} b1 b1 ratio\n* @param {Number} b2 b2 ratio\n* @return {String} Not Array, Not Separator, Only Number & Unit\n* @return {PropertyObject} Array with Separator.\n* @example\ndot(1, 3, 0.3, 0.7);\n// => 1.6\n*/\nexport function dot(a1: any, a2: any, b1: number, b2: number): any {\n if (b2 === 0) {\n return a2;\n } else if (b1 === 0 || b1 + b2 === 0) {\n // prevent division by zero.\n return a1;\n }\n // dot Object\n\n const type1 = getType(a1);\n const type2 = getType(a2);\n const isFunction1 = type1 === FUNCTION;\n const isFunction2 = type2 === FUNCTION;\n\n if (isFunction1 || isFunction2) {\n return () => {\n return dot(isFunction1 ? toPropertyObject(a1()) : a1, isFunction2 ? toPropertyObject(a2()) : a2, b1, b2);\n };\n } else if (type1 === type2) {\n if (type1 === PROPERTY) {\n return dotObject(a1, a2, b1, b2);\n } else if (type1 === ARRAY) {\n return dotArray(a1, a2, b1, b2);\n } else if (type1 !== \"value\") {\n return a1;\n }\n } else {\n return a1;\n }\n const v1 = splitUnit(`${a1}`);\n const v2 = splitUnit(`${a2}`);\n let v;\n\n // 숫자가 아닐경우 첫번째 값을 반환 b2가 0일경우 두번째 값을 반환\n if (isNaN(v1.value) || isNaN(v2.value)) {\n return a1;\n } else {\n v = dotNumber(v1.value, v2.value, b1, b2);\n }\n const prefix = v1.prefix || v2.prefix;\n const unit = v1.unit || v2.unit;\n\n if (!prefix && !unit) {\n return v;\n }\n return prefix + v + unit;\n}\n\nexport function dotValue(\n time: number,\n prevTime: number,\n nextTime: number,\n prevValue: any,\n nextValue: any,\n easing?: EasingType) {\n if (time === prevTime) {\n return prevValue;\n } else if (time === nextTime) {\n return nextValue;\n } else if (!easing) {\n return dot(prevValue, nextValue, time - prevTime, nextTime - time);\n }\n const ratio = easing((time - prevTime) / (nextTime - prevTime));\n const value = dot(prevValue, nextValue, ratio, 1 - ratio);\n\n return value;\n}\n","import Animator, { isDirectionReverse } from \"./Animator\";\nimport Frame from \"./Frame\";\nimport {\n toFixed,\n isFixed,\n playCSS,\n toId,\n exportCSS,\n getRealId,\n makeId,\n isPausedCSS,\n isRole,\n isInProperties,\n getValueByNames,\n isEndedCSS,\n setPlayCSS,\n getNames,\n updateFrame,\n} from \"./utils\";\nimport { dotValue } from \"./utils/dot\";\nimport {\n START_ANIMATION,\n PREFIX, THRESHOLD,\n TIMING_FUNCTION, ALTERNATE, ALTERNATE_REVERSE, INFINITE,\n REVERSE, EASING, FILL_MODE, DIRECTION, ITERATION_COUNT,\n EASING_NAME, DELAY, PLAY_SPEED, DURATION, PAUSE_ANIMATION, DATA_SCENE_ID, SELECTOR, ROLES, CURRENT_TIME\n} from \"./consts\";\nimport {\n isObject, isArray, isUndefined, decamelize,\n ANIMATION, fromCSS, addClass, removeClass, hasClass,\n KEYFRAMES, requestAnimationFrame, isFunction,\n IObject, $, splitComma, toArray, isString, IArrayFormat,\n dot as dotNumber,\n find,\n findIndex,\n} from \"@daybrush/utils\";\nimport {\n NameType, RoleObject, AnimateElement, AnimatorState,\n SceneItemState, SceneItemOptions, EasingType, PlayCondition, DirectionType\n} from \"./types\";\n\nfunction getNearTimeIndex(times: number[], time: number) {\n const length = times.length;\n\n for (let i = 0; i < length; ++i) {\n if (times[i] === time) {\n return [i, i];\n } else if (times[i] > time) {\n return [i > 0 ? i - 1 : 0, i];\n }\n }\n return [length - 1, length - 1];\n}\nfunction makeAnimationProperties(properties: object) {\n const cssArray = [];\n\n for (const name in properties) {\n cssArray.push(`${ANIMATION}-${decamelize(name)}:${properties[name]};`);\n }\n return cssArray.join(\"\");\n}\nfunction addTime(times: number[], time: number) {\n const length = times.length;\n for (let i = 0; i < length; ++i) {\n if (time < times[i]) {\n times.splice(i, 0, time);\n return;\n }\n }\n times[length] = time;\n}\nfunction addEntry(entries: number[][], time: number, keytime: number) {\n const prevEntry = entries[entries.length - 1];\n\n (!prevEntry || prevEntry[0] !== time || prevEntry[1] !== keytime) &&\n entries.push([toFixed(time), toFixed(keytime)]);\n}\nexport function getEntries(times: number[], states: AnimatorState[]) {\n let entries = times.map(time => ([time, time]));\n let nextEntries = [];\n\n states.forEach(state => {\n const iterationCount = state[ITERATION_COUNT] as number;\n const delay = state[DELAY];\n const playSpeed = state[PLAY_SPEED];\n const direction = state[DIRECTION];\n const intCount = Math.ceil(iterationCount);\n const currentDuration = entries[entries.length - 1][0];\n const length = entries.length;\n const lastTime = currentDuration * iterationCount;\n\n for (let i = 0; i < intCount; ++i) {\n const isReverse =\n direction === REVERSE ||\n direction === ALTERNATE && i % 2 ||\n direction === ALTERNATE_REVERSE && !(i % 2);\n\n for (let j = 0; j < length; ++j) {\n const entry = entries[isReverse ? length - j - 1 : j];\n const time = entry[1];\n const currentTime = currentDuration * i + (isReverse ? currentDuration - entry[0] : entry[0]);\n const prevEntry = entries[isReverse ? length - j : j - 1];\n\n if (currentTime > lastTime) {\n if (j !== 0) {\n const prevTime = currentDuration * i +\n (isReverse ? currentDuration - prevEntry[0] : prevEntry[0]);\n const divideTime = dotNumber(prevEntry[1], time, lastTime - prevTime, currentTime - lastTime);\n\n addEntry(nextEntries, (delay + currentDuration * iterationCount) / playSpeed, divideTime);\n }\n break;\n } else if (\n currentTime === lastTime\n && nextEntries.length\n && nextEntries[nextEntries.length - 1][0] === lastTime + delay\n ) {\n break;\n }\n addEntry(nextEntries, (delay + currentTime) / playSpeed, time);\n }\n }\n // delay time\n delay && nextEntries.unshift([0, nextEntries[0][1]]);\n\n entries = nextEntries;\n nextEntries = [];\n });\n\n return entries;\n}\n/**\n* manage Frame Keyframes and play keyframes.\n* @extends Animator\n* @example\nconst item = new SceneItem({\n\t0: {\n\t\tdisplay: \"none\",\n\t},\n\t1: {\n\t\tdisplay: \"block\",\n\t\topacity: 0,\n\t},\n\t2: {\n\t\topacity: 1,\n\t}\n});\n*/\nclass SceneItem extends Animator {\n public times: number[] = [];\n public items: IObject = {};\n public names: RoleObject = {};\n public elements: AnimateElement[] = [];\n public temp: Frame;\n private needUpdate: boolean = true;\n private target: any;\n private targetFunc: (frame: Frame) => void;\n\n /**\n * @param - properties\n * @param - options\n * @example\n const item = new SceneItem({\n 0: {\n display: \"none\",\n },\n 1: {\n display: \"block\",\n opacity: 0,\n },\n 2: {\n opacity: 1,\n }\n });\n */\n constructor(properties?: any, options?: Partial) {\n super();\n this.load(properties, options);\n }\n public getDuration() {\n const times = this.times;\n const length = times.length;\n\n return (length === 0 ? 0 : times[length - 1]) || this.state[DURATION];\n }\n /**\n * get size of list\n * @return {Number} length of list\n */\n public size() {\n return this.times.length;\n }\n public setDuration(duration: number) {\n if (!duration) {\n return this;\n }\n const originalDuration = this.getDuration();\n\n if (originalDuration > 0) {\n const ratio = duration / originalDuration;\n const { times, items } = this;\n const obj: IObject = {};\n\n this.times = times.map(time => {\n const time2 = toFixed(time * ratio);\n\n obj[time2] = items[time];\n\n return time2;\n });\n this.items = obj;\n } else {\n this.newFrame(duration);\n }\n return this;\n }\n public setId(id?: number | string) {\n const state = this.state;\n const elements = this.elements;\n const length = elements.length;\n\n state.id = id || makeId(!!length);\n\n if (length && !state[SELECTOR]) {\n const sceneId = toId(this.getId());\n\n state[SELECTOR] = `[${DATA_SCENE_ID}=\"${sceneId}\"]`;\n elements.forEach(element => {\n element.setAttribute(DATA_SCENE_ID, sceneId);\n });\n }\n return this;\n }\n\n /**\n * Set properties to the sceneItem at that time\n * @param {Number} time - time\n * @param {...String|Object} [properties] - property names or values\n * @return {SceneItem} An instance itself\n * @example\n item.set(0, \"a\", \"b\") // item.getFrame(0).set(\"a\", \"b\")\n console.log(item.get(0, \"a\")); // \"b\"\n */\n public set(time: any, ...args: any[]) {\n if (time instanceof SceneItem) {\n return this.set(0, time);\n } else if (isArray(time)) {\n const length = time.length;\n\n for (let i = 0; i < length; ++i) {\n const t = length === 1 ? 0 : this.getUnitTime(`${i / (length - 1) * 100}%`);\n\n this.set(t, time[i]);\n }\n } else if (isObject(time)) {\n for (const t in time) {\n const value = time[t];\n\n splitComma(t).forEach(eachTime => {\n const realTime = this.getUnitTime(eachTime);\n\n if (isNaN(realTime)) {\n getNames(value, [eachTime]).forEach(names => {\n const innerValue = getValueByNames(names.slice(1), value);\n const arr = isArray(innerValue) ?\n innerValue : [getValueByNames(names, this.target), innerValue];\n const length = arr.length;\n\n for (let i = 0; i < length; ++i) {\n this.newFrame(`${i / (length - 1) * 100}%`).set(...names, arr[i]);\n }\n });\n } else {\n this.set(realTime, value);\n }\n });\n }\n } else if (!isUndefined(time)) {\n const value = args[0];\n\n splitComma(time + \"\").forEach(eachTime => {\n const realTime = this.getUnitTime(eachTime);\n\n if (value instanceof SceneItem) {\n const delay = value.getDelay();\n const frames = value.toObject(!this.hasFrame(realTime + delay));\n const duration = value.getDuration();\n const direction = value.getDirection();\n const isReverse = direction.indexOf(\"reverse\") > -1;\n\n for (const frameTime in frames) {\n const nextTime = isReverse ? duration - parseFloat(frameTime) : parseFloat(frameTime);\n this.set(realTime + nextTime, frames[frameTime]);\n }\n } else if (args.length === 1 && isArray(value)) {\n value.forEach((item: any) => {\n this.set(realTime, item);\n });\n } else {\n const frame = this.newFrame(realTime);\n\n frame.set(...args);\n }\n });\n }\n this.needUpdate = true;\n return this;\n }\n /**\n * Get properties of the sceneItem at that time\n * @param {Number} time - time\n * @param {...String|Object} args property's name or properties\n * @return {Number|String|PropertyObejct} property value\n * @example\n item.get(0, \"a\"); // item.getFrame(0).get(\"a\");\n item.get(0, \"transform\", \"translate\"); // item.getFrame(0).get(\"transform\", \"translate\");\n */\n public get(time: string | number, ...args: NameType[]) {\n const frame = this.getFrame(time);\n\n return frame && frame.get(...args);\n }\n public remove(time: string | number, ...args: any[]): this;\n /**\n * remove properties to the sceneItem at that time\n * @param {Number} time - time\n * @param {...String|Object} [properties] - property names or values\n * @return {SceneItem} An instance itself\n * @example\n item.remove(0, \"a\");\n */\n public remove(time: string | number, ...args: NameType[]) {\n if (args.length) {\n const frame = this.getFrame(time);\n\n frame && frame.remove(...args);\n } else {\n this.removeFrame(time);\n }\n this.needUpdate = true;\n return this;\n }\n /**\n * Append the item or object at the last time.\n * @param - the scene item or item object\n * @return An instance itself\n * @example\n item.append(new SceneItem({\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n }));\n item.append({\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n });\n item.set(item.getDuration(), {\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n });\n */\n public append(item: SceneItem | IObject) {\n if (item instanceof SceneItem) {\n this.set(this.getDuration(), item);\n } else {\n this.append(new SceneItem(item));\n }\n return this;\n }\n /**\n * Push the front frames for the time and prepend the scene item or item object.\n * @param - the scene item or item object\n * @return An instance itself\n */\n public prepend(item: SceneItem | IObject) {\n if (item instanceof SceneItem) {\n const unshiftTime = item.getDuration() + item.getDelay();\n const firstFrame = this.getFrame(0);\n // remove first frame\n this.removeFrame(0);\n this.unshift(unshiftTime);\n this.set(0, item);\n this.set(unshiftTime + THRESHOLD, firstFrame);\n } else {\n this.prepend(new SceneItem(item));\n }\n return this;\n }\n /**\n * Push out the amount of time.\n * @param - time to push\n * @example\n item.get(0); // frame 0\n item.unshift(3);\n item.get(3) // frame 0\n */\n public unshift(time: number) {\n const { times, items } = this;\n const obj: IObject = {};\n\n this.times = times.map(t => {\n const time2 = toFixed(time + t);\n\n obj[time2] = items[t];\n return time2;\n });\n this.items = obj;\n return this;\n }\n /**\n * Get the frames in the item in object form.\n * @return {}\n * @example\n item.toObject();\n // {0: {display: \"none\"}, 1: {display: \"block\"}}\n */\n public toObject(isStartZero = true): IObject {\n const obj: IObject = {};\n const delay = this.getDelay();\n\n this.forEach((frame: Frame, time: number) => {\n obj[(!time && !isStartZero ? THRESHOLD : 0) + delay + time] = frame.clone();\n });\n return obj;\n }\n /**\n * Specifies an element to synchronize items' keyframes.\n * @param {string} selectors - Selectors to find elements in items.\n * @return {SceneItem} An instance itself\n * @example\nitem.setSelector(\"#id.class\");\n */\n public setSelector(target: string | boolean | ((id: number | string) => string)) {\n if (isFunction(target)) {\n this.setElement(target(this.getId()));\n } else {\n this.setElement(target);\n }\n return this;\n }\n /**\n * Get the elements connected to SceneItem.\n */\n public getElements(): AnimateElement[] {\n return this.elements;\n }\n /**\n * Specifies an element to synchronize item's keyframes.\n * @param - elements to synchronize item's keyframes.\n * @param - Make sure that you have peusdo.\n * @return {SceneItem} An instance itself\n * @example\nitem.setElement(document.querySelector(\"#id.class\"));\nitem.setElement(document.querySelectorAll(\".class\"));\n */\n public setElements(target: boolean | string | AnimateElement | IArrayFormat): this {\n return this.setElement(target);\n }\n /**\n * Specifies an element to synchronize item's keyframes.\n * @param - elements to synchronize item's keyframes.\n * @param - Make sure that you have peusdo.\n * @return {SceneItem} An instance itself\n * @example\nitem.setElement(document.querySelector(\"#id.class\"));\nitem.setElement(document.querySelectorAll(\".class\"));\n */\n public setElement(target: boolean | string | AnimateElement | IArrayFormat) {\n const state = this.state;\n let elements: AnimateElement[] = [];\n\n if (!target) {\n return this;\n } else if (target === true || isString(target)) {\n const selector = target === true ? `${state.id}` : target;\n const matches = /([\\s\\S]+)(:+[a-zA-Z]+)$/g.exec(selector);\n\n elements = toArray($(matches ? matches[1] : selector, true));\n state[SELECTOR] = selector;\n } else {\n elements = (target instanceof Element) ? [target] : toArray(target);\n }\n if (!elements.length) {\n return this;\n }\n this.elements = elements;\n this.setId(this.getId());\n this.target = elements[0].style;\n this.targetFunc = (frame: Frame) => {\n const attributes = frame.get(\"attribute\");\n\n if (attributes) {\n for (const name in attributes) {\n elements.forEach(el => {\n el.setAttribute(name, attributes[name]);\n });\n }\n }\n if (frame.has(\"html\")) {\n const html = frame.get(\"html\");\n\n elements.forEach(el => {\n el.innerHTML = html;\n });\n }\n const cssText = frame.toCSS();\n\n if (state.cssText !== cssText) {\n state.cssText = cssText;\n\n elements.forEach(el => {\n el.style.cssText += cssText;\n });\n return frame;\n }\n };\n return this;\n }\n public setTarget(target: any): this {\n this.target = target;\n this.targetFunc = (frame: Frame) => {\n const obj = frame.get();\n\n for (const name in obj) {\n target[name] = obj[name];\n }\n };\n return this;\n }\n /**\n * add css styles of items's element to the frame at that time.\n * @param {Array} properties - elements to synchronize item's keyframes.\n * @return {SceneItem} An instance itself\n * @example\n item.setElement(document.querySelector(\"#id.class\"));\n item.setCSS(0, [\"opacity\"]);\n item.setCSS(0, [\"opacity\", \"width\", \"height\"]);\n */\n public setCSS(time: number, properties: string[]) {\n this.set(time, fromCSS(this.elements, properties));\n return this;\n }\n public setTime(time: number | string, isTick?: boolean, isParent?: boolean, parentEasing?: EasingType) {\n super.setTime(time, isTick, isParent);\n\n const iterationTime = this.getIterationTime();\n const easing = this.getEasing() || parentEasing;\n const frame = this.getNowFrame(iterationTime, easing);\n const currentTime = this.getTime();\n\n this.temp = frame;\n /**\n * This event is fired when timeupdate and animate.\n * @event SceneItem#animate\n * @param {Number} param.currentTime The total time that the animator is running.\n * @param {Number} param.time The iteration time during duration that the animator is running.\n * @param {Frame} param.frame frame of that time.\n */\n this.trigger(\"animate\", {\n frame,\n currentTime,\n time: iterationTime,\n });\n this.targetFunc && this.targetFunc(frame);\n return this;\n }\n /**\n * update property names used in frames.\n * @return {SceneItem} An instance itself\n * @example\n item.update();\n */\n public update() {\n const names = {};\n this.forEach(frame => {\n updateFrame(names, frame.properties);\n });\n this.names = names;\n this.needUpdate = false;\n return this;\n }\n /**\n * Create and add a frame to the sceneItem at that time\n * @param {Number} time - frame's time\n * @return {Frame} Created frame.\n * @example\n item.newFrame(time);\n */\n public newFrame(time: string | number) {\n let frame = this.getFrame(time);\n\n if (frame) {\n return frame;\n }\n frame = new Frame();\n this.setFrame(time, frame);\n return frame;\n }\n /**\n * Add a frame to the sceneItem at that time\n * @param {Number} time - frame's time\n * @return {SceneItem} An instance itself\n * @example\n item.setFrame(time, frame);\n */\n public setFrame(time: string | number, frame: Frame) {\n const realTime = this.getUnitTime(time);\n\n this.items[realTime] = frame;\n addTime(this.times, realTime);\n this.needUpdate = true;\n return this;\n }\n public getFrame(time: number | string, ...names: any[]): Frame;\n /**\n * get sceneItem's frame at that time\n * @param {Number} time - frame's time\n * @return {Frame} sceneItem's frame at that time\n * @example\n const frame = item.getFrame(time);\n */\n public getFrame(time: number | string) {\n return this.items[this.getUnitTime(time)];\n }\n public removeFrame(time: number | string, ...names: any[]): this;\n /**\n * remove sceneItem's frame at that time\n * @param - frame's time\n * @return {SceneItem} An instance itself\n * @example\n item.removeFrame(time);\n */\n public removeFrame(time: number | string) {\n const realTime = this.getUnitTime(time);\n const items = this.items;\n const index = this.times.indexOf(realTime);\n\n delete items[realTime];\n\n // remove time\n if (index > -1) {\n this.times.splice(index, 1);\n }\n this.needUpdate = true;\n return this;\n }\n /**\n * check if the item has a frame at that time\n * @param {Number} time - frame's time\n * @return {Boolean} true: the item has a frame // false: not\n * @example\n if (item.hasFrame(10)) {\n // has\n } else {\n // not\n }\n */\n public hasFrame(time: number | string) {\n return this.getUnitTime(time) in this.items;\n }\n /**\n * Check if keyframes has propery's name\n * @param - property's time\n * @return {boolean} true: if has property, false: not\n * @example\n item.hasName([\"transform\", \"translate\"]); // true or not\n */\n public hasName(args: string[]) {\n this.needUpdate && this.update();\n return isInProperties(this.names, args, true);\n }\n /**\n * merge frame of the previous time at the next time.\n * @param - The time of the frame to merge\n * @param - The target frame\n * @return {SceneItem} An instance itself\n * @example\n // getFrame(1) contains getFrame(0)\n item.merge(0, 1);\n */\n public mergeFrame(time: number | string, frame: Frame) {\n if (frame) {\n const toFrame = this.newFrame(time);\n\n toFrame.merge(frame);\n }\n return this;\n }\n /**\n * Get frame of the current time\n * @param {Number} time - the current time\n * @param {function} easing - the speed curve of an animation\n * @return {Frame} frame of the current time\n * @example\n let item = new SceneItem({\n 0: {\n display: \"none\",\n },\n 1: {\n display: \"block\",\n opacity: 0,\n },\n 2: {\n opacity: 1,\n }\n });\n // opacity: 0.7; display:\"block\";\n const frame = item.getNowFrame(1.7);\n */\n public getNowFrame(time: number, easing?: EasingType, isAccurate?: boolean) {\n this.needUpdate && this.update();\n const frame = new Frame();\n const [left, right] = getNearTimeIndex(this.times, time);\n let realEasing = this.getEasing() || easing;\n let nameObject = this.names;\n\n if (this.hasName([TIMING_FUNCTION])) {\n const nowEasing = this.getNowValue(time, [TIMING_FUNCTION], left, right, false, 0, true);\n\n isFunction(nowEasing) && (realEasing = nowEasing);\n }\n if (isAccurate) {\n const prevFrame = this.getFrame(time);\n const prevNames = updateFrame({}, prevFrame.properties);\n\n for (const name in ROLES) {\n if (name in prevNames) {\n prevNames[name] = nameObject[name];\n }\n }\n nameObject = prevNames;\n }\n const names = getNames(nameObject, []);\n\n names.forEach(properties => {\n const value = this.getNowValue(time, properties, left, right, isAccurate, realEasing, isFixed(properties));\n\n if (isUndefined(value)) {\n return;\n }\n frame.set(properties, value);\n });\n return frame;\n }\n public load(properties: any = {}, options = properties.options) {\n options && this.setOptions(options);\n\n if (isArray(properties)) {\n this.set(properties);\n } else if (properties.keyframes) {\n this.set(properties.keyframes);\n } else {\n for (const time in properties) {\n if (time !== \"options\") {\n this.set({\n [time]: properties[time],\n });\n }\n }\n }\n if (options && options[DURATION]) {\n this.setDuration(options[DURATION]);\n }\n return this;\n }\n /**\n * clone SceneItem.\n * @return {SceneItem} An instance of clone\n * @example\n * item.clone();\n */\n public clone() {\n const item = new SceneItem();\n\n item.setOptions(this.state);\n this.forEach((frame: Frame, time: number) => {\n item.setFrame(time, frame.clone());\n });\n return item;\n }\n /**\n * executes a provided function once for each scene item.\n * @param - Function to execute for each element, taking three arguments\n * @return {Keyframes} An instance itself\n */\n public forEach(callback: (item: Frame, time: number, items: IObject) => void) {\n const times = this.times;\n const items = this.items;\n\n times.forEach(time => {\n callback(items[time], time, items);\n });\n return this;\n }\n public setOptions(options: Partial = {}) {\n super.setOptions(options);\n const { id, selector, elements, element, target } = options;\n\n id && this.setId(id);\n if (target) {\n this.setTarget(target);\n } else if (selector) {\n this.setSelector(selector);\n } else if (elements || element) {\n this.setElement(elements || element);\n }\n return this;\n }\n public toCSS(\n playCondition: PlayCondition = { className: START_ANIMATION },\n parentDuration = this.getDuration(), states: AnimatorState[] = []) {\n const itemState = this.state;\n const selector = itemState[SELECTOR];\n\n if (!selector) {\n return \"\";\n }\n const originalDuration = this.getDuration();\n itemState[DURATION] = originalDuration;\n states.push(itemState);\n\n const reversedStates = toArray(states).reverse();\n const id = toId(getRealId(this));\n const superParent = states[0];\n const infiniteIndex = findIndex(reversedStates, state => {\n return state[ITERATION_COUNT] === INFINITE || !isFinite(state[DURATION]);\n }, states.length - 1);\n const finiteStates = reversedStates.slice(0, infiniteIndex);\n const duration = parentDuration || finiteStates.reduce((prev, cur) => {\n return (cur[DELAY] + prev * (cur[ITERATION_COUNT] as number)) / cur[PLAY_SPEED];\n }, originalDuration);\n const delay = reversedStates.slice(infiniteIndex).reduce((prev, cur) => {\n return (prev + cur[DELAY]) / cur[PLAY_SPEED];\n }, 0);\n const easingName = find(reversedStates, state => (state[EASING] && state[EASING_NAME]), itemState)[EASING_NAME];\n const iterationCount = reversedStates[infiniteIndex][ITERATION_COUNT];\n const fillMode = superParent[FILL_MODE];\n const direction = reversedStates[infiniteIndex][DIRECTION];\n const cssText = makeAnimationProperties({\n fillMode,\n direction,\n iterationCount,\n delay: `${delay}s`,\n name: `${PREFIX}KEYFRAMES_${id}`,\n duration: `${duration / superParent[PLAY_SPEED]}s`,\n timingFunction: easingName,\n });\n const selectors = splitComma(selector).map(sel => {\n const matches = /([\\s\\S]+)(:+[a-zA-Z]+)$/g.exec(sel);\n\n if (matches) {\n return [matches[1], matches[2]];\n } else {\n return [sel, \"\"];\n }\n });\n const className = playCondition.className;\n const selectorCallback = playCondition.selector;\n const preselector = isFunction(selectorCallback) ? selectorCallback(this, selector) : selectorCallback;\n\n return `\n ${preselector || selectors.map(([sel, peusdo]) => `${sel}.${className}${peusdo}`)} {${cssText}}\n ${selectors.map(([sel, peusdo]) => `${sel}.${PAUSE_ANIMATION}${peusdo}`)} {${ANIMATION}-play-state: paused;}\n @${KEYFRAMES} ${PREFIX}KEYFRAMES_${id}{${this._toKeyframes(duration, finiteStates, direction)}}`;\n }\n /**\n * Export the CSS of the items to the style.\n * @param - Add a selector or className to play.\n * @return {SceneItem} An instance itself\n */\n public exportCSS(\n playCondition?: PlayCondition,\n duration?: number, options?: AnimatorState[]) {\n if (!this.elements.length) {\n return \"\";\n }\n const css = this.toCSS(playCondition, duration, options);\n const isParent = options && !isUndefined(options[ITERATION_COUNT]);\n\n !isParent && exportCSS(getRealId(this), css);\n return this;\n }\n public pause() {\n super.pause();\n isPausedCSS(this) && this.pauseCSS();\n return this;\n }\n public pauseCSS() {\n this.elements.forEach(element => {\n addClass(element, PAUSE_ANIMATION);\n });\n return this;\n }\n public endCSS() {\n this.elements.forEach(element => {\n removeClass(element, PAUSE_ANIMATION);\n removeClass(element, START_ANIMATION);\n });\n setPlayCSS(this, false);\n return this;\n }\n public end() {\n isEndedCSS(this) && this.endCSS();\n super.end();\n return this;\n }\n /**\n * Play using the css animation and keyframes.\n * @param - Check if you want to export css.\n * @param [playClassName=\"startAnimation\"] - Add a class name to play.\n * @param - The shorthand properties for six of the animation properties.\n * @see {@link https://www.w3schools.com/cssref/css3_pr_animation.asp}\n * @example\n item.playCSS();\n item.playCSS(false, \"startAnimation\", {\n direction: \"reverse\",\n fillMode: \"forwards\",\n });\n */\n public playCSS(isExportCSS = true, playClassName?: string, properties: object = {}) {\n playCSS(this, isExportCSS, playClassName, properties);\n return this;\n }\n public addPlayClass(isPaused: boolean, playClassName?: string, properties: object = {}) {\n const elements = this.elements;\n const length = elements.length;\n const cssText = makeAnimationProperties(properties);\n\n if (!length) {\n return;\n }\n if (isPaused) {\n elements.forEach(element => {\n removeClass(element, PAUSE_ANIMATION);\n });\n } else {\n elements.forEach(element => {\n element.style.cssText += cssText;\n if (hasClass(element, START_ANIMATION)) {\n removeClass(element, START_ANIMATION);\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n addClass(element, START_ANIMATION);\n });\n });\n } else {\n addClass(element, START_ANIMATION);\n }\n });\n }\n return elements[0];\n }\n /**\n * Remove All Frames\n * @return {SceneItem} An instance itself\n */\n public clear() {\n this.times = [];\n this.items = {};\n this.names = {};\n this.temp = null;\n this.needUpdate = true;\n return this;\n }\n public getNowValue(\n time: number,\n properties: string[],\n left?: number,\n right?: number,\n isAccurate?: boolean,\n easing?: EasingType,\n usePrevValue?: boolean,\n ) {\n const times = this.times;\n const length = times.length;\n\n let prevTime: number;\n let nextTime: number;\n let prevFrame: Frame;\n let nextFrame: Frame;\n const isUndefinedLeft = isUndefined(left);\n const isUndefinedRight = isUndefined(right);\n if (isUndefinedLeft || isUndefinedRight) {\n const indicies = getNearTimeIndex(times, time);\n isUndefinedLeft && (left = indicies[0]);\n isUndefinedRight && (right = indicies[1]);\n }\n\n for (let i = left; i >= 0; --i) {\n const frame = this.getFrame(times[i]);\n\n if (frame.has(...properties)) {\n prevTime = times[i];\n prevFrame = frame;\n break;\n }\n }\n const prevValue = prevFrame && prevFrame.raw(...properties);\n\n if (isAccurate && !isRole([properties[0]])) {\n return prevTime === time ? prevValue : undefined;\n }\n if (usePrevValue) {\n return prevValue;\n }\n for (let i = right; i < length; ++i) {\n const frame = this.getFrame(times[i]);\n\n if (frame.has(...properties)) {\n nextTime = times[i];\n nextFrame = frame;\n break;\n }\n }\n const nextValue = nextFrame && nextFrame.raw(...properties);\n\n if (!prevFrame || isUndefined(prevValue)) {\n return nextValue;\n }\n if (!nextFrame || isUndefined(nextValue) || prevValue === nextValue) {\n return prevValue;\n }\n return dotValue(time, Math.max(prevTime, 0), nextTime, prevValue, nextValue, easing);\n }\n private _toKeyframes(duration: number, states: AnimatorState[], direction: DirectionType) {\n const frames: IObject = {};\n const times = this.times.slice();\n\n if (!times.length) {\n return \"\";\n }\n const originalDuration = this.getDuration();\n (!this.getFrame(0)) && times.unshift(0);\n (!this.getFrame(originalDuration)) && times.push(originalDuration);\n const entries = getEntries(times, states);\n const lastEntry = entries[entries.length - 1];\n\n // end delay time\n lastEntry[0] < duration && addEntry(entries, duration, lastEntry[1]);\n let prevTime = -1;\n\n return entries.map(([time, keytime]) => {\n if (!frames[keytime]) {\n frames[keytime] =\n (!this.hasFrame(keytime) || keytime === 0 || keytime === originalDuration ?\n this.getNowFrame(keytime) : this.getNowFrame(keytime, 0, true)).toCSS();\n }\n\n let frameTime = time / duration * 100;\n\n if (frameTime - prevTime < THRESHOLD) {\n frameTime += THRESHOLD;\n }\n prevTime = frameTime;\n return `${Math.min(frameTime, 100)}%{\n ${time === 0 && !isDirectionReverse(0, 1, direction) ? \"\" : frames[keytime]}\n }`;\n }).join(\"\");\n }\n}\n\nexport default SceneItem;\n","import Animator from \"./Animator\";\nimport SceneItem from \"./SceneItem\";\nimport { SELECTOR, DURATION, DELAY, RUNNING } from \"./consts\";\nimport { playCSS, exportCSS, getRealId, isPausedCSS, isEndedCSS, setPlayCSS } from \"./utils\";\nimport { isFunction, IS_WINDOW, IObject, $, IArrayFormat } from \"@daybrush/utils\";\nimport {\n AnimateElement, SceneState, SceneOptions, EasingType,\n AnimatorState, SceneItemOptions, PlayCondition\n} from \"./types\";\nimport Frame from \"./Frame\";\nimport ListMap from \"list-map\";\n\n/**\n * manage sceneItems and play Scene.\n * @sort 1\n */\nclass Scene extends Animator {\n /**\n * version info\n * @type {string}\n * @example\n * Scene.VERSION // #__VERSION__#\n */\n public static VERSION: string = \"#__VERSION__#\";\n public items: ListMap = new ListMap();\n public temp: IObject;\n /**\n * @param - properties\n * @param - options\n * @example\n const scene = new Scene({\n item1: {\n 0: {\n display: \"none\",\n },\n 1: {\n display: \"block\",\n opacity: 0,\n },\n 2: {\n opacity: 1,\n },\n },\n item2: {\n 2: {\n opacity: 1,\n },\n }\n });\n */\n constructor(properties?: {options?: Partial} & IObject, options?: Partial) {\n super();\n this.load(properties, options);\n }\n public getDuration() {\n let time = 0;\n\n this.forEach(item => {\n time = Math.max(time, item.getTotalDuration() / item.getPlaySpeed());\n });\n return time || this.state[DURATION];\n }\n public setDuration(duration: number) {\n const items = this.items;\n const sceneDuration = this.getDuration();\n\n if (duration === 0 || !isFinite(sceneDuration)) {\n return this;\n }\n if (sceneDuration === 0) {\n this.forEach(item => {\n item.setDuration(duration);\n });\n } else {\n const ratio = duration / sceneDuration;\n\n this.forEach(item => {\n item.setDelay(item.getDelay() * ratio);\n item.setDuration(item.getDuration() * ratio);\n });\n }\n super.setDuration(duration);\n return this;\n }\n public getItem(name: number | string): T;\n /**\n * get item in scene by name\n * @param - The item's name\n * @return {Scene | SceneItem} item\n * @example\n const item = scene.getItem(\"item1\")\n */\n public getItem(name: number | string) {\n return this.items.get(name);\n }\n /**\n * create item in scene\n * @param {} name - name of item to create\n * @param {} options - The option object of SceneItem\n * @return {} Newly created item\n * @example\n const item = scene.newItem(\"item1\")\n */\n public newItem(name: number | string, options: Partial = {}): Scene | SceneItem {\n if (this.items.has(name)) {\n return this.items.get(name);\n }\n const item = new SceneItem();\n\n this.setItem(name, item);\n item.setOptions(options);\n\n return item;\n }\n /**\n * remove item in scene\n * @param - name of item to remove\n * @return An instance itself\n * @example\n const item = scene.newItem(\"item1\")\n\n scene.removeItem(\"item1\");\n */\n public removeItem(name: number | string): this {\n this.items.remove(name);\n return this;\n }\n /**\n * add a sceneItem to the scene\n * @param - name of item to create\n * @param - sceneItem\n * @example\n const item = scene.newItem(\"item1\")\n */\n public setItem(name: number | string, item: Scene | SceneItem) {\n item.setId(name);\n this.items.set(name, item);\n return this;\n }\n public setTime(time: number | string, isTick?: boolean, isParent?: boolean, parentEasing?: EasingType) {\n super.setTime(time, isTick, isParent);\n\n const iterationTime = this.getIterationTime();\n const easing = this.getEasing() || parentEasing;\n const frames: IObject = {};\n\n this.forEach(item => {\n item.setTime(iterationTime * item.getPlaySpeed() - item.getDelay(), isTick, true, easing);\n\n frames[item.getId()] = item.temp;\n });\n this.temp = frames;\n\n /**\n * This event is fired when timeupdate and animate.\n * @event Scene#animate\n * @param {object} param The object of data to be sent to an event.\n * @param {number} param.currentTime The total time that the animator is running.\n * @param {number} param.time The iteration time during duration that the animator is running.\n * @param {object} param.frames frames of that time.\n * @example\nconst scene = new Scene({\n a: {\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n },\n b: {\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n }\n}).on(\"animate\", e => {\n console.log(e.frames);\n // {a: Frame, b: Frame}\n console.log(e.frames.a.get(\"opacity\"));\n});\n */\n this.trigger(\"animate\", {\n frames,\n currentTime: this.getTime(),\n time: iterationTime,\n });\n\n return this;\n }\n /**\n * executes a provided function once for each scene item.\n * @param - Function to execute for each element, taking three arguments\n * @return {Scene} An instance itself\n */\n public forEach(\n func: (\n item: Scene | SceneItem,\n id: string | number,\n index: number,\n items: IObject,\n ) => void,\n ) {\n const items = this.items;\n\n items.forEach((item, id, index, obj) => {\n func(item, id, index, obj);\n });\n return this;\n }\n public toCSS(\n playCondition?: PlayCondition,\n duration: number = this.getDuration(), parentStates: AnimatorState[] = []) {\n const totalDuration = !duration || !isFinite(duration) ? 0 : duration;\n const styles: string[] = [];\n const state = this.state;\n\n state[DURATION] = this.getDuration();\n\n this.forEach(item => {\n styles.push(item.toCSS(playCondition, totalDuration, parentStates.concat(state)));\n });\n return styles.join(\"\");\n }\n /**\n * Export the CSS of the items to the style.\n * @param - Add a selector or className to play.\n * @return {Scene} An instance itself\n */\n public exportCSS(\n playCondition?: PlayCondition, duration?: number, parentStates?: AnimatorState[]) {\n const css = this.toCSS(playCondition, duration, parentStates);\n\n (!parentStates || !parentStates.length) && exportCSS(getRealId(this), css);\n return this;\n }\n public append(item: SceneItem | Scene) {\n item.setDelay(item.getDelay() + this.getDuration());\n this.setItem(getRealId(item), item);\n }\n public pauseCSS() {\n return this.forEach(item => {\n item.pauseCSS();\n });\n }\n public pause() {\n super.pause();\n\n isPausedCSS(this) && this.pauseCSS();\n this.forEach(item => {\n item.pause();\n });\n return this;\n }\n public endCSS() {\n this.forEach(item => {\n item.endCSS();\n });\n setPlayCSS(this, false);\n }\n public end() {\n isEndedCSS(this) && this.endCSS();\n super.end();\n return this;\n }\n public addPlayClass(isPaused: boolean, playClassName?: string, properties: object = {}) {\n let animtionElement: AnimateElement;\n\n this.forEach(item => {\n const el = item.addPlayClass(isPaused, playClassName, properties);\n\n !animtionElement && (animtionElement = el);\n });\n return animtionElement;\n }\n /**\n * Play using the css animation and keyframes.\n * @param - Check if you want to export css.\n * @param [playClassName=\"startAnimation\"] - Add a class name to play.\n * @param - The shorthand properties for six of the animation properties.\n * @return {Scene} An instance itself\n * @see {@link https://www.w3schools.com/cssref/css3_pr_animation.asp}\n * @example\n scene.playCSS();\n scene.playCSS(false, {\n direction: \"reverse\",\n fillMode: \"forwards\",\n });\n */\n public playCSS(isExportCSS = true, playClassName?: string, properties: Partial = {}) {\n playCSS(this, isExportCSS, playClassName, properties);\n return this;\n }\n public set(properties: any, ...args: any[]): this;\n /**\n * Set properties to the Scene.\n * @param - properties\n * @return An instance itself\n * @example\nscene.set({\n \".a\": {\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n },\n },\n});\n// 0\nconsole.log(scene.getItem(\".a\").get(0, \"opacity\"));\n// 1\nconsole.log(scene.getItem(\".a\").get(1, \"opacity\"));\n */\n public set(properties: any) {\n this.load(properties);\n return this;\n }\n public load(properties: any = {}, options = properties.options) {\n if (!properties) {\n return this;\n }\n const selector = options && options[SELECTOR] || this.state[SELECTOR];\n for (const name in properties) {\n if (name === \"options\") {\n continue;\n }\n const object = properties[name];\n let item;\n\n if (object instanceof Scene || object instanceof SceneItem) {\n this.setItem(name, object);\n item = object;\n } else if (isFunction(object) && selector) {\n const elements =\n IS_WINDOW\n ? $(`${isFunction(selector) ? selector(name) : name}`, true) as IArrayFormat\n : ([] as AnimateElement[]);\n const length = elements.length;\n const scene = new Scene();\n\n for (let i = 0; i < length; ++i) {\n (scene.newItem(i) as SceneItem).setId().setElement(elements[i]).load(object(i, elements[i]));\n }\n this.setItem(name, scene);\n continue;\n } else {\n item = this.newItem(name);\n item.load(object);\n }\n selector && item.setSelector(selector);\n }\n this.setOptions(options);\n }\n public setOptions(options: Partial = {}): this {\n super.setOptions(options);\n\n const selector = options.selector;\n\n if (selector) {\n this.state[SELECTOR] = selector;\n }\n return this;\n }\n public setSelector(target?: string | boolean | ((id: number | string) => string)) {\n const state = this.state;\n const selector = target || state[SELECTOR];\n\n state[SELECTOR] = selector;\n const isItFunction = isFunction(target);\n if (selector) {\n this.forEach((item, name) => {\n item.setSelector(isItFunction ? (target as (id: number | string) => string)(name) : selector);\n });\n }\n return this;\n }\n public start(delay: number = this.state[DELAY]): boolean {\n const result = super.start(delay);\n\n if (result) {\n this.forEach(item => {\n item.start(0);\n });\n } else {\n this.forEach(item => {\n item.setPlayState(RUNNING);\n });\n }\n return result;\n }\n}\n\nexport default Scene;\n","import { IObject } from \"@daybrush/utils\";\nimport Scene from \"./Scene\";\nimport SceneItem from \"./SceneItem\";\nimport { SceneOptions, SceneItemOptions } from \"./types\";\n\nexport function animate(properties?: IObject, options?: Partial) {\n return new Scene(properties, options).play();\n}\nexport function animateItem(properties?: IObject, options?: Partial) {\n return new SceneItem(properties, options).play();\n}\n"],"names":["y1","y2","t","t2","x1","x2","x","solveX","dx","Math","abs","cubic","func","solveFromX","max","min","easingName","count","position","time","level","floor","STEP_START","steps","STEP_END","LINEAR","bezier","EASE","EASE_IN","EASE_OUT","EASE_IN_OUT","PREFIX","DATA_SCENE_ID","TIMING_FUNCTION","ROLES","transform","filter","attribute","html","ALIAS","easing","FIXED","_a","MAXIMUM","THRESHOLD","DURATION","FILL_MODE","DIRECTION","ITERATION_COUNT","DELAY","EASING","PLAY_SPEED","EASING_NAME","ITERATION_TIME","PAUSED","ENDED","TIMEUPDATE","ANIMATE","PLAY","RUNNING","ITERATION","START_ANIMATION","PAUSE_ANIMATION","ALTERNATE","REVERSE","ALTERNATE_REVERSE","NORMAL","INFINITE","PLAY_STATE","PLAY_CSS","PREV_TIME","TICK_TIME","CURRENT_TIME","SELECTOR","TRANSFORM_NAME","EASINGS","OPTIONS","EVENTS","events","name","callback","once","isObject","n","_on","isArray","forEach","_this","push","_i","args","off","callback2","callbacks","index","indexOf","splice","data","event","target","type","currentTarget","toArray","apply","value","options","setOptions","isString","split","separator","newOptions","length","prefix","suffix","model","arr","map","v","PropertyObject","clone","join","toValue","str","properties","splitText","obj","i","matches","trim","toPropertyObject","styles","RGBA","text","afterModel","COLOR_MODELS","arrayToColorObject","stringToRGBA","result","arrayToPropertyObject","values","splitComma","splitSpace","exec","stringToBracketObject","charAt","stringToColorObject","object","size","get","toObject","alias","names","isProperty","isFixedProperty","roles","fixed","OBJECT","ARRAY","isPropertyObject","PROPERTY","STRING","NUMBER","constructor","Object","stack","isPureObject","concat","getNames","pop","slice","updateFrame","num","round","undefined","isCheckTrue","role","isInProperties","item","isActivate","state","isPaused","isEnded","id","css","styleId","toId","styleElement","$","innerText","document","body","insertAdjacentHTML","selector","random","IS_WINDOW","checkElement","getId","setId","makeId","match","isExportCSS","playClassName","ANIMATION","getPlayState","className","isPausedCSS","addPlayClass","setTime","exportCSS","el","addAnimationEvent","setPlayCSS","setPlayState","duration","getDuration","isZeroDuration","isFinite","animationend","finish","animationstart","trigger","removeEvent","animationiteration","elapsedTime","currentTime","iterationCount","setIteration","addEvent","curveArray","parseFloat","getter","setter","parent","prototype","camelize","iteration","iteraiontCount","direction","setters","getters","tslib_1","_super","delay","fillMode","playSpeed","iterationTime","tickTime","prevTime","playState","getEasing","setEasing","setDuration","getActiveDuration","Infinity","getTime","toTime","timerId","requestAnimationFrame","tick","start","cancelAnimationFrame","end","pause","isTick","isParent","activeDuration","getUnitTime","calculate","isDelay","getIterationTime","unit","toFixed","passIterationCount","maxIterationCount","currentIterationTime","setIterationTime","isReverse","isDirectionReverse","isFiniteDuration","isForwards","now","to","Animator","GetterSetter","EventTrigger","arrObj","replace","merge","from","getType","FUNCTION","getValue","set","raw","getPropertyName","getValueByNames","params","self","firstParam","Frame","_set","isRole","has","isFixed","stylesLength","isUndefined","frame","frameProperties","cssObject","toInnerProperties","TRANSFORM","FILTER","toCSSObject","cssArray","lastParam","a1","a2","b1","b2","v1","dot","color1","color2","value1","value2","model1","model2","dotArray","colorModel","parseInt","a1Type","dotColor","type1","type2","isFunction1","isFunction2","dotObject","splitUnit","v2","isNaN","dotNumber","nextTime","prevValue","nextValue","ratio","times","decamelize","entries","keytime","prevEntry","states","nextEntries","intCount","ceil","currentDuration","lastTime","j","entry","divideTime","addEntry","unshift","load","originalDuration","ratio_1","items_1","obj_1","time2","items","newFrame","elements","sceneId_1","element","setAttribute","SceneItem","eachTime","realTime","innerValue","value_1","getDelay","frames","hasFrame","getDirection","frameTime","needUpdate","getFrame","remove","removeFrame","append","unshiftTime","firstFrame","prepend","isStartZero","isFunction","setElement","Element","style","targetFunc","attributes","html_1","innerHTML","cssText","toCSS","fromCSS","parentEasing","getNowFrame","temp","setFrame","addTime","update","toFrame","isAccurate","left","right","realEasing","nameObject","hasName","nowEasing","getNowValue","prevFrame","prevNames","keyframes","setTarget","setSelector","playCondition","parentDuration","itemState","reversedStates","reverse","getRealId","superParent","infiniteIndex","findIndex","finiteStates","reduce","prev","cur","find","makeAnimationProperties","timingFunction","selectors","sel","selectorCallback","preselector","peusdo","KEYFRAMES","_toKeyframes","pauseCSS","addClass","removeClass","isEndedCSS","endCSS","playCSS","hasClass","usePrevValue","nextFrame","isUndefinedLeft","isUndefinedRight","indicies","getNearTimeIndex","dotValue","getEntries","lastEntry","ListMap","getTotalDuration","getPlaySpeed","sceneDuration","setDelay","setItem","parentStates","totalDuration","animtionElement","Scene","scene","newItem","isItFunction","play"],"mappings":"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"} \ No newline at end of file diff --git a/dist/scene.js b/dist/scene.js new file mode 100644 index 00000000..0928456e --- /dev/null +++ b/dist/scene.js @@ -0,0 +1,5096 @@ +/* +Copyright (c) 2016 Daybrush +name: scenejs +license: MIT +author: Daybrush +repository: https://github.com/daybrush/scenejs.git +version: 1.2.0 +*/ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.Scene = factory()); +}(this, function () { 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + + /* global Reflect, Promise */ + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + }; + + return extendStatics(d, b); + }; + + function __extends(d, b) { + extendStatics(d, b); + + function __() { + this.constructor = d; + } + + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + function __decorate(decorators, target, key, desc) { + var c = arguments.length, + r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, + d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + } + + function cubic(y1, y2, t) { + var t2 = 1 - t; // Bezier Curve Formula + + return t * t * t + 3 * t * t * t2 * y2 + 3 * t * t2 * t2 * y1; + } + + function solveFromX(x1, x2, x) { + // x 0 ~ 1 + // t 0 ~ 1 + var t = x; + var solveX = x; + var dx = 1; + + while (Math.abs(dx) > 1 / 1000) { + // 예상 t초에 의한 _x값 + solveX = cubic(x1, x2, t); + dx = solveX - x; // 차이가 미세하면 그 값을 t로 지정 + + if (Math.abs(dx) < 1 / 1000) { + return t; + } + + t -= dx / 2; + } + + return t; + } + /** + * @namespace easing + */ + + /** + * Cubic Bezier curve. + * @memberof easing + * @func bezier + * @param {number} [x1] - point1's x + * @param {number} [y1] - point1's y + * @param {number} [x2] - point2's x + * @param {number} [y2] - point2's y + * @return {function} the curve function + * @example + import {bezier} from "scenejs"; + Scene.bezier(0, 0, 1, 1) // LINEAR + Scene.bezier(0.25, 0.1, 0.25, 1) // EASE + */ + + + function bezier(x1, y1, x2, y2) { + /* + x = f(t) + calculate inverse function by x + t = f-1(x) + */ + var func = function (x) { + var t = solveFromX(x1, x2, Math.max(Math.min(1, x), 0)); + return cubic(y1, y2, t); + }; + + func.easingName = "cubic-bezier(" + x1 + "," + y1 + "," + x2 + "," + y2 + ")"; + return func; + } + /** + * Specifies a stepping function + * @see {@link https://www.w3schools.com/cssref/css3_pr_animation-timing-function.asp|CSS3 Timing Function} + * @memberof easing + * @func steps + * @param {number} count - point1's x + * @param {"start" | "end"} postion - point1's y + * @return {function} the curve function + * @example + import {steps} from "scenejs"; + Scene.steps(1, "start") // Scene.STEP_START + Scene.steps(1, "end") // Scene.STEP_END + */ + + function steps(count, position) { + var func = function (time) { + var level = 1 / count; + + if (time >= 1) { + return 1; + } + + return (position === "start" ? level : 0) + Math.floor(time / level) * level; + }; + + func.easingName = "steps(" + count + ", " + position + ")"; + return func; + } + /** + * Equivalent to steps(1, start) + * @memberof easing + * @name STEP_START + * @static + * @type {function} + * @example + import {STEP_START} from "scenejs"; + Scene.STEP_START // steps(1, start) + */ + + var STEP_START = + /*#__PURE__#*/ + steps(1, "start"); + /** + * Equivalent to steps(1, end) + * @memberof easing + * @name STEP_END + * @static + * @type {function} + * @example + import {STEP_END} from "scenejs"; + Scene.STEP_END // steps(1, end) + */ + + var STEP_END = + /*#__PURE__#*/ + steps(1, "end"); + /** + * Linear Speed (0, 0, 1, 1) + * @memberof easing + * @name LINEAR + * @static + * @type {function} + * @example + import {LINEAR} from "scenejs"; + Scene.LINEAR + */ + + var LINEAR = + /*#__PURE__#*/ + bezier(0, 0, 1, 1); + /** + * Ease Speed (0.25, 0.1, 0.25, 1) + * @memberof easing + * @name EASE + * @static + * @type {function} + * @example + import {EASE} from "scenejs"; + Scene.EASE + */ + + var EASE = + /*#__PURE__#*/ + bezier(0.25, 0.1, 0.25, 1); + /** + * Ease In Speed (0.42, 0, 1, 1) + * @memberof easing + * @name EASE_IN + * @static + * @type {function} + * @example + import {EASE_IN} from "scenejs"; + Scene.EASE_IN + */ + + var EASE_IN = + /*#__PURE__#*/ + bezier(0.42, 0, 1, 1); + /** + * Ease Out Speed (0, 0, 0.58, 1) + * @memberof easing + * @name EASE_OUT + * @static + * @type {function} + * @example + import {EASE_OUT} from "scenejs"; + Scene.EASE_OUT + */ + + var EASE_OUT = + /*#__PURE__#*/ + bezier(0, 0, 0.58, 1); + /** + * Ease In Out Speed (0.42, 0, 0.58, 1) + * @memberof easing + * @name EASE_IN_OUT + * @static + * @type {function} + * @example + import {EASE_IN_OUT} from "scenejs"; + Scene.EASE_IN_OUT + */ + + var EASE_IN_OUT = + /*#__PURE__#*/ + bezier(0.42, 0, 0.58, 1); + + var _a; + var PREFIX = "__SCENEJS_"; + var DATA_SCENE_ID = "data-scene-id"; + var TIMING_FUNCTION = "animation-timing-function"; + var ROLES = { + transform: {}, + filter: {}, + attribute: {}, + html: true + }; + var ALIAS = { + easing: [TIMING_FUNCTION] + }; + var FIXED = (_a = {}, _a[TIMING_FUNCTION] = true, _a.contents = true, _a.html = true, _a); + var MAXIMUM = 1000000; + var THRESHOLD = 0.000001; + var DURATION = "duration"; + var FILL_MODE = "fillMode"; + var DIRECTION = "direction"; + var ITERATION_COUNT = "iterationCount"; + var DELAY = "delay"; + var EASING = "easing"; + var PLAY_SPEED = "playSpeed"; + var EASING_NAME = "easingName"; + var ITERATION_TIME = "iterationTime"; + var PAUSED = "paused"; + var ENDED = "ended"; + var TIMEUPDATE = "timeupdate"; + var ANIMATE = "animate"; + var PLAY = "play"; + var RUNNING = "running"; + var ITERATION = "iteration"; + var START_ANIMATION = "startAnimation"; + var PAUSE_ANIMATION = "pauseAnimation"; + var ALTERNATE = "alternate"; + var REVERSE = "reverse"; + var ALTERNATE_REVERSE = "alternate-reverse"; + var NORMAL = "normal"; + var INFINITE = "infinite"; + var PLAY_STATE = "playState"; + var PLAY_CSS = "playCSS"; + var PREV_TIME = "prevTime"; + var TICK_TIME = "tickTime"; + var CURRENT_TIME = "currentTime"; + var SELECTOR = "selector"; + var TRANSFORM_NAME = "transform"; + var EASINGS = { + "linear": LINEAR, + "ease": EASE, + "ease-in": EASE_IN, + "ease-out": EASE_OUT, + "ease-in-out": EASE_IN_OUT, + "step-start": STEP_START, + "step-end": STEP_END + }; + /** + * option name list + * @name Scene.OPTIONS + * @memberof Scene + * @static + * @type {$ts:OptionType} + * @example + * Scene.OPTIONS // ["duration", "fillMode", "direction", "iterationCount", "delay", "easing", "playSpeed"] + */ + + var OPTIONS = [DURATION, FILL_MODE, DIRECTION, ITERATION_COUNT, DELAY, EASING, PLAY_SPEED]; + /** + * Event name list + * @name Scene.EVENTS + * @memberof Scene + * @static + * @type {$ts:EventType} + * @example + * Scene.EVENTS // ["paused", "ended", "timeupdate", "animate", "play", "iteration"]; + */ + + var EVENTS = [PAUSED, ENDED, TIMEUPDATE, ANIMATE, PLAY, ITERATION]; + + /* + Copyright (c) 2018 Daybrush + @name: @daybrush/utils + license: MIT + author: Daybrush + repository: https://github.com/daybrush/utils + @version 0.10.5 + */ + /** + * @namespace + * @name Consts + */ + + /** + * get string "rgb" + * @memberof Color + * @example + import {RGB} from "@daybrush/utils"; + + console.log(RGB); // "rgb" + */ + var RGB = "rgb"; + /** + * get string "rgba" + * @memberof Color + * @example + import {RGBA} from "@daybrush/utils"; + + console.log(RGBA); // "rgba" + */ + + var RGBA = "rgba"; + /** + * get string "hsl" + * @memberof Color + * @example + import {HSL} from "@daybrush/utils"; + + console.log(HSL); // "hsl" + */ + + var HSL = "hsl"; + /** + * get string "hsla" + * @memberof Color + * @example + import {HSLA} from "@daybrush/utils"; + + console.log(HSLA); // "hsla" + */ + + var HSLA = "hsla"; + /** + * gets an array of color models. + * @memberof Color + * @example + import {COLOR_MODELS} from "@daybrush/utils"; + + console.log(COLOR_MODELS); // ["rgb", "rgba", "hsl", "hsla"]; + */ + + var COLOR_MODELS = [RGB, RGBA, HSL, HSLA]; + /** + * get string "function" + * @memberof Consts + * @example + import {FUNCTION} from "@daybrush/utils"; + + console.log(FUNCTION); // "function" + */ + + var FUNCTION = "function"; + /** + * get string "property" + * @memberof Consts + * @example + import {PROPERTY} from "@daybrush/utils"; + + console.log(PROPERTY); // "property" + */ + + var PROPERTY = "property"; + /** + * get string "array" + * @memberof Consts + * @example + import {ARRAY} from "@daybrush/utils"; + + console.log(ARRAY); // "array" + */ + + var ARRAY = "array"; + /** + * get string "object" + * @memberof Consts + * @example + import {OBJECT} from "@daybrush/utils"; + + console.log(OBJECT); // "object" + */ + + var OBJECT = "object"; + /** + * get string "string" + * @memberof Consts + * @example + import {STRING} from "@daybrush/utils"; + + console.log(STRING); // "string" + */ + + var STRING = "string"; + /** + * get string "number" + * @memberof Consts + * @example + import {NUMBER} from "@daybrush/utils"; + + console.log(NUMBER); // "number" + */ + + var NUMBER = "number"; + /** + * get string "undefined" + * @memberof Consts + * @example + import {UNDEFINED} from "@daybrush/utils"; + + console.log(UNDEFINED); // "undefined" + */ + + var UNDEFINED = "undefined"; + /** + * Check whether the environment is window or node.js. + * @memberof Consts + * @example + import {IS_WINDOW} from "@daybrush/utils"; + + console.log(IS_WINDOW); // false in node.js + console.log(IS_WINDOW); // true in browser + */ + + var IS_WINDOW = typeof window !== UNDEFINED; + /** + * Check whether the environment is window or node.js. + * @memberof Consts + * @name document + * @example + import {IS_WINDOW} from "@daybrush/utils"; + + console.log(IS_WINDOW); // false in node.js + console.log(IS_WINDOW); // true in browser + */ + + var doc = typeof document !== UNDEFINED && document; + var prefixes = ["webkit", "ms", "moz", "o"]; + /** + * @namespace CrossBrowser + */ + + /** + * Get a CSS property with a vendor prefix that supports cross browser. + * @function + * @param {string} property - A CSS property + * @return {string} CSS property with cross-browser vendor prefix + * @memberof CrossBrowser + * @example + import {getCrossBrowserProperty} from "@daybrush/utils"; + + console.log(getCrossBrowserProperty("transform")); // "transform", "-ms-transform", "-webkit-transform" + console.log(getCrossBrowserProperty("filter")); // "filter", "-webkit-filter" + */ + + var getCrossBrowserProperty = + /*#__PURE__*/ + function (property) { + if (!doc) { + return ""; + } + + var styles = (doc.body || doc.documentElement).style; + var length = prefixes.length; + + if (typeof styles[property] !== UNDEFINED) { + return property; + } + + for (var i = 0; i < length; ++i) { + var name = "-" + prefixes[i] + "-" + property; + + if (typeof styles[name] !== UNDEFINED) { + return name; + } + } + + return ""; + }; + /** + * get string "transfrom" with the vendor prefix. + * @memberof CrossBrowser + * @example + import {TRANSFORM} from "@daybrush/utils"; + + console.log(TRANSFORM); // "transform", "-ms-transform", "-webkit-transform" + */ + + var TRANSFORM = + /*#__PURE__*/ + getCrossBrowserProperty("transform"); + /** + * get string "filter" with the vendor prefix. + * @memberof CrossBrowser + * @example + import {FILTER} from "@daybrush/utils"; + + console.log(FILTER); // "filter", "-ms-filter", "-webkit-filter" + */ + + var FILTER = + /*#__PURE__*/ + getCrossBrowserProperty("filter"); + /** + * get string "animation" with the vendor prefix. + * @memberof CrossBrowser + * @example + import {ANIMATION} from "@daybrush/utils"; + + console.log(ANIMATION); // "animation", "-ms-animation", "-webkit-animation" + */ + + var ANIMATION = + /*#__PURE__*/ + getCrossBrowserProperty("animation"); + /** + * get string "keyframes" with the vendor prefix. + * @memberof CrossBrowser + * @example + import {KEYFRAMES} from "@daybrush/utils"; + + console.log(KEYFRAMES); // "keyframes", "-ms-keyframes", "-webkit-keyframes" + */ + + var KEYFRAMES = + /*#__PURE__*/ + ANIMATION.replace("animation", "keyframes"); + var OPEN_CLOSED_CHARACTER = ["\"", "'", "\\\"", "\\'"]; + + /** + * @namespace + * @name Utils + */ + + /** + * Returns the inner product of two numbers(`a1`, `a2`) by two criteria(`b1`, `b2`). + * @memberof Utils + * @param - The first number + * @param - The second number + * @param - The first number to base on the inner product + * @param - The second number to base on the inner product + * @return - Returns the inner product + import { dot } from "@daybrush/utils"; + + console.log(dot(0, 15, 2, 3)); // 6 + console.log(dot(5, 15, 2, 3)); // 9 + console.log(dot(5, 15, 1, 1)); // 10 + */ + + function dot(a1, a2, b1, b2) { + return (a1 * b2 + a2 * b1) / (b1 + b2); + } + /** + * Check the type that the value is undefined. + * @memberof Utils + * @param {string} value - Value to check the type + * @return {boolean} true if the type is correct, false otherwise + * @example + import {isUndefined} from "@daybrush/utils"; + + console.log(isUndefined(undefined)); // true + console.log(isUndefined("")); // false + console.log(isUndefined(1)); // false + console.log(isUndefined(null)); // false + */ + + function isUndefined(value) { + return typeof value === UNDEFINED; + } + /** + * Check the type that the value is object. + * @memberof Utils + * @param {string} value - Value to check the type + * @return {} true if the type is correct, false otherwise + * @example + import {isObject} from "@daybrush/utils"; + + console.log(isObject({})); // true + console.log(isObject(undefined)); // false + console.log(isObject("")); // false + console.log(isObject(null)); // false + */ + + function isObject(value) { + return value && typeof value === OBJECT; + } + /** + * Check the type that the value is isArray. + * @memberof Utils + * @param {string} value - Value to check the type + * @return {} true if the type is correct, false otherwise + * @example + import {isArray} from "@daybrush/utils"; + + console.log(isArray([])); // true + console.log(isArray({})); // false + console.log(isArray(undefined)); // false + console.log(isArray(null)); // false + */ + + function isArray(value) { + return Array.isArray(value); + } + /** + * Check the type that the value is string. + * @memberof Utils + * @param {string} value - Value to check the type + * @return {} true if the type is correct, false otherwise + * @example + import {isString} from "@daybrush/utils"; + + console.log(isString("1234")); // true + console.log(isString(undefined)); // false + console.log(isString(1)); // false + console.log(isString(null)); // false + */ + + function isString(value) { + return typeof value === STRING; + } + /** + * Check the type that the value is function. + * @memberof Utils + * @param {string} value - Value to check the type + * @return {} true if the type is correct, false otherwise + * @example + import {isFunction} from "@daybrush/utils"; + + console.log(isFunction(function a() {})); // true + console.log(isFunction(() => {})); // true + console.log(isFunction("1234")); // false + console.log(isFunction(1)); // false + console.log(isFunction(null)); // false + */ + + function isFunction(value) { + return typeof value === FUNCTION; + } + + function findClosed(closedCharacter, texts, index, length) { + for (var i = index; i < length; ++i) { + var character = texts[i].trim(); + + if (character === closedCharacter) { + return i; + } + + var nextIndex = i; + + if (character === "(") { + nextIndex = findClosed(")", texts, i + 1, length); + } else if (OPEN_CLOSED_CHARACTER.indexOf(character) > -1) { + nextIndex = findClosed(character, texts, i + 1, length); + } + + if (nextIndex === -1) { + break; + } + + i = nextIndex; + } + + return -1; + } + + function splitText(text, separator) { + var regexText = "(\\s*" + (separator || ",") + "\\s*|\\(|\\)|\"|'|\\\\\"|\\\\'|\\s+)"; + var regex = new RegExp(regexText, "g"); + var texts = text.split(regex).filter(Boolean); + var length = texts.length; + var values = []; + var tempValues = []; + + for (var i = 0; i < length; ++i) { + var character = texts[i].trim(); + var nextIndex = i; + + if (character === "(") { + nextIndex = findClosed(")", texts, i + 1, length); + } else if (character === ")") { + throw new Error("invalid format"); + } else if (OPEN_CLOSED_CHARACTER.indexOf(character) > -1) { + nextIndex = findClosed(character, texts, i + 1, length); + } else if (character === separator) { + if (tempValues.length) { + values.push(tempValues.join("")); + tempValues = []; + } + + continue; + } + + if (nextIndex === -1) { + nextIndex = length - 1; + } + + tempValues.push(texts.slice(i, nextIndex + 1).join("")); + i = nextIndex; + } + + if (tempValues.length) { + values.push(tempValues.join("")); + } + + return values; + } + /** + * divide text by space. + * @memberof Utils + * @param {string} text - text to divide + * @return {Array} divided texts + * @example + import {spliceSpace} from "@daybrush/utils"; + + console.log(splitSpace("a b c d e f g")); + // ["a", "b", "c", "d", "e", "f", "g"] + console.log(splitSpace("'a,b' c 'd,e' f g")); + // ["'a,b'", "c", "'d,e'", "f", "g"] + */ + + function splitSpace(text) { + // divide comma(,) + return splitText(text, ""); + } + /** + * divide text by comma. + * @memberof Utils + * @param {string} text - text to divide + * @return {Array} divided texts + * @example + import {splitComma} from "@daybrush/utils"; + + console.log(splitComma("a,b,c,d,e,f,g")); + // ["a", "b", "c", "d", "e", "f", "g"] + console.log(splitComma("'a,b',c,'d,e',f,g")); + // ["'a,b'", "c", "'d,e'", "f", "g"] + */ + + function splitComma(text) { + // divide comma(,) + // "[^"]*"|'[^']*' + return splitText(text, ","); + } + /** + * divide text by bracket "(", ")". + * @memberof Utils + * @param {string} text - text to divide + * @return {object} divided texts + * @example + import {splitBracket} from "@daybrush/utils"; + + console.log(splitBracket("a(1, 2)")); + // {prefix: "a", value: "1, 2", suffix: ""} + console.log(splitBracket("a(1, 2)b")); + // {prefix: "a", value: "1, 2", suffix: "b"} + */ + + function splitBracket(text) { + var matches = /([^(]*)\(([\s\S]*)\)([\s\S]*)/g.exec(text); + + if (!matches || matches.length < 4) { + return {}; + } else { + return { + prefix: matches[1], + value: matches[2], + suffix: matches[3] + }; + } + } + /** + * divide text by number and unit. + * @memberof Utils + * @param {string} text - text to divide + * @return {} divided texts + * @example + import {splitUnit} from "@daybrush/utils"; + + console.log(splitUnit("10px")); + // {prefix: "", value: 10, unit: "px"} + console.log(splitUnit("-10px")); + // {prefix: "", value: -10, unit: "px"} + console.log(splitUnit("a10%")); + // {prefix: "a", value: 10, unit: "%"} + */ + + function splitUnit(text) { + var matches = /^([^\d|e|\-|\+]*)((?:\d|\.|-|e-|e\+)+)(\S*)$/g.exec(text); + + if (!matches) { + return { + prefix: "", + unit: "", + value: NaN + }; + } + + var prefix = matches[1]; + var value = matches[2]; + var unit = matches[3]; + return { + prefix: prefix, + unit: unit, + value: parseFloat(value) + }; + } + /** + * transform strings to camel-case + * @memberof Utils + * @param {String} text - string + * @return {String} camel-case string + * @example + import {camelize} from "@daybrush/utils"; + + console.log(camelize("transform-origin")); // transformOrigin + console.log(camelize("abcd_efg")); // abcdEfg + console.log(camelize("abcd efg")); // abcdEfg + */ + + function camelize(str) { + return str.replace(/[\s-_]([a-z])/g, function (all, letter) { + return letter.toUpperCase(); + }); + } + /** + * transform a camelized string into a lowercased string. + * @memberof Utils + * @param {string} text - a camel-cased string + * @param {string} [separator="-"] - a separator + * @return {string} a lowercased string + * @example + import {decamelize} from "@daybrush/utils"; + + console.log(decamelize("transformOrigin")); // transform-origin + console.log(decamelize("abcdEfg", "_")); // abcd_efg + */ + + function decamelize(str, separator) { + if (separator === void 0) { + separator = "-"; + } + + return str.replace(/([a-z])([A-Z])/g, function (all, letter, letter2) { + return "" + letter + separator + letter2.toLowerCase(); + }); + } + /** + * transforms something in an array into an array. + * @memberof Utils + * @param - Array form + * @return an array + * @example + import {toArray} from "@daybrush/utils"; + + const arr1 = toArray(document.querySelectorAll(".a")); // Element[] + const arr2 = toArray(document.querySelectorAll(".a")); // HTMLElement[] + */ + + function toArray(value) { + return [].slice.call(value); + } + /** + * Date.now() method + * @memberof CrossBrowser + * @return {number} milliseconds + * @example + import {now} from "@daybrush/utils"; + + console.log(now()); // 12121324241(milliseconds) + */ + + function now() { + return Date.now ? Date.now() : new Date().getTime(); + } + /** + * Returns the index of the first element in the array that satisfies the provided testing function. + * @function + * @memberof CrossBrowser + * @param - The array `findIndex` was called upon. + * @param - A function to execute on each value in the array until the function returns true, indicating that the satisfying element was found. + * @param - Returns defaultIndex if not found by the function. + * @example + import { findIndex } from "@daybrush/utils"; + + findIndex([{a: 1}, {a: 2}, {a: 3}, {a: 4}], ({ a }) => a === 2); // 1 + */ + + function findIndex(arr, callback, defaultIndex) { + if (defaultIndex === void 0) { + defaultIndex = -1; + } + + var length = arr.length; + + for (var i = 0; i < length; ++i) { + if (callback(arr[i], i, arr)) { + return i; + } + } + + return defaultIndex; + } + /** + * Returns the value of the first element in the array that satisfies the provided testing function. + * @function + * @memberof CrossBrowser + * @param - The array `find` was called upon. + * @param - A function to execute on each value in the array, + * @param - Returns defalutValue if not found by the function. + * @example + import { find } from "@daybrush/utils"; + + find([{a: 1}, {a: 2}, {a: 3}, {a: 4}], ({ a }) => a === 2); // {a: 2} + */ + + function find(arr, callback, defalutValue) { + var index = findIndex(arr, callback); + return index > -1 ? arr[index] : defalutValue; + } + /** + * window.requestAnimationFrame() method with cross browser. + * @function + * @memberof CrossBrowser + * @param {FrameRequestCallback} callback - The function to call when it's time to update your animation for the next repaint. + * @return {number} id + * @example + import {requestAnimationFrame} from "@daybrush/utils"; + + requestAnimationFrame((timestamp) => { + console.log(timestamp); + }); + */ + + var requestAnimationFrame = + /*#__PURE__*/ + function () { + var firstTime = now(); + var raf = IS_WINDOW && (window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame); + return raf ? raf.bind(window) : function (callback) { + var currTime = now(); + var id = window.setTimeout(function () { + callback(currTime - firstTime); + }, 1000 / 60); + return id; + }; + }(); + /** + * window.cancelAnimationFrame() method with cross browser. + * @function + * @memberof CrossBrowser + * @param {number} handle - the id obtained through requestAnimationFrame method + * @return {void} + * @example + import { requestAnimationFrame, cancelAnimationFrame } from "@daybrush/utils"; + + const id = requestAnimationFrame((timestamp) => { + console.log(timestamp); + }); + + cancelAnimationFrame(id); + */ + + var cancelAnimationFrame = + /*#__PURE__*/ + function () { + var caf = IS_WINDOW && (window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || window.msCancelAnimationFrame); + return caf ? caf.bind(window) : function (handle) { + clearTimeout(handle); + }; + }(); + + /** + * @namespace + * @name Color + */ + + /** + * Remove the # from the hex color. + * @memberof Color + * @param {} hex - hex color + * @return {} hex color + * @example + import {cutHex} from "@daybrush/utils"; + + console.log(cutHex("#000000")) // "000000" + */ + + function cutHex(hex) { + return hex.replace("#", ""); + } + /** + * convert hex color to rgb color. + * @memberof Color + * @param {} hex - hex color + * @return {} rgb color + * @example + import {hexToRGBA} from "@daybrush/utils"; + + console.log(hexToRGBA("#00000005")); + // [0, 0, 0, 1] + console.log(hexToRGBA("#201045")); + // [32, 16, 69, 1] + */ + + function hexToRGBA(hex) { + var h = cutHex(hex); + var r = parseInt(h.substring(0, 2), 16); + var g = parseInt(h.substring(2, 4), 16); + var b = parseInt(h.substring(4, 6), 16); + var a = parseInt(h.substring(6, 8), 16) / 255; + + if (isNaN(a)) { + a = 1; + } + + return [r, g, b, a]; + } + /** + * convert 3(or 4)-digit hex color to 6(or 8)-digit hex color. + * @memberof Color + * @param {} hex - 3(or 4)-digit hex color + * @return {} 6(or 8)-digit hex color + * @example + import {toFullHex} from "@daybrush/utils"; + + console.log(toFullHex("#123")); // "#112233" + console.log(toFullHex("#123a")); // "#112233aa" + */ + + function toFullHex(h) { + var r = h.charAt(1); + var g = h.charAt(2); + var b = h.charAt(3); + var a = h.charAt(4); + var arr = ["#", r, r, g, g, b, b, a, a]; + return arr.join(""); + } + /** + * convert hsl color to rgba color. + * @memberof Color + * @param {} hsl - hsl color(hue: 0 ~ 360, saturation: 0 ~ 1, lightness: 0 ~ 1, alpha: 0 ~ 1) + * @return {} rgba color + * @example + import {hslToRGBA} from "@daybrush/utils"; + + console.log(hslToRGBA([150, 0.5, 0.4])); + // [51, 153, 102, 1] + */ + + function hslToRGBA(hsl) { + var h = hsl[0]; + var s = hsl[1]; + var l = hsl[2]; + + if (h < 0) { + h += Math.floor((Math.abs(h) + 360) / 360) * 360; + } + + h %= 360; + var c = (1 - Math.abs(2 * l - 1)) * s; + var x = c * (1 - Math.abs(h / 60 % 2 - 1)); + var m = l - c / 2; + var rgb; + + if (h < 60) { + rgb = [c, x, 0]; + } else if (h < 120) { + rgb = [x, c, 0]; + } else if (h < 180) { + rgb = [0, c, x]; + } else if (h < 240) { + rgb = [0, x, c]; + } else if (h < 300) { + rgb = [x, 0, c]; + } else if (h < 360) { + rgb = [c, 0, x]; + } + + var result = [Math.round((rgb[0] + m) * 255), Math.round((rgb[1] + m) * 255), Math.round((rgb[2] + m) * 255), hsl.length > 3 ? hsl[3] : 1]; + return result; + } + /** + * convert string to rgba color. + * @memberof Color + * @param {} - 3-hex(#000), 4-hex(#0000) 6-hex(#000000), 8-hex(#00000000) or RGB(A), or HSL(A) + * @return {} rgba color + * @example + import {stringToRGBA} from "@daybrush/utils"; + + console.log(stringToRGBA("#000000")); // [0, 0, 0, 1] + console.log(stringToRGBA("rgb(100, 100, 100)")); // [100, 100, 100, 1] + console.log(stringToRGBA("hsl(150, 0.5, 0.4)")); // [51, 153, 102, 1] + */ + + function stringToRGBA(color) { + if (color.charAt(0) === "#") { + if (color.length === 4 || color.length === 5) { + return hexToRGBA(toFullHex(color)); + } else { + return hexToRGBA(color); + } + } else if (color.indexOf("(") !== -1) { + // in bracket. + var _a = splitBracket(color), + prefix = _a.prefix, + value = _a.value; + + if (!prefix || !value) { + return; + } + + var arr = splitComma(value); + var colorArr = []; + var length = arr.length; + + switch (prefix) { + case RGB: + case RGBA: + for (var i = 0; i < length; ++i) { + colorArr[i] = parseFloat(arr[i]); + } + + return colorArr; + + case HSL: + case HSLA: + for (var i = 0; i < length; ++i) { + if (arr[i].indexOf("%") !== -1) { + colorArr[i] = parseFloat(arr[i]) / 100; + } else { + colorArr[i] = parseFloat(arr[i]); + } + } // hsl, hsla to rgba + + + return hslToRGBA(colorArr); + } + } + + return; + } + + /** + * Returns all element descendants of node that + * match selectors. + */ + + /** + * Checks if the specified class value exists in the element's class attribute. + * @memberof DOM + * @param - A DOMString containing one or more selectors to match + * @param - If multi is true, a DOMString containing one or more selectors to match against. + * @example + import {$} from "@daybrush/utils"; + + console.log($("div")); // div element + console.log($("div", true)); // [div, div] elements + */ + + function $(selectors, multi) { + return multi ? doc.querySelectorAll(selectors) : doc.querySelector(selectors); + } + /** + * Checks if the specified class value exists in the element's class attribute. + * @memberof DOM + * @param element - target + * @param className - the class name to search + * @return {boolean} return false if the class is not found. + * @example + import {hasClass} from "@daybrush/utils"; + + console.log(hasClass(element, "start")); // true or false + */ + + function hasClass(element, className) { + if (element.classList) { + return element.classList.contains(className); + } + + return !!element.className.match(new RegExp("(\\s|^)" + className + "(\\s|$)")); + } + /** + * Add the specified class value. If these classe already exist in the element's class attribute they are ignored. + * @memberof DOM + * @param element - target + * @param className - the class name to add + * @example + import {addClass} from "@daybrush/utils"; + + addClass(element, "start"); + */ + + function addClass(element, className) { + if (element.classList) { + element.classList.add(className); + } else { + element.className += " " + className; + } + } + /** + * Removes the specified class value. + * @memberof DOM + * @param element - target + * @param className - the class name to remove + * @example + import {removeClass} from "@daybrush/utils"; + + removeClass(element, "start"); + */ + + function removeClass(element, className) { + if (element.classList) { + element.classList.remove(className); + } else { + var reg = new RegExp("(\\s|^)" + className + "(\\s|$)"); + element.className = element.className.replace(reg, " "); + } + } + /** + * Gets the CSS properties from the element. + * @memberof DOM + * @param elements - elements + * @param properites - the CSS properties + * @return returns CSS properties and values. + * @example + import {fromCSS} from "@daybrush/utils"; + + console.log(fromCSS(element, ["left", "opacity", "top"])); // {"left": "10px", "opacity": 1, "top": "10px"} + */ + + function fromCSS(elements, properties) { + if (!elements || !properties || !properties.length) { + return {}; + } + + var element; + + if (elements instanceof Element) { + element = elements; + } else if (elements.length) { + element = elements[0]; + } else { + return {}; + } + + var cssObject = {}; + var styles = window.getComputedStyle(element); + var length = properties.length; + + for (var i = 0; i < length; ++i) { + cssObject[properties[i]] = styles[properties[i]]; + } + + return cssObject; + } + /** + * Sets up a function that will be called whenever the specified event is delivered to the target + * @memberof DOM + * @param - event target + * @param - A case-sensitive string representing the event type to listen for. + * @param - The object which receives a notification (an object that implements the Event interface) when an event of the specified type occurs + * @param - An options object that specifies characteristics about the event listener. The available options are: + * @example + import {addEvent} from "@daybrush/utils"; + + addEvent(el, "click", e => { + console.log(e); + }); + */ + + function addEvent(el, type, listener, options) { + el.addEventListener(type, listener, options); + } + /** + * removes from the EventTarget an event listener previously registered with EventTarget.addEventListener() + * @memberof DOM + * @param - event target + * @param - A case-sensitive string representing the event type to listen for. + * @param - The EventListener function of the event handler to remove from the event target. + * @example + import {addEvent, removeEvent} from "@daybrush/utils"; + const listener = e => { + console.log(e); + }; + addEvent(el, "click", listener); + removeEvent(el, "click", listener); + */ + + function removeEvent(el, type, listener) { + el.removeEventListener(type, listener); + } + + /** + * attach and trigger event handlers. + */ + + var EventTrigger = + /*#__PURE__*/ + function () { + /** + * @example + const et = new Scene.EventTrigger(); + const scene = new Scene(); + scene.on("call", e => { + console.log(e.param); + }); + et.on("call", e => { + console.log(e.param); + }); + scene.trigger("call", {param: 1}); + et.trigger("call", {param: 1}); + */ + function EventTrigger() { + this.events = {}; + } + + var __proto = EventTrigger.prototype; + + __proto._on = function (name, callback, once) { + var _this = this; + + var events = this.events; + + if (isObject(name)) { + for (var n in name) { + this._on(n, name[n], once); + } + + return; + } + + if (!(name in events)) { + events[name] = []; + } + + if (!callback) { + return; + } + + if (isArray(callback)) { + callback.forEach(function (func) { + return _this._on(name, func, once); + }); + return; + } + + events[name].push(once ? function callback2() { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + callback.apply(void 0, args); + this.off(name, callback2); + } : callback); + }; + /** + * Attach an event handler function for one or more events to target + * @param - event's name + * @param - function to execute when the event is triggered. + * @return {EventTrigger} An Instance itself. + * @example + target.on("animate", function() { + console.log("animate"); + }); + target.trigger("animate"); + */ + + + __proto.on = function (name, callback) { + this._on(name, callback); + + return this; + }; + /** + * Dettach an event handler function for one or more events to target + * @param - event's name + * @param - function to execute when the event is triggered. + * @return {EventTrigger} An Instance itself. + * @example + const callback = function() { + console.log("animate"); + }; + target.on("animate", callback); + target.off("animate", callback); + target.off("animate"); + */ + + + __proto.off = function (name, callback) { + if (!name) { + this.events = {}; + } else if (!callback) { + this.events[name] = []; + } else { + var callbacks = this.events[name]; + + if (!callbacks) { + return this; + } + + var index = callbacks.indexOf(callback); + + if (index !== -1) { + callbacks.splice(index, 1); + } + } + + return this; + }; + /** + * execute event handler + * @param - event's name + * @param - event handler's additional parameter + * @return {EventTrigger} An Instance itself. + * @example + target.on("animate", function(a1, a2) { + console.log("animate", a1, a2); + }); + target.trigger("animate", [1, 2]); // log => "animate", 1, 2 + */ + + + __proto.trigger = function (name) { + var _this = this; + + var data = []; + + for (var _i = 1; _i < arguments.length; _i++) { + data[_i - 1] = arguments[_i]; + } + + var events = this.events; + + if (!(name in events)) { + return this; + } + + var args = data || []; + !args[0] && (args[0] = {}); + var event = events[name]; + var target = args[0]; + target.type = name; + target.currentTarget = this; + !target.target && (target.target = this); + toArray(events[name]).forEach(function (callback) { + callback.apply(_this, data); + }); + return this; + }; + + __proto.once = function (name, callback) { + this._on(name, callback, true); + + return this; + }; + + return EventTrigger; + }(); + + /** + * Make string, array to PropertyObject for the dot product + */ + + var PropertyObject = + /*#__PURE__*/ + function () { + /** + * @param - This value is in the array format. + * @param - options + * @example + var obj = new PropertyObject([100,100,100,0.5], { + "separator" : ",", + "prefix" : "rgba(", + "suffix" : ")" + }); + */ + function PropertyObject(value, options) { + this.prefix = ""; + this.suffix = ""; + this.model = ""; + this.type = ""; + this.separator = ","; + options && this.setOptions(options); + this.value = isString(value) ? value.split(this.separator) : value; + } + + var __proto = PropertyObject.prototype; + + __proto.setOptions = function (newOptions) { + for (var name in newOptions) { + this[name] = newOptions[name]; + } + + return this; + }; + /** + * the number of values. + * @example + const obj1 = new PropertyObject("1,2,3", ","); + console.log(obj1.length); + // 3 + */ + + + __proto.size = function () { + return this.value.length; + }; + /** + * retrieve one of values at the index + * @param {Number} index - index + * @return {Object} one of values at the index + * @example + const obj1 = new PropertyObject("1,2,3", ","); + console.log(obj1.get(0)); + // 1 + */ + + + __proto.get = function (index) { + return this.value[index]; + }; + /** + * Set the value at that index + * @param {Number} index - index + * @param {Object} value - text, a number, object to set + * @return {PropertyObject} An instance itself + * @example + const obj1 = new PropertyObject("1,2,3", ","); + obj1.set(0, 2); + console.log(obj1.toValue()); + // 2,2,3 + */ + + + __proto.set = function (index, value) { + this.value[index] = value; + return this; + }; + /** + * create a copy of an instance itself. + * @return {PropertyObject} clone + * @example + const obj1 = new PropertyObject("1,2,3", ","); + const obj2 = obj1.clone(); + */ + + + __proto.clone = function () { + var _a = this, + separator = _a.separator, + prefix = _a.prefix, + suffix = _a.suffix, + model = _a.model, + type = _a.type; + + var arr = this.value.map(function (v) { + return v instanceof PropertyObject ? v.clone() : v; + }); + return new PropertyObject(arr, { + separator: separator, + prefix: prefix, + suffix: suffix, + model: model, + type: type + }); + }; + /** + * Make Property Object to String + * @return {String} Make Property Object to String + * @example + //rgba(100, 100, 100, 0.5) + const obj4 = new PropertyObject([100,100,100,0.5], { + "separator" : ",", + "prefix" : "rgba(", + "suffix" : ")", + }); + console.log(obj4.toValue()); + // "rgba(100,100,100,0.5)" + */ + + + __proto.toValue = function () { + return this.prefix + this.join() + this.suffix; + }; + /** + * Make Property Object's array to String + * @return {String} Join the elements of an array into a string + * @example + //rgba(100, 100, 100, 0.5) + var obj4 = new PropertyObject([100,100,100,0.5], { + "separator" : ",", + "prefix" : "rgba(", + "suffix" : ")" + }); + obj4.join(); // => "100,100,100,0.5" + */ + + + __proto.join = function () { + return this.value.map(function (v) { + return v instanceof PropertyObject ? v.toValue() : v; + }).join(this.separator); + }; + /** + * executes a provided function once per array element. + * @param {Function} callback - Function to execute for each element, taking three arguments + * @param {All} [callback.currentValue] The current element being processed in the array. + * @param {Number} [callback.index] The index of the current element being processed in the array. + * @param {Array} [callback.array] the array. + * @return {PropertyObject} An instance itself + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach|MDN Array.forEach()} reference to MDN document. + * @example + //rgba(100, 100, 100, 0.5) + var obj4 = new PropertyObject([100,100,100,0.5], { + "separator" : ",", + "prefix" : "rgba(", + "suffix" : ")" + }); + obj4.forEach(t => { + console.log(t); + }); // => "100,100,100,0.5" + */ + + + __proto.forEach = function (func) { + this.value.forEach(func); + return this; + }; + + return PropertyObject; + }(); + + /** + * @namespace + * @name Property + */ + function splitStyle(str) { + var properties = splitText(str, ";"); + var obj = {}; + var length = properties.length; + + for (var i = 0; i < length; ++i) { + var matches = splitText(properties[i], ":"); + + if (matches.length < 2 || !matches[1]) { + --length; + continue; + } + + obj[matches[0].trim()] = toPropertyObject(matches[1].trim()); + } + + return { + styles: obj, + length: length + }; + } + /** + * convert array to PropertyObject[type=color]. + * default model "rgba" + * @memberof Property + * @function arrayToColorObject + * @param {Array|PropertyObject} value ex) [0, 0, 0, 1] + * @return {PropertyObject} PropertyObject[type=color] + * @example + arrayToColorObject([0, 0, 0]) + // => PropertyObject(type="color", model="rgba", value=[0, 0, 0, 1], separator=",") + */ + + function arrayToColorObject(arr) { + var model = RGBA; + + if (arr.length === 3) { + arr[3] = 1; + } + + return new PropertyObject(arr, { + model: model, + separator: ",", + type: "color", + prefix: model + "(", + suffix: ")" + }); + } + /** + * convert text with parentheses to object. + * @memberof Property + * @function stringToBracketObject + * @param {String} value ex) "rgba(0,0,0,1)" + * @return {PropertyObject} PropertyObject + * @example + stringToBracketObject("abcde(0, 0, 0,1)") + // => PropertyObject(model="abcde", value=[0, 0, 0,1], separator=",") + */ + + function stringToBracketObject(text) { + // [prefix, value, other] + var _a = splitBracket(text), + model = _a.prefix, + value = _a.value, + afterModel = _a.suffix; + + if (typeof value === "undefined") { + return text; + } + + if (COLOR_MODELS.indexOf(model) > -1) { + return arrayToColorObject(stringToRGBA(text)); + } // divide comma(,) + + + var obj = toPropertyObject(value, model); + var arr = [value]; + var separator = ","; + var prefix = model + "("; + var suffix = ")" + afterModel; + + if (obj instanceof PropertyObject) { + separator = obj.separator; + arr = obj.value; + prefix += obj.prefix; + suffix = obj.suffix + suffix; + } + + return new PropertyObject(arr, { + separator: separator, + model: model, + prefix: prefix, + suffix: suffix + }); + } + function arrayToPropertyObject(arr, separator) { + return new PropertyObject(arr, { + type: "array", + separator: separator + }); + } + /** + * convert text with parentheses to PropertyObject[type=color]. + * If the values are not RGBA model, change them RGBA mdoel. + * @memberof Property + * @function stringToColorObject + * @param {String|PropertyObject} value ex) "rgba(0,0,0,1)" + * @return {PropertyObject} PropertyObject[type=color] + * @example + stringToColorObject("rgba(0, 0, 0,1)") + // => PropertyObject(type="color", model="rgba", value=[0, 0, 0,1], separator=",") + */ + + function stringToColorObject(value) { + var result = stringToRGBA(value); + return result ? arrayToColorObject(result) : value; + } + function toPropertyObject(value, model) { + if (!isString(value)) { + if (isArray(value)) { + return arrayToPropertyObject(value, ","); + } + + return value; + } + + var values = splitComma(value); + + if (values.length > 1) { + return arrayToPropertyObject(values.map(function (v) { + return toPropertyObject(v); + }), ","); + } + + values = splitSpace(value); + + if (values.length > 1) { + return arrayToPropertyObject(values.map(function (v) { + return toPropertyObject(v); + }), " "); + } + + values = /^(['"])([^'"]*)(['"])$/g.exec(value); + + if (values && values[1] === values[3]) { + // Quotes + return new PropertyObject([toPropertyObject(values[2])], { + prefix: values[1], + suffix: values[1] + }); + } else if (value.indexOf("(") !== -1) { + // color + return stringToBracketObject(value); + } else if (value.charAt(0) === "#" && model !== "url") { + return stringToColorObject(value); + } + + return value; + } + function toObject(object, result) { + if (result === void 0) { + result = {}; + } + + var model = object.model; + + if (model) { + object.setOptions({ + model: "", + suffix: "", + prefix: "" + }); + var value = object.size() > 1 ? object : object.get(0); + result[model] = value; + } else { + object.forEach(function (obj) { + toObject(obj, result); + }); + } + + return result; + } + + function isPropertyObject(value) { + return value instanceof PropertyObject; + } + function setAlias(name, alias) { + ALIAS[name] = alias; + } + function setRole(names, isProperty, isFixedProperty) { + var length = names.length; + var roles = ROLES; + var fixed = FIXED; + + for (var i = 0; i < length - 1; ++i) { + !roles[names[i]] && (roles[names[i]] = {}); + roles = roles[names[i]]; + + if (isFixedProperty) { + !fixed[names[i]] && (fixed[names[i]] = {}); + fixed = fixed[names[i]]; + } + } + + isFixedProperty && (fixed[names[length - 1]] = true); + roles[names[length - 1]] = isProperty ? true : {}; + } + function getType(value) { + var type = typeof value; + + if (type === OBJECT) { + if (isArray(value)) { + return ARRAY; + } else if (isPropertyObject(value)) { + return PROPERTY; + } + } else if (type === STRING || type === NUMBER) { + return "value"; + } + + return type; + } + function isPureObject(obj) { + return isObject(obj) && obj.constructor === Object; + } + function getNames(names, stack) { + var arr = []; + + if (isPureObject(names)) { + for (var name in names) { + stack.push(name); + arr = arr.concat(getNames(names[name], stack)); + stack.pop(); + } + } else { + arr.push(stack.slice()); + } + + return arr; + } + function updateFrame(names, properties) { + for (var name in properties) { + var value = properties[name]; + + if (!isPureObject(value)) { + names[name] = true; + continue; + } + + if (!isObject(names[name])) { + names[name] = {}; + } + + updateFrame(names[name], properties[name]); + } + + return names; + } + function toFixed(num) { + return Math.round(num * MAXIMUM) / MAXIMUM; + } + function getValueByNames(names, properties, length) { + if (length === void 0) { + length = names.length; + } + + var value = properties; + + for (var i = 0; i < length; ++i) { + if (!isObject(value)) { + return undefined; + } + + value = value[names[i]]; + } + + return value; + } + function isInProperties(roles, args, isCheckTrue) { + var length = args.length; + var role = roles; + + if (length === 0) { + return false; + } + + for (var i = 0; i < length; ++i) { + if (role === true) { + return false; + } + + role = role[args[i]]; + + if (!role || !isCheckTrue && role === true) { + return false; + } + } + + return true; + } + function isRole(args, isCheckTrue) { + return isInProperties(ROLES, args, isCheckTrue); + } + function isFixed(args) { + return isInProperties(FIXED, args, true); + } + function setPlayCSS(item, isActivate) { + item.state[PLAY_CSS] = isActivate; + } + function isPausedCSS(item) { + return item.state[PLAY_CSS] && item.isPaused(); + } + function isEndedCSS(item) { + return !item.isEnded() && item.state[PLAY_CSS]; + } + function exportCSS(id, css) { + var styleId = PREFIX + "STYLE_" + toId(id); + var styleElement = $("#" + styleId); + + if (styleElement) { + styleElement.innerText = css; + } else { + doc.body.insertAdjacentHTML("beforeend", ""); + } + } + function makeId(selector) { + for (;;) { + var id = "" + Math.floor(Math.random() * 10000000); + + if (!IS_WINDOW || !selector) { + return id; + } + + var checkElement = $("[data-scene-id=\"" + id + "\"]"); + + if (!checkElement) { + return id; + } + } + } + function getRealId(item) { + return item.getId() || item.setId(makeId(false)).getId(); + } + function toId(text) { + return ("" + text).match(/[0-9a-zA-Z]+/g).join(""); + } + function playCSS(item, isExportCSS, playClassName, properties) { + if (properties === void 0) { + properties = {}; + } + + if (!ANIMATION || item.getPlayState() === RUNNING) { + return; + } + + var className = playClassName || START_ANIMATION; + + if (isPausedCSS(item)) { + item.addPlayClass(true, className, properties); + } else { + if (item.isEnded()) { + item.setTime(0); + } + + isExportCSS && item.exportCSS({ + className: className + }); + var el = item.addPlayClass(false, className, properties); + + if (!el) { + return; + } + + addAnimationEvent(item, el); + setPlayCSS(item, true); + } + + item.setPlayState(RUNNING); + } + function addAnimationEvent(item, el) { + var state = item.state; + var duration = item.getDuration(); + var isZeroDuration = !duration || !isFinite(duration); + + var animationend = function () { + setPlayCSS(item, false); + item.finish(); + }; + + var animationstart = function () { + item.trigger(PLAY); + }; + + item.once(ENDED, function () { + removeEvent(el, "animationcancel", animationend); + removeEvent(el, "animationend", animationend); + removeEvent(el, "animationiteration", animationiteration); + removeEvent(el, "animationstart", animationstart); + }); + + var animationiteration = function (_a) { + var elapsedTime = _a.elapsedTime; + var currentTime = elapsedTime; + var iterationCount = isZeroDuration ? 0 : currentTime / duration; + state[CURRENT_TIME] = currentTime; + item.setIteration(iterationCount); + }; + + addEvent(el, "animationcancel", animationend); + addEvent(el, "animationend", animationend); + addEvent(el, "animationiteration", animationiteration); + addEvent(el, "animationstart", animationstart); + } + function getEasing(curveArray) { + var easing; + + if (isString(curveArray)) { + if (curveArray in EASINGS) { + easing = EASINGS[curveArray]; + } else { + var obj = toPropertyObject(curveArray); + + if (isString(obj)) { + return 0; + } else { + if (obj.model === "cubic-bezier") { + curveArray = obj.value.map(function (v) { + return parseFloat(v); + }); + easing = bezier(curveArray[0], curveArray[1], curveArray[2], curveArray[3]); + } else if (obj.model === "steps") { + easing = steps(parseFloat(obj.value[0]), obj.value[1]); + } else { + return 0; + } + } + } + } else if (isArray(curveArray)) { + easing = bezier(curveArray[0], curveArray[1], curveArray[2], curveArray[3]); + } else { + easing = curveArray; + } + + return easing; + } + + function GetterSetter(getter, setter, parent) { + return function (constructor) { + var prototype = constructor.prototype; + getter.forEach(function (name) { + prototype[camelize("get " + name)] = function () { + return this[parent][name]; + }; + }); + setter.forEach(function (name) { + prototype[camelize("set " + name)] = function (value) { + this[parent][name] = value; + return this; + }; + }); + }; + } + + function isDirectionReverse(iteration, iteraiontCount, direction) { + if (direction === REVERSE) { + return true; + } else if (iteraiontCount !== INFINITE && iteration === iteraiontCount && iteraiontCount % 1 === 0) { + return direction === (iteration % 2 >= 1 ? ALTERNATE_REVERSE : ALTERNATE); + } + + return direction === (iteration % 2 >= 1 ? ALTERNATE : ALTERNATE_REVERSE); + } + /** + * @typedef {Object} AnimatorState The Animator options. Properties used in css animation. + * @property {number} [duration] The duration property defines how long an animation should take to complete one cycle. + * @property {"none"|"forwards"|"backwards"|"both"} [fillMode] The fillMode property specifies a style for the element when the animation is not playing (before it starts, after it ends, or both). + * @property {"infinite"|number} [iterationCount] The iterationCount property specifies the number of times an animation should be played. + * @property {array|function} [easing] The easing(timing-function) specifies the speed curve of an animation. + * @property {number} [delay] The delay property specifies a delay for the start of an animation. + * @property {"normal"|"reverse"|"alternate"|"alternate-reverse"} [direction] The direction property defines whether an animation should be played forwards, backwards or in alternate cycles. + */ + + var setters = ["id", ITERATION_COUNT, DELAY, FILL_MODE, DIRECTION, PLAY_SPEED, DURATION, PLAY_SPEED, ITERATION_TIME, PLAY_STATE]; + var getters = setters.concat([EASING, EASING_NAME]); + /** + * play video, animation, the others + * @extends EventTrigger + * @see {@link https://www.w3schools.com/css/css3_animations.asp|CSS3 Animation} + */ + + var Animator = + /*#__PURE__*/ + function (_super) { + __extends(Animator, _super); + /** + * @param - animator's options + * @example + const animator = new Animator({ + delay: 2, + diretion: "alternate", + duration: 2, + fillMode: "forwards", + iterationCount: 3, + easing: Scene.easing.EASE, + }); + */ + + + function Animator(options) { + var _this = _super.call(this) || this; + + _this.timerId = 0; + _this.state = { + id: "", + easing: 0, + easingName: "linear", + iterationCount: 1, + delay: 0, + fillMode: "forwards", + direction: NORMAL, + playSpeed: 1, + currentTime: 0, + iterationTime: -1, + iteration: 0, + tickTime: 0, + prevTime: 0, + playState: PAUSED, + duration: 0 + }; + + _this.setOptions(options); + + return _this; + } + /** + * set animator's easing. + * @param curverArray - The speed curve of an animation. + * @return {Animator} An instance itself. + * @example + animator.({ + delay: 2, + diretion: "alternate", + duration: 2, + fillMode: "forwards", + iterationCount: 3, + easing: Scene.easing.EASE, + }); + */ + + + var __proto = Animator.prototype; + + __proto.setEasing = function (curveArray) { + var easing = getEasing(curveArray); + var easingName = easing && easing[EASING_NAME] || "linear"; + var state = this.state; + state[EASING] = easing; + state[EASING_NAME] = easingName; + return this; + }; + /** + * set animator's options. + * @see {@link https://www.w3schools.com/css/css3_animations.asp|CSS3 Animation} + * @param - animator's options + * @return {Animator} An instance itself. + * @example + animator.({ + delay: 2, + diretion: "alternate", + duration: 2, + fillMode: "forwards", + iterationCount: 3, + easing: Scene.eaasing.EASE, + }); + */ + + + __proto.setOptions = function (options) { + if (options === void 0) { + options = {}; + } + + for (var name in options) { + var value = options[name]; + + if (name === EASING) { + this.setEasing(value); + continue; + } else if (name === DURATION) { + value && this.setDuration(value); + continue; + } + + if (OPTIONS.indexOf(name) > -1) { + this.state[name] = value; + } + } + + return this; + }; + /** + * Get the animator's total duration including delay + * @return {number} Total duration + * @example + animator.getTotalDuration(); + */ + + + __proto.getTotalDuration = function () { + return this.getActiveDuration(true); + }; + /** + * Get the animator's total duration excluding delay + * @return {number} Total duration excluding delay + * @example + animator.getActiveDuration(); + */ + + + __proto.getActiveDuration = function (delay) { + var state = this.state; + var count = state[ITERATION_COUNT]; + + if (count === INFINITE) { + return Infinity; + } + + return (delay ? state[DELAY] : 0) + this.getDuration() * count; + }; + /** + * Check if the animator has reached the end. + * @return {boolean} ended + * @example + animator.isEnded(); // true or false + */ + + + __proto.isEnded = function () { + if (this.state[TICK_TIME] === 0 && this.state[PLAY_STATE] === PAUSED) { + return true; + } else if (this.getTime() < this.getActiveDuration()) { + return false; + } + + return true; + }; + /** + *Check if the animator is paused: + * @return {boolean} paused + * @example + animator.isPaused(); // true or false + */ + + + __proto.isPaused = function () { + return this.state[PLAY_STATE] === PAUSED; + }; + + __proto.start = function (delay) { + if (delay === void 0) { + delay = this.state[DELAY]; + } + + var state = this.state; + state[PLAY_STATE] = RUNNING; + + if (state[TICK_TIME] >= delay) { + /** + * This event is fired when play animator. + * @event Animator#play + */ + this.trigger(PLAY); + return true; + } + + return false; + }; + /** + * play animator + * @return {Animator} An instance itself. + */ + + + __proto.play = function (toTime) { + var _this = this; + + var state = this.state; + var delay = state[DELAY]; + var currentTime = this.getTime(); + state[PLAY_STATE] = RUNNING; + + if (this.isEnded() && (currentTime === 0 || currentTime >= this.getActiveDuration())) { + this.setTime(-delay, true); + } + + this.timerId = requestAnimationFrame(function (time) { + state[PREV_TIME] = time; + + _this.tick(time, toTime); + }); + this.start(); + return this; + }; + /** + * pause animator + * @return {Animator} An instance itself. + */ + + + __proto.pause = function () { + var state = this.state; + + if (state[PLAY_STATE] !== PAUSED) { + state[PLAY_STATE] = PAUSED; + /** + * This event is fired when animator is paused. + * @event Animator#paused + */ + + this.trigger(PAUSED); + } + + cancelAnimationFrame(this.timerId); + return this; + }; + /** + * end animator + * @return {Animator} An instance itself. + */ + + + __proto.finish = function () { + this.setTime(0); + this.state[TICK_TIME] = 0; + this.end(); + return this; + }; + /** + * end animator + * @return {Animator} An instance itself. + */ + + + __proto.end = function () { + this.pause(); + /** + * This event is fired when animator is ended. + * @event Animator#ended + */ + + this.trigger(ENDED); + return this; + }; + /** + * set currentTime + * @param {Number|String} time - currentTime + * @return {Animator} An instance itself. + * @example + animator.setTime("from"); // 0 + animator.setTime("to"); // 100% + animator.setTime("50%"); + animator.setTime(10); + animator.getTime() // 10 + */ + + + __proto.setTime = function (time, isTick, isParent) { + var activeDuration = this.getActiveDuration(); + var state = this.state; + var prevTime = state[TICK_TIME]; + var delay = state[DELAY]; + var currentTime = isTick ? time : this.getUnitTime(time); + state[TICK_TIME] = delay + currentTime; + + if (currentTime < 0) { + currentTime = 0; + } else if (currentTime > activeDuration) { + currentTime = activeDuration; + } + + state[CURRENT_TIME] = currentTime; + this.calculate(); + + if (isTick && !isParent) { + var tickTime = state[TICK_TIME]; + + if (prevTime < delay && time >= 0) { + this.start(0); + } + + if (tickTime < prevTime || this.isEnded()) { + this.end(); + return; + } + } + + if (this.isDelay()) { + return this; + } + /** + * This event is fired when the animator updates the time. + * @event Animator#timeupdate + * @param {Object} param The object of data to be sent to an event. + * @param {Number} param.currentTime The total time that the animator is running. + * @param {Number} param.time The iteration time during duration that the animator is running. + * @param {Number} param.iterationCount The iteration count that the animator is running. + */ + + + this.trigger(TIMEUPDATE, { + currentTime: currentTime, + time: this.getIterationTime(), + iterationCount: state[ITERATION] + }); + return this; + }; + /** + * Get the animator's current time + * @return {number} current time + * @example + animator.getTime(); + */ + + + __proto.getTime = function () { + return this.state[CURRENT_TIME]; + }; + + __proto.getUnitTime = function (time) { + if (isString(time)) { + var duration = this.getDuration() || 100; + + if (time === "from") { + return 0; + } else if (time === "to") { + return duration; + } + + var _a = splitUnit(time), + unit = _a.unit, + value = _a.value; + + if (unit === "%") { + !this.getDuration() && this.setDuration(duration); + return toFixed(parseFloat(time) / 100 * duration); + } else if (unit === ">") { + return value + THRESHOLD; + } else { + return value; + } + } else { + return toFixed(time); + } + }; + /** + * Check if the current state of animator is delayed. + * @return {boolean} check delay state + */ + + + __proto.isDelay = function () { + var state = this.state; + var delay = state[DELAY]; + var tickTime = state[TICK_TIME]; + return delay > 0 && tickTime < delay; + }; + + __proto.setIteration = function (iterationCount) { + var state = this.state; + var passIterationCount = Math.floor(iterationCount); + var maxIterationCount = state[ITERATION_COUNT] === INFINITE ? Infinity : state[ITERATION_COUNT]; + + if (state[ITERATION] < passIterationCount && passIterationCount < maxIterationCount) { + /** + * The event is fired when an iteration of an animation ends. + * @event Animator#iteration + * @param {Object} param The object of data to be sent to an event. + * @param {Number} param.currentTime The total time that the animator is running. + * @param {Number} param.iterationCount The iteration count that the animator is running. + */ + this.trigger("iteration", { + currentTime: state[CURRENT_TIME], + iterationCount: passIterationCount + }); + } + + state[ITERATION] = iterationCount; + return this; + }; + + __proto.calculate = function () { + var state = this.state; + var iterationCount = state[ITERATION_COUNT]; + var fillMode = state[FILL_MODE]; + var direction = state[DIRECTION]; + var duration = this.getDuration(); + var time = this.getTime(); + var iteration = duration === 0 ? 0 : time / duration; + var currentIterationTime = duration ? time % duration : 0; + + if (!duration) { + this.setIterationTime(0); + return this; + } + + this.setIteration(iteration); // direction : normal, reverse, alternate, alternate-reverse + // fillMode : forwards, backwards, both, none + + var isReverse = isDirectionReverse(iteration, iterationCount, direction); + var isFiniteDuration = isFinite(duration); + + if (isFiniteDuration && isReverse) { + currentIterationTime = duration - currentIterationTime; + } + + if (isFiniteDuration && iterationCount !== INFINITE) { + var isForwards = fillMode === "both" || fillMode === "forwards"; // fill forwards + + if (iteration >= iterationCount) { + currentIterationTime = duration * (isForwards ? iterationCount % 1 || 1 : 0); + isReverse && (currentIterationTime = duration - currentIterationTime); + } + } + + this.setIterationTime(currentIterationTime); + return this; + }; + + __proto.tick = function (now, to) { + var _this = this; + + if (this.isPaused()) { + return; + } + + var state = this.state; + var playSpeed = state[PLAY_SPEED]; + var prevTime = state[PREV_TIME]; + var delay = state[DELAY]; + var tickTime = state[TICK_TIME]; + var currentTime = tickTime + Math.min(1000, now - prevTime) / 1000 * playSpeed; + state[PREV_TIME] = now; + this.setTime(currentTime - delay, true); + + if (to && to * 1000 < now) { + this.pause(); + } + + if (state[PLAY_STATE] === PAUSED) { + return; + } + + this.timerId = requestAnimationFrame(function (time) { + _this.tick(time, to); + }); + }; + + Animator = __decorate([GetterSetter(getters, setters, "state")], Animator); + return Animator; + }(EventTrigger); + + function toInnerProperties(obj) { + if (!obj) { + return ""; + } + + var arrObj = []; + + for (var name in obj) { + arrObj.push(name.replace(/\d$/g, "") + "(" + obj[name] + ")"); + } + + return arrObj.join(" "); + } + /* eslint-disable */ + + + function clone(target, toValue) { + if (toValue === void 0) { + toValue = false; + } + + return merge({}, target, toValue); + } + + function merge(to, from, toValue) { + if (toValue === void 0) { + toValue = false; + } + + for (var name in from) { + var value = from[name]; + var type = getType(value); + + if (type === PROPERTY) { + to[name] = toValue ? value.toValue() : value.clone(); + } else if (type === FUNCTION) { + to[name] = toValue ? getValue([name], value) : value; + } else if (type === ARRAY) { + to[name] = value.slice(); + } else if (type === OBJECT) { + if (isObject(to[name]) && !isPropertyObject(to[name])) { + merge(to[name], value, toValue); + } else { + to[name] = clone(value, toValue); + } + } else { + to[name] = from[name]; + } + } + + return to; + } + /* eslint-enable */ + + + function getPropertyName(args) { + return args[0] in ALIAS ? ALIAS[args[0]] : args; + } + + function getValue(names, value) { + var type = getType(value); + + if (type === PROPERTY) { + return value.toValue(); + } else if (type === FUNCTION) { + if (names[0] !== TIMING_FUNCTION) { + return getValue(names, value()); + } + } else if (type === OBJECT) { + return clone(value, true); + } + + return value; + } + /** + * Animation's Frame + */ + + + var Frame = + /*#__PURE__*/ + function () { + /** + * @param - properties + * @example + const frame = new Scene.Frame({ + display: "none" + transform: { + translate: "50px", + scale: "5, 5", + } + }); + */ + function Frame(properties) { + if (properties === void 0) { + properties = {}; + } + + this.properties = {}; + this.set(properties); + } + /** + * get property value + * @param {...Number|String|PropertyObject} args - property name or value + * @example + frame.get("display") // => "none", "block", .... + frame.get("transform", "translate") // => "10px,10px" + */ + + + var __proto = Frame.prototype; + + __proto.get = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var value = this.raw.apply(this, args); + return getValue(getPropertyName(args), value); + }; + + __proto.raw = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + return getValueByNames(getPropertyName(args), this.properties); + }; + /** + * remove property value + * @param {...String} args - property name + * @return {Frame} An instance itself + * @example + frame.remove("display") + */ + + + __proto.remove = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var params = getPropertyName(args); + var length = params.length; + + if (!length) { + return this; + } + + var value = getValueByNames(params, this.properties, length - 1); + + if (isObject(value)) { + delete value[params[length - 1]]; + } + + return this; + }; + /** + * set property + * @param {...Number|String|PropertyObject} args - property names or values + * @return {Frame} An instance itself + * @example + // one parameter + frame.set({ + display: "none", + transform: { + translate: "10px, 10px", + scale: "1", + }, + filter: { + brightness: "50%", + grayscale: "100%" + } + }); + // two parameters + frame.set("transform", { + translate: "10px, 10px", + scale: "1", + }); + // three parameters + frame.set("transform", "translate", "50px"); + */ + + + __proto.set = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var self = this; + var length = args.length; + var params = args.slice(0, -1); + var value = args[length - 1]; + var firstParam = params[0]; + + if (length === 1 && value instanceof Frame) { + self.merge(value); + } else if (firstParam in ALIAS) { + self._set(ALIAS[firstParam], value); + } else if (length === 2 && isArray(firstParam)) { + self._set(firstParam, value); + } else if (isPropertyObject(value)) { + if (isRole(params)) { + self.set.apply(self, params.concat([toObject(value)])); + } else { + self._set(params, value); + } + } else if (isArray(value)) { + self._set(params, value); + } else if (isObject(value)) { + if (!self.has.apply(self, params) && isRole(params)) { + self._set(params, {}); + } + + for (var name in value) { + self.set.apply(self, params.concat([name, value[name]])); + } + } else if (isString(value)) { + if (isRole(params, true)) { + if (isFixed(params) || !isRole(params)) { + this._set(params, value); + } else { + var obj = toPropertyObject(value); + + if (isObject(obj)) { + self.set.apply(self, params.concat([obj])); + } + } + + return this; + } else { + var _a = splitStyle(value), + styles = _a.styles, + stylesLength = _a.length; + + for (var name in styles) { + self.set.apply(self, params.concat([name, styles[name]])); + } + + if (stylesLength) { + return this; + } + } + + self._set(params, value); + } else { + self._set(params, value); + } + + return self; + }; + /** + * Gets the names of properties. + * @return the names of properties. + * @example + // one parameter + frame.set({ + display: "none", + transform: { + translate: "10px, 10px", + scale: "1", + }, + }); + // [["display"], ["transform", "translate"], ["transform", "scale"]] + console.log(frame.getNames()); + */ + + + __proto.getNames = function () { + return getNames(this.properties, []); + }; + /** + * check that has property. + * @param {...String} args - property name + * @example + frame.has("property", "display") // => true or false + */ + + + __proto.has = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var params = getPropertyName(args); + var length = params.length; + + if (!length) { + return false; + } + + return !isUndefined(getValueByNames(params, this.properties, length)); + }; + /** + * clone frame. + * @return {Frame} An instance of clone + * @example + frame.clone(); + */ + + + __proto.clone = function () { + var frame = new Frame(); + return frame.merge(this); + }; + /** + * merge one frame to other frame. + * @param - target frame. + * @return {Frame} An instance itself + * @example + frame.merge(frame2); + */ + + + __proto.merge = function (frame) { + var properties = this.properties; + var frameProperties = frame.properties; + + if (frameProperties) { + merge(properties, frameProperties); + } + + return this; + }; + /** + * Specifies an css object that coverted the frame. + * @return {object} cssObject + */ + + + __proto.toCSSObject = function () { + var properties = this.get(); + var cssObject = {}; + + for (var name in properties) { + if (isRole([name], true)) { + continue; + } + + var value = properties[name]; + + if (name === TIMING_FUNCTION) { + cssObject[TIMING_FUNCTION.replace("animation", ANIMATION)] = (isString(value) ? value : value[EASING_NAME]) || "initial"; + } else { + cssObject[name] = value; + } + } + + var transform = toInnerProperties(properties[TRANSFORM_NAME]); + var filter = toInnerProperties(properties.filter); + TRANSFORM && transform && (cssObject[TRANSFORM] = transform); + FILTER && filter && (cssObject[FILTER] = filter); + return cssObject; + }; + /** + * Specifies an css text that coverted the frame. + * @return {string} cssText + */ + + + __proto.toCSS = function () { + var cssObject = this.toCSSObject(); + var cssArray = []; + + for (var name in cssObject) { + cssArray.push(name + ":" + cssObject[name] + ";"); + } + + return cssArray.join(""); + }; + /** + * Remove All Properties + * @return {Frame} An instance itself + */ + + + __proto.clear = function () { + this.properties = {}; + return this; + }; + + __proto._set = function (args, value) { + var properties = this.properties; + var length = args.length; + + for (var i = 0; i < length - 1; ++i) { + var name = args[i]; + !(name in properties) && (properties[name] = {}); + properties = properties[name]; + } + + if (!length) { + return; + } + + if (length === 1 && args[0] === TIMING_FUNCTION) { + properties[TIMING_FUNCTION] = getEasing(value); + } else { + var lastParam = args[length - 1]; + properties[lastParam] = isString(value) && !isFixed(args) ? toPropertyObject(value, lastParam) : value; + } + }; + + return Frame; + }(); + + function dotArray(a1, a2, b1, b2) { + var length = a2.length; + return a1.map(function (v1, i) { + if (i >= length) { + return v1; + } else { + return dot$1(v1, a2[i], b1, b2); + } + }); + } + + function dotColor(color1, color2, b1, b2) { + // convert array to PropertyObject(type=color) + var value1 = color1.value; + var value2 = color2.value; // If the model name is not same, the inner product is impossible. + + var model1 = color1.model; + var model2 = color2.model; + + if (model1 !== model2) { + // It is recognized as a string. + return dot$1(color1.toValue(), color2.toValue(), b1, b2); + } + + if (value1.length === 3) { + value1[3] = 1; + } + + if (value2.length === 3) { + value2[3] = 1; + } + + var v = dotArray(value1, value2, b1, b2); + var colorModel = model1; + + for (var i = 0; i < 3; ++i) { + v[i] = parseInt(v[i], 10); + } + + var object = new PropertyObject(v, { + type: "color", + model: colorModel, + prefix: colorModel + "(", + suffix: ")" + }); + return object; + } + + function dotObject(a1, a2, b1, b2) { + var a1Type = a1.type; + + if (a1Type === "color") { + return dotColor(a1, a2, b1, b2); + } + + var value1 = a1.value; + var value2 = a2.value; + var arr = dotArray(value1, value2, b1, b2); + return new PropertyObject(arr, { + type: a1Type, + separator: a1.separator || a2.separator, + prefix: a1.prefix || a2.prefix, + suffix: a1.suffix || a2.suffix, + model: a1.model || a2.model + }); + } + /** + * The dot product of a1 and a2 for the b1 and b2. + * @memberof Dot + * @function dot + * @param {String|Number|PropertyObject} a1 value1 + * @param {String|Number|PropertyObject} a2 value2 + * @param {Number} b1 b1 ratio + * @param {Number} b2 b2 ratio + * @return {String} Not Array, Not Separator, Only Number & Unit + * @return {PropertyObject} Array with Separator. + * @example + dot(1, 3, 0.3, 0.7); + // => 1.6 + */ + + + function dot$1(a1, a2, b1, b2) { + if (b2 === 0) { + return a2; + } else if (b1 === 0 || b1 + b2 === 0) { + // prevent division by zero. + return a1; + } // dot Object + + + var type1 = getType(a1); + var type2 = getType(a2); + var isFunction1 = type1 === FUNCTION; + var isFunction2 = type2 === FUNCTION; + + if (isFunction1 || isFunction2) { + return function () { + return dot$1(isFunction1 ? toPropertyObject(a1()) : a1, isFunction2 ? toPropertyObject(a2()) : a2, b1, b2); + }; + } else if (type1 === type2) { + if (type1 === PROPERTY) { + return dotObject(a1, a2, b1, b2); + } else if (type1 === ARRAY) { + return dotArray(a1, a2, b1, b2); + } else if (type1 !== "value") { + return a1; + } + } else { + return a1; + } + + var v1 = splitUnit("" + a1); + var v2 = splitUnit("" + a2); + var v; // 숫자가 아닐경우 첫번째 값을 반환 b2가 0일경우 두번째 값을 반환 + + if (isNaN(v1.value) || isNaN(v2.value)) { + return a1; + } else { + v = dot(v1.value, v2.value, b1, b2); + } + + var prefix = v1.prefix || v2.prefix; + var unit = v1.unit || v2.unit; + + if (!prefix && !unit) { + return v; + } + + return prefix + v + unit; + } + function dotValue(time, prevTime, nextTime, prevValue, nextValue, easing) { + if (time === prevTime) { + return prevValue; + } else if (time === nextTime) { + return nextValue; + } else if (!easing) { + return dot$1(prevValue, nextValue, time - prevTime, nextTime - time); + } + + var ratio = easing((time - prevTime) / (nextTime - prevTime)); + var value = dot$1(prevValue, nextValue, ratio, 1 - ratio); + return value; + } + + function getNearTimeIndex(times, time) { + var length = times.length; + + for (var i = 0; i < length; ++i) { + if (times[i] === time) { + return [i, i]; + } else if (times[i] > time) { + return [i > 0 ? i - 1 : 0, i]; + } + } + + return [length - 1, length - 1]; + } + + function makeAnimationProperties(properties) { + var cssArray = []; + + for (var name in properties) { + cssArray.push(ANIMATION + "-" + decamelize(name) + ":" + properties[name] + ";"); + } + + return cssArray.join(""); + } + + function addTime(times, time) { + var length = times.length; + + for (var i = 0; i < length; ++i) { + if (time < times[i]) { + times.splice(i, 0, time); + return; + } + } + + times[length] = time; + } + + function addEntry(entries, time, keytime) { + var prevEntry = entries[entries.length - 1]; + (!prevEntry || prevEntry[0] !== time || prevEntry[1] !== keytime) && entries.push([toFixed(time), toFixed(keytime)]); + } + + function getEntries(times, states) { + var entries = times.map(function (time) { + return [time, time]; + }); + var nextEntries = []; + states.forEach(function (state) { + var iterationCount = state[ITERATION_COUNT]; + var delay = state[DELAY]; + var playSpeed = state[PLAY_SPEED]; + var direction = state[DIRECTION]; + var intCount = Math.ceil(iterationCount); + var currentDuration = entries[entries.length - 1][0]; + var length = entries.length; + var lastTime = currentDuration * iterationCount; + + for (var i = 0; i < intCount; ++i) { + var isReverse = direction === REVERSE || direction === ALTERNATE && i % 2 || direction === ALTERNATE_REVERSE && !(i % 2); + + for (var j = 0; j < length; ++j) { + var entry = entries[isReverse ? length - j - 1 : j]; + var time = entry[1]; + var currentTime = currentDuration * i + (isReverse ? currentDuration - entry[0] : entry[0]); + var prevEntry = entries[isReverse ? length - j : j - 1]; + + if (currentTime > lastTime) { + if (j !== 0) { + var prevTime = currentDuration * i + (isReverse ? currentDuration - prevEntry[0] : prevEntry[0]); + var divideTime = dot(prevEntry[1], time, lastTime - prevTime, currentTime - lastTime); + addEntry(nextEntries, (delay + currentDuration * iterationCount) / playSpeed, divideTime); + } + + break; + } else if (currentTime === lastTime && nextEntries.length && nextEntries[nextEntries.length - 1][0] === lastTime + delay) { + break; + } + + addEntry(nextEntries, (delay + currentTime) / playSpeed, time); + } + } // delay time + + + delay && nextEntries.unshift([0, nextEntries[0][1]]); + entries = nextEntries; + nextEntries = []; + }); + return entries; + } + /** + * manage Frame Keyframes and play keyframes. + * @extends Animator + * @example + const item = new SceneItem({ + 0: { + display: "none", + }, + 1: { + display: "block", + opacity: 0, + }, + 2: { + opacity: 1, + } + }); + */ + + var SceneItem = + /*#__PURE__*/ + function (_super) { + __extends(SceneItem, _super); + /** + * @param - properties + * @param - options + * @example + const item = new SceneItem({ + 0: { + display: "none", + }, + 1: { + display: "block", + opacity: 0, + }, + 2: { + opacity: 1, + } + }); + */ + + + function SceneItem(properties, options) { + var _this = _super.call(this) || this; + + _this.times = []; + _this.items = {}; + _this.names = {}; + _this.elements = []; + _this.needUpdate = true; + + _this.load(properties, options); + + return _this; + } + + var __proto = SceneItem.prototype; + + __proto.getDuration = function () { + var times = this.times; + var length = times.length; + return (length === 0 ? 0 : times[length - 1]) || this.state[DURATION]; + }; + /** + * get size of list + * @return {Number} length of list + */ + + + __proto.size = function () { + return this.times.length; + }; + + __proto.setDuration = function (duration) { + if (!duration) { + return this; + } + + var originalDuration = this.getDuration(); + + if (originalDuration > 0) { + var ratio_1 = duration / originalDuration; + + var _a = this, + times = _a.times, + items_1 = _a.items; + + var obj_1 = {}; + this.times = times.map(function (time) { + var time2 = toFixed(time * ratio_1); + obj_1[time2] = items_1[time]; + return time2; + }); + this.items = obj_1; + } else { + this.newFrame(duration); + } + + return this; + }; + + __proto.setId = function (id) { + var state = this.state; + var elements = this.elements; + var length = elements.length; + state.id = id || makeId(!!length); + + if (length && !state[SELECTOR]) { + var sceneId_1 = toId(this.getId()); + state[SELECTOR] = "[" + DATA_SCENE_ID + "=\"" + sceneId_1 + "\"]"; + elements.forEach(function (element) { + element.setAttribute(DATA_SCENE_ID, sceneId_1); + }); + } + + return this; + }; + /** + * Set properties to the sceneItem at that time + * @param {Number} time - time + * @param {...String|Object} [properties] - property names or values + * @return {SceneItem} An instance itself + * @example + item.set(0, "a", "b") // item.getFrame(0).set("a", "b") + console.log(item.get(0, "a")); // "b" + */ + + + __proto.set = function (time) { + var _this = this; + + var args = []; + + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + + if (time instanceof SceneItem) { + return this.set(0, time); + } else if (isArray(time)) { + var length = time.length; + + for (var i = 0; i < length; ++i) { + var t = length === 1 ? 0 : this.getUnitTime(i / (length - 1) * 100 + "%"); + this.set(t, time[i]); + } + } else if (isObject(time)) { + var _loop_1 = function (t) { + var value = time[t]; + splitComma(t).forEach(function (eachTime) { + var realTime = _this.getUnitTime(eachTime); + + if (isNaN(realTime)) { + getNames(value, [eachTime]).forEach(function (names) { + var _a; + + var innerValue = getValueByNames(names.slice(1), value); + var arr = isArray(innerValue) ? innerValue : [getValueByNames(names, _this.target), innerValue]; + var length = arr.length; + + for (var i = 0; i < length; ++i) { + (_a = _this.newFrame(i / (length - 1) * 100 + "%")).set.apply(_a, names.concat([arr[i]])); + } + }); + } else { + _this.set(realTime, value); + } + }); + }; + + for (var t in time) { + _loop_1(t); + } + } else if (!isUndefined(time)) { + var value_1 = args[0]; + splitComma(time + "").forEach(function (eachTime) { + var realTime = _this.getUnitTime(eachTime); + + if (value_1 instanceof SceneItem) { + var delay = value_1.getDelay(); + var frames = value_1.toObject(!_this.hasFrame(realTime + delay)); + var duration = value_1.getDuration(); + var direction = value_1.getDirection(); + var isReverse = direction.indexOf("reverse") > -1; + + for (var frameTime in frames) { + var nextTime = isReverse ? duration - parseFloat(frameTime) : parseFloat(frameTime); + + _this.set(realTime + nextTime, frames[frameTime]); + } + } else if (args.length === 1 && isArray(value_1)) { + value_1.forEach(function (item) { + _this.set(realTime, item); + }); + } else { + var frame = _this.newFrame(realTime); + + frame.set.apply(frame, args); + } + }); + } + + this.needUpdate = true; + return this; + }; + /** + * Get properties of the sceneItem at that time + * @param {Number} time - time + * @param {...String|Object} args property's name or properties + * @return {Number|String|PropertyObejct} property value + * @example + item.get(0, "a"); // item.getFrame(0).get("a"); + item.get(0, "transform", "translate"); // item.getFrame(0).get("transform", "translate"); + */ + + + __proto.get = function (time) { + var args = []; + + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + + var frame = this.getFrame(time); + return frame && frame.get.apply(frame, args); + }; + /** + * remove properties to the sceneItem at that time + * @param {Number} time - time + * @param {...String|Object} [properties] - property names or values + * @return {SceneItem} An instance itself + * @example + item.remove(0, "a"); + */ + + + __proto.remove = function (time) { + var args = []; + + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + + if (args.length) { + var frame = this.getFrame(time); + frame && frame.remove.apply(frame, args); + } else { + this.removeFrame(time); + } + + this.needUpdate = true; + return this; + }; + /** + * Append the item or object at the last time. + * @param - the scene item or item object + * @return An instance itself + * @example + item.append(new SceneItem({ + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + } + })); + item.append({ + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + } + }); + item.set(item.getDuration(), { + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + } + }); + */ + + + __proto.append = function (item) { + if (item instanceof SceneItem) { + this.set(this.getDuration(), item); + } else { + this.append(new SceneItem(item)); + } + + return this; + }; + /** + * Push the front frames for the time and prepend the scene item or item object. + * @param - the scene item or item object + * @return An instance itself + */ + + + __proto.prepend = function (item) { + if (item instanceof SceneItem) { + var unshiftTime = item.getDuration() + item.getDelay(); + var firstFrame = this.getFrame(0); // remove first frame + + this.removeFrame(0); + this.unshift(unshiftTime); + this.set(0, item); + this.set(unshiftTime + THRESHOLD, firstFrame); + } else { + this.prepend(new SceneItem(item)); + } + + return this; + }; + /** + * Push out the amount of time. + * @param - time to push + * @example + item.get(0); // frame 0 + item.unshift(3); + item.get(3) // frame 0 + */ + + + __proto.unshift = function (time) { + var _a = this, + times = _a.times, + items = _a.items; + + var obj = {}; + this.times = times.map(function (t) { + var time2 = toFixed(time + t); + obj[time2] = items[t]; + return time2; + }); + this.items = obj; + return this; + }; + /** + * Get the frames in the item in object form. + * @return {} + * @example + item.toObject(); + // {0: {display: "none"}, 1: {display: "block"}} + */ + + + __proto.toObject = function (isStartZero) { + if (isStartZero === void 0) { + isStartZero = true; + } + + var obj = {}; + var delay = this.getDelay(); + this.forEach(function (frame, time) { + obj[(!time && !isStartZero ? THRESHOLD : 0) + delay + time] = frame.clone(); + }); + return obj; + }; + /** + * Specifies an element to synchronize items' keyframes. + * @param {string} selectors - Selectors to find elements in items. + * @return {SceneItem} An instance itself + * @example + item.setSelector("#id.class"); + */ + + + __proto.setSelector = function (target) { + if (isFunction(target)) { + this.setElement(target(this.getId())); + } else { + this.setElement(target); + } + + return this; + }; + /** + * Get the elements connected to SceneItem. + */ + + + __proto.getElements = function () { + return this.elements; + }; + /** + * Specifies an element to synchronize item's keyframes. + * @param - elements to synchronize item's keyframes. + * @param - Make sure that you have peusdo. + * @return {SceneItem} An instance itself + * @example + item.setElement(document.querySelector("#id.class")); + item.setElement(document.querySelectorAll(".class")); + */ + + + __proto.setElements = function (target) { + return this.setElement(target); + }; + /** + * Specifies an element to synchronize item's keyframes. + * @param - elements to synchronize item's keyframes. + * @param - Make sure that you have peusdo. + * @return {SceneItem} An instance itself + * @example + item.setElement(document.querySelector("#id.class")); + item.setElement(document.querySelectorAll(".class")); + */ + + + __proto.setElement = function (target) { + var state = this.state; + var elements = []; + + if (!target) { + return this; + } else if (target === true || isString(target)) { + var selector = target === true ? "" + state.id : target; + var matches = /([\s\S]+)(:+[a-zA-Z]+)$/g.exec(selector); + elements = toArray($(matches ? matches[1] : selector, true)); + state[SELECTOR] = selector; + } else { + elements = target instanceof Element ? [target] : toArray(target); + } + + if (!elements.length) { + return this; + } + + this.elements = elements; + this.setId(this.getId()); + this.target = elements[0].style; + + this.targetFunc = function (frame) { + var attributes = frame.get("attribute"); + + if (attributes) { + var _loop_2 = function (name) { + elements.forEach(function (el) { + el.setAttribute(name, attributes[name]); + }); + }; + + for (var name in attributes) { + _loop_2(name); + } + } + + if (frame.has("html")) { + var html_1 = frame.get("html"); + elements.forEach(function (el) { + el.innerHTML = html_1; + }); + } + + var cssText = frame.toCSS(); + + if (state.cssText !== cssText) { + state.cssText = cssText; + elements.forEach(function (el) { + el.style.cssText += cssText; + }); + return frame; + } + }; + + return this; + }; + + __proto.setTarget = function (target) { + this.target = target; + + this.targetFunc = function (frame) { + var obj = frame.get(); + + for (var name in obj) { + target[name] = obj[name]; + } + }; + + return this; + }; + /** + * add css styles of items's element to the frame at that time. + * @param {Array} properties - elements to synchronize item's keyframes. + * @return {SceneItem} An instance itself + * @example + item.setElement(document.querySelector("#id.class")); + item.setCSS(0, ["opacity"]); + item.setCSS(0, ["opacity", "width", "height"]); + */ + + + __proto.setCSS = function (time, properties) { + this.set(time, fromCSS(this.elements, properties)); + return this; + }; + + __proto.setTime = function (time, isTick, isParent, parentEasing) { + _super.prototype.setTime.call(this, time, isTick, isParent); + + var iterationTime = this.getIterationTime(); + var easing = this.getEasing() || parentEasing; + var frame = this.getNowFrame(iterationTime, easing); + var currentTime = this.getTime(); + this.temp = frame; + /** + * This event is fired when timeupdate and animate. + * @event SceneItem#animate + * @param {Number} param.currentTime The total time that the animator is running. + * @param {Number} param.time The iteration time during duration that the animator is running. + * @param {Frame} param.frame frame of that time. + */ + + this.trigger("animate", { + frame: frame, + currentTime: currentTime, + time: iterationTime + }); + this.targetFunc && this.targetFunc(frame); + return this; + }; + /** + * update property names used in frames. + * @return {SceneItem} An instance itself + * @example + item.update(); + */ + + + __proto.update = function () { + var names = {}; + this.forEach(function (frame) { + updateFrame(names, frame.properties); + }); + this.names = names; + this.needUpdate = false; + return this; + }; + /** + * Create and add a frame to the sceneItem at that time + * @param {Number} time - frame's time + * @return {Frame} Created frame. + * @example + item.newFrame(time); + */ + + + __proto.newFrame = function (time) { + var frame = this.getFrame(time); + + if (frame) { + return frame; + } + + frame = new Frame(); + this.setFrame(time, frame); + return frame; + }; + /** + * Add a frame to the sceneItem at that time + * @param {Number} time - frame's time + * @return {SceneItem} An instance itself + * @example + item.setFrame(time, frame); + */ + + + __proto.setFrame = function (time, frame) { + var realTime = this.getUnitTime(time); + this.items[realTime] = frame; + addTime(this.times, realTime); + this.needUpdate = true; + return this; + }; + /** + * get sceneItem's frame at that time + * @param {Number} time - frame's time + * @return {Frame} sceneItem's frame at that time + * @example + const frame = item.getFrame(time); + */ + + + __proto.getFrame = function (time) { + return this.items[this.getUnitTime(time)]; + }; + /** + * remove sceneItem's frame at that time + * @param - frame's time + * @return {SceneItem} An instance itself + * @example + item.removeFrame(time); + */ + + + __proto.removeFrame = function (time) { + var realTime = this.getUnitTime(time); + var items = this.items; + var index = this.times.indexOf(realTime); + delete items[realTime]; // remove time + + if (index > -1) { + this.times.splice(index, 1); + } + + this.needUpdate = true; + return this; + }; + /** + * check if the item has a frame at that time + * @param {Number} time - frame's time + * @return {Boolean} true: the item has a frame // false: not + * @example + if (item.hasFrame(10)) { + // has + } else { + // not + } + */ + + + __proto.hasFrame = function (time) { + return this.getUnitTime(time) in this.items; + }; + /** + * Check if keyframes has propery's name + * @param - property's time + * @return {boolean} true: if has property, false: not + * @example + item.hasName(["transform", "translate"]); // true or not + */ + + + __proto.hasName = function (args) { + this.needUpdate && this.update(); + return isInProperties(this.names, args, true); + }; + /** + * merge frame of the previous time at the next time. + * @param - The time of the frame to merge + * @param - The target frame + * @return {SceneItem} An instance itself + * @example + // getFrame(1) contains getFrame(0) + item.merge(0, 1); + */ + + + __proto.mergeFrame = function (time, frame) { + if (frame) { + var toFrame = this.newFrame(time); + toFrame.merge(frame); + } + + return this; + }; + /** + * Get frame of the current time + * @param {Number} time - the current time + * @param {function} easing - the speed curve of an animation + * @return {Frame} frame of the current time + * @example + let item = new SceneItem({ + 0: { + display: "none", + }, + 1: { + display: "block", + opacity: 0, + }, + 2: { + opacity: 1, + } + }); + // opacity: 0.7; display:"block"; + const frame = item.getNowFrame(1.7); + */ + + + __proto.getNowFrame = function (time, easing, isAccurate) { + var _this = this; + + this.needUpdate && this.update(); + var frame = new Frame(); + + var _a = getNearTimeIndex(this.times, time), + left = _a[0], + right = _a[1]; + + var realEasing = this.getEasing() || easing; + var nameObject = this.names; + + if (this.hasName([TIMING_FUNCTION])) { + var nowEasing = this.getNowValue(time, [TIMING_FUNCTION], left, right, false, 0, true); + isFunction(nowEasing) && (realEasing = nowEasing); + } + + if (isAccurate) { + var prevFrame = this.getFrame(time); + var prevNames = updateFrame({}, prevFrame.properties); + + for (var name in ROLES) { + if (name in prevNames) { + prevNames[name] = nameObject[name]; + } + } + + nameObject = prevNames; + } + + var names = getNames(nameObject, []); + names.forEach(function (properties) { + var value = _this.getNowValue(time, properties, left, right, isAccurate, realEasing, isFixed(properties)); + + if (isUndefined(value)) { + return; + } + + frame.set(properties, value); + }); + return frame; + }; + + __proto.load = function (properties, options) { + if (properties === void 0) { + properties = {}; + } + + if (options === void 0) { + options = properties.options; + } + + var _a; + + options && this.setOptions(options); + + if (isArray(properties)) { + this.set(properties); + } else if (properties.keyframes) { + this.set(properties.keyframes); + } else { + for (var time in properties) { + if (time !== "options") { + this.set((_a = {}, _a[time] = properties[time], _a)); + } + } + } + + if (options && options[DURATION]) { + this.setDuration(options[DURATION]); + } + + return this; + }; + /** + * clone SceneItem. + * @return {SceneItem} An instance of clone + * @example + * item.clone(); + */ + + + __proto.clone = function () { + var item = new SceneItem(); + item.setOptions(this.state); + this.forEach(function (frame, time) { + item.setFrame(time, frame.clone()); + }); + return item; + }; + /** + * executes a provided function once for each scene item. + * @param - Function to execute for each element, taking three arguments + * @return {Keyframes} An instance itself + */ + + + __proto.forEach = function (callback) { + var times = this.times; + var items = this.items; + times.forEach(function (time) { + callback(items[time], time, items); + }); + return this; + }; + + __proto.setOptions = function (options) { + if (options === void 0) { + options = {}; + } + + _super.prototype.setOptions.call(this, options); + + var id = options.id, + selector = options.selector, + elements = options.elements, + element = options.element, + target = options.target; + id && this.setId(id); + + if (target) { + this.setTarget(target); + } else if (selector) { + this.setSelector(selector); + } else if (elements || element) { + this.setElement(elements || element); + } + + return this; + }; + + __proto.toCSS = function (playCondition, parentDuration, states) { + if (playCondition === void 0) { + playCondition = { + className: START_ANIMATION + }; + } + + if (parentDuration === void 0) { + parentDuration = this.getDuration(); + } + + if (states === void 0) { + states = []; + } + + var itemState = this.state; + var selector = itemState[SELECTOR]; + + if (!selector) { + return ""; + } + + var originalDuration = this.getDuration(); + itemState[DURATION] = originalDuration; + states.push(itemState); + var reversedStates = toArray(states).reverse(); + var id = toId(getRealId(this)); + var superParent = states[0]; + var infiniteIndex = findIndex(reversedStates, function (state) { + return state[ITERATION_COUNT] === INFINITE || !isFinite(state[DURATION]); + }, states.length - 1); + var finiteStates = reversedStates.slice(0, infiniteIndex); + var duration = parentDuration || finiteStates.reduce(function (prev, cur) { + return (cur[DELAY] + prev * cur[ITERATION_COUNT]) / cur[PLAY_SPEED]; + }, originalDuration); + var delay = reversedStates.slice(infiniteIndex).reduce(function (prev, cur) { + return (prev + cur[DELAY]) / cur[PLAY_SPEED]; + }, 0); + var easingName = find(reversedStates, function (state) { + return state[EASING] && state[EASING_NAME]; + }, itemState)[EASING_NAME]; + var iterationCount = reversedStates[infiniteIndex][ITERATION_COUNT]; + var fillMode = superParent[FILL_MODE]; + var direction = reversedStates[infiniteIndex][DIRECTION]; + var cssText = makeAnimationProperties({ + fillMode: fillMode, + direction: direction, + iterationCount: iterationCount, + delay: delay + "s", + name: PREFIX + "KEYFRAMES_" + id, + duration: duration / superParent[PLAY_SPEED] + "s", + timingFunction: easingName + }); + var selectors = splitComma(selector).map(function (sel) { + var matches = /([\s\S]+)(:+[a-zA-Z]+)$/g.exec(sel); + + if (matches) { + return [matches[1], matches[2]]; + } else { + return [sel, ""]; + } + }); + var className = playCondition.className; + var selectorCallback = playCondition.selector; + var preselector = isFunction(selectorCallback) ? selectorCallback(this, selector) : selectorCallback; + return "\n " + (preselector || selectors.map(function (_a) { + var sel = _a[0], + peusdo = _a[1]; + return sel + "." + className + peusdo; + })) + " {" + cssText + "}\n " + selectors.map(function (_a) { + var sel = _a[0], + peusdo = _a[1]; + return sel + "." + PAUSE_ANIMATION + peusdo; + }) + " {" + ANIMATION + "-play-state: paused;}\n @" + KEYFRAMES + " " + PREFIX + "KEYFRAMES_" + id + "{" + this._toKeyframes(duration, finiteStates, direction) + "}"; + }; + /** + * Export the CSS of the items to the style. + * @param - Add a selector or className to play. + * @return {SceneItem} An instance itself + */ + + + __proto.exportCSS = function (playCondition, duration, options) { + if (!this.elements.length) { + return ""; + } + + var css = this.toCSS(playCondition, duration, options); + var isParent = options && !isUndefined(options[ITERATION_COUNT]); + !isParent && exportCSS(getRealId(this), css); + return this; + }; + + __proto.pause = function () { + _super.prototype.pause.call(this); + + isPausedCSS(this) && this.pauseCSS(); + return this; + }; + + __proto.pauseCSS = function () { + this.elements.forEach(function (element) { + addClass(element, PAUSE_ANIMATION); + }); + return this; + }; + + __proto.endCSS = function () { + this.elements.forEach(function (element) { + removeClass(element, PAUSE_ANIMATION); + removeClass(element, START_ANIMATION); + }); + setPlayCSS(this, false); + return this; + }; + + __proto.end = function () { + isEndedCSS(this) && this.endCSS(); + + _super.prototype.end.call(this); + + return this; + }; + /** + * Play using the css animation and keyframes. + * @param - Check if you want to export css. + * @param [playClassName="startAnimation"] - Add a class name to play. + * @param - The shorthand properties for six of the animation properties. + * @see {@link https://www.w3schools.com/cssref/css3_pr_animation.asp} + * @example + item.playCSS(); + item.playCSS(false, "startAnimation", { + direction: "reverse", + fillMode: "forwards", + }); + */ + + + __proto.playCSS = function (isExportCSS, playClassName, properties) { + if (isExportCSS === void 0) { + isExportCSS = true; + } + + if (properties === void 0) { + properties = {}; + } + + playCSS(this, isExportCSS, playClassName, properties); + return this; + }; + + __proto.addPlayClass = function (isPaused, playClassName, properties) { + if (properties === void 0) { + properties = {}; + } + + var elements = this.elements; + var length = elements.length; + var cssText = makeAnimationProperties(properties); + + if (!length) { + return; + } + + if (isPaused) { + elements.forEach(function (element) { + removeClass(element, PAUSE_ANIMATION); + }); + } else { + elements.forEach(function (element) { + element.style.cssText += cssText; + + if (hasClass(element, START_ANIMATION)) { + removeClass(element, START_ANIMATION); + requestAnimationFrame(function () { + requestAnimationFrame(function () { + addClass(element, START_ANIMATION); + }); + }); + } else { + addClass(element, START_ANIMATION); + } + }); + } + + return elements[0]; + }; + /** + * Remove All Frames + * @return {SceneItem} An instance itself + */ + + + __proto.clear = function () { + this.times = []; + this.items = {}; + this.names = {}; + this.temp = null; + this.needUpdate = true; + return this; + }; + + __proto.getNowValue = function (time, properties, left, right, isAccurate, easing, usePrevValue) { + var times = this.times; + var length = times.length; + var prevTime; + var nextTime; + var prevFrame; + var nextFrame; + var isUndefinedLeft = isUndefined(left); + var isUndefinedRight = isUndefined(right); + + if (isUndefinedLeft || isUndefinedRight) { + var indicies = getNearTimeIndex(times, time); + isUndefinedLeft && (left = indicies[0]); + isUndefinedRight && (right = indicies[1]); + } + + for (var i = left; i >= 0; --i) { + var frame = this.getFrame(times[i]); + + if (frame.has.apply(frame, properties)) { + prevTime = times[i]; + prevFrame = frame; + break; + } + } + + var prevValue = prevFrame && prevFrame.raw.apply(prevFrame, properties); + + if (isAccurate && !isRole([properties[0]])) { + return prevTime === time ? prevValue : undefined; + } + + if (usePrevValue) { + return prevValue; + } + + for (var i = right; i < length; ++i) { + var frame = this.getFrame(times[i]); + + if (frame.has.apply(frame, properties)) { + nextTime = times[i]; + nextFrame = frame; + break; + } + } + + var nextValue = nextFrame && nextFrame.raw.apply(nextFrame, properties); + + if (!prevFrame || isUndefined(prevValue)) { + return nextValue; + } + + if (!nextFrame || isUndefined(nextValue) || prevValue === nextValue) { + return prevValue; + } + + return dotValue(time, Math.max(prevTime, 0), nextTime, prevValue, nextValue, easing); + }; + + __proto._toKeyframes = function (duration, states, direction) { + var _this = this; + + var frames = {}; + var times = this.times.slice(); + + if (!times.length) { + return ""; + } + + var originalDuration = this.getDuration(); + !this.getFrame(0) && times.unshift(0); + !this.getFrame(originalDuration) && times.push(originalDuration); + var entries = getEntries(times, states); + var lastEntry = entries[entries.length - 1]; // end delay time + + lastEntry[0] < duration && addEntry(entries, duration, lastEntry[1]); + var prevTime = -1; + return entries.map(function (_a) { + var time = _a[0], + keytime = _a[1]; + + if (!frames[keytime]) { + frames[keytime] = (!_this.hasFrame(keytime) || keytime === 0 || keytime === originalDuration ? _this.getNowFrame(keytime) : _this.getNowFrame(keytime, 0, true)).toCSS(); + } + + var frameTime = time / duration * 100; + + if (frameTime - prevTime < THRESHOLD) { + frameTime += THRESHOLD; + } + + prevTime = frameTime; + return Math.min(frameTime, 100) + "%{\n " + (time === 0 && !isDirectionReverse(0, 1, direction) ? "" : frames[keytime]) + "\n }"; + }).join(""); + }; + + return SceneItem; + }(Animator); + + /* + Copyright (c) 2019 Daybrush + name: list-map + license: MIT + author: Daybrush + repository: git+https://github.com/daybrush/list-map.git + version: 0.1.1 + */ + + /** + * + */ + + var ListMap = + /*#__PURE__*/ + function () { + function ListMap() { + this.obj = {}; + this.objKeys = []; + } + /** + * + */ + + + var __proto = ListMap.prototype; + + __proto.has = function (key) { + return key in this.obj; + }; + /** + * + */ + + + __proto.get = function (key) { + return this.obj[key]; + }; + /** + * + */ + + + __proto.set = function (key, value) { + if (!this.has(key)) { + this.objKeys.push(key); + } + + this.setItem(key, value); + return this; + }; + /** + * + */ + + + __proto.size = function () { + return this.objKeys.length; + }; + /** + * + */ + + + __proto.keys = function () { + return this.objKeys.slice(); + }; + /** + * + */ + + + __proto.values = function () { + var obj = this.obj; + var keys = this.objKeys; + return keys.map(function (key) { + return obj[key]; + }); + }; + /** + * + */ + + + __proto.getIndex = function (key) { + return this.objKeys.indexOf(key); + }; + /** + * + */ + + + __proto.findIndex = function (callback) { + var obj = this.obj; + return findIndex(this.objKeys, function (key, i) { + return callback(obj[key], key, i, obj); + }); + }; + /** + * + */ + + + __proto.find = function (callback) { + var obj = this.obj; + var result = find(this.objKeys, function (key, i) { + return callback(obj[key], key, i, obj); + }); + return obj[result]; + }; + /** + * + */ + + + __proto.remove = function (key) { + if (this.has(key)) { + var index = this.getIndex(key); + this.removeItem(key); + this.spliceKeys(index, 1); + } + + return this; + }; + /** + * + */ + + + __proto.splice = function (index, deleteCount) { + var _this = this; + + var items = []; + + for (var _i = 2; _i < arguments.length; _i++) { + items[_i - 2] = arguments[_i]; + } + + var added = items.filter(function (_a) { + var key = _a[0], + value = _a[1]; + + var hasItem = _this.has(key); + + _this.setItem(key, value); + + return !hasItem; + }); + var deletedKeys = this.spliceKeys.apply(this, [index, deleteCount].concat(added.map(function (_a) { + var key = _a[0]; + return key; + }))); + deletedKeys.forEach(function (key) { + _this.removeItem(key); + }); + var obj = this.objKeys; + return deletedKeys.map(function (key) { + return [key, obj[key]]; + }); + }; + /** + * + */ + + + __proto.forEach = function (callback) { + var obj = this.obj; + this.objKeys.forEach(function (key, i) { + return callback(obj[key], key, i, obj); + }); + return this; + }; + + __proto.setItem = function (key, value) { + this.obj[key] = value; + }; + + __proto.removeItem = function (key) { + delete this.obj[key]; + }; + + __proto.spliceKeys = function (index, deleteCount) { + var _a; + + var items = []; + + for (var _i = 2; _i < arguments.length; _i++) { + items[_i - 2] = arguments[_i]; + } + + return (_a = this.objKeys).splice.apply(_a, [index, deleteCount].concat(items)); + }; + + return ListMap; + }(); + + /** + * manage sceneItems and play Scene. + * @sort 1 + */ + + var Scene = + /*#__PURE__*/ + function (_super) { + __extends(Scene, _super); + /** + * @param - properties + * @param - options + * @example + const scene = new Scene({ + item1: { + 0: { + display: "none", + }, + 1: { + display: "block", + opacity: 0, + }, + 2: { + opacity: 1, + }, + }, + item2: { + 2: { + opacity: 1, + }, + } + }); + */ + + + function Scene(properties, options) { + var _this = _super.call(this) || this; + + _this.items = new ListMap(); + + _this.load(properties, options); + + return _this; + } + + var __proto = Scene.prototype; + + __proto.getDuration = function () { + var time = 0; + this.forEach(function (item) { + time = Math.max(time, item.getTotalDuration() / item.getPlaySpeed()); + }); + return time || this.state[DURATION]; + }; + + __proto.setDuration = function (duration) { + var items = this.items; + var sceneDuration = this.getDuration(); + + if (duration === 0 || !isFinite(sceneDuration)) { + return this; + } + + if (sceneDuration === 0) { + this.forEach(function (item) { + item.setDuration(duration); + }); + } else { + var ratio_1 = duration / sceneDuration; + this.forEach(function (item) { + item.setDelay(item.getDelay() * ratio_1); + item.setDuration(item.getDuration() * ratio_1); + }); + } + + _super.prototype.setDuration.call(this, duration); + + return this; + }; + /** + * get item in scene by name + * @param - The item's name + * @return {Scene | SceneItem} item + * @example + const item = scene.getItem("item1") + */ + + + __proto.getItem = function (name) { + return this.items.get(name); + }; + /** + * create item in scene + * @param {} name - name of item to create + * @param {} options - The option object of SceneItem + * @return {} Newly created item + * @example + const item = scene.newItem("item1") + */ + + + __proto.newItem = function (name, options) { + if (options === void 0) { + options = {}; + } + + if (this.items.has(name)) { + return this.items.get(name); + } + + var item = new SceneItem(); + this.setItem(name, item); + item.setOptions(options); + return item; + }; + /** + * remove item in scene + * @param - name of item to remove + * @return An instance itself + * @example + const item = scene.newItem("item1") + scene.removeItem("item1"); + */ + + + __proto.removeItem = function (name) { + this.items.remove(name); + return this; + }; + /** + * add a sceneItem to the scene + * @param - name of item to create + * @param - sceneItem + * @example + const item = scene.newItem("item1") + */ + + + __proto.setItem = function (name, item) { + item.setId(name); + this.items.set(name, item); + return this; + }; + + __proto.setTime = function (time, isTick, isParent, parentEasing) { + _super.prototype.setTime.call(this, time, isTick, isParent); + + var iterationTime = this.getIterationTime(); + var easing = this.getEasing() || parentEasing; + var frames = {}; + this.forEach(function (item) { + item.setTime(iterationTime * item.getPlaySpeed() - item.getDelay(), isTick, true, easing); + frames[item.getId()] = item.temp; + }); + this.temp = frames; + /** + * This event is fired when timeupdate and animate. + * @event Scene#animate + * @param {object} param The object of data to be sent to an event. + * @param {number} param.currentTime The total time that the animator is running. + * @param {number} param.time The iteration time during duration that the animator is running. + * @param {object} param.frames frames of that time. + * @example + const scene = new Scene({ + a: { + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + } + }, + b: { + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + } + } + }).on("animate", e => { + console.log(e.frames); + // {a: Frame, b: Frame} + console.log(e.frames.a.get("opacity")); + }); + */ + + this.trigger("animate", { + frames: frames, + currentTime: this.getTime(), + time: iterationTime + }); + return this; + }; + /** + * executes a provided function once for each scene item. + * @param - Function to execute for each element, taking three arguments + * @return {Scene} An instance itself + */ + + + __proto.forEach = function (func) { + var items = this.items; + items.forEach(function (item, id, index, obj) { + func(item, id, index, obj); + }); + return this; + }; + + __proto.toCSS = function (playCondition, duration, parentStates) { + if (duration === void 0) { + duration = this.getDuration(); + } + + if (parentStates === void 0) { + parentStates = []; + } + + var totalDuration = !duration || !isFinite(duration) ? 0 : duration; + var styles = []; + var state = this.state; + state[DURATION] = this.getDuration(); + this.forEach(function (item) { + styles.push(item.toCSS(playCondition, totalDuration, parentStates.concat(state))); + }); + return styles.join(""); + }; + /** + * Export the CSS of the items to the style. + * @param - Add a selector or className to play. + * @return {Scene} An instance itself + */ + + + __proto.exportCSS = function (playCondition, duration, parentStates) { + var css = this.toCSS(playCondition, duration, parentStates); + (!parentStates || !parentStates.length) && exportCSS(getRealId(this), css); + return this; + }; + + __proto.append = function (item) { + item.setDelay(item.getDelay() + this.getDuration()); + this.setItem(getRealId(item), item); + }; + + __proto.pauseCSS = function () { + return this.forEach(function (item) { + item.pauseCSS(); + }); + }; + + __proto.pause = function () { + _super.prototype.pause.call(this); + + isPausedCSS(this) && this.pauseCSS(); + this.forEach(function (item) { + item.pause(); + }); + return this; + }; + + __proto.endCSS = function () { + this.forEach(function (item) { + item.endCSS(); + }); + setPlayCSS(this, false); + }; + + __proto.end = function () { + isEndedCSS(this) && this.endCSS(); + + _super.prototype.end.call(this); + + return this; + }; + + __proto.addPlayClass = function (isPaused, playClassName, properties) { + if (properties === void 0) { + properties = {}; + } + + var animtionElement; + this.forEach(function (item) { + var el = item.addPlayClass(isPaused, playClassName, properties); + !animtionElement && (animtionElement = el); + }); + return animtionElement; + }; + /** + * Play using the css animation and keyframes. + * @param - Check if you want to export css. + * @param [playClassName="startAnimation"] - Add a class name to play. + * @param - The shorthand properties for six of the animation properties. + * @return {Scene} An instance itself + * @see {@link https://www.w3schools.com/cssref/css3_pr_animation.asp} + * @example + scene.playCSS(); + scene.playCSS(false, { + direction: "reverse", + fillMode: "forwards", + }); + */ + + + __proto.playCSS = function (isExportCSS, playClassName, properties) { + if (isExportCSS === void 0) { + isExportCSS = true; + } + + if (properties === void 0) { + properties = {}; + } + + playCSS(this, isExportCSS, playClassName, properties); + return this; + }; + /** + * Set properties to the Scene. + * @param - properties + * @return An instance itself + * @example + scene.set({ + ".a": { + 0: { + opacity: 0, + }, + 1: { + opacity: 1, + }, + }, + }); + // 0 + console.log(scene.getItem(".a").get(0, "opacity")); + // 1 + console.log(scene.getItem(".a").get(1, "opacity")); + */ + + + __proto.set = function (properties) { + this.load(properties); + return this; + }; + + __proto.load = function (properties, options) { + if (properties === void 0) { + properties = {}; + } + + if (options === void 0) { + options = properties.options; + } + + if (!properties) { + return this; + } + + var selector = options && options[SELECTOR] || this.state[SELECTOR]; + + for (var name in properties) { + if (name === "options") { + continue; + } + + var object = properties[name]; + var item = void 0; + + if (object instanceof Scene || object instanceof SceneItem) { + this.setItem(name, object); + item = object; + } else if (isFunction(object) && selector) { + var elements = IS_WINDOW ? $("" + (isFunction(selector) ? selector(name) : name), true) : []; + var length = elements.length; + var scene = new Scene(); + + for (var i = 0; i < length; ++i) { + scene.newItem(i).setId().setElement(elements[i]).load(object(i, elements[i])); + } + + this.setItem(name, scene); + continue; + } else { + item = this.newItem(name); + item.load(object); + } + + selector && item.setSelector(selector); + } + + this.setOptions(options); + }; + + __proto.setOptions = function (options) { + if (options === void 0) { + options = {}; + } + + _super.prototype.setOptions.call(this, options); + + var selector = options.selector; + + if (selector) { + this.state[SELECTOR] = selector; + } + + return this; + }; + + __proto.setSelector = function (target) { + var state = this.state; + var selector = target || state[SELECTOR]; + state[SELECTOR] = selector; + var isItFunction = isFunction(target); + + if (selector) { + this.forEach(function (item, name) { + item.setSelector(isItFunction ? target(name) : selector); + }); + } + + return this; + }; + + __proto.start = function (delay) { + if (delay === void 0) { + delay = this.state[DELAY]; + } + + var result = _super.prototype.start.call(this, delay); + + if (result) { + this.forEach(function (item) { + item.start(0); + }); + } else { + this.forEach(function (item) { + item.setPlayState(RUNNING); + }); + } + + return result; + }; + /** + * version info + * @type {string} + * @example + * Scene.VERSION // 1.2.0 + */ + + + Scene.VERSION = "1.2.0"; + return Scene; + }(Animator); + + function animate(properties, options) { + return new Scene(properties, options).play(); + } + function animateItem(properties, options) { + return new SceneItem(properties, options).play(); + } + + + + var others = ({ + SceneItem: SceneItem, + Frame: Frame, + Animator: Animator, + 'default': Scene, + OPTIONS: OPTIONS, + EVENTS: EVENTS, + FIXED: FIXED, + ROLES: ROLES, + setRole: setRole, + setAlias: setAlias, + bezier: bezier, + steps: steps, + STEP_START: STEP_START, + STEP_END: STEP_END, + LINEAR: LINEAR, + EASE: EASE, + EASE_IN: EASE_IN, + EASE_OUT: EASE_OUT, + EASE_IN_OUT: EASE_IN_OUT, + animate: animate, + animateItem: animateItem + }); + + for (var name in others) { + Scene[name] = others[name]; + } + + return Scene; + +})); +//# sourceMappingURL=scene.js.map diff --git a/dist/scene.js.map b/dist/scene.js.map new file mode 100644 index 00000000..9bd695ad --- /dev/null +++ b/dist/scene.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scene.js","sources":["../src/easing.ts","../src/consts.ts","../src/EventTrigger.ts","../src/PropertyObject.ts","../src/utils/property.ts","../src/utils.ts","../src/Animator.ts","../src/Frame.ts","../src/utils/dot.ts","../src/SceneItem.ts","../src/Scene.ts","../src/presets.ts","../src/index.umd.ts"],"sourcesContent":["import { EasingFunction } from \"./types\";\n\nfunction cubic(y1: number, y2: number, t: number) {\n const t2 = 1 - t;\n\n // Bezier Curve Formula\n return t * t * t + 3 * t * t * t2 * y2 + 3 * t * t2 * t2 * y1;\n}\nfunction solveFromX(x1: number, x2: number, x: number) {\n // x 0 ~ 1\n // t 0 ~ 1\n let t = x;\n let solveX = x;\n let dx = 1;\n\n while (Math.abs(dx) > 1 / 1000) {\n // 예상 t초에 의한 _x값\n solveX = cubic(x1, x2, t);\n dx = solveX - x;\n // 차이가 미세하면 그 값을 t로 지정\n if (Math.abs(dx) < 1 / 1000) {\n return t;\n }\n t -= dx / 2;\n }\n return t;\n}\n/**\n * @namespace easing\n */\n/**\n* Cubic Bezier curve.\n* @memberof easing\n* @func bezier\n* @param {number} [x1] - point1's x\n* @param {number} [y1] - point1's y\n* @param {number} [x2] - point2's x\n* @param {number} [y2] - point2's y\n* @return {function} the curve function\n* @example\nimport {bezier} from \"scenejs\";\nScene.bezier(0, 0, 1, 1) // LINEAR\nScene.bezier(0.25, 0.1, 0.25, 1) // EASE\n*/\nexport function bezier(x1: number, y1: number, x2: number, y2: number) {\n /*\n\t\tx = f(t)\n\t\tcalculate inverse function by x\n\t\tt = f-1(x)\n\t*/\n const func: EasingFunction = (x: number) => {\n const t = solveFromX(x1, x2, Math.max(Math.min(1, x), 0));\n\n return cubic(y1, y2, t);\n };\n\n func.easingName = `cubic-bezier(${x1},${y1},${x2},${y2})`;\n return func;\n}\n/**\n* Specifies a stepping function\n* @see {@link https://www.w3schools.com/cssref/css3_pr_animation-timing-function.asp|CSS3 Timing Function}\n* @memberof easing\n* @func steps\n* @param {number} count - point1's x\n* @param {\"start\" | \"end\"} postion - point1's y\n* @return {function} the curve function\n* @example\nimport {steps} from \"scenejs\";\nScene.steps(1, \"start\") // Scene.STEP_START\nScene.steps(1, \"end\") // Scene.STEP_END\n*/\nexport function steps(count: number, position: \"start\" | \"end\") {\n const func: EasingFunction = (time: number) => {\n const level = 1 / count;\n\n if (time >= 1) {\n return 1;\n }\n return (position === \"start\" ? level : 0) + Math.floor(time / level) * level;\n };\n\n func.easingName = `steps(${count}, ${position})`;\n\n return func;\n}\n\n/**\n* Equivalent to steps(1, start)\n* @memberof easing\n* @name STEP_START\n* @static\n* @type {function}\n* @example\nimport {STEP_START} from \"scenejs\";\nScene.STEP_START // steps(1, start)\n*/\nexport const STEP_START = /*#__PURE__#*/steps(1, \"start\");\n/**\n* Equivalent to steps(1, end)\n* @memberof easing\n* @name STEP_END\n* @static\n* @type {function}\n* @example\nimport {STEP_END} from \"scenejs\";\nScene.STEP_END // steps(1, end)\n*/\nexport const STEP_END = /*#__PURE__#*/steps(1, \"end\");\n/**\n* Linear Speed (0, 0, 1, 1)\n* @memberof easing\n* @name LINEAR\n* @static\n* @type {function}\n* @example\nimport {LINEAR} from \"scenejs\";\nScene.LINEAR\n*/\nexport const LINEAR = /*#__PURE__#*/bezier(0, 0, 1, 1);\n/**\n* Ease Speed (0.25, 0.1, 0.25, 1)\n* @memberof easing\n* @name EASE\n* @static\n* @type {function}\n* @example\nimport {EASE} from \"scenejs\";\nScene.EASE\n*/\nexport const EASE = /*#__PURE__#*/bezier(0.25, 0.1, 0.25, 1);\n/**\n* Ease In Speed (0.42, 0, 1, 1)\n* @memberof easing\n* @name EASE_IN\n* @static\n* @type {function}\n* @example\nimport {EASE_IN} from \"scenejs\";\nScene.EASE_IN\n*/\nexport const EASE_IN = /*#__PURE__#*/bezier(0.42, 0, 1, 1);\n/**\n* Ease Out Speed (0, 0, 0.58, 1)\n* @memberof easing\n* @name EASE_OUT\n* @static\n* @type {function}\n* @example\nimport {EASE_OUT} from \"scenejs\";\nScene.EASE_OUT\n*/\nexport const EASE_OUT = /*#__PURE__#*/bezier(0, 0, 0.58, 1);\n/**\n* Ease In Out Speed (0.42, 0, 0.58, 1)\n* @memberof easing\n* @name EASE_IN_OUT\n* @static\n* @type {function}\n* @example\nimport {EASE_IN_OUT} from \"scenejs\";\nScene.EASE_IN_OUT\n*/\nexport const EASE_IN_OUT = /*#__PURE__#*/bezier(0.42, 0, 0.58, 1);\n","import { IObject } from \"@daybrush/utils\";\nimport { RoleObject, OptionType, EventType, EasingFunction } from \"./types\";\nimport { EASE, EASE_IN, EASE_IN_OUT, LINEAR, EASE_OUT, STEP_START, STEP_END } from \"./easing\";\n\nexport const PREFIX = \"__SCENEJS_\";\nexport const DATA_SCENE_ID = \"data-scene-id\";\nexport const TIMING_FUNCTION = \"animation-timing-function\";\nexport const ROLES: RoleObject = { transform: {}, filter: {}, attribute: {}, html: true };\nexport const ALIAS: IObject = { easing: [TIMING_FUNCTION] };\nexport const FIXED = { [TIMING_FUNCTION]: true, contents: true, html: true };\nexport const MAXIMUM = 1000000;\nexport const THRESHOLD = 0.000001;\n\nexport const DURATION = \"duration\";\nexport const FILL_MODE = \"fillMode\";\nexport const DIRECTION = \"direction\";\nexport const ITERATION_COUNT = \"iterationCount\";\nexport const DELAY = \"delay\";\nexport const EASING = \"easing\";\nexport const PLAY_SPEED = \"playSpeed\";\nexport const EASING_NAME = \"easingName\";\nexport const ITERATION_TIME = \"iterationTime\";\nexport const PAUSED = \"paused\";\nexport const ENDED = \"ended\";\nexport const TIMEUPDATE = \"timeupdate\";\nexport const ANIMATE = \"animate\";\nexport const PLAY = \"play\";\nexport const RUNNING = \"running\";\nexport const ITERATION = \"iteration\";\nexport const START_ANIMATION = \"startAnimation\";\nexport const PAUSE_ANIMATION = \"pauseAnimation\";\nexport const ALTERNATE = \"alternate\";\nexport const REVERSE = \"reverse\";\nexport const ALTERNATE_REVERSE = \"alternate-reverse\";\nexport const NORMAL = \"normal\";\nexport const INFINITE = \"infinite\";\nexport const PLAY_STATE = \"playState\";\nexport const PLAY_CSS = \"playCSS\";\nexport const PREV_TIME = \"prevTime\";\nexport const TICK_TIME = \"tickTime\";\nexport const CURRENT_TIME = \"currentTime\";\nexport const SELECTOR = \"selector\";\nexport const TRANSFORM_NAME = \"transform\";\nexport const EASINGS = {\n \"linear\": LINEAR,\n \"ease\": EASE,\n \"ease-in\": EASE_IN,\n \"ease-out\": EASE_OUT,\n \"ease-in-out\": EASE_IN_OUT,\n \"step-start\": STEP_START,\n \"step-end\": STEP_END,\n};\n\n/**\n* option name list\n* @name Scene.OPTIONS\n* @memberof Scene\n* @static\n* @type {$ts:OptionType}\n* @example\n* Scene.OPTIONS // [\"duration\", \"fillMode\", \"direction\", \"iterationCount\", \"delay\", \"easing\", \"playSpeed\"]\n*/\nexport const OPTIONS: OptionType = [DURATION, FILL_MODE, DIRECTION, ITERATION_COUNT, DELAY, EASING, PLAY_SPEED];\n\n/**\n* Event name list\n* @name Scene.EVENTS\n* @memberof Scene\n* @static\n* @type {$ts:EventType}\n* @example\n* Scene.EVENTS // [\"paused\", \"ended\", \"timeupdate\", \"animate\", \"play\", \"iteration\"];\n*/\nexport const EVENTS: EventType = [PAUSED, ENDED, TIMEUPDATE, ANIMATE, PLAY, ITERATION];\n","import { isObject, isArray, toArray } from \"@daybrush/utils\";\nimport { CallbackType, EventParameter } from \"./types\";\n\n/**\n* attach and trigger event handlers.\n*/\nclass EventTrigger {\n public events: { [name: string]: CallbackType[] };\n /**\n * @example\n const et = new Scene.EventTrigger();\n const scene = new Scene();\n\n scene.on(\"call\", e => {\n console.log(e.param);\n });\n et.on(\"call\", e => {\n console.log(e.param);\n });\n scene.trigger(\"call\", {param: 1});\n et.trigger(\"call\", {param: 1});\n */\n constructor() {\n this.events = {};\n }\n public _on(name: string | EventParameter, callback?: CallbackType | CallbackType[], once?: boolean) {\n const events = this.events;\n\n if (isObject(name)) {\n for (const n in name) {\n this._on(n, name[n], once);\n }\n return;\n }\n if (!(name in events)) {\n events[name] = [];\n }\n if (!callback) {\n return;\n }\n if (isArray(callback)) {\n callback.forEach(func => this._on(name, func, once));\n return;\n }\n events[name].push(once ? function callback2(...args) {\n callback(...args);\n this.off(name, callback2);\n } : callback);\n }\n /**\n * Attach an event handler function for one or more events to target\n * @param - event's name\n * @param - function to execute when the event is triggered.\n * @return {EventTrigger} An Instance itself.\n * @example\n target.on(\"animate\", function() {\n console.log(\"animate\");\n });\n\n target.trigger(\"animate\");\n\n */\n public on(name: string | EventParameter, callback?: CallbackType | CallbackType[]) {\n this._on(name, callback);\n return this;\n }\n /**\n * Dettach an event handler function for one or more events to target\n * @param - event's name\n * @param - function to execute when the event is triggered.\n * @return {EventTrigger} An Instance itself.\n * @example\n const callback = function() {\n console.log(\"animate\");\n };\n target.on(\"animate\", callback);\n\n target.off(\"animate\", callback);\n target.off(\"animate\");\n\n */\n public off(name?: string, callback?: CallbackType) {\n if (!name) {\n this.events = {};\n } else if (!callback) {\n this.events[name] = [];\n } else {\n const callbacks = this.events[name];\n\n if (!callbacks) {\n return this;\n }\n const index = callbacks.indexOf(callback);\n\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n }\n return this;\n }\n /**\n * execute event handler\n * @param - event's name\n * @param - event handler's additional parameter\n * @return {EventTrigger} An Instance itself.\n * @example\n target.on(\"animate\", function(a1, a2) {\n console.log(\"animate\", a1, a2);\n });\n\n target.trigger(\"animate\", [1, 2]); // log => \"animate\", 1, 2\n\n */\n public trigger(name: string, ...data: any[]) {\n const events = this.events;\n\n if (!(name in events)) {\n return this;\n }\n\n const args = data || [];\n\n !args[0] && (args[0] = {});\n const event = events[name];\n const target = args[0];\n\n target.type = name;\n target.currentTarget = this;\n !target.target && (target.target = this);\n toArray(events[name]).forEach(callback => {\n callback.apply(this, data);\n });\n\n return this;\n }\n public once(name: string | EventParameter, callback?: CallbackType | CallbackType[]) {\n this._on(name, callback, true);\n return this;\n }\n}\nexport default EventTrigger;\n","import { isString } from \"@daybrush/utils\";\nimport { PropertyObjectState } from \"./types\";\n\n/**\n* Make string, array to PropertyObject for the dot product\n*/\nclass PropertyObject implements PropertyObjectState {\n public value: any[];\n public prefix: string = \"\";\n public suffix: string = \"\";\n public model: string = \"\";\n public type: string = \"\";\n public separator: string = \",\";\n\n /**\n * @param - This value is in the array format.\n * @param - options\n * @example\n var obj = new PropertyObject([100,100,100,0.5], {\n \"separator\" : \",\",\n \"prefix\" : \"rgba(\",\n \"suffix\" : \")\"\n });\n */\n constructor(value: string | any[], options?: Partial) {\n options && this.setOptions(options);\n this.value = isString(value) ? value.split(this.separator) : value;\n }\n public setOptions(newOptions: Partial) {\n for (const name in newOptions) {\n this[name as keyof PropertyObjectState] = newOptions[name as keyof PropertyObjectState];\n }\n return this;\n }\n /**\n * the number of values.\n * @example\n const obj1 = new PropertyObject(\"1,2,3\", \",\");\n\n console.log(obj1.length);\n // 3\n */\n public size() {\n return this.value.length;\n }\n /**\n * retrieve one of values at the index\n * @param {Number} index - index\n * @return {Object} one of values at the index\n * @example\n const obj1 = new PropertyObject(\"1,2,3\", \",\");\n\n console.log(obj1.get(0));\n // 1\n */\n public get(index: number) {\n return this.value[index];\n }\n /**\n * Set the value at that index\n * @param {Number} index - index\n * @param {Object} value - text, a number, object to set\n * @return {PropertyObject} An instance itself\n * @example\n const obj1 = new PropertyObject(\"1,2,3\", \",\");\n obj1.set(0, 2);\n console.log(obj1.toValue());\n // 2,2,3\n */\n public set(index: number, value: any) {\n this.value[index] = value;\n return this;\n }\n /**\n * create a copy of an instance itself.\n * @return {PropertyObject} clone\n * @example\n const obj1 = new PropertyObject(\"1,2,3\", \",\");\n const obj2 = obj1.clone();\n */\n public clone(): PropertyObject {\n const {\n separator,\n prefix,\n suffix,\n model,\n type,\n } = this;\n const arr = this.value.map(v => ((v instanceof PropertyObject) ? v.clone() : v));\n return new PropertyObject(arr, {\n separator,\n prefix,\n suffix,\n model,\n type,\n });\n }\n /**\n * Make Property Object to String\n * @return {String} Make Property Object to String\n * @example\n //rgba(100, 100, 100, 0.5)\n const obj4 = new PropertyObject([100,100,100,0.5], {\n \"separator\" : \",\",\n \"prefix\" : \"rgba(\",\n \"suffix\" : \")\",\n });\n console.log(obj4.toValue());\n // \"rgba(100,100,100,0.5)\"\n */\n public toValue(): string {\n return this.prefix + this.join() + this.suffix;\n }\n /**\n * Make Property Object's array to String\n * @return {String} Join the elements of an array into a string\n * @example\n //rgba(100, 100, 100, 0.5)\n var obj4 = new PropertyObject([100,100,100,0.5], {\n \"separator\" : \",\",\n \"prefix\" : \"rgba(\",\n \"suffix\" : \")\"\n });\n obj4.join(); // => \"100,100,100,0.5\"\n */\n public join() {\n return this.value.map(v => ((v instanceof PropertyObject) ? v.toValue() : v)).join(this.separator);\n }\n /**\n * executes a provided function once per array element.\n * @param {Function} callback - Function to execute for each element, taking three arguments\n * @param {All} [callback.currentValue] The current element being processed in the array.\n * @param {Number} [callback.index] The index of the current element being processed in the array.\n * @param {Array} [callback.array] the array.\n * @return {PropertyObject} An instance itself\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach|MDN Array.forEach()} reference to MDN document.\n * @example\n //rgba(100, 100, 100, 0.5)\n var obj4 = new PropertyObject([100,100,100,0.5], {\n \"separator\" : \",\",\n \"prefix\" : \"rgba(\",\n \"suffix\" : \")\"\n });\n\n obj4.forEach(t => {\n console.log(t);\n }); // => \"100,100,100,0.5\"\n */\n public forEach(func: (value?: any, index?: number, array?: any[]) => void) {\n this.value.forEach(func);\n return this;\n }\n}\nexport default PropertyObject;\n","/**\n* @namespace\n* @name Property\n*/\n\nimport PropertyObject from \"../PropertyObject\";\nimport {\n COLOR_MODELS, isString,\n splitComma, splitSpace, stringToRGBA,\n RGBA, splitBracket, IObject, isArray, splitText\n} from \"@daybrush/utils\";\nimport { NameType } from \"../types\";\n\nexport function splitStyle(str: string) {\n\n const properties = splitText(str, \";\");\n const obj: IObject = {};\n let length = properties.length;\n\n for (let i = 0; i < length; ++i) {\n const matches = splitText(properties[i], \":\");\n\n if (matches.length < 2 || !matches[1]) {\n --length;\n continue;\n }\n obj[matches[0].trim()] = toPropertyObject(matches[1].trim());\n }\n return { styles: obj, length };\n}\n/**\n* convert array to PropertyObject[type=color].\n* default model \"rgba\"\n* @memberof Property\n* @function arrayToColorObject\n* @param {Array|PropertyObject} value ex) [0, 0, 0, 1]\n* @return {PropertyObject} PropertyObject[type=color]\n* @example\narrayToColorObject([0, 0, 0])\n// => PropertyObject(type=\"color\", model=\"rgba\", value=[0, 0, 0, 1], separator=\",\")\n*/\nexport function arrayToColorObject(arr: number[]) {\n const model = RGBA;\n\n if (arr.length === 3) {\n arr[3] = 1;\n }\n return new PropertyObject(arr, {\n model,\n separator: \",\",\n type: \"color\",\n prefix: `${model}(`,\n suffix: \")\",\n });\n}\n/**\n* convert text with parentheses to object.\n* @memberof Property\n* @function stringToBracketObject\n* @param {String} value ex) \"rgba(0,0,0,1)\"\n* @return {PropertyObject} PropertyObject\n* @example\nstringToBracketObject(\"abcde(0, 0, 0,1)\")\n// => PropertyObject(model=\"abcde\", value=[0, 0, 0,1], separator=\",\")\n*/\nexport function stringToBracketObject(text: string) {\n // [prefix, value, other]\n const { prefix: model, value, suffix: afterModel } = splitBracket(text);\n\n if (typeof value === \"undefined\") {\n return text;\n }\n if (COLOR_MODELS.indexOf(model) > -1) {\n return arrayToColorObject(stringToRGBA(text));\n }\n // divide comma(,)\n const obj = toPropertyObject(value, model);\n\n let arr = [value];\n let separator = \",\";\n let prefix = `${model}(`;\n let suffix = `)${afterModel}`;\n\n if (obj instanceof PropertyObject) {\n separator = obj.separator;\n arr = obj.value;\n prefix += obj.prefix;\n suffix = obj.suffix + suffix;\n }\n return new PropertyObject(arr, {\n separator,\n model,\n prefix,\n suffix,\n });\n}\n\nexport function arrayToPropertyObject(arr: any[], separator: string) {\n return new PropertyObject(arr, {\n type: \"array\",\n separator,\n });\n}\n\n/**\n* convert text with parentheses to PropertyObject[type=color].\n* If the values are not RGBA model, change them RGBA mdoel.\n* @memberof Property\n* @function stringToColorObject\n* @param {String|PropertyObject} value ex) \"rgba(0,0,0,1)\"\n* @return {PropertyObject} PropertyObject[type=color]\n* @example\nstringToColorObject(\"rgba(0, 0, 0,1)\")\n// => PropertyObject(type=\"color\", model=\"rgba\", value=[0, 0, 0,1], separator=\",\")\n*/\nexport function stringToColorObject(value: string): string | PropertyObject {\n const result = stringToRGBA(value);\n\n return result ? arrayToColorObject(result) : value;\n}\n/**\n* convert CSS Value to PropertyObject\n* @memberof Property\n* @function toPropertyObject\n* @param {String} value it's text contains the array.\n* @return {String} Not Array, Not Separator, Only Number & Unit\n* @return {PropertyObject} Array with Separator.\n* @see referenced regular expression {@link http://stackoverflow.com/questions/20215440/parse-css-gradient-rule-with-javascript-regex}\n* @example\ntoPropertyObject(\"1px solid #000\");\n// => PropertyObject([\"1px\", \"solid\", rgba(0, 0, 0, 1)])\n*/\nexport function toPropertyObject(value: any[], model?: NameType): PropertyObject;\nexport function toPropertyObject(value: IObject, model?: NameType): IObject;\nexport function toPropertyObject(value: string, model?: NameType): PropertyObject | string;\nexport function toPropertyObject(value: string | IObject | any[], model?: NameType) {\n if (!isString(value)) {\n if (isArray(value)) {\n return arrayToPropertyObject(value, \",\");\n }\n return value;\n }\n let values: any = splitComma(value);\n\n if (values.length > 1) {\n return arrayToPropertyObject(values.map(v => toPropertyObject(v)), \",\");\n }\n values = splitSpace(value);\n\n if (values.length > 1) {\n return arrayToPropertyObject(values.map(v => toPropertyObject(v)), \" \");\n }\n values = /^(['\"])([^'\"]*)(['\"])$/g.exec(value);\n\n if (values && values[1] === values[3]) {\n // Quotes\n return new PropertyObject([toPropertyObject(values[2])], {\n prefix: values[1],\n suffix: values[1],\n });\n } else if (value.indexOf(\"(\") !== -1) {\n // color\n return stringToBracketObject(value);\n } else if (value.charAt(0) === \"#\" && model !== \"url\") {\n return stringToColorObject(value);\n }\n return value;\n}\nexport function toObject(object: PropertyObject, result: IObject = {}) {\n const model = object.model;\n\n if (model) {\n object.setOptions({\n model: \"\",\n suffix: \"\",\n prefix: \"\",\n });\n const value = object.size() > 1 ? object : object.get(0);\n\n result[model] = value;\n } else {\n object.forEach(obj => {\n toObject(obj, result);\n });\n }\n return result;\n}\n","import {\n ROLES, MAXIMUM, FIXED, ALIAS,\n PAUSED, RUNNING, PLAY, ENDED, PREFIX, PLAY_CSS, CURRENT_TIME, START_ANIMATION, EASINGS\n} from \"./consts\";\nimport PropertyObject from \"./PropertyObject\";\nimport Scene from \"./Scene\";\nimport SceneItem from \"./SceneItem\";\nimport {\n isArray, ANIMATION, ARRAY, OBJECT,\n PROPERTY, STRING, NUMBER, IS_WINDOW, IObject, $, document, isObject, addEvent, removeEvent, isString,\n} from \"@daybrush/utils\";\nimport { EasingType, EasingFunction, NameType } from \"./types\";\nimport { toPropertyObject } from \"./utils/property\";\nimport { bezier, steps } from \"./easing\";\n\nexport function isPropertyObject(value: any): value is PropertyObject {\n return value instanceof PropertyObject;\n}\nexport function setAlias(name: string, alias: string[]) {\n ALIAS[name] = alias;\n}\nexport function setRole(names: string[], isProperty?: boolean, isFixedProperty?: boolean) {\n const length = names.length;\n let roles: any = ROLES;\n let fixed: any = FIXED;\n\n for (let i = 0; i < length - 1; ++i) {\n !roles[names[i]] && (roles[names[i]] = {});\n roles = roles[names[i]];\n if (isFixedProperty) {\n !fixed[names[i]] && (fixed[names[i]] = {});\n fixed = fixed[names[i]];\n }\n }\n isFixedProperty && (fixed[names[length - 1]] = true);\n roles[names[length - 1]] = isProperty ? true : {};\n}\nexport function getType(value: any) {\n const type = typeof value;\n\n if (type === OBJECT) {\n if (isArray(value)) {\n return ARRAY;\n } else if (isPropertyObject(value)) {\n return PROPERTY;\n }\n } else if (type === STRING || type === NUMBER) {\n return \"value\";\n }\n return type;\n}\nexport function isPureObject(obj: any): obj is object {\n return isObject(obj) && obj.constructor === Object;\n}\nexport function getNames(names: IObject, stack: string[]) {\n let arr: string[][] = [];\n\n if (isPureObject(names)) {\n for (const name in names) {\n stack.push(name);\n arr = arr.concat(getNames(names[name], stack));\n stack.pop();\n }\n } else {\n arr.push(stack.slice());\n }\n return arr;\n}\nexport function updateFrame(names: IObject, properties: IObject) {\n for (const name in properties) {\n const value = properties[name];\n\n if (!isPureObject(value)) {\n names[name] = true;\n continue;\n }\n if (!isObject(names[name])) {\n names[name] = {};\n }\n updateFrame(names[name], properties[name]);\n }\n return names;\n}\nexport function toFixed(num: number) {\n return Math.round(num * MAXIMUM) / MAXIMUM;\n}\nexport function getValueByNames(\n names: Array,\n properties: IObject, length: number = names.length) {\n let value = properties;\n\n for (let i = 0; i < length; ++i) {\n if (!isObject(value)) {\n return undefined;\n }\n value = value[names[i]];\n }\n return value;\n}\nexport function isInProperties(roles: IObject, args: NameType[], isCheckTrue?: boolean) {\n const length = args.length;\n let role: any = roles;\n\n if (length === 0) {\n return false;\n }\n for (let i = 0; i < length; ++i) {\n if (role === true) {\n return false;\n }\n role = role[args[i]];\n if (!role || (!isCheckTrue && role === true)) {\n return false;\n }\n }\n return true;\n}\nexport function isRole(args: NameType[], isCheckTrue?: boolean) {\n return isInProperties(ROLES, args, isCheckTrue);\n}\nexport function isFixed(args: NameType[]) {\n return isInProperties(FIXED, args, true);\n}\n\nexport interface IterationInterface {\n currentTime: number;\n iterationCount: number;\n elapsedTime: number;\n}\nexport function setPlayCSS(item: Scene | SceneItem, isActivate: boolean) {\n item.state[PLAY_CSS] = isActivate;\n}\nexport function isPausedCSS(item: Scene | SceneItem) {\n return item.state[PLAY_CSS] && item.isPaused();\n}\nexport function isEndedCSS(item: Scene | SceneItem) {\n return !item.isEnded() && item.state[PLAY_CSS];\n}\n\nexport function exportCSS(id: number | string, css: string) {\n const styleId = `${PREFIX}STYLE_${toId(id)}`;\n const styleElement: HTMLElement = $(`#${styleId}`);\n\n if (styleElement) {\n styleElement.innerText = css;\n } else {\n document.body.insertAdjacentHTML(\"beforeend\",\n ``);\n }\n}\nexport function makeId(selector?: boolean) {\n for (; ;) {\n const id = `${Math.floor(Math.random() * 10000000)}`;\n\n if (!IS_WINDOW || !selector) {\n return id;\n }\n const checkElement = $(`[data-scene-id=\"${id}\"]`);\n\n if (!checkElement) {\n return id;\n }\n }\n}\nexport function getRealId(item: Scene | SceneItem) {\n return item.getId() || item.setId(makeId(false)).getId();\n}\nexport function toId(text: number | string) {\n return `${text}`.match(/[0-9a-zA-Z]+/g).join(\"\");\n}\nexport function playCSS(\n item: Scene | SceneItem, isExportCSS?: boolean,\n playClassName?: string, properties: object = {}) {\n if (!ANIMATION || item.getPlayState() === RUNNING) {\n return;\n }\n const className = playClassName || START_ANIMATION;\n\n if (isPausedCSS(item)) {\n item.addPlayClass(true, className, properties);\n } else {\n if (item.isEnded()) {\n item.setTime(0);\n }\n isExportCSS && item.exportCSS({ className });\n const el = item.addPlayClass(false, className, properties);\n\n if (!el) {\n return;\n }\n addAnimationEvent(item, el);\n setPlayCSS(item, true);\n }\n item.setPlayState(RUNNING);\n}\n\nexport function addAnimationEvent(item: Scene | SceneItem, el: Element) {\n const state = item.state;\n const duration = item.getDuration();\n const isZeroDuration = !duration || !isFinite(duration);\n const animationend = () => {\n setPlayCSS(item, false);\n item.finish();\n };\n const animationstart = () => {\n item.trigger(PLAY);\n };\n item.once(ENDED, () => {\n removeEvent(el, \"animationcancel\", animationend);\n removeEvent(el, \"animationend\", animationend);\n removeEvent(el, \"animationiteration\", animationiteration);\n removeEvent(el, \"animationstart\", animationstart);\n });\n const animationiteration = ({ elapsedTime }: any) => {\n const currentTime = elapsedTime;\n const iterationCount = isZeroDuration ? 0 : (currentTime / duration);\n\n state[CURRENT_TIME] = currentTime;\n item.setIteration(iterationCount);\n };\n addEvent(el, \"animationcancel\", animationend);\n addEvent(el, \"animationend\", animationend);\n addEvent(el, \"animationiteration\", animationiteration);\n addEvent(el, \"animationstart\", animationstart);\n}\n\nexport function getEasing(curveArray: string | number[] | EasingFunction): EasingType {\n let easing: EasingType;\n\n if (isString(curveArray)) {\n if (curveArray in EASINGS) {\n easing = EASINGS[curveArray];\n } else {\n const obj = toPropertyObject(curveArray);\n\n if (isString(obj)) {\n return 0;\n } else {\n if (obj.model === \"cubic-bezier\") {\n curveArray = obj.value.map(v => parseFloat(v));\n easing = bezier(curveArray[0], curveArray[1], curveArray[2], curveArray[3]);\n } else if (obj.model === \"steps\") {\n easing = steps(parseFloat(obj.value[0]), obj.value[1]);\n } else {\n return 0;\n }\n }\n }\n } else if (isArray(curveArray)) {\n easing = bezier(curveArray[0], curveArray[1], curveArray[2], curveArray[3]);\n } else {\n easing = curveArray;\n }\n\n return easing;\n}\n","import {\n THRESHOLD,\n ALTERNATE, ALTERNATE_REVERSE, REVERSE, INFINITE, NORMAL,\n ITERATION_COUNT, DELAY, FILL_MODE, DIRECTION, PLAY_SPEED,\n DURATION, EASING, ITERATION_TIME, EASING_NAME, PAUSED,\n RUNNING, PLAY, TIMEUPDATE, ENDED, PLAY_STATE, PREV_TIME, TICK_TIME, CURRENT_TIME, ITERATION, OPTIONS, EASINGS\n} from \"./consts\";\nimport EventTrigger from \"./EventTrigger\";\nimport { bezier, steps } from \"./easing\";\nimport { toFixed, getEasing } from \"./utils\";\nimport { splitUnit, isString, camelize, requestAnimationFrame, isArray, cancelAnimationFrame } from \"@daybrush/utils\";\nimport {\n IterationCountType, DirectionType, AnimatorState,\n EasingFunction, FillModeType, PlayStateType, EasingType, AnimatorOptions,\n} from \"./types\";\nimport { toPropertyObject } from \"./utils/property\";\n\nfunction GetterSetter {}>(\n getter: string[], setter: string[], parent: string) {\n return (constructor: T) => {\n const prototype = constructor.prototype;\n\n getter.forEach(name => {\n prototype[camelize(`get ${name}`)] = function() {\n return this[parent][name];\n };\n });\n setter.forEach(name => {\n prototype[camelize(`set ${name}`)] = function(value: any) {\n this[parent][name] = value;\n return this;\n };\n });\n };\n}\nexport function isDirectionReverse(iteration: number, iteraiontCount: IterationCountType, direction: DirectionType) {\n if (direction === REVERSE) {\n return true;\n } else if (iteraiontCount !== INFINITE && iteration === iteraiontCount && iteraiontCount % 1 === 0) {\n return direction === (iteration % 2 >= 1 ? ALTERNATE_REVERSE : ALTERNATE);\n }\n return direction === (iteration % 2 >= 1 ? ALTERNATE : ALTERNATE_REVERSE);\n}\n/**\n* @typedef {Object} AnimatorState The Animator options. Properties used in css animation.\n* @property {number} [duration] The duration property defines how long an animation should take to complete one cycle.\n* @property {\"none\"|\"forwards\"|\"backwards\"|\"both\"} [fillMode] The fillMode property specifies a style for the element when the animation is not playing (before it starts, after it ends, or both).\n* @property {\"infinite\"|number} [iterationCount] The iterationCount property specifies the number of times an animation should be played.\n* @property {array|function} [easing] The easing(timing-function) specifies the speed curve of an animation.\n* @property {number} [delay] The delay property specifies a delay for the start of an animation.\n* @property {\"normal\"|\"reverse\"|\"alternate\"|\"alternate-reverse\"} [direction] The direction property defines whether an animation should be played forwards, backwards or in alternate cycles.\n*/\n\nconst setters = [\"id\", ITERATION_COUNT, DELAY, FILL_MODE,\n DIRECTION, PLAY_SPEED, DURATION, PLAY_SPEED, ITERATION_TIME, PLAY_STATE];\nconst getters = [...setters, EASING, EASING_NAME];\n\n/**\n* play video, animation, the others\n* @extends EventTrigger\n* @see {@link https://www.w3schools.com/css/css3_animations.asp|CSS3 Animation}\n*/\n@GetterSetter(getters, setters, \"state\")\nclass Animator\n extends EventTrigger {\n public state: U;\n private timerId: number = 0;\n\n /**\n * @param - animator's options\n * @example\n const animator = new Animator({\n delay: 2,\n diretion: \"alternate\",\n duration: 2,\n fillMode: \"forwards\",\n iterationCount: 3,\n easing: Scene.easing.EASE,\n });\n */\n constructor(options?: Partial) {\n super();\n this.state = {\n id: \"\",\n easing: 0,\n easingName: \"linear\",\n iterationCount: 1,\n delay: 0,\n fillMode: \"forwards\",\n direction: NORMAL,\n playSpeed: 1,\n currentTime: 0,\n iterationTime: -1,\n iteration: 0,\n tickTime: 0,\n prevTime: 0,\n playState: PAUSED,\n duration: 0,\n } as U;\n this.setOptions(options);\n }\n /**\n * set animator's easing.\n * @param curverArray - The speed curve of an animation.\n * @return {Animator} An instance itself.\n * @example\n animator.({\n delay: 2,\n diretion: \"alternate\",\n duration: 2,\n fillMode: \"forwards\",\n iterationCount: 3,\n easing: Scene.easing.EASE,\n });\n */\n public setEasing(curveArray: string | number[] | EasingFunction): this {\n const easing: EasingType = getEasing(curveArray);\n const easingName = easing && easing[EASING_NAME] || \"linear\";\n const state = this.state;\n\n state[EASING] = easing;\n state[EASING_NAME] = easingName;\n return this;\n }\n /**\n * set animator's options.\n * @see {@link https://www.w3schools.com/css/css3_animations.asp|CSS3 Animation}\n * @param - animator's options\n * @return {Animator} An instance itself.\n * @example\n animator.({\n delay: 2,\n diretion: \"alternate\",\n duration: 2,\n fillMode: \"forwards\",\n iterationCount: 3,\n easing: Scene.eaasing.EASE,\n });\n */\n public setOptions(options: Partial = {}): this {\n for (const name in options) {\n const value = options[name];\n\n if (name === EASING) {\n this.setEasing(value);\n continue;\n } else if (name === DURATION) {\n value && this.setDuration(value);\n continue;\n }\n if (OPTIONS.indexOf(name as any) > -1) {\n this.state[name] = value;\n }\n }\n\n return this;\n }\n /**\n * Get the animator's total duration including delay\n * @return {number} Total duration\n * @example\n animator.getTotalDuration();\n */\n public getTotalDuration(): number {\n return this.getActiveDuration(true);\n }\n /**\n * Get the animator's total duration excluding delay\n * @return {number} Total duration excluding delay\n * @example\n animator.getActiveDuration();\n */\n public getActiveDuration(delay?: boolean): number {\n const state = this.state;\n const count = state[ITERATION_COUNT];\n if (count === INFINITE) {\n return Infinity;\n }\n return (delay ? state[DELAY] : 0) + this.getDuration() * count;\n }\n /**\n * Check if the animator has reached the end.\n * @return {boolean} ended\n * @example\n animator.isEnded(); // true or false\n */\n public isEnded(): boolean {\n if (this.state[TICK_TIME] === 0 && this.state[PLAY_STATE] === PAUSED) {\n return true;\n } else if (this.getTime() < this.getActiveDuration()) {\n return false;\n }\n return true;\n }\n /**\n *Check if the animator is paused:\n * @return {boolean} paused\n * @example\n animator.isPaused(); // true or false\n */\n public isPaused(): boolean {\n return this.state[PLAY_STATE] === PAUSED;\n }\n public start(delay: number = this.state[DELAY]): boolean {\n const state = this.state;\n\n state[PLAY_STATE] = RUNNING;\n if (state[TICK_TIME] >= delay) {\n /**\n * This event is fired when play animator.\n * @event Animator#play\n */\n this.trigger(PLAY);\n return true;\n }\n return false;\n }\n /**\n * play animator\n * @return {Animator} An instance itself.\n */\n public play(toTime?: number) {\n const state = this.state;\n const delay = state[DELAY];\n const currentTime = this.getTime();\n\n state[PLAY_STATE] = RUNNING;\n\n if (this.isEnded() && (currentTime === 0 || currentTime >= this.getActiveDuration())) {\n this.setTime(-delay, true);\n }\n\n this.timerId = requestAnimationFrame((time: number) => {\n state[PREV_TIME] = time;\n this.tick(time, toTime);\n });\n this.start();\n return this;\n }\n /**\n * pause animator\n * @return {Animator} An instance itself.\n */\n public pause(): this {\n const state = this.state;\n\n if (state[PLAY_STATE] !== PAUSED) {\n state[PLAY_STATE] = PAUSED;\n /**\n * This event is fired when animator is paused.\n * @event Animator#paused\n */\n this.trigger(PAUSED);\n }\n cancelAnimationFrame(this.timerId);\n return this;\n }\n /**\n * end animator\n * @return {Animator} An instance itself.\n */\n public finish() {\n this.setTime(0);\n this.state[TICK_TIME] = 0;\n this.end();\n return this;\n }\n /**\n * end animator\n * @return {Animator} An instance itself.\n */\n public end() {\n this.pause();\n /**\n * This event is fired when animator is ended.\n * @event Animator#ended\n */\n this.trigger(ENDED);\n return this;\n }\n /**\n * set currentTime\n * @param {Number|String} time - currentTime\n * @return {Animator} An instance itself.\n * @example\n\n animator.setTime(\"from\"); // 0\n animator.setTime(\"to\"); // 100%\n animator.setTime(\"50%\");\n animator.setTime(10);\n animator.getTime() // 10\n */\n public setTime(time: number | string, isTick?: boolean, isParent?: boolean) {\n const activeDuration = this.getActiveDuration();\n const state = this.state;\n const prevTime = state[TICK_TIME];\n const delay = state[DELAY];\n let currentTime = isTick ? (time as number) : this.getUnitTime(time);\n\n state[TICK_TIME] = delay + currentTime;\n if (currentTime < 0) {\n currentTime = 0;\n } else if (currentTime > activeDuration) {\n currentTime = activeDuration;\n }\n state[CURRENT_TIME] = currentTime;\n this.calculate();\n\n if (isTick && !isParent) {\n const tickTime = state[TICK_TIME];\n\n if (prevTime < delay && time >= 0) {\n this.start(0);\n }\n if (tickTime < prevTime || this.isEnded()) {\n this.end();\n return;\n }\n }\n if (this.isDelay()) {\n return this;\n }\n /**\n * This event is fired when the animator updates the time.\n * @event Animator#timeupdate\n * @param {Object} param The object of data to be sent to an event.\n * @param {Number} param.currentTime The total time that the animator is running.\n * @param {Number} param.time The iteration time during duration that the animator is running.\n * @param {Number} param.iterationCount The iteration count that the animator is running.\n */\n this.trigger(TIMEUPDATE, {\n currentTime,\n time: this.getIterationTime(),\n iterationCount: state[ITERATION],\n });\n\n return this;\n }\n /**\n * Get the animator's current time\n * @return {number} current time\n * @example\n animator.getTime();\n */\n public getTime(): number {\n return this.state[CURRENT_TIME];\n }\n public getUnitTime(time: string | number) {\n if (isString(time)) {\n const duration = this.getDuration() || 100;\n\n if (time === \"from\") {\n return 0;\n } else if (time === \"to\") {\n return duration;\n }\n const { unit, value } = splitUnit(time);\n\n if (unit === \"%\") {\n !this.getDuration() && (this.setDuration(duration));\n return toFixed(parseFloat(time) / 100 * duration);\n } else if (unit === \">\") {\n return value + THRESHOLD;\n } else {\n return value;\n }\n } else {\n return toFixed(time);\n }\n }\n /**\n * Check if the current state of animator is delayed.\n * @return {boolean} check delay state\n */\n public isDelay() {\n const state = this.state;\n const delay = state[DELAY];\n const tickTime = state[TICK_TIME];\n\n return delay > 0 && (tickTime < delay);\n }\n public setIteration(iterationCount: number): this {\n const state = this.state;\n const passIterationCount = Math.floor(iterationCount);\n const maxIterationCount = state[ITERATION_COUNT] === INFINITE ? Infinity : state[ITERATION_COUNT];\n\n if (state[ITERATION] < passIterationCount && passIterationCount < maxIterationCount) {\n /**\n * The event is fired when an iteration of an animation ends.\n * @event Animator#iteration\n * @param {Object} param The object of data to be sent to an event.\n * @param {Number} param.currentTime The total time that the animator is running.\n * @param {Number} param.iterationCount The iteration count that the animator is running.\n */\n this.trigger(\"iteration\", {\n currentTime: state[CURRENT_TIME],\n iterationCount: passIterationCount,\n });\n }\n state[ITERATION] = iterationCount;\n return this;\n }\n protected calculate() {\n const state = this.state;\n const iterationCount = state[ITERATION_COUNT];\n const fillMode = state[FILL_MODE];\n const direction = state[DIRECTION];\n const duration = this.getDuration();\n const time = this.getTime();\n const iteration = duration === 0 ? 0 : time / duration;\n let currentIterationTime = duration ? time % duration : 0;\n\n if (!duration) {\n this.setIterationTime(0);\n return this;\n }\n this.setIteration(iteration);\n\n // direction : normal, reverse, alternate, alternate-reverse\n // fillMode : forwards, backwards, both, none\n const isReverse = isDirectionReverse(iteration, iterationCount, direction);\n\n const isFiniteDuration = isFinite(duration);\n if (isFiniteDuration && isReverse) {\n currentIterationTime = duration - currentIterationTime;\n }\n if (isFiniteDuration && iterationCount !== INFINITE) {\n const isForwards = fillMode === \"both\" || fillMode === \"forwards\";\n\n // fill forwards\n if (iteration >= iterationCount) {\n currentIterationTime = duration * (isForwards ? (iterationCount % 1) || 1 : 0);\n isReverse && (currentIterationTime = duration - currentIterationTime);\n }\n }\n this.setIterationTime(currentIterationTime);\n return this;\n }\n private tick(now: number, to?: number) {\n if (this.isPaused()) {\n return;\n }\n const state = this.state;\n const playSpeed = state[PLAY_SPEED];\n const prevTime = state[PREV_TIME];\n const delay = state[DELAY];\n const tickTime = state[TICK_TIME];\n const currentTime = tickTime + Math.min(1000, now - prevTime) / 1000 * playSpeed;\n\n state[PREV_TIME] = now;\n this.setTime(currentTime - delay, true);\n if (to && to * 1000 < now) {\n this.pause();\n }\n if (state[PLAY_STATE] === PAUSED) {\n return;\n }\n\n this.timerId = requestAnimationFrame((time: number) => {\n this.tick(time, to);\n });\n }\n}\n/**\n * Specifies the unique indicator of the animator\n * @method Animator#setId\n * @param {number | string} - String or number of id to be set in the animator\n * @return {Animator} An instance itself.\n */\n/**\n * Specifies the unique indicator of the animator\n * @method Animator#getId\n * @return {number | string} the indicator of the item.\n */\n/**\n * Get a delay for the start of an animation.\n * @method Animator#getDelay\n * @return {number} delay\n */\n/**\n * Set a delay for the start of an animation.\n * @method Animator#setDelay\n * @param {number} delay - delay\n * @return {Animator} An instance itself.\n */\n/**\n * Get fill mode for the item when the animation is not playing (before it starts, after it ends, or both)\n * @method Animator#getFillMode\n * @return {FillModeType} fillMode\n */\n/**\n * Set fill mode for the item when the animation is not playing (before it starts, after it ends, or both)\n * @method Animator#setFillMode\n * @param {FillModeType} fillMode - fillMode\n * @return {Animator} An instance itself.\n */\n/**\n * Get the number of times an animation should be played.\n * @method Animator#getIterationCount\n * @return {IterationCountType} iterationCount\n */\n/**\n * Set the number of times an animation should be played.\n * @method Animator#setIterationCount\n * @param {IterationCountType} iterationCount - iterationCount\n * @return {Animator} An instance itself.\n */\n/**\n * Get whether an animation should be played forwards, backwards or in alternate cycles.\n * @method Animator#getDirection\n * @return {DirectionType} direction\n */\n/**\n * Set whether an animation should be played forwards, backwards or in alternate cycles.\n * @method Animator#setDirection\n * @param {DirectionType} direction - direction\n * @return {Animator} An instance itself.\n */\n/**\n * Get whether the animation is running or paused.\n * @method Animator#getPlayState\n * @return {PlayStateType} playState\n */\n/**\n * Set whether the animation is running or paused.\n * @method Animator#setPlayState\n * @param {PlayStateType} playState - playState\n * @return {Animator} An instance itself.\n */\n/**\n * Get the animator's play speed\n * @method Animator#getPlaySpeed\n * @return {number} playSpeed\n */\n/**\n * Set the animator's play speed\n * @method Animator#setPlaySpeed\n * @param {number} playSpeed - playSpeed\n * @return {Animator} An instance itself.\n */\n/**\n * Get how long an animation should take to complete one cycle.\n * @method Animator#getDuration\n * @return {number} duration\n */\n/**\n * Set how long an animation should take to complete one cycle.\n * @method Animator#setDuration\n * @param {number} duration - duration\n * @return {Animator} An instance itself.\n */\n/**\n * Get the speed curve of an animation.\n * @method Animator#getEasing\n * @return {EasingType} easing\n */\n/**\n * Get the speed curve's name\n * @method Animator#getEasingName\n * @return {string} the curve's name.\n */\n/**\n\t* Get the animator's current iteration time\n\t* @method Animator#getIterationTime\n\t* @return {number} current iteration time\n\t* @example\nanimator.getIterationTime();\n\t*/\n\n// tslint:disable-next-line:interface-name\ninterface Animator {\n setId(id: number | string): this;\n getId(): number | string;\n getIterationTime(): number;\n setIterationTime(time: number): this;\n setDelay(delay: number): this;\n getDelay(): number;\n setFillMode(fillMode: FillModeType): this;\n getFillMode(): FillModeType;\n setIterationCount(iterationCount: IterationCountType): this;\n getIterationCount(): IterationCountType;\n setDirection(direction: DirectionType): this;\n getDirection(): DirectionType;\n setPlayState(playState: PlayStateType): this;\n getPlayState(): PlayStateType;\n setPlaySpeed(playSpeed: number): this;\n getPlaySpeed(): number;\n setDuration(duration: number): this;\n getDuration(): number;\n getEasing(): EasingType;\n getEasingName(): string;\n}\nexport default Animator;\n","import {\n ALIAS, TIMING_FUNCTION, TRANSFORM_NAME, EASING_NAME\n} from \"./consts\";\nimport { isRole, getType, isPropertyObject, getValueByNames, isFixed, getNames, getEasing } from \"./utils\";\nimport { toPropertyObject, splitStyle, toObject } from \"./utils/property\";\nimport {\n isObject, isArray, isString,\n ANIMATION, TRANSFORM, FILTER, PROPERTY, FUNCTION, ARRAY, OBJECT, IObject, isUndefined\n} from \"@daybrush/utils\";\nimport { NameType } from \"./types\";\n\nfunction toInnerProperties(obj: IObject) {\n if (!obj) {\n return \"\";\n }\n const arrObj = [];\n\n for (const name in obj) {\n arrObj.push(`${name.replace(/\\d$/g, \"\")}(${obj[name]})`);\n }\n return arrObj.join(\" \");\n}\n\n/* eslint-disable */\nfunction clone(target: IObject, toValue = false) {\n return merge({}, target, toValue);\n}\nfunction merge(to: IObject, from: IObject, toValue = false) {\n for (const name in from) {\n const value = from[name];\n const type = getType(value);\n\n if (type === PROPERTY) {\n to[name] = toValue ? value.toValue() : value.clone();\n } else if (type === FUNCTION) {\n to[name] = toValue ? getValue([name], value) : value;\n } else if (type === ARRAY) {\n to[name] = value.slice();\n } else if (type === OBJECT) {\n if (isObject(to[name]) && !isPropertyObject(to[name])) {\n merge(to[name], value, toValue);\n } else {\n to[name] = clone(value, toValue);\n }\n } else {\n to[name] = from[name];\n }\n }\n return to;\n}\n/* eslint-enable */\n\nfunction getPropertyName(args: NameType[]) {\n return args[0] in ALIAS ? ALIAS[args[0]] : args;\n}\nfunction getValue(names: NameType[], value: any): any {\n const type = getType(value);\n\n if (type === PROPERTY) {\n return value.toValue();\n } else if (type === FUNCTION) {\n if (names[0] !== TIMING_FUNCTION) {\n return getValue(names, value());\n }\n } else if (type === OBJECT) {\n return clone(value, true);\n }\n return value;\n}\n/**\n* Animation's Frame\n*/\nclass Frame {\n public properties: IObject;\n /**\n * @param - properties\n * @example\n const frame = new Scene.Frame({\n display: \"none\"\n transform: {\n translate: \"50px\",\n scale: \"5, 5\",\n }\n });\n */\n constructor(properties: any = {}) {\n this.properties = {};\n this.set(properties);\n }\n /**\n * get property value\n * @param {...Number|String|PropertyObject} args - property name or value\n * @example\n frame.get(\"display\") // => \"none\", \"block\", ....\n frame.get(\"transform\", \"translate\") // => \"10px,10px\"\n */\n public get(...args: NameType[]) {\n const value = this.raw(...args);\n\n return getValue(getPropertyName(args), value);\n }\n\n public raw(...args: NameType[]) {\n return getValueByNames(getPropertyName(args), this.properties);\n }\n /**\n * remove property value\n * @param {...String} args - property name\n * @return {Frame} An instance itself\n * @example\n frame.remove(\"display\")\n */\n public remove(...args: NameType[]) {\n const params = getPropertyName(args);\n const length = params.length;\n\n if (!length) {\n return this;\n }\n const value = getValueByNames(params, this.properties, length - 1);\n\n if (isObject(value)) {\n delete value[params[length - 1]];\n }\n return this;\n }\n /**\n * set property\n * @param {...Number|String|PropertyObject} args - property names or values\n * @return {Frame} An instance itself\n * @example\n // one parameter\n frame.set({\n display: \"none\",\n transform: {\n translate: \"10px, 10px\",\n scale: \"1\",\n },\n filter: {\n brightness: \"50%\",\n grayscale: \"100%\"\n }\n });\n\n // two parameters\n frame.set(\"transform\", {\n translate: \"10px, 10px\",\n scale: \"1\",\n });\n\n // three parameters\n frame.set(\"transform\", \"translate\", \"50px\");\n */\n public set(...args: any[]) {\n const self = this;\n const length = args.length;\n const params = args.slice(0, -1);\n const value = args[length - 1];\n const firstParam = params[0];\n\n if (length === 1 && value instanceof Frame) {\n self.merge(value);\n } else if (firstParam in ALIAS) {\n self._set(ALIAS[firstParam], value);\n } else if (length === 2 && isArray(firstParam)) {\n self._set(firstParam, value);\n } else if (isPropertyObject(value)) {\n if (isRole(params)) {\n self.set(...params, toObject(value));\n } else {\n self._set(params, value);\n }\n } else if (isArray(value)) {\n self._set(params, value);\n } else if (isObject(value)) {\n if (!self.has(...params) && isRole(params)) {\n self._set(params, {});\n }\n for (const name in value) {\n self.set(...params, name, value[name]);\n }\n } else if (isString(value)) {\n if (isRole(params, true)) {\n if (isFixed(params) || !isRole(params)) {\n this._set(params, value);\n } else {\n const obj = toPropertyObject(value);\n\n if (isObject(obj)) {\n self.set(...params, obj);\n }\n }\n return this;\n } else {\n const { styles, length: stylesLength } = splitStyle(value);\n\n for (const name in styles) {\n self.set(...params, name, styles[name]);\n }\n if (stylesLength) {\n return this;\n }\n }\n self._set(params, value);\n } else {\n self._set(params, value);\n }\n return self;\n }\n /**\n * Gets the names of properties.\n * @return the names of properties.\n * @example\n // one parameter\n frame.set({\n display: \"none\",\n transform: {\n translate: \"10px, 10px\",\n scale: \"1\",\n },\n });\n\n // [[\"display\"], [\"transform\", \"translate\"], [\"transform\", \"scale\"]]\n console.log(frame.getNames());\n */\n public getNames(): string[][] {\n return getNames(this.properties, []);\n }\n /**\n * check that has property.\n * @param {...String} args - property name\n * @example\n frame.has(\"property\", \"display\") // => true or false\n */\n public has(...args: NameType[]) {\n const params = getPropertyName(args);\n const length = params.length;\n\n if (!length) {\n return false;\n }\n return !isUndefined(getValueByNames(params, this.properties, length));\n }\n /**\n * clone frame.\n * @return {Frame} An instance of clone\n * @example\n frame.clone();\n */\n public clone() {\n const frame = new Frame();\n\n return frame.merge(this);\n }\n /**\n * merge one frame to other frame.\n * @param - target frame.\n * @return {Frame} An instance itself\n * @example\n frame.merge(frame2);\n */\n public merge(frame: Frame) {\n const properties = this.properties;\n const frameProperties = frame.properties;\n\n if (frameProperties) {\n merge(properties, frameProperties);\n }\n return this;\n }\n /**\n * Specifies an css object that coverted the frame.\n * @return {object} cssObject\n */\n public toCSSObject() {\n const properties = this.get();\n const cssObject: IObject = {};\n\n for (const name in properties) {\n if (isRole([name], true)) {\n continue;\n }\n const value = properties[name];\n\n if (name === TIMING_FUNCTION) {\n cssObject[TIMING_FUNCTION.replace(\"animation\", ANIMATION)] =\n (isString(value) ? value : value[EASING_NAME]) || \"initial\";\n } else {\n cssObject[name] = value;\n }\n }\n const transform = toInnerProperties(properties[TRANSFORM_NAME]);\n const filter = toInnerProperties(properties.filter);\n\n TRANSFORM && transform && (cssObject[TRANSFORM] = transform);\n FILTER && filter && (cssObject[FILTER] = filter);\n return cssObject;\n }\n /**\n * Specifies an css text that coverted the frame.\n * @return {string} cssText\n */\n public toCSS() {\n const cssObject = this.toCSSObject();\n const cssArray = [];\n\n for (const name in cssObject) {\n cssArray.push(`${name}:${cssObject[name]};`);\n }\n return cssArray.join(\"\");\n }\n /**\n * Remove All Properties\n * @return {Frame} An instance itself\n */\n public clear() {\n this.properties = {};\n return this;\n }\n private _set(args: NameType[], value: any) {\n let properties = this.properties;\n const length = args.length;\n\n for (let i = 0; i < length - 1; ++i) {\n const name = args[i];\n\n !(name in properties) && (properties[name] = {});\n properties = properties[name];\n }\n if (!length) {\n return;\n }\n if (length === 1 && args[0] === TIMING_FUNCTION) {\n properties[TIMING_FUNCTION] = getEasing(value);\n } else {\n const lastParam = args[length - 1];\n properties[lastParam] = isString(value) && !isFixed(args)\n ? toPropertyObject(value, lastParam)\n : value;\n }\n }\n}\nexport default Frame;\n","\nimport PropertyObject from \"../PropertyObject\";\nimport { getType } from \"../utils\";\nimport { toPropertyObject } from \"./property\";\nimport { splitUnit, PROPERTY, FUNCTION, ARRAY, dot as dotNumber } from \"@daybrush/utils\";\nimport { EasingType } from \"../types\";\n\nfunction dotArray(a1: any[], a2: any, b1: number, b2: number): any {\n const length = a2.length;\n\n return a1.map((v1, i) => {\n if (i >= length) {\n return v1;\n } else {\n return dot(v1, a2[i], b1, b2);\n }\n });\n}\n\nfunction dotColor(color1: PropertyObject, color2: PropertyObject, b1: number, b2: number) {\n // convert array to PropertyObject(type=color)\n const value1 = color1.value;\n const value2 = color2.value;\n // If the model name is not same, the inner product is impossible.\n const model1 = color1.model;\n const model2 = color2.model;\n\n if (model1 !== model2) {\n // It is recognized as a string.\n return dot(color1.toValue(), color2.toValue(), b1, b2);\n }\n if (value1.length === 3) {\n value1[3] = 1;\n }\n if (value2.length === 3) {\n value2[3] = 1;\n }\n const v = dotArray(value1, value2, b1, b2);\n const colorModel = model1;\n\n for (let i = 0; i < 3; ++i) {\n v[i] = parseInt(v[i], 10);\n }\n const object = new PropertyObject(v, {\n type: \"color\",\n model: colorModel,\n prefix: `${colorModel}(`,\n suffix: \")\",\n });\n\n return object;\n}\n\nfunction dotObject(a1: PropertyObject, a2: PropertyObject, b1: number, b2: number) {\n const a1Type = a1.type;\n\n if (a1Type === \"color\") {\n return dotColor(a1, a2, b1, b2);\n }\n const value1 = a1.value;\n const value2 = a2.value;\n const arr = dotArray(value1, value2, b1, b2);\n\n return new PropertyObject(arr, {\n type: a1Type,\n separator: a1.separator || a2.separator,\n prefix: a1.prefix || a2.prefix,\n suffix: a1.suffix || a2.suffix,\n model: a1.model || a2.model,\n });\n}\n/**\n* The dot product of a1 and a2 for the b1 and b2.\n* @memberof Dot\n* @function dot\n* @param {String|Number|PropertyObject} a1 value1\n* @param {String|Number|PropertyObject} a2 value2\n* @param {Number} b1 b1 ratio\n* @param {Number} b2 b2 ratio\n* @return {String} Not Array, Not Separator, Only Number & Unit\n* @return {PropertyObject} Array with Separator.\n* @example\ndot(1, 3, 0.3, 0.7);\n// => 1.6\n*/\nexport function dot(a1: any, a2: any, b1: number, b2: number): any {\n if (b2 === 0) {\n return a2;\n } else if (b1 === 0 || b1 + b2 === 0) {\n // prevent division by zero.\n return a1;\n }\n // dot Object\n\n const type1 = getType(a1);\n const type2 = getType(a2);\n const isFunction1 = type1 === FUNCTION;\n const isFunction2 = type2 === FUNCTION;\n\n if (isFunction1 || isFunction2) {\n return () => {\n return dot(isFunction1 ? toPropertyObject(a1()) : a1, isFunction2 ? toPropertyObject(a2()) : a2, b1, b2);\n };\n } else if (type1 === type2) {\n if (type1 === PROPERTY) {\n return dotObject(a1, a2, b1, b2);\n } else if (type1 === ARRAY) {\n return dotArray(a1, a2, b1, b2);\n } else if (type1 !== \"value\") {\n return a1;\n }\n } else {\n return a1;\n }\n const v1 = splitUnit(`${a1}`);\n const v2 = splitUnit(`${a2}`);\n let v;\n\n // 숫자가 아닐경우 첫번째 값을 반환 b2가 0일경우 두번째 값을 반환\n if (isNaN(v1.value) || isNaN(v2.value)) {\n return a1;\n } else {\n v = dotNumber(v1.value, v2.value, b1, b2);\n }\n const prefix = v1.prefix || v2.prefix;\n const unit = v1.unit || v2.unit;\n\n if (!prefix && !unit) {\n return v;\n }\n return prefix + v + unit;\n}\n\nexport function dotValue(\n time: number,\n prevTime: number,\n nextTime: number,\n prevValue: any,\n nextValue: any,\n easing?: EasingType) {\n if (time === prevTime) {\n return prevValue;\n } else if (time === nextTime) {\n return nextValue;\n } else if (!easing) {\n return dot(prevValue, nextValue, time - prevTime, nextTime - time);\n }\n const ratio = easing((time - prevTime) / (nextTime - prevTime));\n const value = dot(prevValue, nextValue, ratio, 1 - ratio);\n\n return value;\n}\n","import Animator, { isDirectionReverse } from \"./Animator\";\nimport Frame from \"./Frame\";\nimport {\n toFixed,\n isFixed,\n playCSS,\n toId,\n exportCSS,\n getRealId,\n makeId,\n isPausedCSS,\n isRole,\n isInProperties,\n getValueByNames,\n isEndedCSS,\n setPlayCSS,\n getNames,\n updateFrame,\n} from \"./utils\";\nimport { dotValue } from \"./utils/dot\";\nimport {\n START_ANIMATION,\n PREFIX, THRESHOLD,\n TIMING_FUNCTION, ALTERNATE, ALTERNATE_REVERSE, INFINITE,\n REVERSE, EASING, FILL_MODE, DIRECTION, ITERATION_COUNT,\n EASING_NAME, DELAY, PLAY_SPEED, DURATION, PAUSE_ANIMATION, DATA_SCENE_ID, SELECTOR, ROLES, CURRENT_TIME\n} from \"./consts\";\nimport {\n isObject, isArray, isUndefined, decamelize,\n ANIMATION, fromCSS, addClass, removeClass, hasClass,\n KEYFRAMES, requestAnimationFrame, isFunction,\n IObject, $, splitComma, toArray, isString, IArrayFormat,\n dot as dotNumber,\n find,\n findIndex,\n} from \"@daybrush/utils\";\nimport {\n NameType, RoleObject, AnimateElement, AnimatorState,\n SceneItemState, SceneItemOptions, EasingType, PlayCondition, DirectionType\n} from \"./types\";\n\nfunction getNearTimeIndex(times: number[], time: number) {\n const length = times.length;\n\n for (let i = 0; i < length; ++i) {\n if (times[i] === time) {\n return [i, i];\n } else if (times[i] > time) {\n return [i > 0 ? i - 1 : 0, i];\n }\n }\n return [length - 1, length - 1];\n}\nfunction makeAnimationProperties(properties: object) {\n const cssArray = [];\n\n for (const name in properties) {\n cssArray.push(`${ANIMATION}-${decamelize(name)}:${properties[name]};`);\n }\n return cssArray.join(\"\");\n}\nfunction addTime(times: number[], time: number) {\n const length = times.length;\n for (let i = 0; i < length; ++i) {\n if (time < times[i]) {\n times.splice(i, 0, time);\n return;\n }\n }\n times[length] = time;\n}\nfunction addEntry(entries: number[][], time: number, keytime: number) {\n const prevEntry = entries[entries.length - 1];\n\n (!prevEntry || prevEntry[0] !== time || prevEntry[1] !== keytime) &&\n entries.push([toFixed(time), toFixed(keytime)]);\n}\nexport function getEntries(times: number[], states: AnimatorState[]) {\n let entries = times.map(time => ([time, time]));\n let nextEntries = [];\n\n states.forEach(state => {\n const iterationCount = state[ITERATION_COUNT] as number;\n const delay = state[DELAY];\n const playSpeed = state[PLAY_SPEED];\n const direction = state[DIRECTION];\n const intCount = Math.ceil(iterationCount);\n const currentDuration = entries[entries.length - 1][0];\n const length = entries.length;\n const lastTime = currentDuration * iterationCount;\n\n for (let i = 0; i < intCount; ++i) {\n const isReverse =\n direction === REVERSE ||\n direction === ALTERNATE && i % 2 ||\n direction === ALTERNATE_REVERSE && !(i % 2);\n\n for (let j = 0; j < length; ++j) {\n const entry = entries[isReverse ? length - j - 1 : j];\n const time = entry[1];\n const currentTime = currentDuration * i + (isReverse ? currentDuration - entry[0] : entry[0]);\n const prevEntry = entries[isReverse ? length - j : j - 1];\n\n if (currentTime > lastTime) {\n if (j !== 0) {\n const prevTime = currentDuration * i +\n (isReverse ? currentDuration - prevEntry[0] : prevEntry[0]);\n const divideTime = dotNumber(prevEntry[1], time, lastTime - prevTime, currentTime - lastTime);\n\n addEntry(nextEntries, (delay + currentDuration * iterationCount) / playSpeed, divideTime);\n }\n break;\n } else if (\n currentTime === lastTime\n && nextEntries.length\n && nextEntries[nextEntries.length - 1][0] === lastTime + delay\n ) {\n break;\n }\n addEntry(nextEntries, (delay + currentTime) / playSpeed, time);\n }\n }\n // delay time\n delay && nextEntries.unshift([0, nextEntries[0][1]]);\n\n entries = nextEntries;\n nextEntries = [];\n });\n\n return entries;\n}\n/**\n* manage Frame Keyframes and play keyframes.\n* @extends Animator\n* @example\nconst item = new SceneItem({\n\t0: {\n\t\tdisplay: \"none\",\n\t},\n\t1: {\n\t\tdisplay: \"block\",\n\t\topacity: 0,\n\t},\n\t2: {\n\t\topacity: 1,\n\t}\n});\n*/\nclass SceneItem extends Animator {\n public times: number[] = [];\n public items: IObject = {};\n public names: RoleObject = {};\n public elements: AnimateElement[] = [];\n public temp: Frame;\n private needUpdate: boolean = true;\n private target: any;\n private targetFunc: (frame: Frame) => void;\n\n /**\n * @param - properties\n * @param - options\n * @example\n const item = new SceneItem({\n 0: {\n display: \"none\",\n },\n 1: {\n display: \"block\",\n opacity: 0,\n },\n 2: {\n opacity: 1,\n }\n });\n */\n constructor(properties?: any, options?: Partial) {\n super();\n this.load(properties, options);\n }\n public getDuration() {\n const times = this.times;\n const length = times.length;\n\n return (length === 0 ? 0 : times[length - 1]) || this.state[DURATION];\n }\n /**\n * get size of list\n * @return {Number} length of list\n */\n public size() {\n return this.times.length;\n }\n public setDuration(duration: number) {\n if (!duration) {\n return this;\n }\n const originalDuration = this.getDuration();\n\n if (originalDuration > 0) {\n const ratio = duration / originalDuration;\n const { times, items } = this;\n const obj: IObject = {};\n\n this.times = times.map(time => {\n const time2 = toFixed(time * ratio);\n\n obj[time2] = items[time];\n\n return time2;\n });\n this.items = obj;\n } else {\n this.newFrame(duration);\n }\n return this;\n }\n public setId(id?: number | string) {\n const state = this.state;\n const elements = this.elements;\n const length = elements.length;\n\n state.id = id || makeId(!!length);\n\n if (length && !state[SELECTOR]) {\n const sceneId = toId(this.getId());\n\n state[SELECTOR] = `[${DATA_SCENE_ID}=\"${sceneId}\"]`;\n elements.forEach(element => {\n element.setAttribute(DATA_SCENE_ID, sceneId);\n });\n }\n return this;\n }\n\n /**\n * Set properties to the sceneItem at that time\n * @param {Number} time - time\n * @param {...String|Object} [properties] - property names or values\n * @return {SceneItem} An instance itself\n * @example\n item.set(0, \"a\", \"b\") // item.getFrame(0).set(\"a\", \"b\")\n console.log(item.get(0, \"a\")); // \"b\"\n */\n public set(time: any, ...args: any[]) {\n if (time instanceof SceneItem) {\n return this.set(0, time);\n } else if (isArray(time)) {\n const length = time.length;\n\n for (let i = 0; i < length; ++i) {\n const t = length === 1 ? 0 : this.getUnitTime(`${i / (length - 1) * 100}%`);\n\n this.set(t, time[i]);\n }\n } else if (isObject(time)) {\n for (const t in time) {\n const value = time[t];\n\n splitComma(t).forEach(eachTime => {\n const realTime = this.getUnitTime(eachTime);\n\n if (isNaN(realTime)) {\n getNames(value, [eachTime]).forEach(names => {\n const innerValue = getValueByNames(names.slice(1), value);\n const arr = isArray(innerValue) ?\n innerValue : [getValueByNames(names, this.target), innerValue];\n const length = arr.length;\n\n for (let i = 0; i < length; ++i) {\n this.newFrame(`${i / (length - 1) * 100}%`).set(...names, arr[i]);\n }\n });\n } else {\n this.set(realTime, value);\n }\n });\n }\n } else if (!isUndefined(time)) {\n const value = args[0];\n\n splitComma(time + \"\").forEach(eachTime => {\n const realTime = this.getUnitTime(eachTime);\n\n if (value instanceof SceneItem) {\n const delay = value.getDelay();\n const frames = value.toObject(!this.hasFrame(realTime + delay));\n const duration = value.getDuration();\n const direction = value.getDirection();\n const isReverse = direction.indexOf(\"reverse\") > -1;\n\n for (const frameTime in frames) {\n const nextTime = isReverse ? duration - parseFloat(frameTime) : parseFloat(frameTime);\n this.set(realTime + nextTime, frames[frameTime]);\n }\n } else if (args.length === 1 && isArray(value)) {\n value.forEach((item: any) => {\n this.set(realTime, item);\n });\n } else {\n const frame = this.newFrame(realTime);\n\n frame.set(...args);\n }\n });\n }\n this.needUpdate = true;\n return this;\n }\n /**\n * Get properties of the sceneItem at that time\n * @param {Number} time - time\n * @param {...String|Object} args property's name or properties\n * @return {Number|String|PropertyObejct} property value\n * @example\n item.get(0, \"a\"); // item.getFrame(0).get(\"a\");\n item.get(0, \"transform\", \"translate\"); // item.getFrame(0).get(\"transform\", \"translate\");\n */\n public get(time: string | number, ...args: NameType[]) {\n const frame = this.getFrame(time);\n\n return frame && frame.get(...args);\n }\n public remove(time: string | number, ...args: any[]): this;\n /**\n * remove properties to the sceneItem at that time\n * @param {Number} time - time\n * @param {...String|Object} [properties] - property names or values\n * @return {SceneItem} An instance itself\n * @example\n item.remove(0, \"a\");\n */\n public remove(time: string | number, ...args: NameType[]) {\n if (args.length) {\n const frame = this.getFrame(time);\n\n frame && frame.remove(...args);\n } else {\n this.removeFrame(time);\n }\n this.needUpdate = true;\n return this;\n }\n /**\n * Append the item or object at the last time.\n * @param - the scene item or item object\n * @return An instance itself\n * @example\n item.append(new SceneItem({\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n }));\n item.append({\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n });\n item.set(item.getDuration(), {\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n });\n */\n public append(item: SceneItem | IObject) {\n if (item instanceof SceneItem) {\n this.set(this.getDuration(), item);\n } else {\n this.append(new SceneItem(item));\n }\n return this;\n }\n /**\n * Push the front frames for the time and prepend the scene item or item object.\n * @param - the scene item or item object\n * @return An instance itself\n */\n public prepend(item: SceneItem | IObject) {\n if (item instanceof SceneItem) {\n const unshiftTime = item.getDuration() + item.getDelay();\n const firstFrame = this.getFrame(0);\n // remove first frame\n this.removeFrame(0);\n this.unshift(unshiftTime);\n this.set(0, item);\n this.set(unshiftTime + THRESHOLD, firstFrame);\n } else {\n this.prepend(new SceneItem(item));\n }\n return this;\n }\n /**\n * Push out the amount of time.\n * @param - time to push\n * @example\n item.get(0); // frame 0\n item.unshift(3);\n item.get(3) // frame 0\n */\n public unshift(time: number) {\n const { times, items } = this;\n const obj: IObject = {};\n\n this.times = times.map(t => {\n const time2 = toFixed(time + t);\n\n obj[time2] = items[t];\n return time2;\n });\n this.items = obj;\n return this;\n }\n /**\n * Get the frames in the item in object form.\n * @return {}\n * @example\n item.toObject();\n // {0: {display: \"none\"}, 1: {display: \"block\"}}\n */\n public toObject(isStartZero = true): IObject {\n const obj: IObject = {};\n const delay = this.getDelay();\n\n this.forEach((frame: Frame, time: number) => {\n obj[(!time && !isStartZero ? THRESHOLD : 0) + delay + time] = frame.clone();\n });\n return obj;\n }\n /**\n * Specifies an element to synchronize items' keyframes.\n * @param {string} selectors - Selectors to find elements in items.\n * @return {SceneItem} An instance itself\n * @example\nitem.setSelector(\"#id.class\");\n */\n public setSelector(target: string | boolean | ((id: number | string) => string)) {\n if (isFunction(target)) {\n this.setElement(target(this.getId()));\n } else {\n this.setElement(target);\n }\n return this;\n }\n /**\n * Get the elements connected to SceneItem.\n */\n public getElements(): AnimateElement[] {\n return this.elements;\n }\n /**\n * Specifies an element to synchronize item's keyframes.\n * @param - elements to synchronize item's keyframes.\n * @param - Make sure that you have peusdo.\n * @return {SceneItem} An instance itself\n * @example\nitem.setElement(document.querySelector(\"#id.class\"));\nitem.setElement(document.querySelectorAll(\".class\"));\n */\n public setElements(target: boolean | string | AnimateElement | IArrayFormat): this {\n return this.setElement(target);\n }\n /**\n * Specifies an element to synchronize item's keyframes.\n * @param - elements to synchronize item's keyframes.\n * @param - Make sure that you have peusdo.\n * @return {SceneItem} An instance itself\n * @example\nitem.setElement(document.querySelector(\"#id.class\"));\nitem.setElement(document.querySelectorAll(\".class\"));\n */\n public setElement(target: boolean | string | AnimateElement | IArrayFormat) {\n const state = this.state;\n let elements: AnimateElement[] = [];\n\n if (!target) {\n return this;\n } else if (target === true || isString(target)) {\n const selector = target === true ? `${state.id}` : target;\n const matches = /([\\s\\S]+)(:+[a-zA-Z]+)$/g.exec(selector);\n\n elements = toArray($(matches ? matches[1] : selector, true));\n state[SELECTOR] = selector;\n } else {\n elements = (target instanceof Element) ? [target] : toArray(target);\n }\n if (!elements.length) {\n return this;\n }\n this.elements = elements;\n this.setId(this.getId());\n this.target = elements[0].style;\n this.targetFunc = (frame: Frame) => {\n const attributes = frame.get(\"attribute\");\n\n if (attributes) {\n for (const name in attributes) {\n elements.forEach(el => {\n el.setAttribute(name, attributes[name]);\n });\n }\n }\n if (frame.has(\"html\")) {\n const html = frame.get(\"html\");\n\n elements.forEach(el => {\n el.innerHTML = html;\n });\n }\n const cssText = frame.toCSS();\n\n if (state.cssText !== cssText) {\n state.cssText = cssText;\n\n elements.forEach(el => {\n el.style.cssText += cssText;\n });\n return frame;\n }\n };\n return this;\n }\n public setTarget(target: any): this {\n this.target = target;\n this.targetFunc = (frame: Frame) => {\n const obj = frame.get();\n\n for (const name in obj) {\n target[name] = obj[name];\n }\n };\n return this;\n }\n /**\n * add css styles of items's element to the frame at that time.\n * @param {Array} properties - elements to synchronize item's keyframes.\n * @return {SceneItem} An instance itself\n * @example\n item.setElement(document.querySelector(\"#id.class\"));\n item.setCSS(0, [\"opacity\"]);\n item.setCSS(0, [\"opacity\", \"width\", \"height\"]);\n */\n public setCSS(time: number, properties: string[]) {\n this.set(time, fromCSS(this.elements, properties));\n return this;\n }\n public setTime(time: number | string, isTick?: boolean, isParent?: boolean, parentEasing?: EasingType) {\n super.setTime(time, isTick, isParent);\n\n const iterationTime = this.getIterationTime();\n const easing = this.getEasing() || parentEasing;\n const frame = this.getNowFrame(iterationTime, easing);\n const currentTime = this.getTime();\n\n this.temp = frame;\n /**\n * This event is fired when timeupdate and animate.\n * @event SceneItem#animate\n * @param {Number} param.currentTime The total time that the animator is running.\n * @param {Number} param.time The iteration time during duration that the animator is running.\n * @param {Frame} param.frame frame of that time.\n */\n this.trigger(\"animate\", {\n frame,\n currentTime,\n time: iterationTime,\n });\n this.targetFunc && this.targetFunc(frame);\n return this;\n }\n /**\n * update property names used in frames.\n * @return {SceneItem} An instance itself\n * @example\n item.update();\n */\n public update() {\n const names = {};\n this.forEach(frame => {\n updateFrame(names, frame.properties);\n });\n this.names = names;\n this.needUpdate = false;\n return this;\n }\n /**\n * Create and add a frame to the sceneItem at that time\n * @param {Number} time - frame's time\n * @return {Frame} Created frame.\n * @example\n item.newFrame(time);\n */\n public newFrame(time: string | number) {\n let frame = this.getFrame(time);\n\n if (frame) {\n return frame;\n }\n frame = new Frame();\n this.setFrame(time, frame);\n return frame;\n }\n /**\n * Add a frame to the sceneItem at that time\n * @param {Number} time - frame's time\n * @return {SceneItem} An instance itself\n * @example\n item.setFrame(time, frame);\n */\n public setFrame(time: string | number, frame: Frame) {\n const realTime = this.getUnitTime(time);\n\n this.items[realTime] = frame;\n addTime(this.times, realTime);\n this.needUpdate = true;\n return this;\n }\n public getFrame(time: number | string, ...names: any[]): Frame;\n /**\n * get sceneItem's frame at that time\n * @param {Number} time - frame's time\n * @return {Frame} sceneItem's frame at that time\n * @example\n const frame = item.getFrame(time);\n */\n public getFrame(time: number | string) {\n return this.items[this.getUnitTime(time)];\n }\n public removeFrame(time: number | string, ...names: any[]): this;\n /**\n * remove sceneItem's frame at that time\n * @param - frame's time\n * @return {SceneItem} An instance itself\n * @example\n item.removeFrame(time);\n */\n public removeFrame(time: number | string) {\n const realTime = this.getUnitTime(time);\n const items = this.items;\n const index = this.times.indexOf(realTime);\n\n delete items[realTime];\n\n // remove time\n if (index > -1) {\n this.times.splice(index, 1);\n }\n this.needUpdate = true;\n return this;\n }\n /**\n * check if the item has a frame at that time\n * @param {Number} time - frame's time\n * @return {Boolean} true: the item has a frame // false: not\n * @example\n if (item.hasFrame(10)) {\n // has\n } else {\n // not\n }\n */\n public hasFrame(time: number | string) {\n return this.getUnitTime(time) in this.items;\n }\n /**\n * Check if keyframes has propery's name\n * @param - property's time\n * @return {boolean} true: if has property, false: not\n * @example\n item.hasName([\"transform\", \"translate\"]); // true or not\n */\n public hasName(args: string[]) {\n this.needUpdate && this.update();\n return isInProperties(this.names, args, true);\n }\n /**\n * merge frame of the previous time at the next time.\n * @param - The time of the frame to merge\n * @param - The target frame\n * @return {SceneItem} An instance itself\n * @example\n // getFrame(1) contains getFrame(0)\n item.merge(0, 1);\n */\n public mergeFrame(time: number | string, frame: Frame) {\n if (frame) {\n const toFrame = this.newFrame(time);\n\n toFrame.merge(frame);\n }\n return this;\n }\n /**\n * Get frame of the current time\n * @param {Number} time - the current time\n * @param {function} easing - the speed curve of an animation\n * @return {Frame} frame of the current time\n * @example\n let item = new SceneItem({\n 0: {\n display: \"none\",\n },\n 1: {\n display: \"block\",\n opacity: 0,\n },\n 2: {\n opacity: 1,\n }\n });\n // opacity: 0.7; display:\"block\";\n const frame = item.getNowFrame(1.7);\n */\n public getNowFrame(time: number, easing?: EasingType, isAccurate?: boolean) {\n this.needUpdate && this.update();\n const frame = new Frame();\n const [left, right] = getNearTimeIndex(this.times, time);\n let realEasing = this.getEasing() || easing;\n let nameObject = this.names;\n\n if (this.hasName([TIMING_FUNCTION])) {\n const nowEasing = this.getNowValue(time, [TIMING_FUNCTION], left, right, false, 0, true);\n\n isFunction(nowEasing) && (realEasing = nowEasing);\n }\n if (isAccurate) {\n const prevFrame = this.getFrame(time);\n const prevNames = updateFrame({}, prevFrame.properties);\n\n for (const name in ROLES) {\n if (name in prevNames) {\n prevNames[name] = nameObject[name];\n }\n }\n nameObject = prevNames;\n }\n const names = getNames(nameObject, []);\n\n names.forEach(properties => {\n const value = this.getNowValue(time, properties, left, right, isAccurate, realEasing, isFixed(properties));\n\n if (isUndefined(value)) {\n return;\n }\n frame.set(properties, value);\n });\n return frame;\n }\n public load(properties: any = {}, options = properties.options) {\n options && this.setOptions(options);\n\n if (isArray(properties)) {\n this.set(properties);\n } else if (properties.keyframes) {\n this.set(properties.keyframes);\n } else {\n for (const time in properties) {\n if (time !== \"options\") {\n this.set({\n [time]: properties[time],\n });\n }\n }\n }\n if (options && options[DURATION]) {\n this.setDuration(options[DURATION]);\n }\n return this;\n }\n /**\n * clone SceneItem.\n * @return {SceneItem} An instance of clone\n * @example\n * item.clone();\n */\n public clone() {\n const item = new SceneItem();\n\n item.setOptions(this.state);\n this.forEach((frame: Frame, time: number) => {\n item.setFrame(time, frame.clone());\n });\n return item;\n }\n /**\n * executes a provided function once for each scene item.\n * @param - Function to execute for each element, taking three arguments\n * @return {Keyframes} An instance itself\n */\n public forEach(callback: (item: Frame, time: number, items: IObject) => void) {\n const times = this.times;\n const items = this.items;\n\n times.forEach(time => {\n callback(items[time], time, items);\n });\n return this;\n }\n public setOptions(options: Partial = {}) {\n super.setOptions(options);\n const { id, selector, elements, element, target } = options;\n\n id && this.setId(id);\n if (target) {\n this.setTarget(target);\n } else if (selector) {\n this.setSelector(selector);\n } else if (elements || element) {\n this.setElement(elements || element);\n }\n return this;\n }\n public toCSS(\n playCondition: PlayCondition = { className: START_ANIMATION },\n parentDuration = this.getDuration(), states: AnimatorState[] = []) {\n const itemState = this.state;\n const selector = itemState[SELECTOR];\n\n if (!selector) {\n return \"\";\n }\n const originalDuration = this.getDuration();\n itemState[DURATION] = originalDuration;\n states.push(itemState);\n\n const reversedStates = toArray(states).reverse();\n const id = toId(getRealId(this));\n const superParent = states[0];\n const infiniteIndex = findIndex(reversedStates, state => {\n return state[ITERATION_COUNT] === INFINITE || !isFinite(state[DURATION]);\n }, states.length - 1);\n const finiteStates = reversedStates.slice(0, infiniteIndex);\n const duration = parentDuration || finiteStates.reduce((prev, cur) => {\n return (cur[DELAY] + prev * (cur[ITERATION_COUNT] as number)) / cur[PLAY_SPEED];\n }, originalDuration);\n const delay = reversedStates.slice(infiniteIndex).reduce((prev, cur) => {\n return (prev + cur[DELAY]) / cur[PLAY_SPEED];\n }, 0);\n const easingName = find(reversedStates, state => (state[EASING] && state[EASING_NAME]), itemState)[EASING_NAME];\n const iterationCount = reversedStates[infiniteIndex][ITERATION_COUNT];\n const fillMode = superParent[FILL_MODE];\n const direction = reversedStates[infiniteIndex][DIRECTION];\n const cssText = makeAnimationProperties({\n fillMode,\n direction,\n iterationCount,\n delay: `${delay}s`,\n name: `${PREFIX}KEYFRAMES_${id}`,\n duration: `${duration / superParent[PLAY_SPEED]}s`,\n timingFunction: easingName,\n });\n const selectors = splitComma(selector).map(sel => {\n const matches = /([\\s\\S]+)(:+[a-zA-Z]+)$/g.exec(sel);\n\n if (matches) {\n return [matches[1], matches[2]];\n } else {\n return [sel, \"\"];\n }\n });\n const className = playCondition.className;\n const selectorCallback = playCondition.selector;\n const preselector = isFunction(selectorCallback) ? selectorCallback(this, selector) : selectorCallback;\n\n return `\n ${preselector || selectors.map(([sel, peusdo]) => `${sel}.${className}${peusdo}`)} {${cssText}}\n ${selectors.map(([sel, peusdo]) => `${sel}.${PAUSE_ANIMATION}${peusdo}`)} {${ANIMATION}-play-state: paused;}\n @${KEYFRAMES} ${PREFIX}KEYFRAMES_${id}{${this._toKeyframes(duration, finiteStates, direction)}}`;\n }\n /**\n * Export the CSS of the items to the style.\n * @param - Add a selector or className to play.\n * @return {SceneItem} An instance itself\n */\n public exportCSS(\n playCondition?: PlayCondition,\n duration?: number, options?: AnimatorState[]) {\n if (!this.elements.length) {\n return \"\";\n }\n const css = this.toCSS(playCondition, duration, options);\n const isParent = options && !isUndefined(options[ITERATION_COUNT]);\n\n !isParent && exportCSS(getRealId(this), css);\n return this;\n }\n public pause() {\n super.pause();\n isPausedCSS(this) && this.pauseCSS();\n return this;\n }\n public pauseCSS() {\n this.elements.forEach(element => {\n addClass(element, PAUSE_ANIMATION);\n });\n return this;\n }\n public endCSS() {\n this.elements.forEach(element => {\n removeClass(element, PAUSE_ANIMATION);\n removeClass(element, START_ANIMATION);\n });\n setPlayCSS(this, false);\n return this;\n }\n public end() {\n isEndedCSS(this) && this.endCSS();\n super.end();\n return this;\n }\n /**\n * Play using the css animation and keyframes.\n * @param - Check if you want to export css.\n * @param [playClassName=\"startAnimation\"] - Add a class name to play.\n * @param - The shorthand properties for six of the animation properties.\n * @see {@link https://www.w3schools.com/cssref/css3_pr_animation.asp}\n * @example\n item.playCSS();\n item.playCSS(false, \"startAnimation\", {\n direction: \"reverse\",\n fillMode: \"forwards\",\n });\n */\n public playCSS(isExportCSS = true, playClassName?: string, properties: object = {}) {\n playCSS(this, isExportCSS, playClassName, properties);\n return this;\n }\n public addPlayClass(isPaused: boolean, playClassName?: string, properties: object = {}) {\n const elements = this.elements;\n const length = elements.length;\n const cssText = makeAnimationProperties(properties);\n\n if (!length) {\n return;\n }\n if (isPaused) {\n elements.forEach(element => {\n removeClass(element, PAUSE_ANIMATION);\n });\n } else {\n elements.forEach(element => {\n element.style.cssText += cssText;\n if (hasClass(element, START_ANIMATION)) {\n removeClass(element, START_ANIMATION);\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n addClass(element, START_ANIMATION);\n });\n });\n } else {\n addClass(element, START_ANIMATION);\n }\n });\n }\n return elements[0];\n }\n /**\n * Remove All Frames\n * @return {SceneItem} An instance itself\n */\n public clear() {\n this.times = [];\n this.items = {};\n this.names = {};\n this.temp = null;\n this.needUpdate = true;\n return this;\n }\n public getNowValue(\n time: number,\n properties: string[],\n left?: number,\n right?: number,\n isAccurate?: boolean,\n easing?: EasingType,\n usePrevValue?: boolean,\n ) {\n const times = this.times;\n const length = times.length;\n\n let prevTime: number;\n let nextTime: number;\n let prevFrame: Frame;\n let nextFrame: Frame;\n const isUndefinedLeft = isUndefined(left);\n const isUndefinedRight = isUndefined(right);\n if (isUndefinedLeft || isUndefinedRight) {\n const indicies = getNearTimeIndex(times, time);\n isUndefinedLeft && (left = indicies[0]);\n isUndefinedRight && (right = indicies[1]);\n }\n\n for (let i = left; i >= 0; --i) {\n const frame = this.getFrame(times[i]);\n\n if (frame.has(...properties)) {\n prevTime = times[i];\n prevFrame = frame;\n break;\n }\n }\n const prevValue = prevFrame && prevFrame.raw(...properties);\n\n if (isAccurate && !isRole([properties[0]])) {\n return prevTime === time ? prevValue : undefined;\n }\n if (usePrevValue) {\n return prevValue;\n }\n for (let i = right; i < length; ++i) {\n const frame = this.getFrame(times[i]);\n\n if (frame.has(...properties)) {\n nextTime = times[i];\n nextFrame = frame;\n break;\n }\n }\n const nextValue = nextFrame && nextFrame.raw(...properties);\n\n if (!prevFrame || isUndefined(prevValue)) {\n return nextValue;\n }\n if (!nextFrame || isUndefined(nextValue) || prevValue === nextValue) {\n return prevValue;\n }\n return dotValue(time, Math.max(prevTime, 0), nextTime, prevValue, nextValue, easing);\n }\n private _toKeyframes(duration: number, states: AnimatorState[], direction: DirectionType) {\n const frames: IObject = {};\n const times = this.times.slice();\n\n if (!times.length) {\n return \"\";\n }\n const originalDuration = this.getDuration();\n (!this.getFrame(0)) && times.unshift(0);\n (!this.getFrame(originalDuration)) && times.push(originalDuration);\n const entries = getEntries(times, states);\n const lastEntry = entries[entries.length - 1];\n\n // end delay time\n lastEntry[0] < duration && addEntry(entries, duration, lastEntry[1]);\n let prevTime = -1;\n\n return entries.map(([time, keytime]) => {\n if (!frames[keytime]) {\n frames[keytime] =\n (!this.hasFrame(keytime) || keytime === 0 || keytime === originalDuration ?\n this.getNowFrame(keytime) : this.getNowFrame(keytime, 0, true)).toCSS();\n }\n\n let frameTime = time / duration * 100;\n\n if (frameTime - prevTime < THRESHOLD) {\n frameTime += THRESHOLD;\n }\n prevTime = frameTime;\n return `${Math.min(frameTime, 100)}%{\n ${time === 0 && !isDirectionReverse(0, 1, direction) ? \"\" : frames[keytime]}\n }`;\n }).join(\"\");\n }\n}\n\nexport default SceneItem;\n","import Animator from \"./Animator\";\nimport SceneItem from \"./SceneItem\";\nimport { SELECTOR, DURATION, DELAY, RUNNING } from \"./consts\";\nimport { playCSS, exportCSS, getRealId, isPausedCSS, isEndedCSS, setPlayCSS } from \"./utils\";\nimport { isFunction, IS_WINDOW, IObject, $, IArrayFormat } from \"@daybrush/utils\";\nimport {\n AnimateElement, SceneState, SceneOptions, EasingType,\n AnimatorState, SceneItemOptions, PlayCondition\n} from \"./types\";\nimport Frame from \"./Frame\";\nimport ListMap from \"list-map\";\n\n/**\n * manage sceneItems and play Scene.\n * @sort 1\n */\nclass Scene extends Animator {\n /**\n * version info\n * @type {string}\n * @example\n * Scene.VERSION // #__VERSION__#\n */\n public static VERSION: string = \"#__VERSION__#\";\n public items: ListMap = new ListMap();\n public temp: IObject;\n /**\n * @param - properties\n * @param - options\n * @example\n const scene = new Scene({\n item1: {\n 0: {\n display: \"none\",\n },\n 1: {\n display: \"block\",\n opacity: 0,\n },\n 2: {\n opacity: 1,\n },\n },\n item2: {\n 2: {\n opacity: 1,\n },\n }\n });\n */\n constructor(properties?: {options?: Partial} & IObject, options?: Partial) {\n super();\n this.load(properties, options);\n }\n public getDuration() {\n let time = 0;\n\n this.forEach(item => {\n time = Math.max(time, item.getTotalDuration() / item.getPlaySpeed());\n });\n return time || this.state[DURATION];\n }\n public setDuration(duration: number) {\n const items = this.items;\n const sceneDuration = this.getDuration();\n\n if (duration === 0 || !isFinite(sceneDuration)) {\n return this;\n }\n if (sceneDuration === 0) {\n this.forEach(item => {\n item.setDuration(duration);\n });\n } else {\n const ratio = duration / sceneDuration;\n\n this.forEach(item => {\n item.setDelay(item.getDelay() * ratio);\n item.setDuration(item.getDuration() * ratio);\n });\n }\n super.setDuration(duration);\n return this;\n }\n public getItem(name: number | string): T;\n /**\n * get item in scene by name\n * @param - The item's name\n * @return {Scene | SceneItem} item\n * @example\n const item = scene.getItem(\"item1\")\n */\n public getItem(name: number | string) {\n return this.items.get(name);\n }\n /**\n * create item in scene\n * @param {} name - name of item to create\n * @param {} options - The option object of SceneItem\n * @return {} Newly created item\n * @example\n const item = scene.newItem(\"item1\")\n */\n public newItem(name: number | string, options: Partial = {}): Scene | SceneItem {\n if (this.items.has(name)) {\n return this.items.get(name);\n }\n const item = new SceneItem();\n\n this.setItem(name, item);\n item.setOptions(options);\n\n return item;\n }\n /**\n * remove item in scene\n * @param - name of item to remove\n * @return An instance itself\n * @example\n const item = scene.newItem(\"item1\")\n\n scene.removeItem(\"item1\");\n */\n public removeItem(name: number | string): this {\n this.items.remove(name);\n return this;\n }\n /**\n * add a sceneItem to the scene\n * @param - name of item to create\n * @param - sceneItem\n * @example\n const item = scene.newItem(\"item1\")\n */\n public setItem(name: number | string, item: Scene | SceneItem) {\n item.setId(name);\n this.items.set(name, item);\n return this;\n }\n public setTime(time: number | string, isTick?: boolean, isParent?: boolean, parentEasing?: EasingType) {\n super.setTime(time, isTick, isParent);\n\n const iterationTime = this.getIterationTime();\n const easing = this.getEasing() || parentEasing;\n const frames: IObject = {};\n\n this.forEach(item => {\n item.setTime(iterationTime * item.getPlaySpeed() - item.getDelay(), isTick, true, easing);\n\n frames[item.getId()] = item.temp;\n });\n this.temp = frames;\n\n /**\n * This event is fired when timeupdate and animate.\n * @event Scene#animate\n * @param {object} param The object of data to be sent to an event.\n * @param {number} param.currentTime The total time that the animator is running.\n * @param {number} param.time The iteration time during duration that the animator is running.\n * @param {object} param.frames frames of that time.\n * @example\nconst scene = new Scene({\n a: {\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n },\n b: {\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n }\n}).on(\"animate\", e => {\n console.log(e.frames);\n // {a: Frame, b: Frame}\n console.log(e.frames.a.get(\"opacity\"));\n});\n */\n this.trigger(\"animate\", {\n frames,\n currentTime: this.getTime(),\n time: iterationTime,\n });\n\n return this;\n }\n /**\n * executes a provided function once for each scene item.\n * @param - Function to execute for each element, taking three arguments\n * @return {Scene} An instance itself\n */\n public forEach(\n func: (\n item: Scene | SceneItem,\n id: string | number,\n index: number,\n items: IObject,\n ) => void,\n ) {\n const items = this.items;\n\n items.forEach((item, id, index, obj) => {\n func(item, id, index, obj);\n });\n return this;\n }\n public toCSS(\n playCondition?: PlayCondition,\n duration: number = this.getDuration(), parentStates: AnimatorState[] = []) {\n const totalDuration = !duration || !isFinite(duration) ? 0 : duration;\n const styles: string[] = [];\n const state = this.state;\n\n state[DURATION] = this.getDuration();\n\n this.forEach(item => {\n styles.push(item.toCSS(playCondition, totalDuration, parentStates.concat(state)));\n });\n return styles.join(\"\");\n }\n /**\n * Export the CSS of the items to the style.\n * @param - Add a selector or className to play.\n * @return {Scene} An instance itself\n */\n public exportCSS(\n playCondition?: PlayCondition, duration?: number, parentStates?: AnimatorState[]) {\n const css = this.toCSS(playCondition, duration, parentStates);\n\n (!parentStates || !parentStates.length) && exportCSS(getRealId(this), css);\n return this;\n }\n public append(item: SceneItem | Scene) {\n item.setDelay(item.getDelay() + this.getDuration());\n this.setItem(getRealId(item), item);\n }\n public pauseCSS() {\n return this.forEach(item => {\n item.pauseCSS();\n });\n }\n public pause() {\n super.pause();\n\n isPausedCSS(this) && this.pauseCSS();\n this.forEach(item => {\n item.pause();\n });\n return this;\n }\n public endCSS() {\n this.forEach(item => {\n item.endCSS();\n });\n setPlayCSS(this, false);\n }\n public end() {\n isEndedCSS(this) && this.endCSS();\n super.end();\n return this;\n }\n public addPlayClass(isPaused: boolean, playClassName?: string, properties: object = {}) {\n let animtionElement: AnimateElement;\n\n this.forEach(item => {\n const el = item.addPlayClass(isPaused, playClassName, properties);\n\n !animtionElement && (animtionElement = el);\n });\n return animtionElement;\n }\n /**\n * Play using the css animation and keyframes.\n * @param - Check if you want to export css.\n * @param [playClassName=\"startAnimation\"] - Add a class name to play.\n * @param - The shorthand properties for six of the animation properties.\n * @return {Scene} An instance itself\n * @see {@link https://www.w3schools.com/cssref/css3_pr_animation.asp}\n * @example\n scene.playCSS();\n scene.playCSS(false, {\n direction: \"reverse\",\n fillMode: \"forwards\",\n });\n */\n public playCSS(isExportCSS = true, playClassName?: string, properties: Partial = {}) {\n playCSS(this, isExportCSS, playClassName, properties);\n return this;\n }\n public set(properties: any, ...args: any[]): this;\n /**\n * Set properties to the Scene.\n * @param - properties\n * @return An instance itself\n * @example\nscene.set({\n \".a\": {\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n },\n },\n});\n// 0\nconsole.log(scene.getItem(\".a\").get(0, \"opacity\"));\n// 1\nconsole.log(scene.getItem(\".a\").get(1, \"opacity\"));\n */\n public set(properties: any) {\n this.load(properties);\n return this;\n }\n public load(properties: any = {}, options = properties.options) {\n if (!properties) {\n return this;\n }\n const selector = options && options[SELECTOR] || this.state[SELECTOR];\n for (const name in properties) {\n if (name === \"options\") {\n continue;\n }\n const object = properties[name];\n let item;\n\n if (object instanceof Scene || object instanceof SceneItem) {\n this.setItem(name, object);\n item = object;\n } else if (isFunction(object) && selector) {\n const elements =\n IS_WINDOW\n ? $(`${isFunction(selector) ? selector(name) : name}`, true) as IArrayFormat\n : ([] as AnimateElement[]);\n const length = elements.length;\n const scene = new Scene();\n\n for (let i = 0; i < length; ++i) {\n (scene.newItem(i) as SceneItem).setId().setElement(elements[i]).load(object(i, elements[i]));\n }\n this.setItem(name, scene);\n continue;\n } else {\n item = this.newItem(name);\n item.load(object);\n }\n selector && item.setSelector(selector);\n }\n this.setOptions(options);\n }\n public setOptions(options: Partial = {}): this {\n super.setOptions(options);\n\n const selector = options.selector;\n\n if (selector) {\n this.state[SELECTOR] = selector;\n }\n return this;\n }\n public setSelector(target?: string | boolean | ((id: number | string) => string)) {\n const state = this.state;\n const selector = target || state[SELECTOR];\n\n state[SELECTOR] = selector;\n const isItFunction = isFunction(target);\n if (selector) {\n this.forEach((item, name) => {\n item.setSelector(isItFunction ? (target as (id: number | string) => string)(name) : selector);\n });\n }\n return this;\n }\n public start(delay: number = this.state[DELAY]): boolean {\n const result = super.start(delay);\n\n if (result) {\n this.forEach(item => {\n item.start(0);\n });\n } else {\n this.forEach(item => {\n item.setPlayState(RUNNING);\n });\n }\n return result;\n }\n}\n\nexport default Scene;\n","import { IObject } from \"@daybrush/utils\";\nimport Scene from \"./Scene\";\nimport SceneItem from \"./SceneItem\";\nimport { SceneOptions, SceneItemOptions } from \"./types\";\n\nexport function animate(properties?: IObject, options?: Partial) {\n return new Scene(properties, options).play();\n}\nexport function animateItem(properties?: IObject, options?: Partial) {\n return new SceneItem(properties, options).play();\n}\n","import Scene, * as others from \"./index\";\n\nfor (const name in others) {\n (Scene as any)[name] = (others as any)[name];\n}\n\nexport default Scene;\n"],"names":["y1","y2","t","t2","x1","x2","x","solveX","dx","Math","abs","cubic","func","solveFromX","max","min","easingName","count","position","time","level","floor","STEP_START","steps","STEP_END","LINEAR","bezier","EASE","EASE_IN","EASE_OUT","EASE_IN_OUT","PREFIX","DATA_SCENE_ID","TIMING_FUNCTION","ROLES","transform","filter","attribute","html","ALIAS","easing","FIXED","_a","MAXIMUM","THRESHOLD","DURATION","FILL_MODE","DIRECTION","ITERATION_COUNT","DELAY","EASING","PLAY_SPEED","EASING_NAME","ITERATION_TIME","PAUSED","ENDED","TIMEUPDATE","ANIMATE","PLAY","RUNNING","ITERATION","START_ANIMATION","PAUSE_ANIMATION","ALTERNATE","REVERSE","ALTERNATE_REVERSE","NORMAL","INFINITE","PLAY_STATE","PLAY_CSS","PREV_TIME","TICK_TIME","CURRENT_TIME","SELECTOR","TRANSFORM_NAME","EASINGS","OPTIONS","EVENTS","events","name","callback","once","isObject","n","_on","isArray","forEach","_this","push","_i","args","off","callback2","callbacks","index","indexOf","splice","data","event","target","type","currentTarget","toArray","apply","value","options","setOptions","isString","split","separator","newOptions","length","prefix","suffix","model","arr","map","v","PropertyObject","clone","join","toValue","str","properties","splitText","obj","i","matches","trim","toPropertyObject","styles","RGBA","text","afterModel","COLOR_MODELS","arrayToColorObject","stringToRGBA","result","arrayToPropertyObject","values","splitComma","splitSpace","exec","stringToBracketObject","charAt","stringToColorObject","object","size","get","toObject","alias","names","isProperty","isFixedProperty","roles","fixed","OBJECT","ARRAY","isPropertyObject","PROPERTY","STRING","NUMBER","constructor","Object","stack","isPureObject","concat","getNames","pop","slice","updateFrame","num","round","undefined","isCheckTrue","role","isInProperties","item","isActivate","state","isPaused","isEnded","id","css","styleId","toId","styleElement","$","innerText","document","body","insertAdjacentHTML","selector","random","IS_WINDOW","checkElement","getId","setId","makeId","match","isExportCSS","playClassName","ANIMATION","getPlayState","className","isPausedCSS","addPlayClass","setTime","exportCSS","el","addAnimationEvent","setPlayCSS","setPlayState","duration","getDuration","isZeroDuration","isFinite","animationend","finish","animationstart","trigger","removeEvent","animationiteration","elapsedTime","currentTime","iterationCount","setIteration","addEvent","curveArray","parseFloat","getter","setter","parent","prototype","camelize","iteration","iteraiontCount","direction","setters","getters","tslib_1","_super","delay","fillMode","playSpeed","iterationTime","tickTime","prevTime","playState","getEasing","setEasing","setDuration","getActiveDuration","Infinity","getTime","toTime","timerId","requestAnimationFrame","tick","start","cancelAnimationFrame","end","pause","isTick","isParent","activeDuration","getUnitTime","calculate","isDelay","getIterationTime","unit","toFixed","passIterationCount","maxIterationCount","currentIterationTime","setIterationTime","isReverse","isDirectionReverse","isFiniteDuration","isForwards","now","to","Animator","GetterSetter","EventTrigger","arrObj","replace","merge","from","getType","FUNCTION","getValue","set","raw","getPropertyName","getValueByNames","params","self","firstParam","Frame","_set","isRole","has","isFixed","stylesLength","isUndefined","frame","frameProperties","cssObject","toInnerProperties","TRANSFORM","FILTER","toCSSObject","cssArray","lastParam","a1","a2","b1","b2","v1","dot","color1","color2","value1","value2","model1","model2","dotArray","colorModel","parseInt","a1Type","dotColor","type1","type2","isFunction1","isFunction2","dotObject","splitUnit","v2","isNaN","dotNumber","nextTime","prevValue","nextValue","ratio","times","decamelize","entries","keytime","prevEntry","states","nextEntries","intCount","ceil","currentDuration","lastTime","j","entry","divideTime","addEntry","unshift","load","originalDuration","ratio_1","items_1","obj_1","time2","items","newFrame","elements","sceneId_1","element","setAttribute","SceneItem","eachTime","realTime","innerValue","value_1","getDelay","frames","hasFrame","getDirection","frameTime","needUpdate","getFrame","remove","removeFrame","append","unshiftTime","firstFrame","prepend","isStartZero","isFunction","setElement","Element","style","targetFunc","attributes","html_1","innerHTML","cssText","toCSS","fromCSS","parentEasing","getNowFrame","temp","setFrame","addTime","update","toFrame","isAccurate","left","right","realEasing","nameObject","hasName","nowEasing","getNowValue","prevFrame","prevNames","keyframes","setTarget","setSelector","playCondition","parentDuration","itemState","reversedStates","reverse","getRealId","superParent","infiniteIndex","findIndex","finiteStates","reduce","prev","cur","find","makeAnimationProperties","timingFunction","selectors","sel","selectorCallback","preselector","peusdo","KEYFRAMES","_toKeyframes","pauseCSS","addClass","removeClass","isEndedCSS","endCSS","playCSS","hasClass","usePrevValue","nextFrame","isUndefinedLeft","isUndefinedRight","indicies","getNearTimeIndex","dotValue","getEntries","lastEntry","ListMap","getTotalDuration","getPlaySpeed","sceneDuration","setDelay","setItem","parentStates","totalDuration","animtionElement","Scene","scene","newItem","isItFunction","play","others"],"mappings":"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"} \ No newline at end of file diff --git a/dist/scene.min.js b/dist/scene.min.js new file mode 100644 index 00000000..ac03e1e8 --- /dev/null +++ b/dist/scene.min.js @@ -0,0 +1,10 @@ +/* +Copyright (c) 2016 Daybrush +name: scenejs +license: MIT +author: Daybrush +repository: https://github.com/daybrush/scenejs.git +version: 1.2.0 +*/ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Scene=e()}(this,function(){"use strict";var i=function(t,e){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)};function r(t,e){function n(){this.constructor=t}i(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}function a(t,e,n){var i=1-n;return n*n*n+3*n*n*i*e+3*n*i*i*t}function s(n,i,r,s){function t(t){var e=function(t,e,n){for(var i=n,r=1;.001'+e+"")}function ue(t){for(;;){var e=""+Math.floor(1e7*Math.random());if(!ft||!t)return e;if(!kt('[data-scene-id="'+e+'"]'))return e}}function fe(t){return t.getId()||t.setId(ue(!1)).getId()}function he(t){return(""+t).match(/[0-9a-zA-Z]+/g).join("")}function ce(t,e,n,i){if(void 0===i&&(i={}),pt&&t.getPlayState()!==M){var r=n||P;if(se(t))t.addPlayClass(!0,r,i);else{t.isEnded()&&t.setTime(0),e&&t.exportCSS({className:r});var s=t.addPlayClass(!1,r,i);if(!s)return;!function(i,t){function e(){re(i,!1),i.finish()}function n(){i.trigger(_)}var r=i.state,s=i.getDuration(),a=!s||!isFinite(s);i.once(O,function(){Vt(t,"animationcancel",e),Vt(t,"animationend",e),Vt(t,"animationiteration",o),Vt(t,"animationstart",n)});var o=function(t){var e=t.elapsedTime,n=a?0:e/s;r[Y]=e,i.setIteration(n)};Lt(t,"animationcancel",e),Lt(t,"animationend",e),Lt(t,"animationiteration",o),Lt(t,"animationstart",n)}(t,s),re(t,!0)}t.setPlayState(M)}}function le(t){var e;if(wt(t))if(t in B)e=B[t];else{var n=Ht(t);if(wt(n))return 0;if("cubic-bezier"===n.model)e=s((t=n.value.map(function(t){return parseFloat(t)}))[0],t[1],t[2],t[3]);else{if("steps"!==n.model)return 0;e=o(parseFloat(n.value[0]),n.value[1])}}else e=St(t)?s(t[0],t[1],t[2],t[3]):t;return e}function ve(t,e,n){return n===R||(e!==L&&t===e&&e%1==0?n===(1<=t%2?z:k):n===(1<=t%2?k:z))}var pe=["id",F,I,b,T,j,x,j,"iterationTime",V],me=pe.concat([D,C]),de=function(n){function t(t){var e=n.call(this)||this;return e.timerId=0,e.state={id:"",easing:0,easingName:"linear",iterationCount:1,delay:0,fillMode:"forwards",direction:"normal",playSpeed:1,currentTime:0,iterationTime:-1,iteration:0,tickTime:0,prevTime:0,playState:A,duration:0},e.setOptions(t),e}r(t,n);var e=t.prototype;return e.setEasing=function(t){var e=le(t),n=e&&e[C]||"linear",i=this.state;return i[D]=e,i[C]=n,this},e.setOptions=function(t){for(var e in void 0===t&&(t={}),t){var n=t[e];e!==D?e!==x?-1=t&&(this.trigger(_),!0)},e.play=function(e){var n=this,i=this.state,t=i[I],r=this.getTime();return i[V]=M,this.isEnded()&&(0===r||r>=this.getActiveDuration())&&this.setTime(-t,!0),this.timerId=Mt(function(t){i[q]=t,n.tick(t,e)}),this.start(),this},e.pause=function(){var t=this.state;return t[V]!==A&&(t[V]=A,this.trigger(A)),Ut(this.timerId),this},e.finish=function(){return this.setTime(0),this.state[Z]=0,this.end(),this},e.end=function(){return this.pause(),this.trigger(O),this},e.setTime=function(t,e,n){var i=this.getActiveDuration(),r=this.state,s=r[Z],a=r[I],o=e?t:this.getUnitTime(t);if(r[Z]=a+o,o<0?o=0:i"===i?r+S:r}return Wt(t)},e.isDelay=function(){var t=this.state,e=t[I],n=t[Z];return 0e)return[0 1 / 1000) {\n // 예상 t초에 의한 _x값\n solveX = cubic(x1, x2, t);\n dx = solveX - x;\n // 차이가 미세하면 그 값을 t로 지정\n if (Math.abs(dx) < 1 / 1000) {\n return t;\n }\n t -= dx / 2;\n }\n return t;\n}\n/**\n * @namespace easing\n */\n/**\n* Cubic Bezier curve.\n* @memberof easing\n* @func bezier\n* @param {number} [x1] - point1's x\n* @param {number} [y1] - point1's y\n* @param {number} [x2] - point2's x\n* @param {number} [y2] - point2's y\n* @return {function} the curve function\n* @example\nimport {bezier} from \"scenejs\";\nScene.bezier(0, 0, 1, 1) // LINEAR\nScene.bezier(0.25, 0.1, 0.25, 1) // EASE\n*/\nexport function bezier(x1: number, y1: number, x2: number, y2: number) {\n /*\n\t\tx = f(t)\n\t\tcalculate inverse function by x\n\t\tt = f-1(x)\n\t*/\n const func: EasingFunction = (x: number) => {\n const t = solveFromX(x1, x2, Math.max(Math.min(1, x), 0));\n\n return cubic(y1, y2, t);\n };\n\n func.easingName = `cubic-bezier(${x1},${y1},${x2},${y2})`;\n return func;\n}\n/**\n* Specifies a stepping function\n* @see {@link https://www.w3schools.com/cssref/css3_pr_animation-timing-function.asp|CSS3 Timing Function}\n* @memberof easing\n* @func steps\n* @param {number} count - point1's x\n* @param {\"start\" | \"end\"} postion - point1's y\n* @return {function} the curve function\n* @example\nimport {steps} from \"scenejs\";\nScene.steps(1, \"start\") // Scene.STEP_START\nScene.steps(1, \"end\") // Scene.STEP_END\n*/\nexport function steps(count: number, position: \"start\" | \"end\") {\n const func: EasingFunction = (time: number) => {\n const level = 1 / count;\n\n if (time >= 1) {\n return 1;\n }\n return (position === \"start\" ? level : 0) + Math.floor(time / level) * level;\n };\n\n func.easingName = `steps(${count}, ${position})`;\n\n return func;\n}\n\n/**\n* Equivalent to steps(1, start)\n* @memberof easing\n* @name STEP_START\n* @static\n* @type {function}\n* @example\nimport {STEP_START} from \"scenejs\";\nScene.STEP_START // steps(1, start)\n*/\nexport const STEP_START = /*#__PURE__#*/steps(1, \"start\");\n/**\n* Equivalent to steps(1, end)\n* @memberof easing\n* @name STEP_END\n* @static\n* @type {function}\n* @example\nimport {STEP_END} from \"scenejs\";\nScene.STEP_END // steps(1, end)\n*/\nexport const STEP_END = /*#__PURE__#*/steps(1, \"end\");\n/**\n* Linear Speed (0, 0, 1, 1)\n* @memberof easing\n* @name LINEAR\n* @static\n* @type {function}\n* @example\nimport {LINEAR} from \"scenejs\";\nScene.LINEAR\n*/\nexport const LINEAR = /*#__PURE__#*/bezier(0, 0, 1, 1);\n/**\n* Ease Speed (0.25, 0.1, 0.25, 1)\n* @memberof easing\n* @name EASE\n* @static\n* @type {function}\n* @example\nimport {EASE} from \"scenejs\";\nScene.EASE\n*/\nexport const EASE = /*#__PURE__#*/bezier(0.25, 0.1, 0.25, 1);\n/**\n* Ease In Speed (0.42, 0, 1, 1)\n* @memberof easing\n* @name EASE_IN\n* @static\n* @type {function}\n* @example\nimport {EASE_IN} from \"scenejs\";\nScene.EASE_IN\n*/\nexport const EASE_IN = /*#__PURE__#*/bezier(0.42, 0, 1, 1);\n/**\n* Ease Out Speed (0, 0, 0.58, 1)\n* @memberof easing\n* @name EASE_OUT\n* @static\n* @type {function}\n* @example\nimport {EASE_OUT} from \"scenejs\";\nScene.EASE_OUT\n*/\nexport const EASE_OUT = /*#__PURE__#*/bezier(0, 0, 0.58, 1);\n/**\n* Ease In Out Speed (0.42, 0, 0.58, 1)\n* @memberof easing\n* @name EASE_IN_OUT\n* @static\n* @type {function}\n* @example\nimport {EASE_IN_OUT} from \"scenejs\";\nScene.EASE_IN_OUT\n*/\nexport const EASE_IN_OUT = /*#__PURE__#*/bezier(0.42, 0, 0.58, 1);\n","import { IObject } from \"@daybrush/utils\";\nimport { RoleObject, OptionType, EventType, EasingFunction } from \"./types\";\nimport { EASE, EASE_IN, EASE_IN_OUT, LINEAR, EASE_OUT, STEP_START, STEP_END } from \"./easing\";\n\nexport const PREFIX = \"__SCENEJS_\";\nexport const DATA_SCENE_ID = \"data-scene-id\";\nexport const TIMING_FUNCTION = \"animation-timing-function\";\nexport const ROLES: RoleObject = { transform: {}, filter: {}, attribute: {}, html: true };\nexport const ALIAS: IObject = { easing: [TIMING_FUNCTION] };\nexport const FIXED = { [TIMING_FUNCTION]: true, contents: true, html: true };\nexport const MAXIMUM = 1000000;\nexport const THRESHOLD = 0.000001;\n\nexport const DURATION = \"duration\";\nexport const FILL_MODE = \"fillMode\";\nexport const DIRECTION = \"direction\";\nexport const ITERATION_COUNT = \"iterationCount\";\nexport const DELAY = \"delay\";\nexport const EASING = \"easing\";\nexport const PLAY_SPEED = \"playSpeed\";\nexport const EASING_NAME = \"easingName\";\nexport const ITERATION_TIME = \"iterationTime\";\nexport const PAUSED = \"paused\";\nexport const ENDED = \"ended\";\nexport const TIMEUPDATE = \"timeupdate\";\nexport const ANIMATE = \"animate\";\nexport const PLAY = \"play\";\nexport const RUNNING = \"running\";\nexport const ITERATION = \"iteration\";\nexport const START_ANIMATION = \"startAnimation\";\nexport const PAUSE_ANIMATION = \"pauseAnimation\";\nexport const ALTERNATE = \"alternate\";\nexport const REVERSE = \"reverse\";\nexport const ALTERNATE_REVERSE = \"alternate-reverse\";\nexport const NORMAL = \"normal\";\nexport const INFINITE = \"infinite\";\nexport const PLAY_STATE = \"playState\";\nexport const PLAY_CSS = \"playCSS\";\nexport const PREV_TIME = \"prevTime\";\nexport const TICK_TIME = \"tickTime\";\nexport const CURRENT_TIME = \"currentTime\";\nexport const SELECTOR = \"selector\";\nexport const TRANSFORM_NAME = \"transform\";\nexport const EASINGS = {\n \"linear\": LINEAR,\n \"ease\": EASE,\n \"ease-in\": EASE_IN,\n \"ease-out\": EASE_OUT,\n \"ease-in-out\": EASE_IN_OUT,\n \"step-start\": STEP_START,\n \"step-end\": STEP_END,\n};\n\n/**\n* option name list\n* @name Scene.OPTIONS\n* @memberof Scene\n* @static\n* @type {$ts:OptionType}\n* @example\n* Scene.OPTIONS // [\"duration\", \"fillMode\", \"direction\", \"iterationCount\", \"delay\", \"easing\", \"playSpeed\"]\n*/\nexport const OPTIONS: OptionType = [DURATION, FILL_MODE, DIRECTION, ITERATION_COUNT, DELAY, EASING, PLAY_SPEED];\n\n/**\n* Event name list\n* @name Scene.EVENTS\n* @memberof Scene\n* @static\n* @type {$ts:EventType}\n* @example\n* Scene.EVENTS // [\"paused\", \"ended\", \"timeupdate\", \"animate\", \"play\", \"iteration\"];\n*/\nexport const EVENTS: EventType = [PAUSED, ENDED, TIMEUPDATE, ANIMATE, PLAY, ITERATION];\n","import { isObject, isArray, toArray } from \"@daybrush/utils\";\nimport { CallbackType, EventParameter } from \"./types\";\n\n/**\n* attach and trigger event handlers.\n*/\nclass EventTrigger {\n public events: { [name: string]: CallbackType[] };\n /**\n * @example\n const et = new Scene.EventTrigger();\n const scene = new Scene();\n\n scene.on(\"call\", e => {\n console.log(e.param);\n });\n et.on(\"call\", e => {\n console.log(e.param);\n });\n scene.trigger(\"call\", {param: 1});\n et.trigger(\"call\", {param: 1});\n */\n constructor() {\n this.events = {};\n }\n public _on(name: string | EventParameter, callback?: CallbackType | CallbackType[], once?: boolean) {\n const events = this.events;\n\n if (isObject(name)) {\n for (const n in name) {\n this._on(n, name[n], once);\n }\n return;\n }\n if (!(name in events)) {\n events[name] = [];\n }\n if (!callback) {\n return;\n }\n if (isArray(callback)) {\n callback.forEach(func => this._on(name, func, once));\n return;\n }\n events[name].push(once ? function callback2(...args) {\n callback(...args);\n this.off(name, callback2);\n } : callback);\n }\n /**\n * Attach an event handler function for one or more events to target\n * @param - event's name\n * @param - function to execute when the event is triggered.\n * @return {EventTrigger} An Instance itself.\n * @example\n target.on(\"animate\", function() {\n console.log(\"animate\");\n });\n\n target.trigger(\"animate\");\n\n */\n public on(name: string | EventParameter, callback?: CallbackType | CallbackType[]) {\n this._on(name, callback);\n return this;\n }\n /**\n * Dettach an event handler function for one or more events to target\n * @param - event's name\n * @param - function to execute when the event is triggered.\n * @return {EventTrigger} An Instance itself.\n * @example\n const callback = function() {\n console.log(\"animate\");\n };\n target.on(\"animate\", callback);\n\n target.off(\"animate\", callback);\n target.off(\"animate\");\n\n */\n public off(name?: string, callback?: CallbackType) {\n if (!name) {\n this.events = {};\n } else if (!callback) {\n this.events[name] = [];\n } else {\n const callbacks = this.events[name];\n\n if (!callbacks) {\n return this;\n }\n const index = callbacks.indexOf(callback);\n\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n }\n return this;\n }\n /**\n * execute event handler\n * @param - event's name\n * @param - event handler's additional parameter\n * @return {EventTrigger} An Instance itself.\n * @example\n target.on(\"animate\", function(a1, a2) {\n console.log(\"animate\", a1, a2);\n });\n\n target.trigger(\"animate\", [1, 2]); // log => \"animate\", 1, 2\n\n */\n public trigger(name: string, ...data: any[]) {\n const events = this.events;\n\n if (!(name in events)) {\n return this;\n }\n\n const args = data || [];\n\n !args[0] && (args[0] = {});\n const event = events[name];\n const target = args[0];\n\n target.type = name;\n target.currentTarget = this;\n !target.target && (target.target = this);\n toArray(events[name]).forEach(callback => {\n callback.apply(this, data);\n });\n\n return this;\n }\n public once(name: string | EventParameter, callback?: CallbackType | CallbackType[]) {\n this._on(name, callback, true);\n return this;\n }\n}\nexport default EventTrigger;\n","import { isString } from \"@daybrush/utils\";\nimport { PropertyObjectState } from \"./types\";\n\n/**\n* Make string, array to PropertyObject for the dot product\n*/\nclass PropertyObject implements PropertyObjectState {\n public value: any[];\n public prefix: string = \"\";\n public suffix: string = \"\";\n public model: string = \"\";\n public type: string = \"\";\n public separator: string = \",\";\n\n /**\n * @param - This value is in the array format.\n * @param - options\n * @example\n var obj = new PropertyObject([100,100,100,0.5], {\n \"separator\" : \",\",\n \"prefix\" : \"rgba(\",\n \"suffix\" : \")\"\n });\n */\n constructor(value: string | any[], options?: Partial) {\n options && this.setOptions(options);\n this.value = isString(value) ? value.split(this.separator) : value;\n }\n public setOptions(newOptions: Partial) {\n for (const name in newOptions) {\n this[name as keyof PropertyObjectState] = newOptions[name as keyof PropertyObjectState];\n }\n return this;\n }\n /**\n * the number of values.\n * @example\n const obj1 = new PropertyObject(\"1,2,3\", \",\");\n\n console.log(obj1.length);\n // 3\n */\n public size() {\n return this.value.length;\n }\n /**\n * retrieve one of values at the index\n * @param {Number} index - index\n * @return {Object} one of values at the index\n * @example\n const obj1 = new PropertyObject(\"1,2,3\", \",\");\n\n console.log(obj1.get(0));\n // 1\n */\n public get(index: number) {\n return this.value[index];\n }\n /**\n * Set the value at that index\n * @param {Number} index - index\n * @param {Object} value - text, a number, object to set\n * @return {PropertyObject} An instance itself\n * @example\n const obj1 = new PropertyObject(\"1,2,3\", \",\");\n obj1.set(0, 2);\n console.log(obj1.toValue());\n // 2,2,3\n */\n public set(index: number, value: any) {\n this.value[index] = value;\n return this;\n }\n /**\n * create a copy of an instance itself.\n * @return {PropertyObject} clone\n * @example\n const obj1 = new PropertyObject(\"1,2,3\", \",\");\n const obj2 = obj1.clone();\n */\n public clone(): PropertyObject {\n const {\n separator,\n prefix,\n suffix,\n model,\n type,\n } = this;\n const arr = this.value.map(v => ((v instanceof PropertyObject) ? v.clone() : v));\n return new PropertyObject(arr, {\n separator,\n prefix,\n suffix,\n model,\n type,\n });\n }\n /**\n * Make Property Object to String\n * @return {String} Make Property Object to String\n * @example\n //rgba(100, 100, 100, 0.5)\n const obj4 = new PropertyObject([100,100,100,0.5], {\n \"separator\" : \",\",\n \"prefix\" : \"rgba(\",\n \"suffix\" : \")\",\n });\n console.log(obj4.toValue());\n // \"rgba(100,100,100,0.5)\"\n */\n public toValue(): string {\n return this.prefix + this.join() + this.suffix;\n }\n /**\n * Make Property Object's array to String\n * @return {String} Join the elements of an array into a string\n * @example\n //rgba(100, 100, 100, 0.5)\n var obj4 = new PropertyObject([100,100,100,0.5], {\n \"separator\" : \",\",\n \"prefix\" : \"rgba(\",\n \"suffix\" : \")\"\n });\n obj4.join(); // => \"100,100,100,0.5\"\n */\n public join() {\n return this.value.map(v => ((v instanceof PropertyObject) ? v.toValue() : v)).join(this.separator);\n }\n /**\n * executes a provided function once per array element.\n * @param {Function} callback - Function to execute for each element, taking three arguments\n * @param {All} [callback.currentValue] The current element being processed in the array.\n * @param {Number} [callback.index] The index of the current element being processed in the array.\n * @param {Array} [callback.array] the array.\n * @return {PropertyObject} An instance itself\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach|MDN Array.forEach()} reference to MDN document.\n * @example\n //rgba(100, 100, 100, 0.5)\n var obj4 = new PropertyObject([100,100,100,0.5], {\n \"separator\" : \",\",\n \"prefix\" : \"rgba(\",\n \"suffix\" : \")\"\n });\n\n obj4.forEach(t => {\n console.log(t);\n }); // => \"100,100,100,0.5\"\n */\n public forEach(func: (value?: any, index?: number, array?: any[]) => void) {\n this.value.forEach(func);\n return this;\n }\n}\nexport default PropertyObject;\n","/**\n* @namespace\n* @name Property\n*/\n\nimport PropertyObject from \"../PropertyObject\";\nimport {\n COLOR_MODELS, isString,\n splitComma, splitSpace, stringToRGBA,\n RGBA, splitBracket, IObject, isArray, splitText\n} from \"@daybrush/utils\";\nimport { NameType } from \"../types\";\n\nexport function splitStyle(str: string) {\n\n const properties = splitText(str, \";\");\n const obj: IObject = {};\n let length = properties.length;\n\n for (let i = 0; i < length; ++i) {\n const matches = splitText(properties[i], \":\");\n\n if (matches.length < 2 || !matches[1]) {\n --length;\n continue;\n }\n obj[matches[0].trim()] = toPropertyObject(matches[1].trim());\n }\n return { styles: obj, length };\n}\n/**\n* convert array to PropertyObject[type=color].\n* default model \"rgba\"\n* @memberof Property\n* @function arrayToColorObject\n* @param {Array|PropertyObject} value ex) [0, 0, 0, 1]\n* @return {PropertyObject} PropertyObject[type=color]\n* @example\narrayToColorObject([0, 0, 0])\n// => PropertyObject(type=\"color\", model=\"rgba\", value=[0, 0, 0, 1], separator=\",\")\n*/\nexport function arrayToColorObject(arr: number[]) {\n const model = RGBA;\n\n if (arr.length === 3) {\n arr[3] = 1;\n }\n return new PropertyObject(arr, {\n model,\n separator: \",\",\n type: \"color\",\n prefix: `${model}(`,\n suffix: \")\",\n });\n}\n/**\n* convert text with parentheses to object.\n* @memberof Property\n* @function stringToBracketObject\n* @param {String} value ex) \"rgba(0,0,0,1)\"\n* @return {PropertyObject} PropertyObject\n* @example\nstringToBracketObject(\"abcde(0, 0, 0,1)\")\n// => PropertyObject(model=\"abcde\", value=[0, 0, 0,1], separator=\",\")\n*/\nexport function stringToBracketObject(text: string) {\n // [prefix, value, other]\n const { prefix: model, value, suffix: afterModel } = splitBracket(text);\n\n if (typeof value === \"undefined\") {\n return text;\n }\n if (COLOR_MODELS.indexOf(model) > -1) {\n return arrayToColorObject(stringToRGBA(text));\n }\n // divide comma(,)\n const obj = toPropertyObject(value, model);\n\n let arr = [value];\n let separator = \",\";\n let prefix = `${model}(`;\n let suffix = `)${afterModel}`;\n\n if (obj instanceof PropertyObject) {\n separator = obj.separator;\n arr = obj.value;\n prefix += obj.prefix;\n suffix = obj.suffix + suffix;\n }\n return new PropertyObject(arr, {\n separator,\n model,\n prefix,\n suffix,\n });\n}\n\nexport function arrayToPropertyObject(arr: any[], separator: string) {\n return new PropertyObject(arr, {\n type: \"array\",\n separator,\n });\n}\n\n/**\n* convert text with parentheses to PropertyObject[type=color].\n* If the values are not RGBA model, change them RGBA mdoel.\n* @memberof Property\n* @function stringToColorObject\n* @param {String|PropertyObject} value ex) \"rgba(0,0,0,1)\"\n* @return {PropertyObject} PropertyObject[type=color]\n* @example\nstringToColorObject(\"rgba(0, 0, 0,1)\")\n// => PropertyObject(type=\"color\", model=\"rgba\", value=[0, 0, 0,1], separator=\",\")\n*/\nexport function stringToColorObject(value: string): string | PropertyObject {\n const result = stringToRGBA(value);\n\n return result ? arrayToColorObject(result) : value;\n}\n/**\n* convert CSS Value to PropertyObject\n* @memberof Property\n* @function toPropertyObject\n* @param {String} value it's text contains the array.\n* @return {String} Not Array, Not Separator, Only Number & Unit\n* @return {PropertyObject} Array with Separator.\n* @see referenced regular expression {@link http://stackoverflow.com/questions/20215440/parse-css-gradient-rule-with-javascript-regex}\n* @example\ntoPropertyObject(\"1px solid #000\");\n// => PropertyObject([\"1px\", \"solid\", rgba(0, 0, 0, 1)])\n*/\nexport function toPropertyObject(value: any[], model?: NameType): PropertyObject;\nexport function toPropertyObject(value: IObject, model?: NameType): IObject;\nexport function toPropertyObject(value: string, model?: NameType): PropertyObject | string;\nexport function toPropertyObject(value: string | IObject | any[], model?: NameType) {\n if (!isString(value)) {\n if (isArray(value)) {\n return arrayToPropertyObject(value, \",\");\n }\n return value;\n }\n let values: any = splitComma(value);\n\n if (values.length > 1) {\n return arrayToPropertyObject(values.map(v => toPropertyObject(v)), \",\");\n }\n values = splitSpace(value);\n\n if (values.length > 1) {\n return arrayToPropertyObject(values.map(v => toPropertyObject(v)), \" \");\n }\n values = /^(['\"])([^'\"]*)(['\"])$/g.exec(value);\n\n if (values && values[1] === values[3]) {\n // Quotes\n return new PropertyObject([toPropertyObject(values[2])], {\n prefix: values[1],\n suffix: values[1],\n });\n } else if (value.indexOf(\"(\") !== -1) {\n // color\n return stringToBracketObject(value);\n } else if (value.charAt(0) === \"#\" && model !== \"url\") {\n return stringToColorObject(value);\n }\n return value;\n}\nexport function toObject(object: PropertyObject, result: IObject = {}) {\n const model = object.model;\n\n if (model) {\n object.setOptions({\n model: \"\",\n suffix: \"\",\n prefix: \"\",\n });\n const value = object.size() > 1 ? object : object.get(0);\n\n result[model] = value;\n } else {\n object.forEach(obj => {\n toObject(obj, result);\n });\n }\n return result;\n}\n","import {\n ROLES, MAXIMUM, FIXED, ALIAS,\n PAUSED, RUNNING, PLAY, ENDED, PREFIX, PLAY_CSS, CURRENT_TIME, START_ANIMATION, EASINGS\n} from \"./consts\";\nimport PropertyObject from \"./PropertyObject\";\nimport Scene from \"./Scene\";\nimport SceneItem from \"./SceneItem\";\nimport {\n isArray, ANIMATION, ARRAY, OBJECT,\n PROPERTY, STRING, NUMBER, IS_WINDOW, IObject, $, document, isObject, addEvent, removeEvent, isString,\n} from \"@daybrush/utils\";\nimport { EasingType, EasingFunction, NameType } from \"./types\";\nimport { toPropertyObject } from \"./utils/property\";\nimport { bezier, steps } from \"./easing\";\n\nexport function isPropertyObject(value: any): value is PropertyObject {\n return value instanceof PropertyObject;\n}\nexport function setAlias(name: string, alias: string[]) {\n ALIAS[name] = alias;\n}\nexport function setRole(names: string[], isProperty?: boolean, isFixedProperty?: boolean) {\n const length = names.length;\n let roles: any = ROLES;\n let fixed: any = FIXED;\n\n for (let i = 0; i < length - 1; ++i) {\n !roles[names[i]] && (roles[names[i]] = {});\n roles = roles[names[i]];\n if (isFixedProperty) {\n !fixed[names[i]] && (fixed[names[i]] = {});\n fixed = fixed[names[i]];\n }\n }\n isFixedProperty && (fixed[names[length - 1]] = true);\n roles[names[length - 1]] = isProperty ? true : {};\n}\nexport function getType(value: any) {\n const type = typeof value;\n\n if (type === OBJECT) {\n if (isArray(value)) {\n return ARRAY;\n } else if (isPropertyObject(value)) {\n return PROPERTY;\n }\n } else if (type === STRING || type === NUMBER) {\n return \"value\";\n }\n return type;\n}\nexport function isPureObject(obj: any): obj is object {\n return isObject(obj) && obj.constructor === Object;\n}\nexport function getNames(names: IObject, stack: string[]) {\n let arr: string[][] = [];\n\n if (isPureObject(names)) {\n for (const name in names) {\n stack.push(name);\n arr = arr.concat(getNames(names[name], stack));\n stack.pop();\n }\n } else {\n arr.push(stack.slice());\n }\n return arr;\n}\nexport function updateFrame(names: IObject, properties: IObject) {\n for (const name in properties) {\n const value = properties[name];\n\n if (!isPureObject(value)) {\n names[name] = true;\n continue;\n }\n if (!isObject(names[name])) {\n names[name] = {};\n }\n updateFrame(names[name], properties[name]);\n }\n return names;\n}\nexport function toFixed(num: number) {\n return Math.round(num * MAXIMUM) / MAXIMUM;\n}\nexport function getValueByNames(\n names: Array,\n properties: IObject, length: number = names.length) {\n let value = properties;\n\n for (let i = 0; i < length; ++i) {\n if (!isObject(value)) {\n return undefined;\n }\n value = value[names[i]];\n }\n return value;\n}\nexport function isInProperties(roles: IObject, args: NameType[], isCheckTrue?: boolean) {\n const length = args.length;\n let role: any = roles;\n\n if (length === 0) {\n return false;\n }\n for (let i = 0; i < length; ++i) {\n if (role === true) {\n return false;\n }\n role = role[args[i]];\n if (!role || (!isCheckTrue && role === true)) {\n return false;\n }\n }\n return true;\n}\nexport function isRole(args: NameType[], isCheckTrue?: boolean) {\n return isInProperties(ROLES, args, isCheckTrue);\n}\nexport function isFixed(args: NameType[]) {\n return isInProperties(FIXED, args, true);\n}\n\nexport interface IterationInterface {\n currentTime: number;\n iterationCount: number;\n elapsedTime: number;\n}\nexport function setPlayCSS(item: Scene | SceneItem, isActivate: boolean) {\n item.state[PLAY_CSS] = isActivate;\n}\nexport function isPausedCSS(item: Scene | SceneItem) {\n return item.state[PLAY_CSS] && item.isPaused();\n}\nexport function isEndedCSS(item: Scene | SceneItem) {\n return !item.isEnded() && item.state[PLAY_CSS];\n}\n\nexport function exportCSS(id: number | string, css: string) {\n const styleId = `${PREFIX}STYLE_${toId(id)}`;\n const styleElement: HTMLElement = $(`#${styleId}`);\n\n if (styleElement) {\n styleElement.innerText = css;\n } else {\n document.body.insertAdjacentHTML(\"beforeend\",\n ``);\n }\n}\nexport function makeId(selector?: boolean) {\n for (; ;) {\n const id = `${Math.floor(Math.random() * 10000000)}`;\n\n if (!IS_WINDOW || !selector) {\n return id;\n }\n const checkElement = $(`[data-scene-id=\"${id}\"]`);\n\n if (!checkElement) {\n return id;\n }\n }\n}\nexport function getRealId(item: Scene | SceneItem) {\n return item.getId() || item.setId(makeId(false)).getId();\n}\nexport function toId(text: number | string) {\n return `${text}`.match(/[0-9a-zA-Z]+/g).join(\"\");\n}\nexport function playCSS(\n item: Scene | SceneItem, isExportCSS?: boolean,\n playClassName?: string, properties: object = {}) {\n if (!ANIMATION || item.getPlayState() === RUNNING) {\n return;\n }\n const className = playClassName || START_ANIMATION;\n\n if (isPausedCSS(item)) {\n item.addPlayClass(true, className, properties);\n } else {\n if (item.isEnded()) {\n item.setTime(0);\n }\n isExportCSS && item.exportCSS({ className });\n const el = item.addPlayClass(false, className, properties);\n\n if (!el) {\n return;\n }\n addAnimationEvent(item, el);\n setPlayCSS(item, true);\n }\n item.setPlayState(RUNNING);\n}\n\nexport function addAnimationEvent(item: Scene | SceneItem, el: Element) {\n const state = item.state;\n const duration = item.getDuration();\n const isZeroDuration = !duration || !isFinite(duration);\n const animationend = () => {\n setPlayCSS(item, false);\n item.finish();\n };\n const animationstart = () => {\n item.trigger(PLAY);\n };\n item.once(ENDED, () => {\n removeEvent(el, \"animationcancel\", animationend);\n removeEvent(el, \"animationend\", animationend);\n removeEvent(el, \"animationiteration\", animationiteration);\n removeEvent(el, \"animationstart\", animationstart);\n });\n const animationiteration = ({ elapsedTime }: any) => {\n const currentTime = elapsedTime;\n const iterationCount = isZeroDuration ? 0 : (currentTime / duration);\n\n state[CURRENT_TIME] = currentTime;\n item.setIteration(iterationCount);\n };\n addEvent(el, \"animationcancel\", animationend);\n addEvent(el, \"animationend\", animationend);\n addEvent(el, \"animationiteration\", animationiteration);\n addEvent(el, \"animationstart\", animationstart);\n}\n\nexport function getEasing(curveArray: string | number[] | EasingFunction): EasingType {\n let easing: EasingType;\n\n if (isString(curveArray)) {\n if (curveArray in EASINGS) {\n easing = EASINGS[curveArray];\n } else {\n const obj = toPropertyObject(curveArray);\n\n if (isString(obj)) {\n return 0;\n } else {\n if (obj.model === \"cubic-bezier\") {\n curveArray = obj.value.map(v => parseFloat(v));\n easing = bezier(curveArray[0], curveArray[1], curveArray[2], curveArray[3]);\n } else if (obj.model === \"steps\") {\n easing = steps(parseFloat(obj.value[0]), obj.value[1]);\n } else {\n return 0;\n }\n }\n }\n } else if (isArray(curveArray)) {\n easing = bezier(curveArray[0], curveArray[1], curveArray[2], curveArray[3]);\n } else {\n easing = curveArray;\n }\n\n return easing;\n}\n","import {\n THRESHOLD,\n ALTERNATE, ALTERNATE_REVERSE, REVERSE, INFINITE, NORMAL,\n ITERATION_COUNT, DELAY, FILL_MODE, DIRECTION, PLAY_SPEED,\n DURATION, EASING, ITERATION_TIME, EASING_NAME, PAUSED,\n RUNNING, PLAY, TIMEUPDATE, ENDED, PLAY_STATE, PREV_TIME, TICK_TIME, CURRENT_TIME, ITERATION, OPTIONS, EASINGS\n} from \"./consts\";\nimport EventTrigger from \"./EventTrigger\";\nimport { bezier, steps } from \"./easing\";\nimport { toFixed, getEasing } from \"./utils\";\nimport { splitUnit, isString, camelize, requestAnimationFrame, isArray, cancelAnimationFrame } from \"@daybrush/utils\";\nimport {\n IterationCountType, DirectionType, AnimatorState,\n EasingFunction, FillModeType, PlayStateType, EasingType, AnimatorOptions,\n} from \"./types\";\nimport { toPropertyObject } from \"./utils/property\";\n\nfunction GetterSetter {}>(\n getter: string[], setter: string[], parent: string) {\n return (constructor: T) => {\n const prototype = constructor.prototype;\n\n getter.forEach(name => {\n prototype[camelize(`get ${name}`)] = function() {\n return this[parent][name];\n };\n });\n setter.forEach(name => {\n prototype[camelize(`set ${name}`)] = function(value: any) {\n this[parent][name] = value;\n return this;\n };\n });\n };\n}\nexport function isDirectionReverse(iteration: number, iteraiontCount: IterationCountType, direction: DirectionType) {\n if (direction === REVERSE) {\n return true;\n } else if (iteraiontCount !== INFINITE && iteration === iteraiontCount && iteraiontCount % 1 === 0) {\n return direction === (iteration % 2 >= 1 ? ALTERNATE_REVERSE : ALTERNATE);\n }\n return direction === (iteration % 2 >= 1 ? ALTERNATE : ALTERNATE_REVERSE);\n}\n/**\n* @typedef {Object} AnimatorState The Animator options. Properties used in css animation.\n* @property {number} [duration] The duration property defines how long an animation should take to complete one cycle.\n* @property {\"none\"|\"forwards\"|\"backwards\"|\"both\"} [fillMode] The fillMode property specifies a style for the element when the animation is not playing (before it starts, after it ends, or both).\n* @property {\"infinite\"|number} [iterationCount] The iterationCount property specifies the number of times an animation should be played.\n* @property {array|function} [easing] The easing(timing-function) specifies the speed curve of an animation.\n* @property {number} [delay] The delay property specifies a delay for the start of an animation.\n* @property {\"normal\"|\"reverse\"|\"alternate\"|\"alternate-reverse\"} [direction] The direction property defines whether an animation should be played forwards, backwards or in alternate cycles.\n*/\n\nconst setters = [\"id\", ITERATION_COUNT, DELAY, FILL_MODE,\n DIRECTION, PLAY_SPEED, DURATION, PLAY_SPEED, ITERATION_TIME, PLAY_STATE];\nconst getters = [...setters, EASING, EASING_NAME];\n\n/**\n* play video, animation, the others\n* @extends EventTrigger\n* @see {@link https://www.w3schools.com/css/css3_animations.asp|CSS3 Animation}\n*/\n@GetterSetter(getters, setters, \"state\")\nclass Animator\n extends EventTrigger {\n public state: U;\n private timerId: number = 0;\n\n /**\n * @param - animator's options\n * @example\n const animator = new Animator({\n delay: 2,\n diretion: \"alternate\",\n duration: 2,\n fillMode: \"forwards\",\n iterationCount: 3,\n easing: Scene.easing.EASE,\n });\n */\n constructor(options?: Partial) {\n super();\n this.state = {\n id: \"\",\n easing: 0,\n easingName: \"linear\",\n iterationCount: 1,\n delay: 0,\n fillMode: \"forwards\",\n direction: NORMAL,\n playSpeed: 1,\n currentTime: 0,\n iterationTime: -1,\n iteration: 0,\n tickTime: 0,\n prevTime: 0,\n playState: PAUSED,\n duration: 0,\n } as U;\n this.setOptions(options);\n }\n /**\n * set animator's easing.\n * @param curverArray - The speed curve of an animation.\n * @return {Animator} An instance itself.\n * @example\n animator.({\n delay: 2,\n diretion: \"alternate\",\n duration: 2,\n fillMode: \"forwards\",\n iterationCount: 3,\n easing: Scene.easing.EASE,\n });\n */\n public setEasing(curveArray: string | number[] | EasingFunction): this {\n const easing: EasingType = getEasing(curveArray);\n const easingName = easing && easing[EASING_NAME] || \"linear\";\n const state = this.state;\n\n state[EASING] = easing;\n state[EASING_NAME] = easingName;\n return this;\n }\n /**\n * set animator's options.\n * @see {@link https://www.w3schools.com/css/css3_animations.asp|CSS3 Animation}\n * @param - animator's options\n * @return {Animator} An instance itself.\n * @example\n animator.({\n delay: 2,\n diretion: \"alternate\",\n duration: 2,\n fillMode: \"forwards\",\n iterationCount: 3,\n easing: Scene.eaasing.EASE,\n });\n */\n public setOptions(options: Partial = {}): this {\n for (const name in options) {\n const value = options[name];\n\n if (name === EASING) {\n this.setEasing(value);\n continue;\n } else if (name === DURATION) {\n value && this.setDuration(value);\n continue;\n }\n if (OPTIONS.indexOf(name as any) > -1) {\n this.state[name] = value;\n }\n }\n\n return this;\n }\n /**\n * Get the animator's total duration including delay\n * @return {number} Total duration\n * @example\n animator.getTotalDuration();\n */\n public getTotalDuration(): number {\n return this.getActiveDuration(true);\n }\n /**\n * Get the animator's total duration excluding delay\n * @return {number} Total duration excluding delay\n * @example\n animator.getActiveDuration();\n */\n public getActiveDuration(delay?: boolean): number {\n const state = this.state;\n const count = state[ITERATION_COUNT];\n if (count === INFINITE) {\n return Infinity;\n }\n return (delay ? state[DELAY] : 0) + this.getDuration() * count;\n }\n /**\n * Check if the animator has reached the end.\n * @return {boolean} ended\n * @example\n animator.isEnded(); // true or false\n */\n public isEnded(): boolean {\n if (this.state[TICK_TIME] === 0 && this.state[PLAY_STATE] === PAUSED) {\n return true;\n } else if (this.getTime() < this.getActiveDuration()) {\n return false;\n }\n return true;\n }\n /**\n *Check if the animator is paused:\n * @return {boolean} paused\n * @example\n animator.isPaused(); // true or false\n */\n public isPaused(): boolean {\n return this.state[PLAY_STATE] === PAUSED;\n }\n public start(delay: number = this.state[DELAY]): boolean {\n const state = this.state;\n\n state[PLAY_STATE] = RUNNING;\n if (state[TICK_TIME] >= delay) {\n /**\n * This event is fired when play animator.\n * @event Animator#play\n */\n this.trigger(PLAY);\n return true;\n }\n return false;\n }\n /**\n * play animator\n * @return {Animator} An instance itself.\n */\n public play(toTime?: number) {\n const state = this.state;\n const delay = state[DELAY];\n const currentTime = this.getTime();\n\n state[PLAY_STATE] = RUNNING;\n\n if (this.isEnded() && (currentTime === 0 || currentTime >= this.getActiveDuration())) {\n this.setTime(-delay, true);\n }\n\n this.timerId = requestAnimationFrame((time: number) => {\n state[PREV_TIME] = time;\n this.tick(time, toTime);\n });\n this.start();\n return this;\n }\n /**\n * pause animator\n * @return {Animator} An instance itself.\n */\n public pause(): this {\n const state = this.state;\n\n if (state[PLAY_STATE] !== PAUSED) {\n state[PLAY_STATE] = PAUSED;\n /**\n * This event is fired when animator is paused.\n * @event Animator#paused\n */\n this.trigger(PAUSED);\n }\n cancelAnimationFrame(this.timerId);\n return this;\n }\n /**\n * end animator\n * @return {Animator} An instance itself.\n */\n public finish() {\n this.setTime(0);\n this.state[TICK_TIME] = 0;\n this.end();\n return this;\n }\n /**\n * end animator\n * @return {Animator} An instance itself.\n */\n public end() {\n this.pause();\n /**\n * This event is fired when animator is ended.\n * @event Animator#ended\n */\n this.trigger(ENDED);\n return this;\n }\n /**\n * set currentTime\n * @param {Number|String} time - currentTime\n * @return {Animator} An instance itself.\n * @example\n\n animator.setTime(\"from\"); // 0\n animator.setTime(\"to\"); // 100%\n animator.setTime(\"50%\");\n animator.setTime(10);\n animator.getTime() // 10\n */\n public setTime(time: number | string, isTick?: boolean, isParent?: boolean) {\n const activeDuration = this.getActiveDuration();\n const state = this.state;\n const prevTime = state[TICK_TIME];\n const delay = state[DELAY];\n let currentTime = isTick ? (time as number) : this.getUnitTime(time);\n\n state[TICK_TIME] = delay + currentTime;\n if (currentTime < 0) {\n currentTime = 0;\n } else if (currentTime > activeDuration) {\n currentTime = activeDuration;\n }\n state[CURRENT_TIME] = currentTime;\n this.calculate();\n\n if (isTick && !isParent) {\n const tickTime = state[TICK_TIME];\n\n if (prevTime < delay && time >= 0) {\n this.start(0);\n }\n if (tickTime < prevTime || this.isEnded()) {\n this.end();\n return;\n }\n }\n if (this.isDelay()) {\n return this;\n }\n /**\n * This event is fired when the animator updates the time.\n * @event Animator#timeupdate\n * @param {Object} param The object of data to be sent to an event.\n * @param {Number} param.currentTime The total time that the animator is running.\n * @param {Number} param.time The iteration time during duration that the animator is running.\n * @param {Number} param.iterationCount The iteration count that the animator is running.\n */\n this.trigger(TIMEUPDATE, {\n currentTime,\n time: this.getIterationTime(),\n iterationCount: state[ITERATION],\n });\n\n return this;\n }\n /**\n * Get the animator's current time\n * @return {number} current time\n * @example\n animator.getTime();\n */\n public getTime(): number {\n return this.state[CURRENT_TIME];\n }\n public getUnitTime(time: string | number) {\n if (isString(time)) {\n const duration = this.getDuration() || 100;\n\n if (time === \"from\") {\n return 0;\n } else if (time === \"to\") {\n return duration;\n }\n const { unit, value } = splitUnit(time);\n\n if (unit === \"%\") {\n !this.getDuration() && (this.setDuration(duration));\n return toFixed(parseFloat(time) / 100 * duration);\n } else if (unit === \">\") {\n return value + THRESHOLD;\n } else {\n return value;\n }\n } else {\n return toFixed(time);\n }\n }\n /**\n * Check if the current state of animator is delayed.\n * @return {boolean} check delay state\n */\n public isDelay() {\n const state = this.state;\n const delay = state[DELAY];\n const tickTime = state[TICK_TIME];\n\n return delay > 0 && (tickTime < delay);\n }\n public setIteration(iterationCount: number): this {\n const state = this.state;\n const passIterationCount = Math.floor(iterationCount);\n const maxIterationCount = state[ITERATION_COUNT] === INFINITE ? Infinity : state[ITERATION_COUNT];\n\n if (state[ITERATION] < passIterationCount && passIterationCount < maxIterationCount) {\n /**\n * The event is fired when an iteration of an animation ends.\n * @event Animator#iteration\n * @param {Object} param The object of data to be sent to an event.\n * @param {Number} param.currentTime The total time that the animator is running.\n * @param {Number} param.iterationCount The iteration count that the animator is running.\n */\n this.trigger(\"iteration\", {\n currentTime: state[CURRENT_TIME],\n iterationCount: passIterationCount,\n });\n }\n state[ITERATION] = iterationCount;\n return this;\n }\n protected calculate() {\n const state = this.state;\n const iterationCount = state[ITERATION_COUNT];\n const fillMode = state[FILL_MODE];\n const direction = state[DIRECTION];\n const duration = this.getDuration();\n const time = this.getTime();\n const iteration = duration === 0 ? 0 : time / duration;\n let currentIterationTime = duration ? time % duration : 0;\n\n if (!duration) {\n this.setIterationTime(0);\n return this;\n }\n this.setIteration(iteration);\n\n // direction : normal, reverse, alternate, alternate-reverse\n // fillMode : forwards, backwards, both, none\n const isReverse = isDirectionReverse(iteration, iterationCount, direction);\n\n const isFiniteDuration = isFinite(duration);\n if (isFiniteDuration && isReverse) {\n currentIterationTime = duration - currentIterationTime;\n }\n if (isFiniteDuration && iterationCount !== INFINITE) {\n const isForwards = fillMode === \"both\" || fillMode === \"forwards\";\n\n // fill forwards\n if (iteration >= iterationCount) {\n currentIterationTime = duration * (isForwards ? (iterationCount % 1) || 1 : 0);\n isReverse && (currentIterationTime = duration - currentIterationTime);\n }\n }\n this.setIterationTime(currentIterationTime);\n return this;\n }\n private tick(now: number, to?: number) {\n if (this.isPaused()) {\n return;\n }\n const state = this.state;\n const playSpeed = state[PLAY_SPEED];\n const prevTime = state[PREV_TIME];\n const delay = state[DELAY];\n const tickTime = state[TICK_TIME];\n const currentTime = tickTime + Math.min(1000, now - prevTime) / 1000 * playSpeed;\n\n state[PREV_TIME] = now;\n this.setTime(currentTime - delay, true);\n if (to && to * 1000 < now) {\n this.pause();\n }\n if (state[PLAY_STATE] === PAUSED) {\n return;\n }\n\n this.timerId = requestAnimationFrame((time: number) => {\n this.tick(time, to);\n });\n }\n}\n/**\n * Specifies the unique indicator of the animator\n * @method Animator#setId\n * @param {number | string} - String or number of id to be set in the animator\n * @return {Animator} An instance itself.\n */\n/**\n * Specifies the unique indicator of the animator\n * @method Animator#getId\n * @return {number | string} the indicator of the item.\n */\n/**\n * Get a delay for the start of an animation.\n * @method Animator#getDelay\n * @return {number} delay\n */\n/**\n * Set a delay for the start of an animation.\n * @method Animator#setDelay\n * @param {number} delay - delay\n * @return {Animator} An instance itself.\n */\n/**\n * Get fill mode for the item when the animation is not playing (before it starts, after it ends, or both)\n * @method Animator#getFillMode\n * @return {FillModeType} fillMode\n */\n/**\n * Set fill mode for the item when the animation is not playing (before it starts, after it ends, or both)\n * @method Animator#setFillMode\n * @param {FillModeType} fillMode - fillMode\n * @return {Animator} An instance itself.\n */\n/**\n * Get the number of times an animation should be played.\n * @method Animator#getIterationCount\n * @return {IterationCountType} iterationCount\n */\n/**\n * Set the number of times an animation should be played.\n * @method Animator#setIterationCount\n * @param {IterationCountType} iterationCount - iterationCount\n * @return {Animator} An instance itself.\n */\n/**\n * Get whether an animation should be played forwards, backwards or in alternate cycles.\n * @method Animator#getDirection\n * @return {DirectionType} direction\n */\n/**\n * Set whether an animation should be played forwards, backwards or in alternate cycles.\n * @method Animator#setDirection\n * @param {DirectionType} direction - direction\n * @return {Animator} An instance itself.\n */\n/**\n * Get whether the animation is running or paused.\n * @method Animator#getPlayState\n * @return {PlayStateType} playState\n */\n/**\n * Set whether the animation is running or paused.\n * @method Animator#setPlayState\n * @param {PlayStateType} playState - playState\n * @return {Animator} An instance itself.\n */\n/**\n * Get the animator's play speed\n * @method Animator#getPlaySpeed\n * @return {number} playSpeed\n */\n/**\n * Set the animator's play speed\n * @method Animator#setPlaySpeed\n * @param {number} playSpeed - playSpeed\n * @return {Animator} An instance itself.\n */\n/**\n * Get how long an animation should take to complete one cycle.\n * @method Animator#getDuration\n * @return {number} duration\n */\n/**\n * Set how long an animation should take to complete one cycle.\n * @method Animator#setDuration\n * @param {number} duration - duration\n * @return {Animator} An instance itself.\n */\n/**\n * Get the speed curve of an animation.\n * @method Animator#getEasing\n * @return {EasingType} easing\n */\n/**\n * Get the speed curve's name\n * @method Animator#getEasingName\n * @return {string} the curve's name.\n */\n/**\n\t* Get the animator's current iteration time\n\t* @method Animator#getIterationTime\n\t* @return {number} current iteration time\n\t* @example\nanimator.getIterationTime();\n\t*/\n\n// tslint:disable-next-line:interface-name\ninterface Animator {\n setId(id: number | string): this;\n getId(): number | string;\n getIterationTime(): number;\n setIterationTime(time: number): this;\n setDelay(delay: number): this;\n getDelay(): number;\n setFillMode(fillMode: FillModeType): this;\n getFillMode(): FillModeType;\n setIterationCount(iterationCount: IterationCountType): this;\n getIterationCount(): IterationCountType;\n setDirection(direction: DirectionType): this;\n getDirection(): DirectionType;\n setPlayState(playState: PlayStateType): this;\n getPlayState(): PlayStateType;\n setPlaySpeed(playSpeed: number): this;\n getPlaySpeed(): number;\n setDuration(duration: number): this;\n getDuration(): number;\n getEasing(): EasingType;\n getEasingName(): string;\n}\nexport default Animator;\n","import {\n ALIAS, TIMING_FUNCTION, TRANSFORM_NAME, EASING_NAME\n} from \"./consts\";\nimport { isRole, getType, isPropertyObject, getValueByNames, isFixed, getNames, getEasing } from \"./utils\";\nimport { toPropertyObject, splitStyle, toObject } from \"./utils/property\";\nimport {\n isObject, isArray, isString,\n ANIMATION, TRANSFORM, FILTER, PROPERTY, FUNCTION, ARRAY, OBJECT, IObject, isUndefined\n} from \"@daybrush/utils\";\nimport { NameType } from \"./types\";\n\nfunction toInnerProperties(obj: IObject) {\n if (!obj) {\n return \"\";\n }\n const arrObj = [];\n\n for (const name in obj) {\n arrObj.push(`${name.replace(/\\d$/g, \"\")}(${obj[name]})`);\n }\n return arrObj.join(\" \");\n}\n\n/* eslint-disable */\nfunction clone(target: IObject, toValue = false) {\n return merge({}, target, toValue);\n}\nfunction merge(to: IObject, from: IObject, toValue = false) {\n for (const name in from) {\n const value = from[name];\n const type = getType(value);\n\n if (type === PROPERTY) {\n to[name] = toValue ? value.toValue() : value.clone();\n } else if (type === FUNCTION) {\n to[name] = toValue ? getValue([name], value) : value;\n } else if (type === ARRAY) {\n to[name] = value.slice();\n } else if (type === OBJECT) {\n if (isObject(to[name]) && !isPropertyObject(to[name])) {\n merge(to[name], value, toValue);\n } else {\n to[name] = clone(value, toValue);\n }\n } else {\n to[name] = from[name];\n }\n }\n return to;\n}\n/* eslint-enable */\n\nfunction getPropertyName(args: NameType[]) {\n return args[0] in ALIAS ? ALIAS[args[0]] : args;\n}\nfunction getValue(names: NameType[], value: any): any {\n const type = getType(value);\n\n if (type === PROPERTY) {\n return value.toValue();\n } else if (type === FUNCTION) {\n if (names[0] !== TIMING_FUNCTION) {\n return getValue(names, value());\n }\n } else if (type === OBJECT) {\n return clone(value, true);\n }\n return value;\n}\n/**\n* Animation's Frame\n*/\nclass Frame {\n public properties: IObject;\n /**\n * @param - properties\n * @example\n const frame = new Scene.Frame({\n display: \"none\"\n transform: {\n translate: \"50px\",\n scale: \"5, 5\",\n }\n });\n */\n constructor(properties: any = {}) {\n this.properties = {};\n this.set(properties);\n }\n /**\n * get property value\n * @param {...Number|String|PropertyObject} args - property name or value\n * @example\n frame.get(\"display\") // => \"none\", \"block\", ....\n frame.get(\"transform\", \"translate\") // => \"10px,10px\"\n */\n public get(...args: NameType[]) {\n const value = this.raw(...args);\n\n return getValue(getPropertyName(args), value);\n }\n\n public raw(...args: NameType[]) {\n return getValueByNames(getPropertyName(args), this.properties);\n }\n /**\n * remove property value\n * @param {...String} args - property name\n * @return {Frame} An instance itself\n * @example\n frame.remove(\"display\")\n */\n public remove(...args: NameType[]) {\n const params = getPropertyName(args);\n const length = params.length;\n\n if (!length) {\n return this;\n }\n const value = getValueByNames(params, this.properties, length - 1);\n\n if (isObject(value)) {\n delete value[params[length - 1]];\n }\n return this;\n }\n /**\n * set property\n * @param {...Number|String|PropertyObject} args - property names or values\n * @return {Frame} An instance itself\n * @example\n // one parameter\n frame.set({\n display: \"none\",\n transform: {\n translate: \"10px, 10px\",\n scale: \"1\",\n },\n filter: {\n brightness: \"50%\",\n grayscale: \"100%\"\n }\n });\n\n // two parameters\n frame.set(\"transform\", {\n translate: \"10px, 10px\",\n scale: \"1\",\n });\n\n // three parameters\n frame.set(\"transform\", \"translate\", \"50px\");\n */\n public set(...args: any[]) {\n const self = this;\n const length = args.length;\n const params = args.slice(0, -1);\n const value = args[length - 1];\n const firstParam = params[0];\n\n if (length === 1 && value instanceof Frame) {\n self.merge(value);\n } else if (firstParam in ALIAS) {\n self._set(ALIAS[firstParam], value);\n } else if (length === 2 && isArray(firstParam)) {\n self._set(firstParam, value);\n } else if (isPropertyObject(value)) {\n if (isRole(params)) {\n self.set(...params, toObject(value));\n } else {\n self._set(params, value);\n }\n } else if (isArray(value)) {\n self._set(params, value);\n } else if (isObject(value)) {\n if (!self.has(...params) && isRole(params)) {\n self._set(params, {});\n }\n for (const name in value) {\n self.set(...params, name, value[name]);\n }\n } else if (isString(value)) {\n if (isRole(params, true)) {\n if (isFixed(params) || !isRole(params)) {\n this._set(params, value);\n } else {\n const obj = toPropertyObject(value);\n\n if (isObject(obj)) {\n self.set(...params, obj);\n }\n }\n return this;\n } else {\n const { styles, length: stylesLength } = splitStyle(value);\n\n for (const name in styles) {\n self.set(...params, name, styles[name]);\n }\n if (stylesLength) {\n return this;\n }\n }\n self._set(params, value);\n } else {\n self._set(params, value);\n }\n return self;\n }\n /**\n * Gets the names of properties.\n * @return the names of properties.\n * @example\n // one parameter\n frame.set({\n display: \"none\",\n transform: {\n translate: \"10px, 10px\",\n scale: \"1\",\n },\n });\n\n // [[\"display\"], [\"transform\", \"translate\"], [\"transform\", \"scale\"]]\n console.log(frame.getNames());\n */\n public getNames(): string[][] {\n return getNames(this.properties, []);\n }\n /**\n * check that has property.\n * @param {...String} args - property name\n * @example\n frame.has(\"property\", \"display\") // => true or false\n */\n public has(...args: NameType[]) {\n const params = getPropertyName(args);\n const length = params.length;\n\n if (!length) {\n return false;\n }\n return !isUndefined(getValueByNames(params, this.properties, length));\n }\n /**\n * clone frame.\n * @return {Frame} An instance of clone\n * @example\n frame.clone();\n */\n public clone() {\n const frame = new Frame();\n\n return frame.merge(this);\n }\n /**\n * merge one frame to other frame.\n * @param - target frame.\n * @return {Frame} An instance itself\n * @example\n frame.merge(frame2);\n */\n public merge(frame: Frame) {\n const properties = this.properties;\n const frameProperties = frame.properties;\n\n if (frameProperties) {\n merge(properties, frameProperties);\n }\n return this;\n }\n /**\n * Specifies an css object that coverted the frame.\n * @return {object} cssObject\n */\n public toCSSObject() {\n const properties = this.get();\n const cssObject: IObject = {};\n\n for (const name in properties) {\n if (isRole([name], true)) {\n continue;\n }\n const value = properties[name];\n\n if (name === TIMING_FUNCTION) {\n cssObject[TIMING_FUNCTION.replace(\"animation\", ANIMATION)] =\n (isString(value) ? value : value[EASING_NAME]) || \"initial\";\n } else {\n cssObject[name] = value;\n }\n }\n const transform = toInnerProperties(properties[TRANSFORM_NAME]);\n const filter = toInnerProperties(properties.filter);\n\n TRANSFORM && transform && (cssObject[TRANSFORM] = transform);\n FILTER && filter && (cssObject[FILTER] = filter);\n return cssObject;\n }\n /**\n * Specifies an css text that coverted the frame.\n * @return {string} cssText\n */\n public toCSS() {\n const cssObject = this.toCSSObject();\n const cssArray = [];\n\n for (const name in cssObject) {\n cssArray.push(`${name}:${cssObject[name]};`);\n }\n return cssArray.join(\"\");\n }\n /**\n * Remove All Properties\n * @return {Frame} An instance itself\n */\n public clear() {\n this.properties = {};\n return this;\n }\n private _set(args: NameType[], value: any) {\n let properties = this.properties;\n const length = args.length;\n\n for (let i = 0; i < length - 1; ++i) {\n const name = args[i];\n\n !(name in properties) && (properties[name] = {});\n properties = properties[name];\n }\n if (!length) {\n return;\n }\n if (length === 1 && args[0] === TIMING_FUNCTION) {\n properties[TIMING_FUNCTION] = getEasing(value);\n } else {\n const lastParam = args[length - 1];\n properties[lastParam] = isString(value) && !isFixed(args)\n ? toPropertyObject(value, lastParam)\n : value;\n }\n }\n}\nexport default Frame;\n","\nimport PropertyObject from \"../PropertyObject\";\nimport { getType } from \"../utils\";\nimport { toPropertyObject } from \"./property\";\nimport { splitUnit, PROPERTY, FUNCTION, ARRAY, dot as dotNumber } from \"@daybrush/utils\";\nimport { EasingType } from \"../types\";\n\nfunction dotArray(a1: any[], a2: any, b1: number, b2: number): any {\n const length = a2.length;\n\n return a1.map((v1, i) => {\n if (i >= length) {\n return v1;\n } else {\n return dot(v1, a2[i], b1, b2);\n }\n });\n}\n\nfunction dotColor(color1: PropertyObject, color2: PropertyObject, b1: number, b2: number) {\n // convert array to PropertyObject(type=color)\n const value1 = color1.value;\n const value2 = color2.value;\n // If the model name is not same, the inner product is impossible.\n const model1 = color1.model;\n const model2 = color2.model;\n\n if (model1 !== model2) {\n // It is recognized as a string.\n return dot(color1.toValue(), color2.toValue(), b1, b2);\n }\n if (value1.length === 3) {\n value1[3] = 1;\n }\n if (value2.length === 3) {\n value2[3] = 1;\n }\n const v = dotArray(value1, value2, b1, b2);\n const colorModel = model1;\n\n for (let i = 0; i < 3; ++i) {\n v[i] = parseInt(v[i], 10);\n }\n const object = new PropertyObject(v, {\n type: \"color\",\n model: colorModel,\n prefix: `${colorModel}(`,\n suffix: \")\",\n });\n\n return object;\n}\n\nfunction dotObject(a1: PropertyObject, a2: PropertyObject, b1: number, b2: number) {\n const a1Type = a1.type;\n\n if (a1Type === \"color\") {\n return dotColor(a1, a2, b1, b2);\n }\n const value1 = a1.value;\n const value2 = a2.value;\n const arr = dotArray(value1, value2, b1, b2);\n\n return new PropertyObject(arr, {\n type: a1Type,\n separator: a1.separator || a2.separator,\n prefix: a1.prefix || a2.prefix,\n suffix: a1.suffix || a2.suffix,\n model: a1.model || a2.model,\n });\n}\n/**\n* The dot product of a1 and a2 for the b1 and b2.\n* @memberof Dot\n* @function dot\n* @param {String|Number|PropertyObject} a1 value1\n* @param {String|Number|PropertyObject} a2 value2\n* @param {Number} b1 b1 ratio\n* @param {Number} b2 b2 ratio\n* @return {String} Not Array, Not Separator, Only Number & Unit\n* @return {PropertyObject} Array with Separator.\n* @example\ndot(1, 3, 0.3, 0.7);\n// => 1.6\n*/\nexport function dot(a1: any, a2: any, b1: number, b2: number): any {\n if (b2 === 0) {\n return a2;\n } else if (b1 === 0 || b1 + b2 === 0) {\n // prevent division by zero.\n return a1;\n }\n // dot Object\n\n const type1 = getType(a1);\n const type2 = getType(a2);\n const isFunction1 = type1 === FUNCTION;\n const isFunction2 = type2 === FUNCTION;\n\n if (isFunction1 || isFunction2) {\n return () => {\n return dot(isFunction1 ? toPropertyObject(a1()) : a1, isFunction2 ? toPropertyObject(a2()) : a2, b1, b2);\n };\n } else if (type1 === type2) {\n if (type1 === PROPERTY) {\n return dotObject(a1, a2, b1, b2);\n } else if (type1 === ARRAY) {\n return dotArray(a1, a2, b1, b2);\n } else if (type1 !== \"value\") {\n return a1;\n }\n } else {\n return a1;\n }\n const v1 = splitUnit(`${a1}`);\n const v2 = splitUnit(`${a2}`);\n let v;\n\n // 숫자가 아닐경우 첫번째 값을 반환 b2가 0일경우 두번째 값을 반환\n if (isNaN(v1.value) || isNaN(v2.value)) {\n return a1;\n } else {\n v = dotNumber(v1.value, v2.value, b1, b2);\n }\n const prefix = v1.prefix || v2.prefix;\n const unit = v1.unit || v2.unit;\n\n if (!prefix && !unit) {\n return v;\n }\n return prefix + v + unit;\n}\n\nexport function dotValue(\n time: number,\n prevTime: number,\n nextTime: number,\n prevValue: any,\n nextValue: any,\n easing?: EasingType) {\n if (time === prevTime) {\n return prevValue;\n } else if (time === nextTime) {\n return nextValue;\n } else if (!easing) {\n return dot(prevValue, nextValue, time - prevTime, nextTime - time);\n }\n const ratio = easing((time - prevTime) / (nextTime - prevTime));\n const value = dot(prevValue, nextValue, ratio, 1 - ratio);\n\n return value;\n}\n","import Animator, { isDirectionReverse } from \"./Animator\";\nimport Frame from \"./Frame\";\nimport {\n toFixed,\n isFixed,\n playCSS,\n toId,\n exportCSS,\n getRealId,\n makeId,\n isPausedCSS,\n isRole,\n isInProperties,\n getValueByNames,\n isEndedCSS,\n setPlayCSS,\n getNames,\n updateFrame,\n} from \"./utils\";\nimport { dotValue } from \"./utils/dot\";\nimport {\n START_ANIMATION,\n PREFIX, THRESHOLD,\n TIMING_FUNCTION, ALTERNATE, ALTERNATE_REVERSE, INFINITE,\n REVERSE, EASING, FILL_MODE, DIRECTION, ITERATION_COUNT,\n EASING_NAME, DELAY, PLAY_SPEED, DURATION, PAUSE_ANIMATION, DATA_SCENE_ID, SELECTOR, ROLES, CURRENT_TIME\n} from \"./consts\";\nimport {\n isObject, isArray, isUndefined, decamelize,\n ANIMATION, fromCSS, addClass, removeClass, hasClass,\n KEYFRAMES, requestAnimationFrame, isFunction,\n IObject, $, splitComma, toArray, isString, IArrayFormat,\n dot as dotNumber,\n find,\n findIndex,\n} from \"@daybrush/utils\";\nimport {\n NameType, RoleObject, AnimateElement, AnimatorState,\n SceneItemState, SceneItemOptions, EasingType, PlayCondition, DirectionType\n} from \"./types\";\n\nfunction getNearTimeIndex(times: number[], time: number) {\n const length = times.length;\n\n for (let i = 0; i < length; ++i) {\n if (times[i] === time) {\n return [i, i];\n } else if (times[i] > time) {\n return [i > 0 ? i - 1 : 0, i];\n }\n }\n return [length - 1, length - 1];\n}\nfunction makeAnimationProperties(properties: object) {\n const cssArray = [];\n\n for (const name in properties) {\n cssArray.push(`${ANIMATION}-${decamelize(name)}:${properties[name]};`);\n }\n return cssArray.join(\"\");\n}\nfunction addTime(times: number[], time: number) {\n const length = times.length;\n for (let i = 0; i < length; ++i) {\n if (time < times[i]) {\n times.splice(i, 0, time);\n return;\n }\n }\n times[length] = time;\n}\nfunction addEntry(entries: number[][], time: number, keytime: number) {\n const prevEntry = entries[entries.length - 1];\n\n (!prevEntry || prevEntry[0] !== time || prevEntry[1] !== keytime) &&\n entries.push([toFixed(time), toFixed(keytime)]);\n}\nexport function getEntries(times: number[], states: AnimatorState[]) {\n let entries = times.map(time => ([time, time]));\n let nextEntries = [];\n\n states.forEach(state => {\n const iterationCount = state[ITERATION_COUNT] as number;\n const delay = state[DELAY];\n const playSpeed = state[PLAY_SPEED];\n const direction = state[DIRECTION];\n const intCount = Math.ceil(iterationCount);\n const currentDuration = entries[entries.length - 1][0];\n const length = entries.length;\n const lastTime = currentDuration * iterationCount;\n\n for (let i = 0; i < intCount; ++i) {\n const isReverse =\n direction === REVERSE ||\n direction === ALTERNATE && i % 2 ||\n direction === ALTERNATE_REVERSE && !(i % 2);\n\n for (let j = 0; j < length; ++j) {\n const entry = entries[isReverse ? length - j - 1 : j];\n const time = entry[1];\n const currentTime = currentDuration * i + (isReverse ? currentDuration - entry[0] : entry[0]);\n const prevEntry = entries[isReverse ? length - j : j - 1];\n\n if (currentTime > lastTime) {\n if (j !== 0) {\n const prevTime = currentDuration * i +\n (isReverse ? currentDuration - prevEntry[0] : prevEntry[0]);\n const divideTime = dotNumber(prevEntry[1], time, lastTime - prevTime, currentTime - lastTime);\n\n addEntry(nextEntries, (delay + currentDuration * iterationCount) / playSpeed, divideTime);\n }\n break;\n } else if (\n currentTime === lastTime\n && nextEntries.length\n && nextEntries[nextEntries.length - 1][0] === lastTime + delay\n ) {\n break;\n }\n addEntry(nextEntries, (delay + currentTime) / playSpeed, time);\n }\n }\n // delay time\n delay && nextEntries.unshift([0, nextEntries[0][1]]);\n\n entries = nextEntries;\n nextEntries = [];\n });\n\n return entries;\n}\n/**\n* manage Frame Keyframes and play keyframes.\n* @extends Animator\n* @example\nconst item = new SceneItem({\n\t0: {\n\t\tdisplay: \"none\",\n\t},\n\t1: {\n\t\tdisplay: \"block\",\n\t\topacity: 0,\n\t},\n\t2: {\n\t\topacity: 1,\n\t}\n});\n*/\nclass SceneItem extends Animator {\n public times: number[] = [];\n public items: IObject = {};\n public names: RoleObject = {};\n public elements: AnimateElement[] = [];\n public temp: Frame;\n private needUpdate: boolean = true;\n private target: any;\n private targetFunc: (frame: Frame) => void;\n\n /**\n * @param - properties\n * @param - options\n * @example\n const item = new SceneItem({\n 0: {\n display: \"none\",\n },\n 1: {\n display: \"block\",\n opacity: 0,\n },\n 2: {\n opacity: 1,\n }\n });\n */\n constructor(properties?: any, options?: Partial) {\n super();\n this.load(properties, options);\n }\n public getDuration() {\n const times = this.times;\n const length = times.length;\n\n return (length === 0 ? 0 : times[length - 1]) || this.state[DURATION];\n }\n /**\n * get size of list\n * @return {Number} length of list\n */\n public size() {\n return this.times.length;\n }\n public setDuration(duration: number) {\n if (!duration) {\n return this;\n }\n const originalDuration = this.getDuration();\n\n if (originalDuration > 0) {\n const ratio = duration / originalDuration;\n const { times, items } = this;\n const obj: IObject = {};\n\n this.times = times.map(time => {\n const time2 = toFixed(time * ratio);\n\n obj[time2] = items[time];\n\n return time2;\n });\n this.items = obj;\n } else {\n this.newFrame(duration);\n }\n return this;\n }\n public setId(id?: number | string) {\n const state = this.state;\n const elements = this.elements;\n const length = elements.length;\n\n state.id = id || makeId(!!length);\n\n if (length && !state[SELECTOR]) {\n const sceneId = toId(this.getId());\n\n state[SELECTOR] = `[${DATA_SCENE_ID}=\"${sceneId}\"]`;\n elements.forEach(element => {\n element.setAttribute(DATA_SCENE_ID, sceneId);\n });\n }\n return this;\n }\n\n /**\n * Set properties to the sceneItem at that time\n * @param {Number} time - time\n * @param {...String|Object} [properties] - property names or values\n * @return {SceneItem} An instance itself\n * @example\n item.set(0, \"a\", \"b\") // item.getFrame(0).set(\"a\", \"b\")\n console.log(item.get(0, \"a\")); // \"b\"\n */\n public set(time: any, ...args: any[]) {\n if (time instanceof SceneItem) {\n return this.set(0, time);\n } else if (isArray(time)) {\n const length = time.length;\n\n for (let i = 0; i < length; ++i) {\n const t = length === 1 ? 0 : this.getUnitTime(`${i / (length - 1) * 100}%`);\n\n this.set(t, time[i]);\n }\n } else if (isObject(time)) {\n for (const t in time) {\n const value = time[t];\n\n splitComma(t).forEach(eachTime => {\n const realTime = this.getUnitTime(eachTime);\n\n if (isNaN(realTime)) {\n getNames(value, [eachTime]).forEach(names => {\n const innerValue = getValueByNames(names.slice(1), value);\n const arr = isArray(innerValue) ?\n innerValue : [getValueByNames(names, this.target), innerValue];\n const length = arr.length;\n\n for (let i = 0; i < length; ++i) {\n this.newFrame(`${i / (length - 1) * 100}%`).set(...names, arr[i]);\n }\n });\n } else {\n this.set(realTime, value);\n }\n });\n }\n } else if (!isUndefined(time)) {\n const value = args[0];\n\n splitComma(time + \"\").forEach(eachTime => {\n const realTime = this.getUnitTime(eachTime);\n\n if (value instanceof SceneItem) {\n const delay = value.getDelay();\n const frames = value.toObject(!this.hasFrame(realTime + delay));\n const duration = value.getDuration();\n const direction = value.getDirection();\n const isReverse = direction.indexOf(\"reverse\") > -1;\n\n for (const frameTime in frames) {\n const nextTime = isReverse ? duration - parseFloat(frameTime) : parseFloat(frameTime);\n this.set(realTime + nextTime, frames[frameTime]);\n }\n } else if (args.length === 1 && isArray(value)) {\n value.forEach((item: any) => {\n this.set(realTime, item);\n });\n } else {\n const frame = this.newFrame(realTime);\n\n frame.set(...args);\n }\n });\n }\n this.needUpdate = true;\n return this;\n }\n /**\n * Get properties of the sceneItem at that time\n * @param {Number} time - time\n * @param {...String|Object} args property's name or properties\n * @return {Number|String|PropertyObejct} property value\n * @example\n item.get(0, \"a\"); // item.getFrame(0).get(\"a\");\n item.get(0, \"transform\", \"translate\"); // item.getFrame(0).get(\"transform\", \"translate\");\n */\n public get(time: string | number, ...args: NameType[]) {\n const frame = this.getFrame(time);\n\n return frame && frame.get(...args);\n }\n public remove(time: string | number, ...args: any[]): this;\n /**\n * remove properties to the sceneItem at that time\n * @param {Number} time - time\n * @param {...String|Object} [properties] - property names or values\n * @return {SceneItem} An instance itself\n * @example\n item.remove(0, \"a\");\n */\n public remove(time: string | number, ...args: NameType[]) {\n if (args.length) {\n const frame = this.getFrame(time);\n\n frame && frame.remove(...args);\n } else {\n this.removeFrame(time);\n }\n this.needUpdate = true;\n return this;\n }\n /**\n * Append the item or object at the last time.\n * @param - the scene item or item object\n * @return An instance itself\n * @example\n item.append(new SceneItem({\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n }));\n item.append({\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n });\n item.set(item.getDuration(), {\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n });\n */\n public append(item: SceneItem | IObject) {\n if (item instanceof SceneItem) {\n this.set(this.getDuration(), item);\n } else {\n this.append(new SceneItem(item));\n }\n return this;\n }\n /**\n * Push the front frames for the time and prepend the scene item or item object.\n * @param - the scene item or item object\n * @return An instance itself\n */\n public prepend(item: SceneItem | IObject) {\n if (item instanceof SceneItem) {\n const unshiftTime = item.getDuration() + item.getDelay();\n const firstFrame = this.getFrame(0);\n // remove first frame\n this.removeFrame(0);\n this.unshift(unshiftTime);\n this.set(0, item);\n this.set(unshiftTime + THRESHOLD, firstFrame);\n } else {\n this.prepend(new SceneItem(item));\n }\n return this;\n }\n /**\n * Push out the amount of time.\n * @param - time to push\n * @example\n item.get(0); // frame 0\n item.unshift(3);\n item.get(3) // frame 0\n */\n public unshift(time: number) {\n const { times, items } = this;\n const obj: IObject = {};\n\n this.times = times.map(t => {\n const time2 = toFixed(time + t);\n\n obj[time2] = items[t];\n return time2;\n });\n this.items = obj;\n return this;\n }\n /**\n * Get the frames in the item in object form.\n * @return {}\n * @example\n item.toObject();\n // {0: {display: \"none\"}, 1: {display: \"block\"}}\n */\n public toObject(isStartZero = true): IObject {\n const obj: IObject = {};\n const delay = this.getDelay();\n\n this.forEach((frame: Frame, time: number) => {\n obj[(!time && !isStartZero ? THRESHOLD : 0) + delay + time] = frame.clone();\n });\n return obj;\n }\n /**\n * Specifies an element to synchronize items' keyframes.\n * @param {string} selectors - Selectors to find elements in items.\n * @return {SceneItem} An instance itself\n * @example\nitem.setSelector(\"#id.class\");\n */\n public setSelector(target: string | boolean | ((id: number | string) => string)) {\n if (isFunction(target)) {\n this.setElement(target(this.getId()));\n } else {\n this.setElement(target);\n }\n return this;\n }\n /**\n * Get the elements connected to SceneItem.\n */\n public getElements(): AnimateElement[] {\n return this.elements;\n }\n /**\n * Specifies an element to synchronize item's keyframes.\n * @param - elements to synchronize item's keyframes.\n * @param - Make sure that you have peusdo.\n * @return {SceneItem} An instance itself\n * @example\nitem.setElement(document.querySelector(\"#id.class\"));\nitem.setElement(document.querySelectorAll(\".class\"));\n */\n public setElements(target: boolean | string | AnimateElement | IArrayFormat): this {\n return this.setElement(target);\n }\n /**\n * Specifies an element to synchronize item's keyframes.\n * @param - elements to synchronize item's keyframes.\n * @param - Make sure that you have peusdo.\n * @return {SceneItem} An instance itself\n * @example\nitem.setElement(document.querySelector(\"#id.class\"));\nitem.setElement(document.querySelectorAll(\".class\"));\n */\n public setElement(target: boolean | string | AnimateElement | IArrayFormat) {\n const state = this.state;\n let elements: AnimateElement[] = [];\n\n if (!target) {\n return this;\n } else if (target === true || isString(target)) {\n const selector = target === true ? `${state.id}` : target;\n const matches = /([\\s\\S]+)(:+[a-zA-Z]+)$/g.exec(selector);\n\n elements = toArray($(matches ? matches[1] : selector, true));\n state[SELECTOR] = selector;\n } else {\n elements = (target instanceof Element) ? [target] : toArray(target);\n }\n if (!elements.length) {\n return this;\n }\n this.elements = elements;\n this.setId(this.getId());\n this.target = elements[0].style;\n this.targetFunc = (frame: Frame) => {\n const attributes = frame.get(\"attribute\");\n\n if (attributes) {\n for (const name in attributes) {\n elements.forEach(el => {\n el.setAttribute(name, attributes[name]);\n });\n }\n }\n if (frame.has(\"html\")) {\n const html = frame.get(\"html\");\n\n elements.forEach(el => {\n el.innerHTML = html;\n });\n }\n const cssText = frame.toCSS();\n\n if (state.cssText !== cssText) {\n state.cssText = cssText;\n\n elements.forEach(el => {\n el.style.cssText += cssText;\n });\n return frame;\n }\n };\n return this;\n }\n public setTarget(target: any): this {\n this.target = target;\n this.targetFunc = (frame: Frame) => {\n const obj = frame.get();\n\n for (const name in obj) {\n target[name] = obj[name];\n }\n };\n return this;\n }\n /**\n * add css styles of items's element to the frame at that time.\n * @param {Array} properties - elements to synchronize item's keyframes.\n * @return {SceneItem} An instance itself\n * @example\n item.setElement(document.querySelector(\"#id.class\"));\n item.setCSS(0, [\"opacity\"]);\n item.setCSS(0, [\"opacity\", \"width\", \"height\"]);\n */\n public setCSS(time: number, properties: string[]) {\n this.set(time, fromCSS(this.elements, properties));\n return this;\n }\n public setTime(time: number | string, isTick?: boolean, isParent?: boolean, parentEasing?: EasingType) {\n super.setTime(time, isTick, isParent);\n\n const iterationTime = this.getIterationTime();\n const easing = this.getEasing() || parentEasing;\n const frame = this.getNowFrame(iterationTime, easing);\n const currentTime = this.getTime();\n\n this.temp = frame;\n /**\n * This event is fired when timeupdate and animate.\n * @event SceneItem#animate\n * @param {Number} param.currentTime The total time that the animator is running.\n * @param {Number} param.time The iteration time during duration that the animator is running.\n * @param {Frame} param.frame frame of that time.\n */\n this.trigger(\"animate\", {\n frame,\n currentTime,\n time: iterationTime,\n });\n this.targetFunc && this.targetFunc(frame);\n return this;\n }\n /**\n * update property names used in frames.\n * @return {SceneItem} An instance itself\n * @example\n item.update();\n */\n public update() {\n const names = {};\n this.forEach(frame => {\n updateFrame(names, frame.properties);\n });\n this.names = names;\n this.needUpdate = false;\n return this;\n }\n /**\n * Create and add a frame to the sceneItem at that time\n * @param {Number} time - frame's time\n * @return {Frame} Created frame.\n * @example\n item.newFrame(time);\n */\n public newFrame(time: string | number) {\n let frame = this.getFrame(time);\n\n if (frame) {\n return frame;\n }\n frame = new Frame();\n this.setFrame(time, frame);\n return frame;\n }\n /**\n * Add a frame to the sceneItem at that time\n * @param {Number} time - frame's time\n * @return {SceneItem} An instance itself\n * @example\n item.setFrame(time, frame);\n */\n public setFrame(time: string | number, frame: Frame) {\n const realTime = this.getUnitTime(time);\n\n this.items[realTime] = frame;\n addTime(this.times, realTime);\n this.needUpdate = true;\n return this;\n }\n public getFrame(time: number | string, ...names: any[]): Frame;\n /**\n * get sceneItem's frame at that time\n * @param {Number} time - frame's time\n * @return {Frame} sceneItem's frame at that time\n * @example\n const frame = item.getFrame(time);\n */\n public getFrame(time: number | string) {\n return this.items[this.getUnitTime(time)];\n }\n public removeFrame(time: number | string, ...names: any[]): this;\n /**\n * remove sceneItem's frame at that time\n * @param - frame's time\n * @return {SceneItem} An instance itself\n * @example\n item.removeFrame(time);\n */\n public removeFrame(time: number | string) {\n const realTime = this.getUnitTime(time);\n const items = this.items;\n const index = this.times.indexOf(realTime);\n\n delete items[realTime];\n\n // remove time\n if (index > -1) {\n this.times.splice(index, 1);\n }\n this.needUpdate = true;\n return this;\n }\n /**\n * check if the item has a frame at that time\n * @param {Number} time - frame's time\n * @return {Boolean} true: the item has a frame // false: not\n * @example\n if (item.hasFrame(10)) {\n // has\n } else {\n // not\n }\n */\n public hasFrame(time: number | string) {\n return this.getUnitTime(time) in this.items;\n }\n /**\n * Check if keyframes has propery's name\n * @param - property's time\n * @return {boolean} true: if has property, false: not\n * @example\n item.hasName([\"transform\", \"translate\"]); // true or not\n */\n public hasName(args: string[]) {\n this.needUpdate && this.update();\n return isInProperties(this.names, args, true);\n }\n /**\n * merge frame of the previous time at the next time.\n * @param - The time of the frame to merge\n * @param - The target frame\n * @return {SceneItem} An instance itself\n * @example\n // getFrame(1) contains getFrame(0)\n item.merge(0, 1);\n */\n public mergeFrame(time: number | string, frame: Frame) {\n if (frame) {\n const toFrame = this.newFrame(time);\n\n toFrame.merge(frame);\n }\n return this;\n }\n /**\n * Get frame of the current time\n * @param {Number} time - the current time\n * @param {function} easing - the speed curve of an animation\n * @return {Frame} frame of the current time\n * @example\n let item = new SceneItem({\n 0: {\n display: \"none\",\n },\n 1: {\n display: \"block\",\n opacity: 0,\n },\n 2: {\n opacity: 1,\n }\n });\n // opacity: 0.7; display:\"block\";\n const frame = item.getNowFrame(1.7);\n */\n public getNowFrame(time: number, easing?: EasingType, isAccurate?: boolean) {\n this.needUpdate && this.update();\n const frame = new Frame();\n const [left, right] = getNearTimeIndex(this.times, time);\n let realEasing = this.getEasing() || easing;\n let nameObject = this.names;\n\n if (this.hasName([TIMING_FUNCTION])) {\n const nowEasing = this.getNowValue(time, [TIMING_FUNCTION], left, right, false, 0, true);\n\n isFunction(nowEasing) && (realEasing = nowEasing);\n }\n if (isAccurate) {\n const prevFrame = this.getFrame(time);\n const prevNames = updateFrame({}, prevFrame.properties);\n\n for (const name in ROLES) {\n if (name in prevNames) {\n prevNames[name] = nameObject[name];\n }\n }\n nameObject = prevNames;\n }\n const names = getNames(nameObject, []);\n\n names.forEach(properties => {\n const value = this.getNowValue(time, properties, left, right, isAccurate, realEasing, isFixed(properties));\n\n if (isUndefined(value)) {\n return;\n }\n frame.set(properties, value);\n });\n return frame;\n }\n public load(properties: any = {}, options = properties.options) {\n options && this.setOptions(options);\n\n if (isArray(properties)) {\n this.set(properties);\n } else if (properties.keyframes) {\n this.set(properties.keyframes);\n } else {\n for (const time in properties) {\n if (time !== \"options\") {\n this.set({\n [time]: properties[time],\n });\n }\n }\n }\n if (options && options[DURATION]) {\n this.setDuration(options[DURATION]);\n }\n return this;\n }\n /**\n * clone SceneItem.\n * @return {SceneItem} An instance of clone\n * @example\n * item.clone();\n */\n public clone() {\n const item = new SceneItem();\n\n item.setOptions(this.state);\n this.forEach((frame: Frame, time: number) => {\n item.setFrame(time, frame.clone());\n });\n return item;\n }\n /**\n * executes a provided function once for each scene item.\n * @param - Function to execute for each element, taking three arguments\n * @return {Keyframes} An instance itself\n */\n public forEach(callback: (item: Frame, time: number, items: IObject) => void) {\n const times = this.times;\n const items = this.items;\n\n times.forEach(time => {\n callback(items[time], time, items);\n });\n return this;\n }\n public setOptions(options: Partial = {}) {\n super.setOptions(options);\n const { id, selector, elements, element, target } = options;\n\n id && this.setId(id);\n if (target) {\n this.setTarget(target);\n } else if (selector) {\n this.setSelector(selector);\n } else if (elements || element) {\n this.setElement(elements || element);\n }\n return this;\n }\n public toCSS(\n playCondition: PlayCondition = { className: START_ANIMATION },\n parentDuration = this.getDuration(), states: AnimatorState[] = []) {\n const itemState = this.state;\n const selector = itemState[SELECTOR];\n\n if (!selector) {\n return \"\";\n }\n const originalDuration = this.getDuration();\n itemState[DURATION] = originalDuration;\n states.push(itemState);\n\n const reversedStates = toArray(states).reverse();\n const id = toId(getRealId(this));\n const superParent = states[0];\n const infiniteIndex = findIndex(reversedStates, state => {\n return state[ITERATION_COUNT] === INFINITE || !isFinite(state[DURATION]);\n }, states.length - 1);\n const finiteStates = reversedStates.slice(0, infiniteIndex);\n const duration = parentDuration || finiteStates.reduce((prev, cur) => {\n return (cur[DELAY] + prev * (cur[ITERATION_COUNT] as number)) / cur[PLAY_SPEED];\n }, originalDuration);\n const delay = reversedStates.slice(infiniteIndex).reduce((prev, cur) => {\n return (prev + cur[DELAY]) / cur[PLAY_SPEED];\n }, 0);\n const easingName = find(reversedStates, state => (state[EASING] && state[EASING_NAME]), itemState)[EASING_NAME];\n const iterationCount = reversedStates[infiniteIndex][ITERATION_COUNT];\n const fillMode = superParent[FILL_MODE];\n const direction = reversedStates[infiniteIndex][DIRECTION];\n const cssText = makeAnimationProperties({\n fillMode,\n direction,\n iterationCount,\n delay: `${delay}s`,\n name: `${PREFIX}KEYFRAMES_${id}`,\n duration: `${duration / superParent[PLAY_SPEED]}s`,\n timingFunction: easingName,\n });\n const selectors = splitComma(selector).map(sel => {\n const matches = /([\\s\\S]+)(:+[a-zA-Z]+)$/g.exec(sel);\n\n if (matches) {\n return [matches[1], matches[2]];\n } else {\n return [sel, \"\"];\n }\n });\n const className = playCondition.className;\n const selectorCallback = playCondition.selector;\n const preselector = isFunction(selectorCallback) ? selectorCallback(this, selector) : selectorCallback;\n\n return `\n ${preselector || selectors.map(([sel, peusdo]) => `${sel}.${className}${peusdo}`)} {${cssText}}\n ${selectors.map(([sel, peusdo]) => `${sel}.${PAUSE_ANIMATION}${peusdo}`)} {${ANIMATION}-play-state: paused;}\n @${KEYFRAMES} ${PREFIX}KEYFRAMES_${id}{${this._toKeyframes(duration, finiteStates, direction)}}`;\n }\n /**\n * Export the CSS of the items to the style.\n * @param - Add a selector or className to play.\n * @return {SceneItem} An instance itself\n */\n public exportCSS(\n playCondition?: PlayCondition,\n duration?: number, options?: AnimatorState[]) {\n if (!this.elements.length) {\n return \"\";\n }\n const css = this.toCSS(playCondition, duration, options);\n const isParent = options && !isUndefined(options[ITERATION_COUNT]);\n\n !isParent && exportCSS(getRealId(this), css);\n return this;\n }\n public pause() {\n super.pause();\n isPausedCSS(this) && this.pauseCSS();\n return this;\n }\n public pauseCSS() {\n this.elements.forEach(element => {\n addClass(element, PAUSE_ANIMATION);\n });\n return this;\n }\n public endCSS() {\n this.elements.forEach(element => {\n removeClass(element, PAUSE_ANIMATION);\n removeClass(element, START_ANIMATION);\n });\n setPlayCSS(this, false);\n return this;\n }\n public end() {\n isEndedCSS(this) && this.endCSS();\n super.end();\n return this;\n }\n /**\n * Play using the css animation and keyframes.\n * @param - Check if you want to export css.\n * @param [playClassName=\"startAnimation\"] - Add a class name to play.\n * @param - The shorthand properties for six of the animation properties.\n * @see {@link https://www.w3schools.com/cssref/css3_pr_animation.asp}\n * @example\n item.playCSS();\n item.playCSS(false, \"startAnimation\", {\n direction: \"reverse\",\n fillMode: \"forwards\",\n });\n */\n public playCSS(isExportCSS = true, playClassName?: string, properties: object = {}) {\n playCSS(this, isExportCSS, playClassName, properties);\n return this;\n }\n public addPlayClass(isPaused: boolean, playClassName?: string, properties: object = {}) {\n const elements = this.elements;\n const length = elements.length;\n const cssText = makeAnimationProperties(properties);\n\n if (!length) {\n return;\n }\n if (isPaused) {\n elements.forEach(element => {\n removeClass(element, PAUSE_ANIMATION);\n });\n } else {\n elements.forEach(element => {\n element.style.cssText += cssText;\n if (hasClass(element, START_ANIMATION)) {\n removeClass(element, START_ANIMATION);\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n addClass(element, START_ANIMATION);\n });\n });\n } else {\n addClass(element, START_ANIMATION);\n }\n });\n }\n return elements[0];\n }\n /**\n * Remove All Frames\n * @return {SceneItem} An instance itself\n */\n public clear() {\n this.times = [];\n this.items = {};\n this.names = {};\n this.temp = null;\n this.needUpdate = true;\n return this;\n }\n public getNowValue(\n time: number,\n properties: string[],\n left?: number,\n right?: number,\n isAccurate?: boolean,\n easing?: EasingType,\n usePrevValue?: boolean,\n ) {\n const times = this.times;\n const length = times.length;\n\n let prevTime: number;\n let nextTime: number;\n let prevFrame: Frame;\n let nextFrame: Frame;\n const isUndefinedLeft = isUndefined(left);\n const isUndefinedRight = isUndefined(right);\n if (isUndefinedLeft || isUndefinedRight) {\n const indicies = getNearTimeIndex(times, time);\n isUndefinedLeft && (left = indicies[0]);\n isUndefinedRight && (right = indicies[1]);\n }\n\n for (let i = left; i >= 0; --i) {\n const frame = this.getFrame(times[i]);\n\n if (frame.has(...properties)) {\n prevTime = times[i];\n prevFrame = frame;\n break;\n }\n }\n const prevValue = prevFrame && prevFrame.raw(...properties);\n\n if (isAccurate && !isRole([properties[0]])) {\n return prevTime === time ? prevValue : undefined;\n }\n if (usePrevValue) {\n return prevValue;\n }\n for (let i = right; i < length; ++i) {\n const frame = this.getFrame(times[i]);\n\n if (frame.has(...properties)) {\n nextTime = times[i];\n nextFrame = frame;\n break;\n }\n }\n const nextValue = nextFrame && nextFrame.raw(...properties);\n\n if (!prevFrame || isUndefined(prevValue)) {\n return nextValue;\n }\n if (!nextFrame || isUndefined(nextValue) || prevValue === nextValue) {\n return prevValue;\n }\n return dotValue(time, Math.max(prevTime, 0), nextTime, prevValue, nextValue, easing);\n }\n private _toKeyframes(duration: number, states: AnimatorState[], direction: DirectionType) {\n const frames: IObject = {};\n const times = this.times.slice();\n\n if (!times.length) {\n return \"\";\n }\n const originalDuration = this.getDuration();\n (!this.getFrame(0)) && times.unshift(0);\n (!this.getFrame(originalDuration)) && times.push(originalDuration);\n const entries = getEntries(times, states);\n const lastEntry = entries[entries.length - 1];\n\n // end delay time\n lastEntry[0] < duration && addEntry(entries, duration, lastEntry[1]);\n let prevTime = -1;\n\n return entries.map(([time, keytime]) => {\n if (!frames[keytime]) {\n frames[keytime] =\n (!this.hasFrame(keytime) || keytime === 0 || keytime === originalDuration ?\n this.getNowFrame(keytime) : this.getNowFrame(keytime, 0, true)).toCSS();\n }\n\n let frameTime = time / duration * 100;\n\n if (frameTime - prevTime < THRESHOLD) {\n frameTime += THRESHOLD;\n }\n prevTime = frameTime;\n return `${Math.min(frameTime, 100)}%{\n ${time === 0 && !isDirectionReverse(0, 1, direction) ? \"\" : frames[keytime]}\n }`;\n }).join(\"\");\n }\n}\n\nexport default SceneItem;\n","import Animator from \"./Animator\";\nimport SceneItem from \"./SceneItem\";\nimport { SELECTOR, DURATION, DELAY, RUNNING } from \"./consts\";\nimport { playCSS, exportCSS, getRealId, isPausedCSS, isEndedCSS, setPlayCSS } from \"./utils\";\nimport { isFunction, IS_WINDOW, IObject, $, IArrayFormat } from \"@daybrush/utils\";\nimport {\n AnimateElement, SceneState, SceneOptions, EasingType,\n AnimatorState, SceneItemOptions, PlayCondition\n} from \"./types\";\nimport Frame from \"./Frame\";\nimport ListMap from \"list-map\";\n\n/**\n * manage sceneItems and play Scene.\n * @sort 1\n */\nclass Scene extends Animator {\n /**\n * version info\n * @type {string}\n * @example\n * Scene.VERSION // #__VERSION__#\n */\n public static VERSION: string = \"#__VERSION__#\";\n public items: ListMap = new ListMap();\n public temp: IObject;\n /**\n * @param - properties\n * @param - options\n * @example\n const scene = new Scene({\n item1: {\n 0: {\n display: \"none\",\n },\n 1: {\n display: \"block\",\n opacity: 0,\n },\n 2: {\n opacity: 1,\n },\n },\n item2: {\n 2: {\n opacity: 1,\n },\n }\n });\n */\n constructor(properties?: {options?: Partial} & IObject, options?: Partial) {\n super();\n this.load(properties, options);\n }\n public getDuration() {\n let time = 0;\n\n this.forEach(item => {\n time = Math.max(time, item.getTotalDuration() / item.getPlaySpeed());\n });\n return time || this.state[DURATION];\n }\n public setDuration(duration: number) {\n const items = this.items;\n const sceneDuration = this.getDuration();\n\n if (duration === 0 || !isFinite(sceneDuration)) {\n return this;\n }\n if (sceneDuration === 0) {\n this.forEach(item => {\n item.setDuration(duration);\n });\n } else {\n const ratio = duration / sceneDuration;\n\n this.forEach(item => {\n item.setDelay(item.getDelay() * ratio);\n item.setDuration(item.getDuration() * ratio);\n });\n }\n super.setDuration(duration);\n return this;\n }\n public getItem(name: number | string): T;\n /**\n * get item in scene by name\n * @param - The item's name\n * @return {Scene | SceneItem} item\n * @example\n const item = scene.getItem(\"item1\")\n */\n public getItem(name: number | string) {\n return this.items.get(name);\n }\n /**\n * create item in scene\n * @param {} name - name of item to create\n * @param {} options - The option object of SceneItem\n * @return {} Newly created item\n * @example\n const item = scene.newItem(\"item1\")\n */\n public newItem(name: number | string, options: Partial = {}): Scene | SceneItem {\n if (this.items.has(name)) {\n return this.items.get(name);\n }\n const item = new SceneItem();\n\n this.setItem(name, item);\n item.setOptions(options);\n\n return item;\n }\n /**\n * remove item in scene\n * @param - name of item to remove\n * @return An instance itself\n * @example\n const item = scene.newItem(\"item1\")\n\n scene.removeItem(\"item1\");\n */\n public removeItem(name: number | string): this {\n this.items.remove(name);\n return this;\n }\n /**\n * add a sceneItem to the scene\n * @param - name of item to create\n * @param - sceneItem\n * @example\n const item = scene.newItem(\"item1\")\n */\n public setItem(name: number | string, item: Scene | SceneItem) {\n item.setId(name);\n this.items.set(name, item);\n return this;\n }\n public setTime(time: number | string, isTick?: boolean, isParent?: boolean, parentEasing?: EasingType) {\n super.setTime(time, isTick, isParent);\n\n const iterationTime = this.getIterationTime();\n const easing = this.getEasing() || parentEasing;\n const frames: IObject = {};\n\n this.forEach(item => {\n item.setTime(iterationTime * item.getPlaySpeed() - item.getDelay(), isTick, true, easing);\n\n frames[item.getId()] = item.temp;\n });\n this.temp = frames;\n\n /**\n * This event is fired when timeupdate and animate.\n * @event Scene#animate\n * @param {object} param The object of data to be sent to an event.\n * @param {number} param.currentTime The total time that the animator is running.\n * @param {number} param.time The iteration time during duration that the animator is running.\n * @param {object} param.frames frames of that time.\n * @example\nconst scene = new Scene({\n a: {\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n },\n b: {\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n }\n }\n}).on(\"animate\", e => {\n console.log(e.frames);\n // {a: Frame, b: Frame}\n console.log(e.frames.a.get(\"opacity\"));\n});\n */\n this.trigger(\"animate\", {\n frames,\n currentTime: this.getTime(),\n time: iterationTime,\n });\n\n return this;\n }\n /**\n * executes a provided function once for each scene item.\n * @param - Function to execute for each element, taking three arguments\n * @return {Scene} An instance itself\n */\n public forEach(\n func: (\n item: Scene | SceneItem,\n id: string | number,\n index: number,\n items: IObject,\n ) => void,\n ) {\n const items = this.items;\n\n items.forEach((item, id, index, obj) => {\n func(item, id, index, obj);\n });\n return this;\n }\n public toCSS(\n playCondition?: PlayCondition,\n duration: number = this.getDuration(), parentStates: AnimatorState[] = []) {\n const totalDuration = !duration || !isFinite(duration) ? 0 : duration;\n const styles: string[] = [];\n const state = this.state;\n\n state[DURATION] = this.getDuration();\n\n this.forEach(item => {\n styles.push(item.toCSS(playCondition, totalDuration, parentStates.concat(state)));\n });\n return styles.join(\"\");\n }\n /**\n * Export the CSS of the items to the style.\n * @param - Add a selector or className to play.\n * @return {Scene} An instance itself\n */\n public exportCSS(\n playCondition?: PlayCondition, duration?: number, parentStates?: AnimatorState[]) {\n const css = this.toCSS(playCondition, duration, parentStates);\n\n (!parentStates || !parentStates.length) && exportCSS(getRealId(this), css);\n return this;\n }\n public append(item: SceneItem | Scene) {\n item.setDelay(item.getDelay() + this.getDuration());\n this.setItem(getRealId(item), item);\n }\n public pauseCSS() {\n return this.forEach(item => {\n item.pauseCSS();\n });\n }\n public pause() {\n super.pause();\n\n isPausedCSS(this) && this.pauseCSS();\n this.forEach(item => {\n item.pause();\n });\n return this;\n }\n public endCSS() {\n this.forEach(item => {\n item.endCSS();\n });\n setPlayCSS(this, false);\n }\n public end() {\n isEndedCSS(this) && this.endCSS();\n super.end();\n return this;\n }\n public addPlayClass(isPaused: boolean, playClassName?: string, properties: object = {}) {\n let animtionElement: AnimateElement;\n\n this.forEach(item => {\n const el = item.addPlayClass(isPaused, playClassName, properties);\n\n !animtionElement && (animtionElement = el);\n });\n return animtionElement;\n }\n /**\n * Play using the css animation and keyframes.\n * @param - Check if you want to export css.\n * @param [playClassName=\"startAnimation\"] - Add a class name to play.\n * @param - The shorthand properties for six of the animation properties.\n * @return {Scene} An instance itself\n * @see {@link https://www.w3schools.com/cssref/css3_pr_animation.asp}\n * @example\n scene.playCSS();\n scene.playCSS(false, {\n direction: \"reverse\",\n fillMode: \"forwards\",\n });\n */\n public playCSS(isExportCSS = true, playClassName?: string, properties: Partial = {}) {\n playCSS(this, isExportCSS, playClassName, properties);\n return this;\n }\n public set(properties: any, ...args: any[]): this;\n /**\n * Set properties to the Scene.\n * @param - properties\n * @return An instance itself\n * @example\nscene.set({\n \".a\": {\n 0: {\n opacity: 0,\n },\n 1: {\n opacity: 1,\n },\n },\n});\n// 0\nconsole.log(scene.getItem(\".a\").get(0, \"opacity\"));\n// 1\nconsole.log(scene.getItem(\".a\").get(1, \"opacity\"));\n */\n public set(properties: any) {\n this.load(properties);\n return this;\n }\n public load(properties: any = {}, options = properties.options) {\n if (!properties) {\n return this;\n }\n const selector = options && options[SELECTOR] || this.state[SELECTOR];\n for (const name in properties) {\n if (name === \"options\") {\n continue;\n }\n const object = properties[name];\n let item;\n\n if (object instanceof Scene || object instanceof SceneItem) {\n this.setItem(name, object);\n item = object;\n } else if (isFunction(object) && selector) {\n const elements =\n IS_WINDOW\n ? $(`${isFunction(selector) ? selector(name) : name}`, true) as IArrayFormat\n : ([] as AnimateElement[]);\n const length = elements.length;\n const scene = new Scene();\n\n for (let i = 0; i < length; ++i) {\n (scene.newItem(i) as SceneItem).setId().setElement(elements[i]).load(object(i, elements[i]));\n }\n this.setItem(name, scene);\n continue;\n } else {\n item = this.newItem(name);\n item.load(object);\n }\n selector && item.setSelector(selector);\n }\n this.setOptions(options);\n }\n public setOptions(options: Partial = {}): this {\n super.setOptions(options);\n\n const selector = options.selector;\n\n if (selector) {\n this.state[SELECTOR] = selector;\n }\n return this;\n }\n public setSelector(target?: string | boolean | ((id: number | string) => string)) {\n const state = this.state;\n const selector = target || state[SELECTOR];\n\n state[SELECTOR] = selector;\n const isItFunction = isFunction(target);\n if (selector) {\n this.forEach((item, name) => {\n item.setSelector(isItFunction ? (target as (id: number | string) => string)(name) : selector);\n });\n }\n return this;\n }\n public start(delay: number = this.state[DELAY]): boolean {\n const result = super.start(delay);\n\n if (result) {\n this.forEach(item => {\n item.start(0);\n });\n } else {\n this.forEach(item => {\n item.setPlayState(RUNNING);\n });\n }\n return result;\n }\n}\n\nexport default Scene;\n","import { IObject } from \"@daybrush/utils\";\nimport Scene from \"./Scene\";\nimport SceneItem from \"./SceneItem\";\nimport { SceneOptions, SceneItemOptions } from \"./types\";\n\nexport function animate(properties?: IObject, options?: Partial) {\n return new Scene(properties, options).play();\n}\nexport function animateItem(properties?: IObject, options?: Partial) {\n return new SceneItem(properties, options).play();\n}\n","import Scene, * as others from \"./index\";\n\nfor (const name in others) {\n (Scene as any)[name] = (others as any)[name];\n}\n\nexport default Scene;\n"],"names":["y1","y2","t","t2","x1","x2","func","x","dx","Math","abs","cubic","solveFromX","max","min","easingName","count","position","time","level","floor","STEP_START","steps","STEP_END","LINEAR","bezier","EASE","EASE_IN","EASE_OUT","EASE_IN_OUT","PREFIX","DATA_SCENE_ID","TIMING_FUNCTION","ROLES","transform","filter","attribute","html","ALIAS","easing","FIXED","_a","MAXIMUM","THRESHOLD","DURATION","FILL_MODE","DIRECTION","ITERATION_COUNT","DELAY","EASING","PLAY_SPEED","EASING_NAME","PAUSED","ENDED","TIMEUPDATE","PLAY","RUNNING","ITERATION","START_ANIMATION","PAUSE_ANIMATION","ALTERNATE","REVERSE","ALTERNATE_REVERSE","INFINITE","PLAY_STATE","PLAY_CSS","PREV_TIME","TICK_TIME","CURRENT_TIME","SELECTOR","EASINGS","OPTIONS","EVENTS","events","name","callback","once","this","isObject","n","_on","isArray","forEach","_this","push","_i","args","off","callback2","callbacks","index","indexOf","splice","data","target","type","currentTarget","toArray","apply","value","options","setOptions","isString","split","separator","newOptions","length","prefix","suffix","model","PropertyObject","map","v","clone","join","toValue","arr","RGBA","arrayToPropertyObject","values","splitComma","toPropertyObject","splitSpace","exec","text","afterModel","COLOR_MODELS","arrayToColorObject","stringToRGBA","obj","stringToBracketObject","charAt","result","stringToColorObject","OBJECT","ARRAY","isPropertyObject","PROPERTY","STRING","NUMBER","constructor","Object","names","stack","isPureObject","concat","getNames","pop","slice","properties","updateFrame","num","round","i","roles","isCheckTrue","role","isInProperties","item","isActivate","state","isPaused","isEnded","id","css","styleId","toId","styleElement","$","innerText","document","body","insertAdjacentHTML","selector","random","IS_WINDOW","getId","setId","makeId","match","isExportCSS","playClassName","ANIMATION","getPlayState","className","isPausedCSS","addPlayClass","setTime","exportCSS","el","animationend","setPlayCSS","finish","animationstart","trigger","duration","getDuration","isZeroDuration","isFinite","removeEvent","animationiteration","currentTime","iterationCount","setIteration","addEvent","addAnimationEvent","setPlayState","curveArray","parseFloat","iteration","iteraiontCount","direction","setters","getters","_super","delay","fillMode","playSpeed","iterationTime","tickTime","prevTime","playState","tslib_1","getEasing","setDuration","setEasing","getActiveDuration","Infinity","getTime","toTime","timerId","requestAnimationFrame","tick","start","cancelAnimationFrame","end","pause","isTick","isParent","activeDuration","getUnitTime","calculate","isDelay","getIterationTime","unit","toFixed","passIterationCount","maxIterationCount","currentIterationTime","setIterationTime","isReverse","isDirectionReverse","isFiniteDuration","now","to","Animator","getter","setter","parent","prototype","camelize","GetterSetter","EventTrigger","arrObj","replace","merge","from","getType","FUNCTION","getValue","set","raw","getPropertyName","getValueByNames","params","self","firstParam","Frame","_set","isRole","object","size","get","toObject","has","isFixed","str","splitText","matches","trim","styles","stylesLength","isUndefined","frame","frameProperties","cssObject","toInnerProperties","TRANSFORM","FILTER","toCSSObject","cssArray","lastParam","a1","a2","b1","b2","v1","dot","a1Type","color1","color2","value1","value2","model1","dotArray","colorModel","parseInt","dotColor","type1","type2","isFunction1","isFunction2","dotObject","splitUnit","v2","isNaN","dotNumber","times","decamelize","entries","keytime","prevEntry","load","originalDuration","ratio_1","items_1","obj_1","time2","items","newFrame","elements","sceneId_1","element","setAttribute","SceneItem","eachTime","realTime","innerValue","value_1","getDelay","frames","hasFrame","getDirection","frameTime","nextTime","needUpdate","getFrame","remove","removeFrame","append","unshiftTime","firstFrame","unshift","prepend","isStartZero","isFunction","setElement","Element","style","targetFunc","attributes","html_1","innerHTML","cssText","toCSS","fromCSS","parentEasing","getNowFrame","temp","setFrame","addTime","update","isAccurate","left","right","realEasing","nameObject","hasName","nowEasing","getNowValue","prevNames","keyframes","setTarget","setSelector","playCondition","parentDuration","states","itemState","reversedStates","reverse","getRealId","superParent","infiniteIndex","findIndex","finiteStates","reduce","prev","cur","find","makeAnimationProperties","timingFunction","selectors","sel","selectorCallback","peusdo","KEYFRAMES","_toKeyframes","pauseCSS","addClass","removeClass","isEndedCSS","endCSS","playCSS","hasClass","usePrevValue","prevFrame","nextFrame","isUndefinedLeft","isUndefinedRight","indicies","getNearTimeIndex","prevValue","undefined","nextValue","ratio","dotValue","nextEntries","intCount","ceil","currentDuration","lastTime","j","entry","divideTime","addEntry","getEntries","lastEntry","ListMap","getTotalDuration","getPlaySpeed","sceneDuration","setDelay","setItem","parentStates","totalDuration","animtionElement","Scene","scene","newItem","isItFunction","isProperty","isFixedProperty","fixed","alias","play","others"],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d5498068..72e8e140 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "scenejs", - "version": "1.1.7", + "version": "1.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -229,9 +229,9 @@ } }, "@daybrush/utils": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@daybrush/utils/-/utils-0.10.4.tgz", - "integrity": "sha512-gqnTIsaHbqOuIEDwtZIkxZuIRo1yT2rY7jesTYW/Niu9jfv6RiIyhlLHq9j3Z4Ua8eeaydRvBzST1CU+aoo79A==" + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@daybrush/utils/-/utils-0.10.5.tgz", + "integrity": "sha512-VCPbgJgImkUmGHX33drZJh/5FYBhfSM+EFqlBY7fzKIahBGEemjYfninVSp9BdzqF9P2MyCh7R3hgxmySXLEzg==" }, "@egjs/component": { "version": "2.1.2", diff --git a/package.json b/package.json index f320969a..0ce207a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scenejs", - "version": "1.1.7", + "version": "1.2.0", "description": "JavaScript & CSS timeline-based animation library", "main": "dist/scene.cjs.js", "module": "dist/scene.esm.js", @@ -75,7 +75,7 @@ "typescript": "^2.8.4" }, "dependencies": { - "@daybrush/utils": "^0.10.4", + "@daybrush/utils": "^0.10.5", "list-map": "^0.1.1" } }