UNPKG

@egjs/view360

Version:

360 integrated viewing solution from inside-out view to outside-in view. It provides user-friendly service by rotating 360 degrees through various user interaction such as motion sensor and touch.

1,861 lines (1,607 loc) 481 kB
/* Copyright (c) 2017-present NAVER Corp. name: @egjs/view360 license: MIT author: NAVER Corp. repository: https://github.com/naver/egjs-view360 version: 3.6.4 */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (global.eg = global.eg || {}, global.eg.view360 = factory())); }(this, (function () { 'use strict'; var VERSION = "3.6.4"; /*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ /* 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 __()); } var __assign = function () { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } function __generator(thisArg, body) { var _ = { label: 0, sent: function () { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } } function __values(o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; if (m) return m.call(o); if (o && typeof o.length === "number") return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); } function __read(o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; } function __spread() { for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); return ar; } /* Copyright (c) NAVER Corp. name: @egjs/component license: MIT author: NAVER Corp. repository: https://github.com/naver/egjs-component version: 3.0.2 */ /*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ function __values$1(o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; if (m) return m.call(o); if (o && typeof o.length === "number") return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); } function __read$1(o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; } function __spread$1() { for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read$1(arguments[i])); return ar; } /* * Copyright (c) 2015 NAVER Corp. * egjs projects are licensed under the MIT license */ var isUndefined = function (value) { return typeof value === "undefined"; }; /** * Event class to provide additional properties * @ko Component에서 추가적인 프로퍼티를 제공하는 이벤트 클래스 */ var ComponentEvent = /*#__PURE__*/ function () { /** * Create a new instance of ComponentEvent. * @ko ComponentEvent의 새로운 인스턴스를 생성한다. * @param eventType The name of the event.<ko>이벤트 이름.</ko> * @param props An object that contains additional event properties.<ko>추가적인 이벤트 프로퍼티 오브젝트.</ko> */ function ComponentEvent(eventType, props) { var e_1, _a; this._canceled = false; if (props) { try { for (var _b = __values$1(Object.keys(props)), _c = _b.next(); !_c.done; _c = _b.next()) { var key = _c.value; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment this[key] = props[key]; } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } } this.eventType = eventType; } /** * Stop the event. {@link ComponentEvent#isCanceled} will return `true` after. * @ko 이벤트를 중단한다. 이후 {@link ComponentEvent#isCanceled}가 `true`를 반환한다. */ var __proto = ComponentEvent.prototype; __proto.stop = function () { this._canceled = true; }; /** * Returns a boolean value that indicates whether {@link ComponentEvent#stop} is called before. * @ko {@link ComponentEvent#stop}이 호출되었는지 여부를 반환한다. * @return {boolean} A boolean value that indicates whether {@link ComponentEvent#stop} is called before.<ko>이전에 {@link ComponentEvent#stop}이 불려졌는지 여부를 반환한다.</ko> */ __proto.isCanceled = function () { return this._canceled; }; return ComponentEvent; }(); /** * A class used to manage events in a component * @ko 컴포넌트의 이벤트을 관리할 수 있게 하는 클래스 */ var Component = /*#__PURE__*/ function () { /** * @support {"ie": "7+", "ch" : "latest", "ff" : "latest", "sf" : "latest", "edge" : "latest", "ios" : "7+", "an" : "2.1+ (except 3.x)"} */ function Component() { this._eventHandler = {}; } /** * Trigger a custom event. * @ko 커스텀 이벤트를 발생시킨다 * @param {string | ComponentEvent} event The name of the custom event to be triggered or an instance of the ComponentEvent<ko>발생할 커스텀 이벤트의 이름 또는 ComponentEvent의 인스턴스</ko> * @param {any[]} params Event data to be sent when triggering a custom event <ko>커스텀 이벤트가 발생할 때 전달할 데이터</ko> * @return An instance of the component itself<ko>컴포넌트 자신의 인스턴스</ko> * @example * ```ts * import Component, { ComponentEvent } from "@egjs/component"; * * class Some extends Component<{ * beforeHi: ComponentEvent<{ foo: number; bar: string }>; * hi: { foo: { a: number; b: boolean } }; * someEvent: (foo: number, bar: string) => void; * someOtherEvent: void; // When there's no event argument * }> { * some(){ * if(this.trigger("beforeHi")){ // When event call to stop return false. * this.trigger("hi");// fire hi event. * } * } * } * * const some = new Some(); * some.on("beforeHi", e => { * if(condition){ * e.stop(); // When event call to stop, `hi` event not call. * } * // `currentTarget` is component instance. * console.log(some === e.currentTarget); // true * * typeof e.foo; // number * typeof e.bar; // string * }); * some.on("hi", e => { * typeof e.foo.b; // boolean * }); * // If you want to more know event design. You can see article. * // https://github.com/naver/egjs-component/wiki/How-to-make-Component-event-design%3F * ``` */ var __proto = Component.prototype; __proto.trigger = function (event) { var params = []; for (var _i = 1; _i < arguments.length; _i++) { params[_i - 1] = arguments[_i]; } var eventName = event instanceof ComponentEvent ? event.eventType : event; var handlers = __spread$1(this._eventHandler[eventName] || []); if (handlers.length <= 0) { return this; } if (event instanceof ComponentEvent) { event.currentTarget = this; handlers.forEach(function (handler) { handler(event); }); } else { handlers.forEach(function (handler) { // eslint-disable-next-line @typescript-eslint/no-unsafe-call handler.apply(void 0, __spread$1(params)); }); } return this; }; /** * Executed event just one time. * @ko 이벤트가 한번만 실행된다. * @param {string} eventName The name of the event to be attached or an event name - event handler mapped object.<ko>등록할 이벤트의 이름 또는 이벤트 이름-핸들러 오브젝트</ko> * @param {function} handlerToAttach The handler function of the event to be attached <ko>등록할 이벤트의 핸들러 함수</ko> * @return An instance of the component itself<ko>컴포넌트 자신의 인스턴스</ko> * @example * ```ts * import Component, { ComponentEvent } from "@egjs/component"; * * class Some extends Component<{ * hi: ComponentEvent; * }> { * hi() { * alert("hi"); * } * thing() { * this.once("hi", this.hi); * } * } * * var some = new Some(); * some.thing(); * some.trigger(new ComponentEvent("hi")); * // fire alert("hi"); * some.trigger(new ComponentEvent("hi")); * // Nothing happens * ``` */ __proto.once = function (eventName, handlerToAttach) { var _this = this; if (typeof eventName === "object" && isUndefined(handlerToAttach)) { var eventHash = eventName; for (var key in eventHash) { this.once(key, eventHash[key]); } return this; } else if (typeof eventName === "string" && typeof handlerToAttach === "function") { var listener_1 = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } // eslint-disable-next-line @typescript-eslint/no-unsafe-call handlerToAttach.apply(void 0, __spread$1(args)); _this.off(eventName, listener_1); }; this.on(eventName, listener_1); } return this; }; /** * Checks whether an event has been attached to a component. * @ko 컴포넌트에 이벤트가 등록됐는지 확인한다. * @param {string} eventName The name of the event to be attached <ko>등록 여부를 확인할 이벤트의 이름</ko> * @return {boolean} Indicates whether the event is attached. <ko>이벤트 등록 여부</ko> * @example * ```ts * import Component from "@egjs/component"; * * class Some extends Component<{ * hi: void; * }> { * some() { * this.hasOn("hi");// check hi event. * } * } * ``` */ __proto.hasOn = function (eventName) { return !!this._eventHandler[eventName]; }; /** * Attaches an event to a component. * @ko 컴포넌트에 이벤트를 등록한다. * @param {string} eventName The name of the event to be attached or an event name - event handler mapped object.<ko>등록할 이벤트의 이름 또는 이벤트 이름-핸들러 오브젝트</ko> * @param {function} handlerToAttach The handler function of the event to be attached <ko>등록할 이벤트의 핸들러 함수</ko> * @return An instance of a component itself<ko>컴포넌트 자신의 인스턴스</ko> * @example * ```ts * import Component, { ComponentEvent } from "@egjs/component"; * * class Some extends Component<{ * hi: void; * }> { * hi() { * console.log("hi"); * } * some() { * this.on("hi",this.hi); //attach event * } * } * ``` */ __proto.on = function (eventName, handlerToAttach) { if (typeof eventName === "object" && isUndefined(handlerToAttach)) { var eventHash = eventName; for (var name in eventHash) { this.on(name, eventHash[name]); } return this; } else if (typeof eventName === "string" && typeof handlerToAttach === "function") { var handlerList = this._eventHandler[eventName]; if (isUndefined(handlerList)) { this._eventHandler[eventName] = []; handlerList = this._eventHandler[eventName]; } handlerList.push(handlerToAttach); } return this; }; /** * Detaches an event from the component.<br/>If the `eventName` is not given this will detach all event handlers attached.<br/>If the `handlerToDetach` is not given, this will detach all event handlers for `eventName`. * @ko 컴포넌트에 등록된 이벤트를 해제한다.<br/>`eventName`이 주어지지 않았을 경우 모든 이벤트 핸들러를 제거한다.<br/>`handlerToAttach`가 주어지지 않았을 경우 `eventName`에 해당하는 모든 이벤트 핸들러를 제거한다. * @param {string?} eventName The name of the event to be detached <ko>해제할 이벤트의 이름</ko> * @param {function?} handlerToDetach The handler function of the event to be detached <ko>해제할 이벤트의 핸들러 함수</ko> * @return An instance of a component itself <ko>컴포넌트 자신의 인스턴스</ko> * @example * ```ts * import Component, { ComponentEvent } from "@egjs/component"; * * class Some extends Component<{ * hi: void; * }> { * hi() { * console.log("hi"); * } * some() { * this.off("hi",this.hi); //detach event * } * } * ``` */ __proto.off = function (eventName, handlerToDetach) { var e_1, _a; // Detach all event handlers. if (isUndefined(eventName)) { this._eventHandler = {}; return this; } // Detach all handlers for eventname or detach event handlers by object. if (isUndefined(handlerToDetach)) { if (typeof eventName === "string") { delete this._eventHandler[eventName]; return this; } else { var eventHash = eventName; for (var name in eventHash) { this.off(name, eventHash[name]); } return this; } } // Detach single event handler var handlerList = this._eventHandler[eventName]; if (handlerList) { var idx = 0; try { for (var handlerList_1 = __values$1(handlerList), handlerList_1_1 = handlerList_1.next(); !handlerList_1_1.done; handlerList_1_1 = handlerList_1.next()) { var handlerFunction = handlerList_1_1.value; if (handlerFunction === handlerToDetach) { handlerList.splice(idx, 1); if (handlerList.length <= 0) { delete this._eventHandler[eventName]; } break; } idx++; } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (handlerList_1_1 && !handlerList_1_1.done && (_a = handlerList_1.return)) _a.call(handlerList_1); } finally { if (e_1) throw e_1.error; } } } return this; }; /** * Version info string * @ko 버전정보 문자열 * @name VERSION * @static * @example * Component.VERSION; // ex) 3.0.0 * @memberof Component */ Component.VERSION = "3.0.2"; return Component; }(); /* * Copyright (c) 2015 NAVER Corp. * egjs projects are licensed under the MIT license */ var ComponentEvent$1 = ComponentEvent; /** * @this {Promise} */ function finallyConstructor(callback) { var constructor = this.constructor; return this.then( function(value) { // @ts-ignore return constructor.resolve(callback()).then(function() { return value; }); }, function(reason) { // @ts-ignore return constructor.resolve(callback()).then(function() { // @ts-ignore return constructor.reject(reason); }); } ); } function allSettled(arr) { var P = this; return new P(function(resolve, reject) { if (!(arr && typeof arr.length !== 'undefined')) { return reject( new TypeError( typeof arr + ' ' + arr + ' is not iterable(cannot read property Symbol(Symbol.iterator))' ) ); } var args = Array.prototype.slice.call(arr); if (args.length === 0) return resolve([]); var remaining = args.length; function res(i, val) { if (val && (typeof val === 'object' || typeof val === 'function')) { var then = val.then; if (typeof then === 'function') { then.call( val, function(val) { res(i, val); }, function(e) { args[i] = { status: 'rejected', reason: e }; if (--remaining === 0) { resolve(args); } } ); return; } } args[i] = { status: 'fulfilled', value: val }; if (--remaining === 0) { resolve(args); } } for (var i = 0; i < args.length; i++) { res(i, args[i]); } }); } // Store setTimeout reference so promise-polyfill will be unaffected by // other code modifying setTimeout (like sinon.useFakeTimers()) var setTimeoutFunc = setTimeout; function isArray(x) { return Boolean(x && typeof x.length !== 'undefined'); } function noop() {} // Polyfill for Function.prototype.bind function bind(fn, thisArg) { return function() { fn.apply(thisArg, arguments); }; } /** * @constructor * @param {Function} fn */ function Promise$1(fn) { if (!(this instanceof Promise$1)) throw new TypeError('Promises must be constructed via new'); if (typeof fn !== 'function') throw new TypeError('not a function'); /** @type {!number} */ this._state = 0; /** @type {!boolean} */ this._handled = false; /** @type {Promise|undefined} */ this._value = undefined; /** @type {!Array<!Function>} */ this._deferreds = []; doResolve(fn, this); } function handle(self, deferred) { while (self._state === 3) { self = self._value; } if (self._state === 0) { self._deferreds.push(deferred); return; } self._handled = true; Promise$1._immediateFn(function() { var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; if (cb === null) { (self._state === 1 ? resolve : reject)(deferred.promise, self._value); return; } var ret; try { ret = cb(self._value); } catch (e) { reject(deferred.promise, e); return; } resolve(deferred.promise, ret); }); } function resolve(self, newValue) { try { // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.'); if ( newValue && (typeof newValue === 'object' || typeof newValue === 'function') ) { var then = newValue.then; if (newValue instanceof Promise$1) { self._state = 3; self._value = newValue; finale(self); return; } else if (typeof then === 'function') { doResolve(bind(then, newValue), self); return; } } self._state = 1; self._value = newValue; finale(self); } catch (e) { reject(self, e); } } function reject(self, newValue) { self._state = 2; self._value = newValue; finale(self); } function finale(self) { if (self._state === 2 && self._deferreds.length === 0) { Promise$1._immediateFn(function() { if (!self._handled) { Promise$1._unhandledRejectionFn(self._value); } }); } for (var i = 0, len = self._deferreds.length; i < len; i++) { handle(self, self._deferreds[i]); } self._deferreds = null; } /** * @constructor */ function Handler(onFulfilled, onRejected, promise) { this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; this.onRejected = typeof onRejected === 'function' ? onRejected : null; this.promise = promise; } /** * Take a potentially misbehaving resolver function and make sure * onFulfilled and onRejected are only called once. * * Makes no guarantees about asynchrony. */ function doResolve(fn, self) { var done = false; try { fn( function(value) { if (done) return; done = true; resolve(self, value); }, function(reason) { if (done) return; done = true; reject(self, reason); } ); } catch (ex) { if (done) return; done = true; reject(self, ex); } } Promise$1.prototype['catch'] = function(onRejected) { return this.then(null, onRejected); }; Promise$1.prototype.then = function(onFulfilled, onRejected) { // @ts-ignore var prom = new this.constructor(noop); handle(this, new Handler(onFulfilled, onRejected, prom)); return prom; }; Promise$1.prototype['finally'] = finallyConstructor; Promise$1.all = function(arr) { return new Promise$1(function(resolve, reject) { if (!isArray(arr)) { return reject(new TypeError('Promise.all accepts an array')); } var args = Array.prototype.slice.call(arr); if (args.length === 0) return resolve([]); var remaining = args.length; function res(i, val) { try { if (val && (typeof val === 'object' || typeof val === 'function')) { var then = val.then; if (typeof then === 'function') { then.call( val, function(val) { res(i, val); }, reject ); return; } } args[i] = val; if (--remaining === 0) { resolve(args); } } catch (ex) { reject(ex); } } for (var i = 0; i < args.length; i++) { res(i, args[i]); } }); }; Promise$1.allSettled = allSettled; Promise$1.resolve = function(value) { if (value && typeof value === 'object' && value.constructor === Promise$1) { return value; } return new Promise$1(function(resolve) { resolve(value); }); }; Promise$1.reject = function(value) { return new Promise$1(function(resolve, reject) { reject(value); }); }; Promise$1.race = function(arr) { return new Promise$1(function(resolve, reject) { if (!isArray(arr)) { return reject(new TypeError('Promise.race accepts an array')); } for (var i = 0, len = arr.length; i < len; i++) { Promise$1.resolve(arr[i]).then(resolve, reject); } }); }; // Use polyfill for setImmediate for performance gains Promise$1._immediateFn = // @ts-ignore (typeof setImmediate === 'function' && function(fn) { // @ts-ignore setImmediate(fn); }) || function(fn) { setTimeoutFunc(fn, 0); }; Promise$1._unhandledRejectionFn = function _unhandledRejectionFn(err) { if (typeof console !== 'undefined' && console) { console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console } }; /* Copyright (c) 2015 NAVER Corp. name: @egjs/agent license: MIT author: NAVER Corp. repository: git+https://github.com/naver/agent.git version: 2.2.1 */ function some(arr, callback) { var length = arr.length; for (var i = 0; i < length; ++i) { if (callback(arr[i], i)) { return true; } } return false; } function find(arr, callback) { var length = arr.length; for (var i = 0; i < length; ++i) { if (callback(arr[i], i)) { return arr[i]; } } return null; } function getUserAgent(agent) { var userAgent = agent; if (typeof userAgent === "undefined") { if (typeof navigator === "undefined" || !navigator) { return ""; } userAgent = navigator.userAgent || ""; } return userAgent.toLowerCase(); } function execRegExp(pattern, text) { try { return new RegExp(pattern, "g").exec(text); } catch (e) { return null; } } function hasUserAgentData() { if (typeof navigator === "undefined" || !navigator || !navigator.userAgentData) { return false; } var userAgentData = navigator.userAgentData; var brands = userAgentData.brands || userAgentData.uaList; return !!(brands && brands.length); } function findVersion(versionTest, userAgent) { var result = execRegExp("(" + versionTest + ")((?:\\/|\\s|:)([0-9|\\.|_]+))?", userAgent); return result ? result[3] : ""; } function convertVersion(text) { return text.replace(/_/g, "."); } function findPreset(presets, userAgent) { var userPreset = null; var version = "-1"; some(presets, function (preset) { var result = execRegExp("(" + preset.test + ")((?:\\/|\\s|:)([0-9|\\.|_]+))?", userAgent); if (!result || preset.brand) { return false; } userPreset = preset; version = result[3] || "-1"; if (preset.versionAlias) { version = preset.versionAlias; } else if (preset.versionTest) { version = findVersion(preset.versionTest.toLowerCase(), userAgent) || version; } version = convertVersion(version); return true; }); return { preset: userPreset, version: version }; } function findBrand(brands, preset) { return find(brands, function (_a) { var brand = _a.brand; return execRegExp("" + preset.test, brand.toLowerCase()); }); } var BROWSER_PRESETS = [{ test: "phantomjs", id: "phantomjs" }, { test: "whale", id: "whale" }, { test: "edgios|edge|edg", id: "edge" }, { test: "msie|trident|windows phone", id: "ie", versionTest: "iemobile|msie|rv" }, { test: "miuibrowser", id: "miui browser" }, { test: "samsungbrowser", id: "samsung internet" }, { test: "samsung", id: "samsung internet", versionTest: "version" }, { test: "chrome|crios", id: "chrome" }, { test: "firefox|fxios", id: "firefox" }, { test: "android", id: "android browser", versionTest: "version" }, { test: "safari|iphone|ipad|ipod", id: "safari", versionTest: "version" }]; // chromium's engine(blink) is based on applewebkit 537.36. var CHROMIUM_PRESETS = [{ test: "(?=.*applewebkit/(53[0-7]|5[0-2]|[0-4]))(?=.*\\schrome)", id: "chrome" }, { test: "chromium", id: "chrome" }, { test: "whale", id: "chrome", brand: true }]; var WEBKIT_PRESETS = [{ test: "applewebkit", id: "webkit" }]; var WEBVIEW_PRESETS = [{ test: "(?=(iphone|ipad))(?!(.*version))", id: "webview" }, { test: "(?=(android|iphone|ipad))(?=.*(naver|daum|; wv))", id: "webview" }, { // test webview test: "webview", id: "webview" }]; var OS_PRESETS = [{ test: "windows phone", id: "windows phone" }, { test: "windows 2000", id: "window", versionAlias: "5.0" }, { test: "windows nt", id: "window" }, { test: "iphone|ipad|ipod", id: "ios", versionTest: "iphone os|cpu os" }, { test: "mac os x", id: "mac" }, { test: "android", id: "android" }, { test: "tizen", id: "tizen" }, { test: "webos|web0s", id: "webos" }]; function parseUserAgentData(osData) { var userAgentData = navigator.userAgentData; var brands = (userAgentData.uaList || userAgentData.brands).slice(); var isMobile = userAgentData.mobile || false; var firstBrand = brands[0]; var browser = { name: firstBrand.brand, version: firstBrand.version, majorVersion: -1, webkit: false, webview: some(WEBVIEW_PRESETS, function (preset) { return findBrand(brands, preset); }), chromium: some(CHROMIUM_PRESETS, function (preset) { return findBrand(brands, preset); }) }; var os = { name: "unknown", version: "-1", majorVersion: -1 }; browser.webkit = !browser.chromium && some(WEBKIT_PRESETS, function (preset) { return findBrand(brands, preset); }); if (osData) { var platform_1 = osData.platform.toLowerCase(); var result = find(OS_PRESETS, function (preset) { return new RegExp("" + preset.test, "g").exec(platform_1); }); os.name = result ? result.id : platform_1; os.version = osData.platformVersion; } some(BROWSER_PRESETS, function (preset) { var result = findBrand(brands, preset); if (!result) { return false; } browser.name = preset.id; browser.version = osData ? osData.uaFullVersion : result.version; return true; }); if (navigator.platform === "Linux armv8l") { os.name = "android"; } else if (browser.webkit) { os.name = isMobile ? "ios" : "mac"; } if (os.name === "ios" && browser.webview) { browser.version = "-1"; } os.version = convertVersion(os.version); browser.version = convertVersion(browser.version); os.majorVersion = parseInt(os.version, 10); browser.majorVersion = parseInt(browser.version, 10); return { browser: browser, os: os, isMobile: isMobile, isHints: true }; } function parseUserAgent(userAgent) { var nextAgent = getUserAgent(userAgent); var isMobile = !!/mobi/g.exec(nextAgent); var browser = { name: "unknown", version: "-1", majorVersion: -1, webview: !!findPreset(WEBVIEW_PRESETS, nextAgent).preset, chromium: !!findPreset(CHROMIUM_PRESETS, nextAgent).preset, webkit: false }; var os = { name: "unknown", version: "-1", majorVersion: -1 }; var _a = findPreset(BROWSER_PRESETS, nextAgent), browserPreset = _a.preset, browserVersion = _a.version; var _b = findPreset(OS_PRESETS, nextAgent), osPreset = _b.preset, osVersion = _b.version; browser.webkit = !browser.chromium && !!findPreset(WEBKIT_PRESETS, nextAgent).preset; if (osPreset) { os.name = osPreset.id; os.version = osVersion; os.majorVersion = parseInt(osVersion, 10); } if (browserPreset) { browser.name = browserPreset.id; browser.version = browserVersion; if (browser.webview && os.name === "ios" && browser.name !== "safari") { browser.webview = false; } } browser.majorVersion = parseInt(browser.version, 10); return { browser: browser, os: os, isMobile: isMobile, isHints: false }; } /** * Extracts browser and operating system information from the user agent string. * @ko 유저 에이전트 문자열에서 브라우저와 운영체제 정보를 추출한다. * @function eg.agent#agent * @param - user agent string to parse <ko>파싱할 유저에이전트 문자열</ko> * @return - agent Info <ko> 에이전트 정보 </ko> * @example import agent from "@egjs/agent"; // eg.agent(); const { os, browser, isMobile } = agent(); */ function agent(userAgent) { if (typeof userAgent === "undefined" && hasUserAgentData()) { return parseUserAgentData(); } else { return parseUserAgent(userAgent); } } /* eslint-disable @typescript-eslint/no-implied-eval */ /* eslint-disable no-new-func, no-nested-ternary */ var win = typeof window !== "undefined" && window.Math === Math ? window : typeof self !== "undefined" && self.Math === Math ? self : Function("return this")(); /* eslint-enable no-new-func, no-nested-ternary */ var doc = win.document; var nav = win.navigator; var agent$1 = agent(); var osName = agent$1.os.name; var browserName = agent$1.browser.name; var IS_IOS = osName === "ios"; var IS_SAFARI_ON_DESKTOP = osName === "mac" && browserName === "safari"; /* eslint-disable @typescript-eslint/naming-convention */ win.Float32Array = typeof win.Float32Array !== "undefined" ? win.Float32Array : win.Array; var Float32Array$1 = win.Float32Array; var getComputedStyle = win.getComputedStyle; var userAgent = win.navigator && win.navigator.userAgent; var SUPPORT_TOUCH = ("ontouchstart" in win); var SUPPORT_DEVICEMOTION = ("ondevicemotion" in win); var DeviceMotionEvent = win.DeviceMotionEvent; var devicePixelRatio = win.devicePixelRatio; var TRANSFORM = function () { var _a; var docStyle = (_a = doc === null || doc === void 0 ? void 0 : doc.documentElement.style) !== null && _a !== void 0 ? _a : {}; var target = ["transform", "webkitTransform", "msTransform", "mozTransform"]; for (var i = 0, len = target.length; i < len; i++) { if (target[i] in docStyle) { return target[i]; } } return ""; }(); // check for will-change support var SUPPORT_WILLCHANGE = win.CSS && win.CSS.supports && win.CSS.supports("will-change", "transform"); var WEBXR_SUPPORTED = false; var checkXRSupport = function () { var navigator = window.navigator; if (!navigator.xr) { return; } if (navigator.xr.isSessionSupported) { navigator.xr.isSessionSupported("immersive-vr").then(function (res) { WEBXR_SUPPORTED = res; }).catch(function () { return void 0; }); } else if (navigator.xr.supportsSession) { navigator.xr.supportsSession("immersive-vr").then(function (res) { WEBXR_SUPPORTED = res; }).catch(function () { return void 0; }); } }; /* Copyright (c) NAVER Crop. name: @cfcs/core license: MIT author: NAVER Crop. repository: https://github.com/naver/cfcs version: 0.0.4 */ /** * cfcs * Copyright (c) 2022-present NAVER Corp. * MIT license */ function keys(obj) { return Object.keys(obj); } var OBSERVERS_PATH = "__observers__"; var Observer = /*#__PURE__*/ function () { function Observer(value) { this._emitter = new Component(); this._current = value; } var __proto = Observer.prototype; Object.defineProperty(__proto, "current", { get: function () { return this._current; }, set: function (value) { var isUpdate = value !== this._current; this._current = value; if (isUpdate) { this._emitter.trigger("update", value); } }, enumerable: false, configurable: true }); __proto.subscribe = function (callback) { this._emitter.on("update", callback); }; __proto.unsubscribe = function (callback) { this._emitter.off("update", callback); }; return Observer; }(); function observe(defaultValue) { return new Observer(defaultValue); } function getObservers(instance) { if (!instance[OBSERVERS_PATH]) { instance[OBSERVERS_PATH] = {}; } return instance[OBSERVERS_PATH]; } function getObserver(instance, name, defaultValue) { var observers = getObservers(instance); if (!observers[name]) { observers[name] = observe(defaultValue); } return observers[name]; } function injectReactiveSubscribe(object) { object["subscribe"] = function (name, callback) { getObserver(this, name).subscribe(callback); }; object["unsubscribe"] = function (name, callback) { var _this = this; if (!name) { keys(getObservers(this)).forEach(function (observerName) { _this.unsubscribe(observerName); }); return; } if (!(name in this)) { return; } getObserver(this, name).unsubscribe(callback); }; } function ReactiveSubscribe(Constructor) { var prototype = Constructor.prototype; injectReactiveSubscribe(prototype); } /* Copyright (c) NAVER Corp. name: @egjs/axes license: MIT author: NAVER Corp. repository: https://github.com/naver/egjs-axes version: 3.8.3 */ /*! ***************************************************************************** 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$1 = function (d, b) { extendStatics$1 = 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$1(d, b); }; function __extends$1(d, b) { extendStatics$1(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); } var __assign$1 = function () { __assign$1 = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign$1.apply(this, arguments); }; 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; } /* * Copyright (c) 2015 NAVER Corp. * egjs projects are licensed under the MIT license */ /* eslint-disable no-new-func, no-nested-ternary */ var win$1; if (typeof window === "undefined") { // window is undefined in node.js win$1 = { navigator: { userAgent: "" } }; } else { win$1 = window; } /* * Copyright (c) 2015 NAVER Corp. * egjs projects are licensed under the MIT license */ var DIRECTION_NONE = 1; var DIRECTION_LEFT = 2; var DIRECTION_RIGHT = 4; var DIRECTION_HORIZONTAL = 2 | 4; var DIRECTION_UP = 8; var DIRECTION_DOWN = 16; var DIRECTION_VERTICAL = 8 | 16; var DIRECTION_ALL = 2 | 4 | 8 | 16; var MOUSE_LEFT = "left"; var MOUSE_RIGHT = "right"; var MOUSE_MIDDLE = "middle"; var ANY = "any"; var NONE = "none"; var SHIFT = "shift"; var CTRL = "ctrl"; var ALT = "alt"; var META = "meta"; var VELOCITY_INTERVAL = 16; var IOS_EDGE_THRESHOLD = 30; var IS_IOS_SAFARI = "ontouchstart" in win$1 && agent().browser.name === "safari"; var TRANSFORM$1 = function () { if (typeof document === "undefined") { return ""; } var bodyStyle = (document.head || document.getElementsByTagName("head")[0]).style; var target = ["transform", "webkitTransform", "msTransform", "mozTransform"]; for (var i = 0, len = target.length; i < len; i++) { if (target[i] in bodyStyle) { return target[i]; } } return ""; }(); var PREVENT_DRAG_CSSPROPS = { "user-select": "none", "-webkit-user-drag": "none" }; var toArray = function (nodes) { // const el = Array.prototype.slice.call(nodes); // for IE8 var el = []; for (var i = 0, len = nodes.length; i < len; i++) { el.push(nodes[i]); } return el; }; var $ = function (param, multi) { if (multi === void 0) { multi = false; } var el; if (typeof param === "string") { // String (HTML, Selector) // check if string is HTML tag format var match = param.match(/^<([a-z]+)\s*([^>]*)>/); // creating element if (match) { // HTML var dummy = document.createElement("div"); dummy.innerHTML = param; el = toArray(dummy.childNodes); } else { // Selector el = toArray(document.querySelectorAll(param)); } if (!multi) { el = el.length >= 1 ? el[0] : undefined; } } else if (param === win$1) { // window el = param; } else if ("value" in param || "current" in param) { el = param.value || param.current; } else if (param.nodeName && (param.nodeType === 1 || param.nodeType === 9)) { // HTMLElement, Document el = param; } else if ("jQuery" in win$1 && param instanceof jQuery || param.constructor.prototype.jquery) { // jQuery el = multi ? param.toArray() : param.get(0); } else if (Array.isArray(param)) { el = param.map(function (v) { return $(v); }); if (!multi) { el = el.length >= 1 ? el[0] : undefined; } } return el; }; var raf = win$1.requestAnimationFrame || win$1.webkitRequestAnimationFrame; var caf = win$1.cancelAnimationFrame || win$1.webkitCancelAnimationFrame; if (raf && !caf) { var keyInfo_1 = {}; var oldraf_1 = raf; raf = function (callback) { var wrapCallback = function (timestamp) { if (keyInfo_1[key]) { callback(timestamp); } }; var key = oldraf_1(wrapCallback); keyInfo_1[key] = true; return key; }; caf = function (key) { delete keyInfo_1[key]; }; } else if (!(raf && caf)) { raf = function (callback) { return win$1.setTimeout(function () { callback(win$1.performance && win$1.performance.now && win$1.performance.now() || new Date().getTime()); }, 16); }; caf = win$1.clearTimeout; } /** * A polyfill for the window.requestAnimationFrame() method. * @see https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame * @private */ var requestAnimationFrame = function (fp) { return raf(fp); }; /** * A polyfill for the window.cancelAnimationFrame() method. It cancels an animation executed through a call to the requestAnimationFrame() method. * @param {Number} key − The ID value returned through a call to the requestAnimationFrame() method. <ko>requestAnimationFrame() 메서드가 반환한 아이디 값</ko> * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/cancelAnimationFrame * @private */ var cancelAnimationFrame = function (key) { caf(key); }; var map = function (obj, callback) { var tranformed = {}; for (var k in obj) { if (k) { tranformed[k] = callback(obj[k], k); } } return tranformed; }; var filter = function (obj, callback) { var filtered = {}; for (var k in obj) { if (k && callback(obj[k], k)) { filtered[k] = obj[k]; } } return filtered; }; var every = function (obj, callback) { for (var k in obj) { if (k && !callback(obj[k], k)) { return false; } } return true; }; var equal = function (target, base) { return every(target, function (v, k) { return v === base[k]; }); }; var roundNumFunc = {}; var roundNumber = function (num, roundUnit) { // Cache for performance if (!roundNumFunc[roundUnit]) { roundNumFunc[roundUnit] = getRoundFunc(roundUnit); } return roundNumFunc[roundUnit](num); }; var roundNumbers = function (num, roundUnit) { if (!num || !roundUnit) { return num; } return map(num, function (value, key) { return roundNumber(value, typeof roundUnit === "number" ? roundUnit : roundUnit[key]); }); }; var getDecimalPlace = function (val) { if (!isFinite(val)) { return 0; } var v = "".concat(val); if (v.indexOf("e") >= 0) { // Exponential Format // 1e-10, 1e-12 var p = 0; var e = 1; while (Math.round(val * e) / e !== val) { e *= 10; p++; } return p; } // In general, following has performance benefit. // https://jsperf.com/precision-calculation return v.indexOf(".") >= 0 ? v.length - v.indexOf(".") - 1 : 0; }; var inversePow = function (n) { // replace Math.pow(10, -n)