diff --git a/.gitignore b/.gitignore
index 0c2d8f58..3b847572 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,7 @@ node_modules/
*.DS_Store
.DS_Store
doc/
-dist/
+
demo/dist/
release/
npm-debug.log*
diff --git a/dist/scene.cjs.js b/dist/scene.cjs.js
new file mode 100644
index 00000000..48db8e87
--- /dev/null
+++ b/dist/scene.cjs.js
@@ -0,0 +1,3814 @@
+/*
+Copyright (c) 2016 Daybrush
+name: scenejs
+license: MIT
+author: Daybrush
+repository: https://github.com/daybrush/scenejs.git
+version: 1.0.1
+*/
+'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: {}
+};
+var ALIAS = {
+ easing: [TIMING_FUNCTION]
+};
+var FIXED = (_a = {}, _a[TIMING_FUNCTION] = true, _a.contents = 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;
+}();
+
+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);
+}
+
+/**
+* @namespace
+* @name Property
+*/
+function splitStyle(str) {
+ var properties = str.split(";");
+ var obj = {};
+ var length = properties.length;
+
+ for (var i = 0; i < length; ++i) {
+ var matches = /([^:]*):([\S\s]*)/g.exec(properties[i]);
+
+ if (!matches || matches.length < 3 || !matches[1]) {
+ --length;
+ continue;
+ }
+
+ obj[matches[1].trim()] = toPropertyObject(matches[2].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);
+ 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) {
+ 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) === "#") {
+ 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 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;
+
+ if (utils.isString(curveArray)) {
+ if (curveArray in EASINGS) {
+ easing = EASINGS[curveArray];
+ } else {
+ var obj = toPropertyObject(curveArray);
+
+ if (utils.isString(obj)) {
+ return this;
+ } 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 this;
+ }
+ }
+ }
+ } else if (utils.isArray(curveArray)) {
+ easing = bezier(curveArray[0], curveArray[1], curveArray[2], curveArray[3]);
+ } else {
+ easing = curveArray;
+ }
+
+ var easingName = 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);
+ }
+
+ state[TICK_TIME] = this.getTime();
+ 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];
+
+ if (params[0] in ALIAS) {
+ self._set(ALIAS[params[0]], value);
+ } else if (length === 2 && utils.isArray(params[0])) {
+ self._set(params[0], value);
+ } else if (utils.isArray(value)) {
+ self._set(params, value);
+ } else if (isPropertyObject(value)) {
+ if (isRole(params)) {
+ self.set.apply(self, params.concat([toObject(value)]));
+ } else {
+ self._set(params, value);
+ }
+ } else if (utils.isObject(value)) {
+ 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) {
+ return this;
+ }
+
+ 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";
+ continue;
+ }
+
+ 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("");
+ };
+
+ __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;
+ }
+
+ properties[args[length - 1]] = utils.isString(value) ? toPropertyObject(value) : 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;
+ state.id = id || makeId(!!length);
+ var elements = this.elements;
+
+ if (elements.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 (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];
+ var realTime = this_1.getUnitTime(t);
+
+ if (isNaN(realTime)) {
+ getNames(value, [t]).forEach(function (names) {
+ 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) {
+ _this.newFrame(i / (length - 1) * 100 + "%").set(names, arr[i]);
+ }
+ });
+ } else {
+ this_1.set(realTime, value);
+ }
+ };
+
+ var this_1 = this;
+
+ for (var t in time) {
+ _loop_1(t);
+ }
+ } else {
+ var value = args[0];
+
+ if (value instanceof Frame) {
+ this.setFrame(time, value);
+ } else if (value instanceof SceneItem) {
+ var delay = value.getDelay();
+ var realTime = this.getUnitTime(time);
+ var frames = value.toObject(!this.hasFrame(realTime + delay));
+ var duration = value.getDuration();
+ var direction = value.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)) {
+ value.forEach(function (item) {
+ _this.set(time, item);
+ });
+ } else {
+ var frame = this.newFrame(time);
+ 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);
+ }
+ }
+
+ 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[0], matches[1]];
+ } 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];
+ };
+
+ __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);
+ // {a: Frame, b: Frame}
+ console.log(e.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;
+ };
+
+ __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.0.1
+ */
+
+
+ Scene.VERSION = "1.0.1";
+ 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..57b7b6dd
--- /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.ts","../src/utils/property.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: {} };\nexport const ALIAS: IObject = { easing: [TIMING_FUNCTION] };\nexport const FIXED = { [TIMING_FUNCTION]: true, contents: 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","import {\n ROLES, MAXIMUM, FIXED, ALIAS,\n PAUSED, RUNNING, PLAY, ENDED, PREFIX, PLAY_CSS, CURRENT_TIME, START_ANIMATION\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,\n} from \"@daybrush/utils\";\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: string[], 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: string[], isCheckTrue?: boolean) {\n return isInProperties(ROLES, args, isCheckTrue);\n}\nexport function isFixed(args: string[]) {\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","/**\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\n} from \"@daybrush/utils\";\n\nexport function splitStyle(str: string) {\n const properties = str.split(\";\");\n const obj: IObject = {};\n let length = properties.length;\n\n for (let i = 0; i < length; ++i) {\n const matches = /([^:]*):([\\S\\s]*)/g.exec(properties[i]);\n\n if (!matches || matches.length < 3 || !matches[1]) {\n --length;\n continue;\n }\n obj[matches[1].trim()] = toPropertyObject(matches[2].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);\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[]): PropertyObject;\nexport function toPropertyObject(value: IObject): IObject;\nexport function toPropertyObject(value: string): PropertyObject | string;\nexport function toPropertyObject(value: string | IObject | any[]) {\n if (!isString(value)) {\n if (isArray(value)) {\n return arrayToPropertyObject(value, \",\");\n }\n return value;\n }\n let values = splitComma(value);\n\n if (values.length > 1) {\n return arrayToPropertyObject(values.map(v => toPropertyObject(v)), \",\");\n }\n values = splitSpace(value);\n if (values.length > 1) {\n return arrayToPropertyObject(values.map(v => toPropertyObject(v)), \" \");\n }\n values = /^(['\"])([^'\"]*)(['\"])$/g.exec(value);\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) === \"#\") {\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 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 } 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 let easing: EasingFunction;\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 this;\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 this;\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 const easingName = easing[EASING_NAME] || \"linear\";\n\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 state[TICK_TIME] = this.getTime();\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, updateFrame } 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\n if (params[0] in ALIAS) {\n self._set(ALIAS[params[0]], value);\n } else if (length === 2 && isArray(params[0])) {\n self._set(params[0], value);\n } else if (isArray(value)) {\n self._set(params, 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 (isObject(value)) {\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 return this;\n }\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 continue;\n }\n cssObject[name] = value;\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 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 properties[args[length - 1]] = isString(value) ? toPropertyObject(value) : value;\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\n state.id = id || makeId(!!length);\n const elements = this.elements;\n\n if (elements.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 (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 const realTime = this.getUnitTime(t);\n\n if (isNaN(realTime)) {\n getNames(value, [t]).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 } else {\n const value = args[0];\n\n if (value instanceof Frame) {\n this.setFrame(time, value);\n } else if (value instanceof SceneItem) {\n const delay = value.getDelay();\n const realTime = this.getUnitTime(time);\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(time, item);\n });\n } else {\n const frame = this.newFrame(time);\n\n frame.set(...args);\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 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[0], matches[1]];\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 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?: 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);\n // {a: Frame, b: Frame}\n console.log(e.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 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","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","alias","names","isProperty","isFixedProperty","roles","fixed","i","OBJECT","ARRAY","isPropertyObject","PROPERTY","STRING","NUMBER","obj","constructor","Object","stack","isPureObject","concat","getNames","pop","slice","properties","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","text","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","str","matches","exec","trim","toPropertyObject","styles","RGBA","afterModel","COLOR_MODELS","arrayToColorObject","stringToRGBA","result","arrayToPropertyObject","values","splitComma","splitSpace","stringToBracketObject","charAt","stringToColorObject","object","size","get","toObject","getter","setter","parent","prototype","camelize","iteration","iteraiontCount","direction","setters","getters","tslib_1","_super","delay","fillMode","playSpeed","iterationTime","tickTime","prevTime","playState","curveArray","parseFloat","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","_set","isRole","isFixed","stylesLength","isUndefined","frame","Frame","frameProperties","cssObject","toInnerProperties","TRANSFORM","FILTER","toCSSObject","cssArray","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","realTime","this_1","innerValue","setFrame","SceneItem","getDelay","frames","hasFrame","getDirection","frameTime","needUpdate","getFrame","remove","removeFrame","append","unshiftTime","firstFrame","prepend","isStartZero","isFunction","setElement","Element","style","targetFunc","attributes","cssText","toCSS","fromCSS","parentEasing","getEasing","getNowFrame","temp","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","has","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..40f41f23
--- /dev/null
+++ b/dist/scene.esm.js
@@ -0,0 +1,3783 @@
+/*
+Copyright (c) 2016 Daybrush
+name: scenejs
+license: MIT
+author: Daybrush
+repository: https://github.com/daybrush/scenejs.git
+version: 1.0.1
+*/
+import { isObject, isArray, toArray, isString, $, document, IS_WINDOW, ANIMATION, removeEvent, addEvent, OBJECT, ARRAY, PROPERTY, STRING, NUMBER, splitComma, splitSpace, RGBA, splitBracket, COLOR_MODELS, stringToRGBA, 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: {}
+};
+var ALIAS = {
+ easing: [TIMING_FUNCTION]
+};
+var FIXED = (_a = {}, _a[TIMING_FUNCTION] = true, _a.contents = 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;
+}();
+
+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);
+}
+
+/**
+* @namespace
+* @name Property
+*/
+function splitStyle(str) {
+ var properties = str.split(";");
+ var obj = {};
+ var length = properties.length;
+
+ for (var i = 0; i < length; ++i) {
+ var matches = /([^:]*):([\S\s]*)/g.exec(properties[i]);
+
+ if (!matches || matches.length < 3 || !matches[1]) {
+ --length;
+ continue;
+ }
+
+ obj[matches[1].trim()] = toPropertyObject(matches[2].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);
+ 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) {
+ 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) === "#") {
+ 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 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;
+
+ if (isString(curveArray)) {
+ if (curveArray in EASINGS) {
+ easing = EASINGS[curveArray];
+ } else {
+ var obj = toPropertyObject(curveArray);
+
+ if (isString(obj)) {
+ return this;
+ } 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 this;
+ }
+ }
+ }
+ } else if (isArray(curveArray)) {
+ easing = bezier(curveArray[0], curveArray[1], curveArray[2], curveArray[3]);
+ } else {
+ easing = curveArray;
+ }
+
+ var easingName = 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);
+ }
+
+ state[TICK_TIME] = this.getTime();
+ 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];
+
+ if (params[0] in ALIAS) {
+ self._set(ALIAS[params[0]], value);
+ } else if (length === 2 && isArray(params[0])) {
+ self._set(params[0], value);
+ } else if (isArray(value)) {
+ self._set(params, value);
+ } else if (isPropertyObject(value)) {
+ if (isRole(params)) {
+ self.set.apply(self, params.concat([toObject(value)]));
+ } else {
+ self._set(params, value);
+ }
+ } else if (isObject(value)) {
+ 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) {
+ return this;
+ }
+
+ 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";
+ continue;
+ }
+
+ 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("");
+ };
+
+ __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;
+ }
+
+ properties[args[length - 1]] = isString(value) ? toPropertyObject(value) : 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;
+ state.id = id || makeId(!!length);
+ var elements = this.elements;
+
+ if (elements.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 (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];
+ var realTime = this_1.getUnitTime(t);
+
+ if (isNaN(realTime)) {
+ getNames(value, [t]).forEach(function (names) {
+ 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) {
+ _this.newFrame(i / (length - 1) * 100 + "%").set(names, arr[i]);
+ }
+ });
+ } else {
+ this_1.set(realTime, value);
+ }
+ };
+
+ var this_1 = this;
+
+ for (var t in time) {
+ _loop_1(t);
+ }
+ } else {
+ var value = args[0];
+
+ if (value instanceof Frame) {
+ this.setFrame(time, value);
+ } else if (value instanceof SceneItem) {
+ var delay = value.getDelay();
+ var realTime = this.getUnitTime(time);
+ var frames = value.toObject(!this.hasFrame(realTime + delay));
+ var duration = value.getDuration();
+ var direction = value.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)) {
+ value.forEach(function (item) {
+ _this.set(time, item);
+ });
+ } else {
+ var frame = this.newFrame(time);
+ 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);
+ }
+ }
+
+ 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[0], matches[1]];
+ } 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];
+ };
+
+ __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);
+ // {a: Frame, b: Frame}
+ console.log(e.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;
+ };
+
+ __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.0.1
+ */
+
+
+ Scene.VERSION = "1.0.1";
+ 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..a788f603
--- /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.ts","../src/utils/property.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: {} };\nexport const ALIAS: IObject = { easing: [TIMING_FUNCTION] };\nexport const FIXED = { [TIMING_FUNCTION]: true, contents: 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","import {\n ROLES, MAXIMUM, FIXED, ALIAS,\n PAUSED, RUNNING, PLAY, ENDED, PREFIX, PLAY_CSS, CURRENT_TIME, START_ANIMATION\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,\n} from \"@daybrush/utils\";\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: string[], 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: string[], isCheckTrue?: boolean) {\n return isInProperties(ROLES, args, isCheckTrue);\n}\nexport function isFixed(args: string[]) {\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","/**\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\n} from \"@daybrush/utils\";\n\nexport function splitStyle(str: string) {\n const properties = str.split(\";\");\n const obj: IObject = {};\n let length = properties.length;\n\n for (let i = 0; i < length; ++i) {\n const matches = /([^:]*):([\\S\\s]*)/g.exec(properties[i]);\n\n if (!matches || matches.length < 3 || !matches[1]) {\n --length;\n continue;\n }\n obj[matches[1].trim()] = toPropertyObject(matches[2].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);\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[]): PropertyObject;\nexport function toPropertyObject(value: IObject): IObject;\nexport function toPropertyObject(value: string): PropertyObject | string;\nexport function toPropertyObject(value: string | IObject | any[]) {\n if (!isString(value)) {\n if (isArray(value)) {\n return arrayToPropertyObject(value, \",\");\n }\n return value;\n }\n let values = splitComma(value);\n\n if (values.length > 1) {\n return arrayToPropertyObject(values.map(v => toPropertyObject(v)), \",\");\n }\n values = splitSpace(value);\n if (values.length > 1) {\n return arrayToPropertyObject(values.map(v => toPropertyObject(v)), \" \");\n }\n values = /^(['\"])([^'\"]*)(['\"])$/g.exec(value);\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) === \"#\") {\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 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 } 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 let easing: EasingFunction;\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 this;\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 this;\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 const easingName = easing[EASING_NAME] || \"linear\";\n\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 state[TICK_TIME] = this.getTime();\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, updateFrame } 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\n if (params[0] in ALIAS) {\n self._set(ALIAS[params[0]], value);\n } else if (length === 2 && isArray(params[0])) {\n self._set(params[0], value);\n } else if (isArray(value)) {\n self._set(params, 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 (isObject(value)) {\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 return this;\n }\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 continue;\n }\n cssObject[name] = value;\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 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 properties[args[length - 1]] = isString(value) ? toPropertyObject(value) : value;\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\n state.id = id || makeId(!!length);\n const elements = this.elements;\n\n if (elements.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 (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 const realTime = this.getUnitTime(t);\n\n if (isNaN(realTime)) {\n getNames(value, [t]).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 } else {\n const value = args[0];\n\n if (value instanceof Frame) {\n this.setFrame(time, value);\n } else if (value instanceof SceneItem) {\n const delay = value.getDelay();\n const realTime = this.getUnitTime(time);\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(time, item);\n });\n } else {\n const frame = this.newFrame(time);\n\n frame.set(...args);\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 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[0], matches[1]];\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 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?: 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);\n // {a: Frame, b: Frame}\n console.log(e.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 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","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","alias","names","isProperty","isFixedProperty","roles","fixed","i","OBJECT","ARRAY","isPropertyObject","PROPERTY","STRING","NUMBER","obj","constructor","Object","stack","isPureObject","concat","getNames","pop","slice","properties","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","text","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","str","matches","exec","trim","toPropertyObject","styles","RGBA","afterModel","COLOR_MODELS","arrayToColorObject","stringToRGBA","result","arrayToPropertyObject","values","splitComma","splitSpace","stringToBracketObject","charAt","stringToColorObject","object","size","get","toObject","getter","setter","parent","prototype","camelize","iteration","iteraiontCount","direction","setters","getters","tslib_1","_super","delay","fillMode","playSpeed","iterationTime","tickTime","prevTime","playState","curveArray","parseFloat","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","_set","isRole","isFixed","stylesLength","isUndefined","frame","Frame","frameProperties","cssObject","toInnerProperties","TRANSFORM","FILTER","toCSSObject","cssArray","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","realTime","this_1","innerValue","setFrame","SceneItem","getDelay","frames","hasFrame","getDirection","frameTime","needUpdate","getFrame","remove","removeFrame","append","unshiftTime","firstFrame","prepend","isStartZero","isFunction","setElement","Element","style","targetFunc","attributes","cssText","toCSS","fromCSS","parentEasing","getEasing","getNowFrame","temp","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","has","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..fb00a52d
--- /dev/null
+++ b/dist/scene.js
@@ -0,0 +1,4958 @@
+/*
+Copyright (c) 2016 Daybrush
+name: scenejs
+license: MIT
+author: Daybrush
+repository: https://github.com/daybrush/scenejs.git
+version: 1.0.1
+*/
+(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: {}
+ };
+ var ALIAS = {
+ easing: [TIMING_FUNCTION]
+ };
+ var FIXED = (_a = {}, _a[TIMING_FUNCTION] = true, _a.contents = 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.0
+ */
+ /**
+ * @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");
+
+ /**
+ * @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;
+ }
+ /**
+ * 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(,)
+ var matches = text.match(/("[^"]*")|('[^']*')|([^\s()]*(?:\((?:[^()]*|\([^()]*\))*\))[^\s()]*)|\S+/g);
+ return matches || [];
+ }
+ /**
+ * 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(,)
+ // "[^"]*"|'[^']*'
+ var matches = text.match(/("[^"]*"|'[^']*'|[^,\s()]*\((?:[^()]*|\([^()]*\))*\)[^,\s()]*|[^,])+/g);
+ return matches ? matches.map(function (str) {
+ return str.trim();
+ }) : [];
+ }
+ /**
+ * 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;
+ }();
+
+ 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);
+ }
+
+ /**
+ * @namespace
+ * @name Property
+ */
+ function splitStyle(str) {
+ var properties = str.split(";");
+ var obj = {};
+ var length = properties.length;
+
+ for (var i = 0; i < length; ++i) {
+ var matches = /([^:]*):([\S\s]*)/g.exec(properties[i]);
+
+ if (!matches || matches.length < 3 || !matches[1]) {
+ --length;
+ continue;
+ }
+
+ obj[matches[1].trim()] = toPropertyObject(matches[2].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);
+ 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) {
+ 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) === "#") {
+ 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 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;
+
+ if (isString(curveArray)) {
+ if (curveArray in EASINGS) {
+ easing = EASINGS[curveArray];
+ } else {
+ var obj = toPropertyObject(curveArray);
+
+ if (isString(obj)) {
+ return this;
+ } 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 this;
+ }
+ }
+ }
+ } else if (isArray(curveArray)) {
+ easing = bezier(curveArray[0], curveArray[1], curveArray[2], curveArray[3]);
+ } else {
+ easing = curveArray;
+ }
+
+ var easingName = 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);
+ }
+
+ state[TICK_TIME] = this.getTime();
+ 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];
+
+ if (params[0] in ALIAS) {
+ self._set(ALIAS[params[0]], value);
+ } else if (length === 2 && isArray(params[0])) {
+ self._set(params[0], value);
+ } else if (isArray(value)) {
+ self._set(params, value);
+ } else if (isPropertyObject(value)) {
+ if (isRole(params)) {
+ self.set.apply(self, params.concat([toObject(value)]));
+ } else {
+ self._set(params, value);
+ }
+ } else if (isObject(value)) {
+ 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) {
+ return this;
+ }
+
+ 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";
+ continue;
+ }
+
+ 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("");
+ };
+
+ __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;
+ }
+
+ properties[args[length - 1]] = isString(value) ? toPropertyObject(value) : 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;
+ state.id = id || makeId(!!length);
+ var elements = this.elements;
+
+ if (elements.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 (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];
+ var realTime = this_1.getUnitTime(t);
+
+ if (isNaN(realTime)) {
+ getNames(value, [t]).forEach(function (names) {
+ 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) {
+ _this.newFrame(i / (length - 1) * 100 + "%").set(names, arr[i]);
+ }
+ });
+ } else {
+ this_1.set(realTime, value);
+ }
+ };
+
+ var this_1 = this;
+
+ for (var t in time) {
+ _loop_1(t);
+ }
+ } else {
+ var value = args[0];
+
+ if (value instanceof Frame) {
+ this.setFrame(time, value);
+ } else if (value instanceof SceneItem) {
+ var delay = value.getDelay();
+ var realTime = this.getUnitTime(time);
+ var frames = value.toObject(!this.hasFrame(realTime + delay));
+ var duration = value.getDuration();
+ var direction = value.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)) {
+ value.forEach(function (item) {
+ _this.set(time, item);
+ });
+ } else {
+ var frame = this.newFrame(time);
+ 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);
+ }
+ }
+
+ 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[0], matches[1]];
+ } 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];
+ };
+
+ __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);
+ // {a: Frame, b: Frame}
+ console.log(e.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;
+ };
+
+ __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.0.1
+ */
+
+
+ Scene.VERSION = "1.0.1";
+ 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..481529f1
--- /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.ts","../src/utils/property.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: {} };\nexport const ALIAS: IObject = { easing: [TIMING_FUNCTION] };\nexport const FIXED = { [TIMING_FUNCTION]: true, contents: 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","import {\n ROLES, MAXIMUM, FIXED, ALIAS,\n PAUSED, RUNNING, PLAY, ENDED, PREFIX, PLAY_CSS, CURRENT_TIME, START_ANIMATION\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,\n} from \"@daybrush/utils\";\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: string[], 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: string[], isCheckTrue?: boolean) {\n return isInProperties(ROLES, args, isCheckTrue);\n}\nexport function isFixed(args: string[]) {\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","/**\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\n} from \"@daybrush/utils\";\n\nexport function splitStyle(str: string) {\n const properties = str.split(\";\");\n const obj: IObject = {};\n let length = properties.length;\n\n for (let i = 0; i < length; ++i) {\n const matches = /([^:]*):([\\S\\s]*)/g.exec(properties[i]);\n\n if (!matches || matches.length < 3 || !matches[1]) {\n --length;\n continue;\n }\n obj[matches[1].trim()] = toPropertyObject(matches[2].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);\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[]): PropertyObject;\nexport function toPropertyObject(value: IObject): IObject;\nexport function toPropertyObject(value: string): PropertyObject | string;\nexport function toPropertyObject(value: string | IObject | any[]) {\n if (!isString(value)) {\n if (isArray(value)) {\n return arrayToPropertyObject(value, \",\");\n }\n return value;\n }\n let values = splitComma(value);\n\n if (values.length > 1) {\n return arrayToPropertyObject(values.map(v => toPropertyObject(v)), \",\");\n }\n values = splitSpace(value);\n if (values.length > 1) {\n return arrayToPropertyObject(values.map(v => toPropertyObject(v)), \" \");\n }\n values = /^(['\"])([^'\"]*)(['\"])$/g.exec(value);\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) === \"#\") {\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 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 } 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 let easing: EasingFunction;\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 this;\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 this;\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 const easingName = easing[EASING_NAME] || \"linear\";\n\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 state[TICK_TIME] = this.getTime();\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, updateFrame } 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\n if (params[0] in ALIAS) {\n self._set(ALIAS[params[0]], value);\n } else if (length === 2 && isArray(params[0])) {\n self._set(params[0], value);\n } else if (isArray(value)) {\n self._set(params, 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 (isObject(value)) {\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 return this;\n }\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 continue;\n }\n cssObject[name] = value;\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 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 properties[args[length - 1]] = isString(value) ? toPropertyObject(value) : value;\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\n state.id = id || makeId(!!length);\n const elements = this.elements;\n\n if (elements.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 (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 const realTime = this.getUnitTime(t);\n\n if (isNaN(realTime)) {\n getNames(value, [t]).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 } else {\n const value = args[0];\n\n if (value instanceof Frame) {\n this.setFrame(time, value);\n } else if (value instanceof SceneItem) {\n const delay = value.getDelay();\n const realTime = this.getUnitTime(time);\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(time, item);\n });\n } else {\n const frame = this.newFrame(time);\n\n frame.set(...args);\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 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[0], matches[1]];\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 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?: 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);\n // {a: Frame, b: Frame}\n console.log(e.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 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","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","alias","names","isProperty","isFixedProperty","roles","fixed","i","OBJECT","ARRAY","isPropertyObject","PROPERTY","STRING","NUMBER","obj","constructor","Object","stack","isPureObject","concat","getNames","pop","slice","properties","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","text","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","str","matches","exec","trim","toPropertyObject","styles","RGBA","afterModel","COLOR_MODELS","arrayToColorObject","stringToRGBA","result","arrayToPropertyObject","values","splitComma","splitSpace","stringToBracketObject","charAt","stringToColorObject","object","size","get","toObject","getter","setter","parent","prototype","camelize","iteration","iteraiontCount","direction","setters","getters","tslib_1","_super","delay","fillMode","playSpeed","iterationTime","tickTime","prevTime","playState","curveArray","parseFloat","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","_set","isRole","isFixed","stylesLength","isUndefined","frame","Frame","frameProperties","cssObject","toInnerProperties","TRANSFORM","FILTER","toCSSObject","cssArray","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","realTime","this_1","innerValue","setFrame","SceneItem","getDelay","frames","hasFrame","getDirection","frameTime","needUpdate","getFrame","remove","removeFrame","append","unshiftTime","firstFrame","prepend","isStartZero","isFunction","setElement","Element","style","targetFunc","attributes","cssText","toCSS","fromCSS","parentEasing","getEasing","getNowFrame","temp","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","has","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..42c0517b
--- /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.0.1
+*/
+!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 ne(t){for(;;){var e=""+Math.floor(1e7*Math.random());if(!ft||!t)return e;if(!Pt('[data-scene-id="'+e+'"]'))return e}}function ie(t){return t.getId()||t.setId(ne(!1)).getId()}function re(t){return(""+t).match(/[0-9a-zA-Z]+/g).join("")}function se(t,e,n,i){if(void 0===i&&(i={}),pt&&t.getPlayState()!==M){var r=n||U;if(Wt(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(){Qt(i,!1),i.finish()}function n(){i.trigger(_)}var r=i.state,s=i.getDuration(),a=!s||!isFinite(s);i.once(O,function(){zt(t,"animationcancel",e),zt(t,"animationend",e),zt(t,"animationiteration",o),zt(t,"animationstart",n)});var o=function(t){var e=t.elapsedTime,n=a?0:e/s;r[Y]=e,i.setIteration(n)};kt(t,"animationcancel",e),kt(t,"animationend",e),kt(t,"animationiteration",o),kt(t,"animationstart",n)}(t,s),Qt(t,!0)}t.setPlayState(M)}}function ae(t){var e=Q;return 3===t.length&&(t[3]=1),new Lt(t,{model:e,separator:",",type:"color",prefix:e+"(",suffix:")"})}function oe(t,e){return new Lt(t,{type:"array",separator:e})}function ue(t){if(!Et(t))return St(t)?oe(t,","):t;var e=xt(t);return 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),i[Z]=this.getTime(),this.timerId=Ot(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)),Nt(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+E:r}return Ht(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: {} };\nexport const ALIAS: IObject = { easing: [TIMING_FUNCTION] };\nexport const FIXED = { [TIMING_FUNCTION]: true, contents: 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","import {\n ROLES, MAXIMUM, FIXED, ALIAS,\n PAUSED, RUNNING, PLAY, ENDED, PREFIX, PLAY_CSS, CURRENT_TIME, START_ANIMATION\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,\n} from \"@daybrush/utils\";\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: string[], 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: string[], isCheckTrue?: boolean) {\n return isInProperties(ROLES, args, isCheckTrue);\n}\nexport function isFixed(args: string[]) {\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","/**\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\n} from \"@daybrush/utils\";\n\nexport function splitStyle(str: string) {\n const properties = str.split(\";\");\n const obj: IObject = {};\n let length = properties.length;\n\n for (let i = 0; i < length; ++i) {\n const matches = /([^:]*):([\\S\\s]*)/g.exec(properties[i]);\n\n if (!matches || matches.length < 3 || !matches[1]) {\n --length;\n continue;\n }\n obj[matches[1].trim()] = toPropertyObject(matches[2].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);\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[]): PropertyObject;\nexport function toPropertyObject(value: IObject): IObject;\nexport function toPropertyObject(value: string): PropertyObject | string;\nexport function toPropertyObject(value: string | IObject | any[]) {\n if (!isString(value)) {\n if (isArray(value)) {\n return arrayToPropertyObject(value, \",\");\n }\n return value;\n }\n let values = splitComma(value);\n\n if (values.length > 1) {\n return arrayToPropertyObject(values.map(v => toPropertyObject(v)), \",\");\n }\n values = splitSpace(value);\n if (values.length > 1) {\n return arrayToPropertyObject(values.map(v => toPropertyObject(v)), \" \");\n }\n values = /^(['\"])([^'\"]*)(['\"])$/g.exec(value);\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) === \"#\") {\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 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 } 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 let easing: EasingFunction;\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 this;\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 this;\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 const easingName = easing[EASING_NAME] || \"linear\";\n\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 state[TICK_TIME] = this.getTime();\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, updateFrame } 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\n if (params[0] in ALIAS) {\n self._set(ALIAS[params[0]], value);\n } else if (length === 2 && isArray(params[0])) {\n self._set(params[0], value);\n } else if (isArray(value)) {\n self._set(params, 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 (isObject(value)) {\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 return this;\n }\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 continue;\n }\n cssObject[name] = value;\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 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 properties[args[length - 1]] = isString(value) ? toPropertyObject(value) : value;\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\n state.id = id || makeId(!!length);\n const elements = this.elements;\n\n if (elements.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 (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 const realTime = this.getUnitTime(t);\n\n if (isNaN(realTime)) {\n getNames(value, [t]).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 } else {\n const value = args[0];\n\n if (value instanceof Frame) {\n this.setFrame(time, value);\n } else if (value instanceof SceneItem) {\n const delay = value.getDelay();\n const realTime = this.getUnitTime(time);\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(time, item);\n });\n } else {\n const frame = this.newFrame(time);\n\n frame.set(...args);\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 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[0], matches[1]];\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 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?: 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);\n // {a: Frame, b: Frame}\n console.log(e.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 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","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","OBJECT","ARRAY","isPropertyObject","PROPERTY","STRING","NUMBER","obj","constructor","Object","names","stack","arr","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","text","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","RGBA","arrayToPropertyObject","values","splitComma","toPropertyObject","splitSpace","exec","afterModel","COLOR_MODELS","arrayToColorObject","stringToRGBA","stringToBracketObject","charAt","result","stringToColorObject","iteration","iteraiontCount","direction","setters","getters","_super","delay","fillMode","playSpeed","iterationTime","tickTime","prevTime","playState","tslib_1","curveArray","parseFloat","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","_set","isRole","object","size","get","toObject","isFixed","str","matches","trim","styles","stylesLength","isUndefined","Frame","frame","frameProperties","cssObject","toInnerProperties","TRANSFORM","FILTER","toCSSObject","cssArray","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","realTime","this_1","innerValue","setFrame","SceneItem","getDelay","frames","hasFrame","getDirection","frameTime","nextTime","needUpdate","getFrame","remove","removeFrame","append","unshiftTime","firstFrame","unshift","prepend","isStartZero","isFunction","setElement","Element","style","targetFunc","attributes","cssText","toCSS","fromCSS","parentEasing","getEasing","getNowFrame","temp","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","has","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