{"version":3,"file":"animated-creative.895c6912f3174bb0df29.js","mappings":"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","sources":["webpack://LIB/webpack/runtime/load script","webpack://LIB/../ad/utils/browser.ts","webpack://LIB/./serialization/image-settings-serializer.ts","webpack://LIB/../ad/utils/image-optimizer.ts","webpack://LIB/../ad/utils/url.ts","webpack://LIB/./actions/actions.utils.ts","webpack://LIB/./animation.utils.ts","webpack://LIB/./animator.ts","webpack://LIB/./color.ts","webpack://LIB/./color.utils.ts","webpack://LIB/./elements/feed/feeds.utils.ts","webpack://LIB/./elements/rich-text/text-nodes.ts","webpack://LIB/./elements/widget/events.ts","webpack://LIB/./environment.ts","webpack://LIB/./font-service.utils.ts","webpack://LIB/./nodes/base-data-node.ts","webpack://LIB/./nodes/data-node.utils.ts","webpack://LIB/./nodes/helpers.ts","webpack://LIB/./rendering/formula.utils.ts","webpack://LIB/./rendering/states.utils.ts","webpack://LIB/./serialization/property-value-serializer.ts","webpack://LIB/./serialization/text-serializer.ts","webpack://LIB/./timing-functions.ts","webpack://LIB/../domain/action.ts","webpack://LIB/../domain/animation.ts","webpack://LIB/../domain/color.ts","webpack://LIB/../domain/creative.ts","webpack://LIB/../domain/image.ts","webpack://LIB/../domain/nodes.ts","webpack://LIB/../domain/property.ts","webpack://LIB/../domain/social.ts","webpack://LIB/../domain/style.ts","webpack://LIB/../domain/transition.ts","webpack://LIB/../domain/user.ts","webpack://LIB/../domain/widget.ts","webpack://LIB/../domain/workspace.ts","webpack://LIB/../domain/text.ts","webpack://LIB/../utils/clone.ts","webpack://LIB/../utils/di.decorators.ts","webpack://LIB/../utils/di.ts","webpack://LIB/../utils/errors/errors.ts","webpack://LIB/../utils/event-emitter.ts","webpack://LIB/../utils/geom.ts","webpack://LIB/../utils/matrix.ts","webpack://LIB/../utils/promises.ts","webpack://LIB/../utils/safe-eval.ts","webpack://LIB/../utils/sanitizer.ts","webpack://LIB/../utils/simple-cache.ts","webpack://LIB/../utils/utils.ts","webpack://LIB/../../node_modules/tslib/tslib.es6.js","webpack://LIB/webpack/bootstrap","webpack://LIB/webpack/runtime/define property getters","webpack://LIB/webpack/runtime/ensure chunk","webpack://LIB/webpack/runtime/get javascript chunk filename","webpack://LIB/webpack/runtime/hasOwnProperty shorthand","webpack://LIB/webpack/runtime/make namespace object","webpack://LIB/webpack/runtime/publicPath","webpack://LIB/webpack/runtime/jsonp chunk loading","webpack://LIB/../ad/domain/ad-events.ts","webpack://LIB/../utils/dom-utils.ts","webpack://LIB/../utils/performance.ts","webpack://LIB/./creative.ts","webpack://LIB/./elements/rich-text/rich-text.bidi-chars.ts","webpack://LIB/./elements/rich-text/rich-text.ts","webpack://LIB/./css-styles.ts","webpack://LIB/./animator-lite.ts","webpack://LIB/../utils/errors/error-message.enum.ts","webpack://LIB/../utils/svg-utils.ts","webpack://LIB/./svg-background.ts","webpack://LIB/../ad/utils/dom.ts","webpack://LIB/./visitor.ts","webpack://LIB/./renderer.ts","webpack://LIB/./creative.container.ts","webpack://LIB/./animated-creative.ts"],"sourcesContent":["var inProgress = {};\nvar dataWebpackPrefix = \"LIB:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// @ts-nocheck\n// https://stackoverflow.com/a/9851769/5161346\n\nconst userAgent = (window.navigator?.userAgent || '').toLowerCase();\n\n// Opera 8.0+\nexport const isOpera = (!!window.opr && !!opr.addons) || !!window.opera || userAgent.indexOf(' opr/') >= 0;\n\n// Firefox 1.0+\nexport const isFirefox = typeof InstallTrigger !== 'undefined';\n\n// Any apple browser including safari, wkWebview, uiWebView.\nexport const isAppleBrowser = window.navigator?.vendor?.indexOf('Apple') > -1;\n\n// Safari\nexport const isSafari = isAppleBrowser && navigator.userAgent.indexOf('crios') === -1 && userAgent.indexOf('fxios') === -1;\n\n// Internet Explorer 6-11\nexport const isIE = /* @cc_on!@ */false || !!document.documentMode;\n\n// Edge 15-18\nexport const isEdge = !isIE && !!window.StyleMedia;\n\n// Chrome 1 - 79\nexport const isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// Edge (based on chromium) detection\n// eslint-disable-next-line eqeqeq\nexport const isEdgeChromium = isChrome && (userAgent.indexOf('edg') != -1);\n\n// Blink engine detection\nexport const isBlink = (isChrome || isOpera || isEdgeChromium) && !!window.CSS;\n\nexport const isIpad = (userAgent.match(/(iPad)/) /* iOS pre 13 */\n || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1) /* iPad OS 13 */);\n\n/**\n * Extract iOS version from User agent.\n * Note that this won't find iPads with version 13 and above\n * because Apple are idiots\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport const preciseIOSVersion = (function () {\n try {\n const agent = window.navigator.userAgent;\n const start = agent.indexOf('OS ');\n\n if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1) {\n const simple = Number(agent.substr(start + 3, 4).replace('_', '.'));\n const full = agent\n .substr(start + 3)\n .split(' ')[0]\n .replace(/_/g, '.')\n .split('.')\n .map(v => Number(v));\n\n return {\n simple,\n full: {\n major: full[0],\n minor: full[1],\n patch: full[2] || 0\n }\n };\n }\n }\n catch (e) { console.warn('Could not get iOS version.'); }\n\n return { simple: 0, full: { major: 0, minor: 0, patch: 0 } };\n}());\n\n/** Note probably not accurate but need it for version */\nexport function getBrowserVersion(): number {\n\n const ua = navigator.userAgent;\n let tem;\n let M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n\n if (/trident/i.test(M[1])) {\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n return parseFloat(tem[1]) || -1;\n }\n if (M[1] === 'Chrome') {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem != null) {\n return parseFloat(tem[2]) || -1;\n }\n }\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+)/i)) != null) {\n M.splice(1, 1, tem[1]);\n }\n return parseFloat(M[1]) || -1;\n}\n\nexport function getAndroidMajorVersion(userAgent: string): string | undefined {\n const match = userAgent.match(/Android\\s(\\d+)/i);\n return match ? match[1] : undefined;\n}\n","import { DEFAULT_IMAGE_SETTINGS, IImageSettings, ImageFitOption, ImageSizeMode, ISerializedImageElement, ISerializedImageSettings, IPosition, ISize } from '@studio/domain';\nimport { aspectRatioScale } from '@studio/utils/geom';\nimport { clamp } from '@studio/utils/utils';\n\nexport function deserializeImageSettings(element: ISerializedImageElement, originalSize?: Partial): IImageSettings {\n return element.imageSettings ? { ...element.imageSettings } : migrateFitToImageSettings(element, originalSize);\n}\n\nexport function serializeImageSettings(settings: IImageSettings): ISerializedImageSettings {\n return { ...settings };\n}\n\nfunction migrateFitToImageSettings(element: ISerializedImageElement, originalSize: Partial = {}): IImageSettings {\n\n\n // Feeds do not have an image asset\n if (!originalSize.width || !originalSize.height) {\n originalSize.width = element.width;\n originalSize.height = element.height;\n }\n\n let highDpi = false;\n if (typeof element.highDpi === 'string') {\n highDpi = element.highDpi === 'true'\n ? true\n : false;\n }\n\n let quality = element.quality;\n if (typeof element.quality === 'string') {\n quality = Number(element.quality);\n }\n\n const settings: IImageSettings = {\n quality: quality,\n highDpi: highDpi,\n sizeMode: fitOptionToSizeMode(element.fitOption),\n ...getFitPositionAsFractionAlign(element, originalSize as ISize)\n };\n\n return settings;\n}\n\n\n/**\n * Translates fitPositionX/Y to an align\n */\n export function getFitPositionAsFractionAlign(element: ISerializedImageElement, originalSize: ISize): IPosition {\n\n let x = 0.5;\n let y = 0.5;\n\n const fitOption = element.fitOption;\n const fitPositionX = Number(element.fitPositionX);\n const fitPositionY = Number(element.fitPositionY);\n\n // fitPosition only applies to cover. Contain is not supported yet\n if (fitOption === 'cover' && originalSize?.width && originalSize?.height) {\n const renderedImageSize = aspectRatioScale(originalSize, element, 'cover');\n if (fitPositionX) {\n const overflow = renderedImageSize.width - element.width;\n if (overflow > 0) {\n // fitPositionX = -1 meeans that we move the image 0.5px left\n x = clamp(0.5 - (fitPositionX * 0.5) / overflow, 0, 1);\n }\n }\n if (fitPositionY) {\n const overflow = renderedImageSize.height - element.height;\n if (overflow > 0) {\n // fitPositionY = -1 meeans that we move the image 0.5px up\n y = clamp(0.5 - (fitPositionY * 0.5) / overflow, 0, 1);\n }\n }\n }\n\n return {\n x,\n y,\n };\n}\n\nexport function fitOptionToSizeMode(fitOption?: ImageFitOption | ImageSizeMode | string): ImageSizeMode {\n switch (fitOption) {\n case 'cover':\n case 'crop':\n return ImageSizeMode.Crop;\n case 'distort':\n case 'stretch':\n return ImageSizeMode.Stretch;\n case 'contain':\n case 'fit':\n return ImageSizeMode.Fit;\n default:\n return DEFAULT_IMAGE_SETTINGS.sizeMode;\n }\n}\n","import { IBounds, IPosition, ISize, ImageFitOption, DEFAULT_IMAGE_QUALITY, ImageSizeMode, IImageViewElement, IImageElementDataNode } from '../../domain';\nimport { alignWithinBounds, aspectRatioScale, boundsToPointRect, HorizontalAlign, roundBounds, VerticalAlign } from '@studio/utils/geom';\nimport { sanitizeUrl } from '@studio/utils/sanitizer';\nimport { clamp, omitUndefined, roundToNearestMultiple } from '@studio/utils/utils';\nimport { fitOptionToSizeMode } from '../../creative/serialization/image-settings-serializer';\nimport { preciseIOSVersion } from './browser';\nimport { getFileExtension, objectToQueryString, isRelativeUrl, getUrlParameters, replaceOrigin, isSameDomain, isBase64 } from './url';\n\ninterface IImageOptimizerUrlBuilderOptions {\n webP: boolean;\n dpr: number;\n origin: string;\n defaultOrigin: string;\n}\n\nexport class ImageOptimizerUrlBuilder {\n\n private static _options: IImageOptimizerUrlBuilderOptions;\n\n static get origin(): string | undefined {\n return ImageOptimizerUrlBuilder._options?.origin;\n }\n\n /**\n * @summary\n * Initialize ImageOptimizer class to build image urls\n */\n static async init_m(origin: string = '', defaultOrigin: string = '', dpr: number = 1): Promise {\n\n // WebP loading is broken in iOS >= 14.3 < 14.5.0\n let webP = false;\n const minorIOSVersion = preciseIOSVersion.simple;\n if (minorIOSVersion > 0 && minorIOSVersion >= 14.3 && minorIOSVersion < 14.5) {\n webP = false;\n }\n else {\n webP = await testWebP();\n }\n\n ImageOptimizerUrlBuilder._options = {\n webP,\n dpr,\n origin,\n defaultOrigin\n };\n\n return webP;\n }\n\n static getCroppingOptions(element: IImageElementDataNode): ICroppingOptions | undefined {\n const imageSettings = element.imageSettings;\n if (imageSettings.sizeMode === ImageSizeMode.Crop) {\n return getCroppingOptions(element, element.imageAsset as ISize, imageSettings.x, imageSettings.y);\n }\n }\n\n static getUrlByElement_m(element: IImageElementDataNode, settings: IImageOptimizerGetUrlByElementOptions = {}): string {\n const { imageAsset, imageSettings } = element;\n const size = getMaxScaledSize(element, settings.sizeLimit);\n const url = settings.feedUrl || imageAsset?.url || '';\n const defaultQuality = settings.force ? 100 : undefined;\n const quality = typeof imageSettings.quality === 'number'\n ? imageSettings.quality\n : defaultQuality;\n let sizeMode = imageSettings.sizeMode;\n const cropping = settings.cropping;\n\n // Feeded images should always keep ratio\n if (!imageAsset) {\n sizeMode = sizeMode === ImageSizeMode.Crop ? ImageSizeMode.Crop : ImageSizeMode.Fit;\n }\n\n const { origin, defaultOrigin, webP } = ImageOptimizerUrlBuilder._options;\n const format = getFormat(url, webP);\n\n // Optimization turned off, just validate url\n if (format === 'svg' || format === 'gif' || typeof quality === 'undefined') {\n const urlWithOrigin = (origin && defaultOrigin && isSameDomain(url, defaultOrigin) && window['ENVIRONMENT'] !== 'local')\n ? replaceOrigin(url, origin)\n : url;\n\n return sanitizeUrl(urlWithOrigin);\n }\n\n // Return retina image if optimize is off in DV\n const dpr = ImageOptimizerUrlBuilder.getDevicePixelRatio(typeof imageSettings.quality === 'number' ? imageSettings.highDpi : true);\n\n return ImageOptimizerUrlBuilder.getUrl(url, { ...size, sizeMode, quality, cropping, dpr });\n }\n\n /**\n * Get url to the image optimizer.\n * WARNING: adding _m suffix to the method name will crash widgets using this\n * @param url\n * @param options\n * @returns\n */\n static getUrl(url: string, options: IImageOptimizerUrlOptions): string {\n const baseOptions = ImageOptimizerUrlBuilder._options;\n if (!baseOptions) {\n throw new Error('ImageOptimizerUrlBuilder not initiated');\n }\n\n return getImageOptimizerUrl(url, {\n webpSupport: baseOptions.webP,\n imageOptimizerOrigin: baseOptions.origin,\n dpr: baseOptions.dpr,\n ...omitUndefined(options),\n });\n }\n\n /**\n * Check if an url or element is a cropped image. It might be needed\n * to detect if an image can be expected to have the same ratio as original image or not.\n * Note that images might already be cropped without affecting url when creative is used\n * as an \"html-export\"\n * @param urlOrElement\n * @returns\n */\n static isCropped_m(urlOrElement: IImageViewElement | string = ''): boolean {\n\n const url = typeof urlOrElement === 'string' ? urlOrElement : (urlOrElement.imageUrl || '');\n\n // In html-export image optimizer will not be available\n if (!this._options.origin && typeof urlOrElement !== 'string') {\n\n // Svg and gifs are never cropped (gifs due to problems with IO)\n const format = getImageExtension(url);\n const isNotSvgOrGif = format !== 'svg' && format !== 'gif';\n const isSizeModeCrop = urlOrElement.__data.imageSettings.sizeMode === ImageSizeMode.Crop;\n\n // HTML-exported ads will have relative url's and should already be cropped\n return isRelativeUrl(url) && isSizeModeCrop && isNotSvgOrGif && !isBase64(url);\n }\n\n return !!url && ImageOptimizerUrlBuilder._isOptimized(url) && !!getUrlParameters(url)['x1'];\n }\n\n /**\n * Get original url from optimized or non optimized string\n */\n static getOriginalUrl(url: string = ''): string {\n if (ImageOptimizerUrlBuilder._isOptimized(url)) {\n return getOriginalUrl(url) || '';\n }\n return url;\n }\n\n /**\n * Check if url goes through image optimizer to request an optimized url;\n * @param url\n * @returns\n */\n private static _isOptimized(url: string): boolean {\n const origin = ImageOptimizerUrlBuilder.origin;\n return !!origin && isOptimizedUrl(url, origin);\n }\n\n static getDevicePixelRatio(highDpi?: boolean): number {\n\n // Note that this is affected by browser zoom so it can be like 1.6012\n const dpr = window.devicePixelRatio;\n\n if (highDpi && dpr) {\n\n // Decrease load on IO by only having a few different variants of the same image (1x, 1.5x and 2x)\n return clamp(roundToNearestMultiple(dpr, 0.5), 1, 2);\n }\n return this._options.dpr;\n }\n}\n\nexport function getImageOptimizerUrl(url: string, options: IImageOptimizerUrlOptions): string {\n\n if (!url) {\n throw new Error('No image url provided');\n }\n\n // Crash if it's not a friendly url\n sanitizeUrl(url);\n\n // Apply default values\n options = { ...imageOptimizerDefaults, ...omitUndefined(options)};\n\n const imageOptimizerOrigin = options.imageOptimizerOrigin || '';\n\n // No URL to optimizer specified or relative (incl. base64) => Use original image\n if (!sanitizeUrl(imageOptimizerOrigin) || isRelativeUrl(url)) {\n return url;\n }\n\n const format = getFormat(url, options.webpSupport);\n\n // Don't optimize SVG (or when wepb is not supported ignore gifs as well)\n if (format === 'svg' || format === 'gif') {\n return url;\n }\n\n // Support if an already optimized url is passed in by taking the ?u=encodedurl part as url\n if (url.indexOf(imageOptimizerOrigin) > -1) {\n const param = getUrlParameters(url)['u'];\n\n if (typeof param === 'string') {\n url = decodeURIComponent(param);\n }\n }\n\n\n if (!options.width || !options.height) {\n throw new Error('No size provided');\n }\n\n const position = options.position\n ? { positionX: options.position.x, positionY: options.position.y }\n : undefined;\n\n // Never show more than @2x resolution due to file size\n const dpr = clamp(options.dpr || 1, 1, 2);\n const w = Math.round(options.width * dpr);\n const h = Math.round(options.height * dpr);\n\n // IO Doesn't crop images with quality 100 so make quality range from 0-99 temporarily\n const q = typeof options.quality === 'number' ? clamp(options.quality, 0, 99) : undefined;\n\n // WARNING: DO NOT CHANGE THE ORDER, DOING SO WILL INVALIDATE CACHING\n const imageOptimizerParameters: IImageOptimizerParameters = {\n u: encodeURIComponent(url),\n w,\n h,\n q,\n f: format,\n rt: getOptimizerRatioParameter(options.sizeMode || options.fitOption),\n ...position,\n ...options.cropping\n };\n\n const query = objectToQueryString(imageOptimizerParameters);\n\n return `${imageOptimizerOrigin}/api/image/${options.method}${query}`;\n}\n\nexport function getCroppingOptions(size: ISize, originalSize?: ISize, alignH: HorizontalAlign = 0.5, alignV: VerticalAlign = 0.5): ICroppingOptions | undefined {\n\n if (!originalSize || !originalSize.width || !originalSize.height) {\n return;\n }\n\n // Image size on canvas including the hidden/overflow areas\n const renderedImageSize = { ...aspectRatioScale(originalSize, size, 'cover'), x: 0, y: 0 };\n\n // Area within renderedImageSize to crop\n const croppingArea = alignWithinBounds(size, renderedImageSize, alignH, alignV);\n\n const scale = originalSize.width / renderedImageSize.width;\n\n // In IO crop happens BEFORE resizing so use positions relative to original size\n const crop: IBounds = roundBounds({\n x: croppingArea.x * scale,\n y: croppingArea.y * scale,\n width: croppingArea.width * scale,\n height: croppingArea.height * scale\n });\n\n const points = boundsToPointRect(crop);\n\n // Never overflow original image (will cause a 400-error from IO)\n points.x2 = Math.min(points.x2, originalSize.width);\n points.y2 = Math.min(points.y2, originalSize.height);\n\n return points;\n}\n\nlet webPPromise: Promise;\nexport function testWebP(): Promise {\n if (!webPPromise) {\n webPPromise = new Promise(res => {\n const webP = new Image();\n webP.onload = webP.onerror = (): void => res(webP.height === 2);\n webP.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n });\n }\n return webPPromise;\n}\n\nexport function getFormat(url: string, webPSupport: boolean = false): ImageFormats {\n const originalFormat = getImageExtension(url);\n\n /**\n * Certain gifs does not render properly on iOS if it's\n * rendered as an animated webp\n */\n const iOSVersion = preciseIOSVersion.simple;\n if (originalFormat === 'gif' && iOSVersion > 0 && iOSVersion >= 14 && iOSVersion < 16) {\n webPSupport = false;\n }\n\n // SVG can't be converted to webp\n if (originalFormat === 'svg') {\n return originalFormat;\n }\n // WebP not supported\n else if (!webPSupport) {\n return !originalFormat || originalFormat === 'webp' ? 'png' : originalFormat;\n }\n\n return 'webp';\n}\n\nfunction getOptimizerRatioParameter(fitOption?: ImageFitOption | ImageSizeMode): undefined | 'cover' | 'contain' {\n\n const sizeMode = fitOptionToSizeMode(fitOption);\n\n // Distort requires the image optimizer to contain the image\n if (sizeMode === ImageSizeMode.Stretch) {\n return 'contain';\n }\n if (sizeMode === ImageSizeMode.Fit) {\n return 'contain';\n }\n if (sizeMode === ImageSizeMode.Crop) {\n return 'cover';\n }\n}\n\nfunction getMaxScaledSize(element: IImageElementDataNode, sizeLimit?: ISize): ISize {\n\n const imageAsset = element.imageAsset;\n\n let scale = element.states.reduce((accumulator, state) => {\n const scaleX = state.scaleX || 0;\n const scaleY = state.scaleY || 0;\n return Math.max(scaleX, scaleY, accumulator);\n }, 1);\n\n if (sizeLimit) {\n // Cap size increase so that image never is larger than limit (with fit 'cover')\n if (element.width <= sizeLimit.width || element.height <= sizeLimit.height) {\n const coverSize = aspectRatioScale(element, sizeLimit, 'cover');\n scale = Math.min(coverSize.width / element.width, scale);\n }\n // Element is overflowing size limit, don't increase size\n else {\n scale = 1;\n }\n }\n\n // Don't allow image getting larger than original\n if (imageAsset?.width && imageAsset?.height) {\n const assetWidth = imageAsset.width;\n const assetHeight = imageAsset.height;\n\n if (assetWidth < element.width * scale) {\n return {\n width: assetWidth,\n height: assetHeight\n };\n }\n }\n\n return {\n width: element.width * scale,\n height: element.height * scale\n };\n}\n\nexport function getImageExtension(url?: string): ImageFormats | undefined {\n const format = getFileExtension(url);\n\n switch (format) {\n case 'jpg':\n return 'jpeg';\n case 'webp':\n case 'jpeg':\n case 'gif':\n case 'png':\n case 'svg':\n return format;\n }\n}\n\n/**\n * Get url parameter from a Image Optimiser URL\n * @param url\n * @returns\n */\nexport function getOriginalUrl(url?: string): string | undefined {\n return getUrlParameters(url)['u'];\n}\n\nexport function isOptimizedUrl(url: string, imageOptimizerOrigin: string): boolean {\n return url.indexOf(imageOptimizerOrigin) > -1 && !!getOriginalUrl(url);\n}\n\ntype ImageFormats = 'webp' | 'jpeg' | 'gif' | 'png' | 'svg';\n\n/**\n * Parameters supported by the optimizer service\n */\ninterface IImageOptimizerParameters {\n\n // Url to original image. Need to be encoded.\n u: string;\n\n // Formats supported to optimize\n f: 'webp' | 'jpeg' | 'png';\n\n // Quality\n q?: number;\n\n // Size\n w: number;\n h: number;\n\n // Image Position parameters\n positionX?: number;\n positionY?: number;\n\n // Cropping parameters\n x1?: number;\n x2?: number;\n y1?: number;\n y2?: number;\n\n /**\n * How size should be calculated (like css background-size).\n * Undefined meens true distort image returned to the size given by w & h\n */\n rt?: 'contain' | 'cover';\n}\n\n// Note, this is used in widget-editor.component as well but raw text. It should match this interface\nexport interface IImageOptimizerUrlOptions {\n webpSupport?: boolean;\n imageOptimizerOrigin?: string;\n width: number;\n height: number;\n originalSize?: ISize;\n /**\n * Deprecated but might have references from widgets\n */\n fitOption?: ImageFitOption;\n sizeMode?: ImageSizeMode;\n cropping?: ICroppingOptions;\n position?: IPosition;\n quality?: number;\n format?: 'webp' | 'jpeg' | 'gif' | 'png' | 'svg';\n method?: 'optimize' | 'optimizepositionedimage';\n highDpi?: boolean;\n dpr?: number;\n}\n\nexport interface IImageOptimizerGetUrlByElementOptions {\n\n /**\n * A url from a feed that will override the one in imageAsset.url\n */\n feedUrl?: string;\n\n /**\n * Defaults to true if not set\n */\n crop?: boolean;\n\n /**\n * A size the image is not allowed to pass when\n * applying scaleX & scaleY to the size calculation\n */\n sizeLimit?: ISize\n\n /**\n * Force optimization to override optimization on/off option.\n * Defaults to false\n */\n force?: boolean;\n\n /**\n * Defines the cropping size for fitOption cover\n */\n cropping?: ICroppingOptions;\n}\n\nexport const imageOptimizerDefaults: Partial = {\n webpSupport: false,\n imageOptimizerOrigin: '',\n method: 'optimize',\n quality: DEFAULT_IMAGE_QUALITY,\n dpr: 1\n};\n\nexport interface ICroppingOptions {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n}\n","import { IUrlParameterMap } from '../domain/url-parameters';\nimport { SimpleCache } from '@studio/utils/simple-cache';\n\nexport const safeUrlRegex = /(javascript|about|data)(:|%3A)/ig;\nconst domainRegex = /^(?:https?:\\/\\/)?(?:[^@\\/\\n]+@)?(?:www\\.)?([^:\\/?\\n]+)/igm;\nconst urlRegex = /[(http(s)?):\\/\\/(www\\.)?a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)/i;\n\nexport function getUrlParameters(url: string | undefined = ''): IUrlParameterMap {\n\n const urlParams = {};\n\n const cache = SimpleCache.get(url);\n\n if (cache) {\n return cache;\n }\n\n if (url && url.indexOf('?') > -1) {\n\n // For modern browsers\n try {\n (new URL(url)).searchParams.forEach((value, key) => {\n urlParams[key] = value;\n });\n }\n catch {\n url = url.substring(url.indexOf('?') + 1);\n\n let match: RegExpExecArray | null;\n // Regex for replacing addition symbol with a space\n const search = /([^&=]+)=?([^&]*)/g;\n const decode = (s: string): string => {\n try {\n s = decodeURIComponent(s.replace(/\\+/g, ' '));\n // eslint-disable-next-line no-empty\n } catch { }\n return s;\n };\n\n const query = url || window.location.search.substring(1);\n\n while (match = search.exec(query)) {\n urlParams[decode(match[1])] = decode(match[2]);\n }\n }\n }\n\n SimpleCache.set(url, urlParams);\n\n return urlParams;\n}\n\nexport function isEncodedUrl(url: string): boolean {\n // What to do with app links like blocket://\n return url\n .toLowerCase()\n .replace(/(https?%3A)?(?=%2F%2F)/i, '')\n .indexOf('%2f%2f') === 0;\n}\n\nexport function isRelativeUrl(url: string): boolean {\n return !!url && url.replace(/^https?:/, '').indexOf('//') !== 0;\n}\n\nexport function isUrl(url: string | undefined): boolean {\n return typeof url === 'string' && !!url.match(urlRegex);\n}\n\nexport function isBase64(str?: string): boolean {\n return !!str && str.startsWith('data:image');\n}\n\nexport function isBase64Video(str?: string): boolean {\n return !!str && str.startsWith('data:video');\n}\n\nexport function addProtocol(url?: string, protocol: 'http' | 'https' | undefined = 'https'): string | undefined {\n if (!url || url === '#') {\n return url;\n }\n\n // Links without protocol messes up iOS safari\n if (url.indexOf('//') === 0) {\n url = `${protocol}:${url}`;\n }\n\n // Make sure url starts with http:// or https://\n else if (url.indexOf('http') !== 0) {\n url = `${protocol}://${url}`;\n }\n\n return url;\n}\n\n/**\n * Merge two parts of a url.\n * Applies a slash between if missing and removes if it has two adjacent.\n * @param domain\n * @param path\n */\nexport function concatUrl(domain: string = '', path: string = ''): string {\n if (domain.length && path.length) {\n if (domain.charAt(domain.length - 1) !== '/') {\n domain += '/';\n }\n if (path.charAt(0) === '/') {\n path = path.substr(1);\n }\n }\n\n return domain + path;\n}\n\n/**\n * Turn object into query parameters\n * @param obj\n */\nexport function serializeObject(obj: any): string {\n const str: string[] = [];\n\n if (typeof obj === 'object') {\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n str.push(`${encodeURIComponent(key)}=${encodeURIComponent(obj[key])}`);\n }\n }\n }\n\n return str.join('&');\n}\n\nexport function getDomain(url?: string, stripProtocol: boolean = true): string | undefined {\n if (typeof url === 'string') {\n const match = url.match(domainRegex);\n if (match) {\n return stripProtocol ? removeProtocol(match[0]) : match[0];\n }\n }\n}\n\nexport function removeProtocol(url: string): string {\n return url.replace(/^((https?:)?\\/\\/)/gim, '');\n}\n\nexport function hasParameter(parameters: IUrlParameterMap, key: string, ): boolean {\n return parameters[key] !== undefined;\n}\n\nexport function parameterToBool(parameter?: string): boolean | undefined {\n\n if (!parameter) {\n return undefined;\n }\n\n switch (parameter.toLowerCase()) {\n case '1':\n case 'on':\n case 'true':\n case 'yes':\n return true;\n case '0':\n case 'off':\n case 'false':\n case 'no':\n return false;\n default:\n return undefined;\n }\n}\n\nexport function parameterToUrl(parameter?: string): string {\n if (!parameter) {\n return '';\n }\n return isEncodedUrl(parameter) ? decodeURIComponent(parameter) : parameter;\n}\n\nexport function replaceOrigin(url: string, newOrigin: string): string {\n if (!newOrigin) {\n return url;\n }\n return url.replace(new URL(url).origin, new URL(newOrigin).origin);\n}\n\nexport function isBannerflow(url: string): boolean {\n if (!url) {\n return false;\n }\n const hostname = typeof URL === 'function' ? new URL(url).hostname : getDomain(url, true);\n return !!hostname && !!hostname.match(/((bannerflow\\.)|(studio\\.local))/g);\n}\n\nexport function isSameDomain(a: string, b: string): boolean {\n return getDomain(a) === getDomain(b);\n}\n\nexport function removeQueryParams(url: string): string {\n return url.replace(/\\?.*/g, '');\n}\n\n\nexport function getUrlsInString(str: string): string[] {\n return str && str.match(/(https?:\\/\\/[^\\s]+)/g) || [];\n}\n\n/**\n * Return the first url that's not undefined. '' means that we should prevent click\n */\nexport function getFirstUrl(...urls: Array | []): string | undefined {\n // NOSONAR\n for (let i = 0; i < urls.length; i++) {\n if (urls[i] !== undefined && urls[i] !== null) {\n return urls[i];\n }\n }\n return undefined;\n}\n\n\nexport function objectToQueryString(params: any, removeEmpty: boolean = true): string {\n if (typeof params === 'object') {\n const queries: string[] = [];\n for (const key in params) {\n const value = params[key];\n if ((value !== undefined && value.toString()) || !removeEmpty) {\n queries.push(`${key}=${value}`);\n }\n }\n\n return queries.length ? `?${queries.join('&')}` : '';\n }\n return '';\n}\n\nexport function getFileExtension(url?: string): string | undefined {\n if (url) {\n const split = url.split(/[#?]/);\n const fragment = split[0];\n const dot = fragment.split('.');\n if (dot.length === 1) {\n return undefined; // no extension found\n }\n const extension = dot.pop()\n ?.trim()\n .toLowerCase();\n\n if (extension) {\n return /[a-zA-Z]/gi.test(extension) ? extension : undefined;\n }\n }\n return undefined;\n}\n\nexport function removeFileExtension(value: string): string {\n return (value || '').replace(/\\.(jpg|png|gif|svg|mp4)$/, '');\n}\n\nexport function isVideoFile(url: string): boolean {\n const ext = getFileExtension(url);\n if (ext) {\n return /(mp4|mov|webm|h264)/.test(ext);\n }\n return false;\n}\n\nexport function isSVGFile(url: string): boolean {\n const ext = getFileExtension(url);\n if (ext) {\n return ext === 'svg';\n }\n return false;\n}\n\nexport function isInLocalEnvironment(): boolean {\n if (!window) {\n return false;\n }\n if (window.location.protocol === 'file:') {\n return true;\n }\n\n return false;\n}\n\nexport function getOrigin(str: string): string {\n try {\n const url = new URL(str);\n return url.origin;\n }\n catch {\n try {\n if (!isUrl(str)) {\n throw new Error('Provided value is not a valid url.');\n }\n const a = document.createElement('a');\n a.href = str;\n return a.origin;\n }\n catch (e) {\n throw new Error(e as string);\n }\n }\n}\n\nexport function getFileName(url: string): string {\n const segments = new URL(url).pathname.split('/');\n return segments.pop() || url;\n}\n\nexport function addMissingProtocol(url: string): string {\n return /https?:\\/\\//.test(url) ? url : `https://${url}`;\n}\n","import { OneOfElementDataNodes } from '@studio/domain';\nimport { uuidv4 } from '../../utils/utils';\nimport { ActionOperationMethod, ActionTrigger, IAction, ReservedActionId, MouseOrTouchEvent } from '../../domain/action';\nimport { DEFAULT_TIMING_FUNCTION } from '../timing-functions';\n\n\ninterface ICreateActionOptions {\n target?: string;\n stateId?: string;\n method?: ActionOperationMethod;\n triggers?: ActionTrigger[];\n templateId?: ReservedActionId;\n preventClickThrough?: boolean;\n}\n\nexport function createAction(options: ICreateActionOptions = {}): IAction {\n\n if (!options.target) {\n if (options.templateId) {\n throw new Error('Actions with templateId requires a target.');\n }\n\n if (options.stateId) {\n throw new Error('Actions with state IDs requires a target.');\n }\n }\n\n\n if (options.triggers?.find(trigger => trigger === ActionTrigger.TouchEnd)) {\n options.triggers.push(ActionTrigger.TouchCancel);\n }\n\n const action: IAction = {\n id: uuidv4(),\n triggers: options.triggers?.length\n ? options.triggers\n : [ActionTrigger.MouseDown],\n operations: [{\n method: options.method || ActionOperationMethod.SetState,\n value: options.method === ActionOperationMethod.OpenUrl\n ? ''\n : options.stateId || undefined,\n target: options.target || undefined,\n animation: DEFAULT_ACTION_ANIMATION\n }],\n conditions: [],\n disabled: false,\n templateId: options.templateId,\n preventClickThrough: options.preventClickThrough\n };\n\n return action;\n}\n\ninterface IActionEventListeners {\n ActionHandler: IActionHandler;\n}\n\nexport interface IActionHandler {\n callback: (event: MouseOrTouchEvent, trigger: ActionTrigger, forceClearStates?: boolean) => void;\n}\n\nexport function registerActionEventHandlers(ActionHandler: IActionHandler): IActionEventListeners {\n const triggers: IActionEventListeners = {} as IActionEventListeners;\n for (const trigger in ActionTrigger) {\n triggers[ActionTrigger[trigger]] = (event: MouseOrTouchEvent, forceClearStates?: boolean): void => ActionHandler.callback(event, ActionTrigger[trigger], forceClearStates);\n }\n return triggers;\n}\n\nexport function isReservedAction(action: IAction): boolean {\n return !!action.templateId;\n}\n\nexport function hasActionPreventClickthrough(dataElement?: OneOfElementDataNodes): boolean {\n const actions = dataElement?.actions;\n if (!actions) {\n return false;\n }\n\n return actions.some(action =>\n !action.disabled && action.preventClickThrough\n );\n}\n\nexport function hasActionTargetUrl(dataElement?: OneOfElementDataNodes): boolean {\n const actions = dataElement?.actions;\n if (!actions) {\n return false;\n }\n\n return actions.some(action =>\n !action.disabled &&\n action.operations.some(op => op.method === ActionOperationMethod.OpenUrl && op.value)\n );\n}\n\nexport function isCancelTrigger(trigger: ActionTrigger): boolean {\n return trigger === ActionTrigger.MouseLeave\n || trigger === ActionTrigger.TouchEnd\n || trigger === ActionTrigger.TouchCancel;\n}\n\nexport function isStateActionMethod(method: ActionOperationMethod): boolean {\n const stateMethods = [\n ActionOperationMethod.SetState,\n ActionOperationMethod.RemoveState,\n ActionOperationMethod.ClearStates\n ];\n\n return stateMethods.indexOf(method) > -1;\n}\n\n\nexport const DEFAULT_ACTION_ANIMATION = {\n timingFunction: DEFAULT_TIMING_FUNCTION,\n duration: 0.2\n};\n","import { handleError } from '@studio/utils/errors';\nimport { capitalize, getUniqueName } from '@studio/utils/string';\nimport { clamp, deepEqual, omit, toFixedDecimal, uuidv4 } from '@studio/utils/utils';\nimport { ISerializedAnimation, ISerializedDataElement, IAnimationTemplate, IAnimation, IAnimationKeyframe, AnimationType, OneOfElementDataNodes, IAnimationSettings, TimingFunctionKey, IState, ITime, ITimeAndDuration, OneOfStatePropertyKeys, keyframeProperties, animatableProperties, OneOfDataNodes } from '@studio/domain';\nimport { createEmptyState, getStateById, isEmptyState, isEqualStates } from '@creative/rendering/states.utils';\nimport { DEFAULT_TIMING_FUNCTION } from './timing-functions';\nimport { isHidden } from './nodes/helpers';\n\n/**\n * Time in second between large.\n */\nexport const IN_OUT_ANIMATION_GAP = 0.02;\nexport const MIN_ELEMENT_DURATION = 0.1;\nexport const MIN_ANIMATION_DURATION = 0.1;\nexport const MIN_KEYFRAME_DISTANCE = 0.08;\nexport const KEYFRAME_SNAP_DISTANCE = 0.02;\n\nexport type TimelineResizeDirection = 'left' | 'right' | 'both';\n\nexport type KeyframeTemplate = ITime & Partial;\ntype KeyframeAndState = { keyframe: IAnimationKeyframe, state: IState };\ntype KeyframesAndStates = { keyframes: IAnimationKeyframe[], states: IState[] };\n\ninterface IAnimationInputSettings {\n name?: string;\n type?: AnimationType;\n timingFunction?: TimingFunctionKey;\n}\n\nexport function addAnimationToElement(element: OneOfElementDataNodes, settings: IAnimationInputSettings = {}, keyframesTemplates: KeyframeTemplate[] = []): IAnimation {\n const animation = createAnimation(element, settings);\n const { keyframes, states } = createKeyframesAndStatesFromTemplates(...keyframesTemplates);\n\n animation.keyframes.push(...keyframes);\n element.animations.push(animation);\n element.states.push(...states);\n\n element.animations.sort(sortAnimations);\n\n return animation;\n}\n\nexport function createAnimation(element: OneOfElementDataNodes, settings: IAnimationInputSettings = {}): IAnimation {\n let name = getUniqueName(settings.name || 'Animation', element.animations.map(animation => animation.name));\n\n if (isTransitionType(settings.type)) {\n name += ` ${settings.type}`;\n }\n\n const animation: IAnimation = {\n id: uuidv4(),\n keyframes: [],\n name,\n timingFunction: settings.timingFunction || DEFAULT_TIMING_FUNCTION,\n type: settings.type || 'keyframe',\n hidden: false\n };\n return animation;\n}\n\nexport function createKeyframesAndStatesFromTemplates(...templates: KeyframeTemplate[]): KeyframesAndStates {\n\n const keyframeTemplates = templates.filter(t =>\n Object.keys(filterKeyframePropertiesFromKeyframeTemplate(t)).length\n );\n const defaultTemplates = templates.filter(t => keyframeTemplates.indexOf(t) === -1);\n\n // Create all keyframes that have a state\n const { keyframes, states } = createKeyframesWithStates(...keyframeTemplates);\n\n // Apply all default state keyframes\n defaultTemplates.forEach(t => keyframes.push(createKeyframe(t)));\n\n keyframes.sort(sortByTime);\n\n return { keyframes, states };\n}\n\nexport function createKeyframesWithStates(...keyframeTemplates: KeyframeTemplate[]): KeyframesAndStates {\n const states: IState[] = [];\n const keyframes: IAnimationKeyframe[] = [];\n\n for (let i = 0; i < keyframeTemplates.length; i++) {\n\n const k = keyframeTemplates[i];\n\n const stateProps = filterKeyframePropertiesFromKeyframeTemplate(k);\n\n const newState = createEmptyState();\n const state = {\n ...newState,\n ...stateProps,\n id: newState.id\n };\n states.push(state);\n\n k.stateId = newState.id;\n\n keyframes.push(createKeyframe(k));\n }\n keyframes.sort(sortByTime);\n\n return { keyframes, states };\n}\n\n/**\n * Get duration of an animation\n * @param animation\n */\nexport function getAnimationDuration(animation: IAnimation | IAnimationTemplate): number {\n return getDuration(...animation.keyframes);\n}\n\n/**\n * Get time when animation starts.\n * Note that time is relative to element.time\n * @param animation\n */\nexport function getAnimationTime(animation: IAnimation): number {\n return getTime(...animation.keyframes);\n}\n\n\n// export function getDurationOfAnimations(animations: IAnimation[]): number {\n// let from = Number.MAX_VALUE;\n// let to = 0;\n\n// if (animations && animations.length) {\n// animations.forEach(animation => {\n// const start = getAnimationTime(animation);\n// const end = start + getAnimationDuration(animation);\n// from = Math.min(from, start);\n// to = Math.min(to, end);\n// });\n// return to - from;\n// }\n// return 0;\n// }\n\n/**\n * Change duration of a single animation.\n */\nexport function setAnimationDuration(animation: IAnimation, duration: number): void {\n const { keyframes, type } = animation;\n if (!keyframes || !keyframes.length) {\n throw new Error(`Can't set duration on an animation without keyframes`);\n }\n\n duration = Math.max(getMinAnimationDuration(animation), duration);\n\n validateDuration(duration);\n\n const currentDuration = getAnimationDuration(animation);\n\n // Single keyframes have 0 duration which can't scale...\n if (currentDuration) {\n const scale = duration / currentDuration;\n\n // The keyframe that should stay in place (0 for everything fluid)\n const reference = isTransitionType(type) ? (type === 'out' ? keyframes[keyframes.length - 1] : keyframes[0]).time : 0;\n\n keyframes.forEach((keyframe) => {\n const dt = keyframe.time - reference;\n keyframe.time = reference + dt * scale;\n keyframe.duration = (keyframe.duration || 0) * scale;\n });\n }\n}\n\nexport function fixTransitionKeyframesAlign(element: OneOfElementDataNodes, animation: IAnimation): void {\n const keyframes = animation.keyframes;\n if (keyframes.length > 1) {\n if (animation.type === 'in') {\n keyframes[0].time = 0;\n }\n else if (animation.type === 'out') {\n keyframes[keyframes.length - 1].time = element.duration - keyframes[keyframes.length - 1].duration;\n }\n }\n}\n\n/**\n * Remove all animations of a ceratin type\n */\nexport function removeAnimationsOfType(element: OneOfElementDataNodes, type: AnimationType): IAnimation[] {\n return removeAnimations(element, ...element.animations.filter((animation: IAnimation) => animation.type === type));\n}\n\n/**\n * Remove a selection of animations from the array of animations\n * @param animations\n * @param animationsToRemove\n */\nexport function removeAnimations(element: OneOfElementDataNodes, ...animationsToRemove: IAnimation[]): IAnimation[] {\n const removedAnimations: IAnimation[] = [];\n const animations = element.animations;\n for (let i = animations.length - 1; i >= 0; i--) {\n const removeIndex = animationsToRemove.findIndex(remove => animations[i].id === remove.id);\n if (removeIndex > -1) {\n animationsToRemove.splice(removeIndex, 1);\n removedAnimations.push(animations.splice(i, 1)[0]);\n }\n }\n removeAnimationStates(element, removedAnimations);\n return removedAnimations;\n}\n\n/**\n * Remove states not used by a set of animations\n * @param element\n * @param animationsToRemove\n */\nexport function removeAnimationStates(element: OneOfElementDataNodes, animationsToRemove: IAnimation[]): void {\n if (animationsToRemove.length) {\n const persistentAnimations = element.animations.filter(animation => !animationsToRemove.some(a => a === animation));\n const persistentKeyframes = getAllKeyframes(persistentAnimations);\n const keyframesToBeRemoved = getAllKeyframes(animationsToRemove);\n\n const idsToRemove = keyframesToBeRemoved\n .map(keyframe => keyframe.stateId)\n .filter(id => id && !persistentKeyframes.some(keyframe => id === keyframe.stateId));\n\n element.states = element.states.filter(state => !idsToRemove.some(id => state.id === id));\n }\n}\n\nexport function removeKeyframes(element: OneOfElementDataNodes, keyframes: IAnimationKeyframe[]): void {\n\n const statesToRemove = new Set();\n\n element.animations.forEach(animation => {\n keyframes.forEach(keyframe => {\n const keyframeToRemove = animation.keyframes.find(kf =>\n kf === keyframe\n );\n\n if (keyframeToRemove) {\n statesToRemove.add(keyframeToRemove.stateId!);\n\n animation.keyframes = animation.keyframes.filter(kf => kf !== keyframe);\n }\n });\n\n });\n\n element.states = element.states.filter(state => !statesToRemove.has(state.id!));\n}\n\n/**\n * Moive animation without changing the duration.\n * Remember that keyframe.time is relative to element.time.\n * @param animation\n * @param relativeTime\n */\nexport function moveAnimationTo(animation: IAnimation, relativeTime: number): number {\n const dt = relativeTime - getAnimationTime(animation);\n animation.keyframes.forEach(keyframe => keyframe.time += dt);\n return relativeTime;\n}\n\n/**\n * Align an animation to end or start of an element.\n * @param animation\n * @param elementDuration\n * @param alignTo\n */\nexport function alignAnimation(animation: IAnimation, elementDuration: number, alignTo: TimelineResizeDirection): number {\n const duration = getAnimationDuration(animation);\n let origin = alignTo === 'both' ? 0.5 : 0;\n if (alignTo === 'right') {\n origin = 1;\n }\n const moveTo = origin * (elementDuration - duration);\n return moveAnimationTo(animation, moveTo);\n}\n\n/**\n * Get duration of all in animations\n */\nexport function getInAnimationDuration(animations: IAnimation[]): number {\n return getAnimationDurationOfType(animations, 'in');\n}\n\n/**\n * Get duration of all out animations\n */\nexport function getOutAnimationDuration(animations: IAnimation[]): number {\n return getAnimationDurationOfType(animations, 'out');\n}\n\n\n/**\n * Get duration of all out animations\n */\nexport function getAnimationDurationOfType(animations: IAnimation[], type: AnimationType): number {\n return getDurationOfAnimations(animations.filter((animation: IAnimation) => animation.type === type));\n}\n\n\n/**\n * Set the duration of all in animations\n * @param animations\n * @param duration\n */\nexport function setInDuration(element: OneOfElementDataNodes, duration: number): void {\n setDurationOfType(element, duration, 'in');\n}\n\n\n/**\n * Set the duration of all out animations\n * @param animations\n * @param duration\n */\nexport function setOutDuration(element: OneOfElementDataNodes, duration: number): void {\n setDurationOfType(element, duration, 'out');\n}\n\n/**\n * Helper to change duration from other anchorpoints than element.time\n */\nexport function getDirectionalDurationChange(current: ITimeAndDuration, newDuration: number, direction: TimelineResizeDirection = 'right', limit: { left?: number, right?: number} = {}): ITimeAndDuration {\n const leftLimit = limit.left || 0;\n const rightLimit = limit.right;\n\n const { duration } = current;\n let origin = direction === 'both' ? 0.5 : 0;\n if (direction === 'left') {\n origin = 1;\n }\n const durationDifference = newDuration - duration;\n let newTime = current.time - durationDifference * origin;\n\n if (newTime < leftLimit) {\n newDuration += origin ? (newTime - leftLimit) / origin : 0;\n newTime = leftLimit;\n }\n if (typeof rightLimit === 'number') {\n const overflow = newTime + newDuration - rightLimit;\n if (overflow > 0) {\n newDuration -= overflow - (overflow * origin);\n newTime -= overflow * origin;\n }\n }\n\n return {\n time: newTime,\n duration: newDuration\n };\n}\n\nexport function setDurationOfElements(elements: OneOfElementDataNodes[], newDuration: number, direction: TimelineResizeDirection = 'right'): void {\n newDuration = Math.max(newDuration, getMinDurationOfElements(...elements));\n\n const current = getTimeAndDuration(...elements);\n const directionalChange = getDirectionalDurationChange(current, newDuration, direction);\n const timeDiff = directionalChange.time - current.time;\n const durationDiff = directionalChange.duration - current.duration;\n\n elements.forEach(element => {\n setElementTimeAndDuration(element, element.time + timeDiff, element.duration + durationDiff);\n });\n}\n\nexport function setElementDuration(element: OneOfElementDataNodes, newDuration: number, direction: TimelineResizeDirection = 'right'): void {\n\n if (element.duration !== newDuration) {\n newDuration = Math.max(getMinElementDuration(element), newDuration);\n const { time, duration } = getDirectionalDurationChange(element, newDuration, direction);\n const outAnimations = getAnimationsOfType(element, 'out');\n\n outAnimations.forEach(animation => {\n // Distance in seconds from \"end\"\n const diff = element.duration - getAnimationTime(animation);\n moveAnimationTo(animation, duration - diff);\n });\n\n const keyframeAnimations = getAnimationsOfType(element, 'keyframe');\n // const keyframesDuration = getA\n keyframeAnimations.forEach(animation => {\n scaleAnimationToElementDuration(animation, element.duration, duration);\n });\n element.duration = duration;\n element.time = time;\n validateAnimations(element);\n }\n}\n\nexport function setElementTimeAndDuration(element: OneOfElementDataNodes, time: number, duration: number): void {\n setElementDuration(element, duration);\n element.time = time;\n}\n\nexport function setDurationOfType(element: OneOfElementDataNodes, duration: number, type: AnimationType): void {\n const animations = element.animations.filter((animation: IAnimation) => animation.type === type);\n setDurationOfAnimations(element, animations, duration);\n}\n\nexport function moveElementToPlayhead(element: OneOfElementDataNodes, elements: ITimeAndDuration[], playheadTime: number): void {\n\n // Exclude itself\n elements = elements.filter(e => e !== element);\n\n const timeAndDuration = getTimeAndDuration(...elements);\n const creativeDuration = timeAndDuration.time + timeAndDuration.duration;\n\n let newTime = Math.max(0, playheadTime - getInAnimationDuration(element.animations));\n\n // With no elemets duration is 0\n if (creativeDuration) {\n newTime = clamp(newTime, 0, Math.max(0, creativeDuration - element.duration));\n }\n else {\n newTime = 0;\n }\n\n element.time = newTime;\n}\n\n/**\n * Scale a bunch of animations so they \"cover\" the given duration\n * @param animations\n * @param duration\n */\nexport function setDurationOfAnimations(element: OneOfElementDataNodes, animations: IAnimation[], duration: number): void {\n\n if (animations?.length) {\n\n const { type } = animations[0];\n\n // When scaling in and out animations make sure they don't overlap the opposite type animations\n if (isTransitionType(type) && animations.every(a => a.type === type)) {\n duration = Math.min(duration, getMaxAnimationDuration(element, animations[0]));\n }\n\n duration = Math.max(MIN_ANIMATION_DURATION, duration);\n\n validateDuration(duration);\n\n const currentDuration = getDurationOfAnimations(animations);\n const scale = duration / currentDuration;\n\n animations.forEach(animation => {\n const animationDuration = getAnimationDuration(animation);\n\n // Set to full duration if animation has no duration\n const newDuration = (animationDuration || currentDuration) * scale;\n\n if (!isNaN(scale)) {\n if (animation.keyframes.length > 1) {\n setAnimationDuration(animation, newDuration);\n }\n else {\n scaleKeyframeAnimation(animation, scale);\n }\n }\n });\n }\n}\n\nexport function scaleAnimationToElementDuration(animation: IAnimation, oldDuration: number, newDuration: number): void {\n const animationDuration = getAnimationDuration(animation);\n const scale = newDuration / oldDuration;\n\n // Only animations that have durations can be scaled\n if (animationDuration) {\n setAnimationDuration(animation, animationDuration * scale);\n }\n // Typically for animations with only one keyframe\n else {\n scaleKeyframeAnimation(animation, scale);\n }\n}\n\n/**\n * Move all keyframes in an animations by a scale.\n * Note: setAnimationDuration should be the prefered method for this\n * since it can handle in/out animations.\n * @param animation\n * @param scale\n */\nexport function scaleKeyframeAnimation(animation: IAnimation, scale: number): void {\n if (animation.type !== 'keyframe') {\n throw new Error('Can only scale keyframe animations');\n }\n if (!scale) {\n throw new Error('A positive scale must be provided');\n }\n animation.keyframes.forEach(k => {\n k.time *= scale;\n k.duration = k.duration * scale;\n });\n}\n\n/**\n * Get the total duration of a group of animations.\n * Note: This is not returning just the longest duration.\n * So the duration of the in and out animation will be element.duration.\n */\nexport function getDurationOfAnimations(animations: IAnimation[]): number {\n return getDuration(...getAllKeyframes(animations));\n}\n\nexport function getTimeOfAnimations(animations: IAnimation[]): number {\n return getTime(...getAllKeyframes(animations));\n}\n\nexport function getTimeAndDurationOfAnimations(animations: IAnimation[]): ITimeAndDuration {\n return getTimeAndDuration(...getAllKeyframes(animations));\n}\n\nexport function getAnimationKeyframesOfType(element: OneOfElementDataNodes, type: AnimationType): IAnimationKeyframe[] {\n const animations = getAnimationsOfType(element, type);\n return animations.reduce((acc, curr) => [...acc, ...curr.keyframes], []);\n}\n\n/**\n * TODO: SUPPORT MORE CASES THAN IN/OUT\n */\nexport function isElementInMainStateAtTime(element: OneOfElementDataNodes, time: number): boolean {\n if (!isElementVisibleAtTime(element, time)) {\n return false;\n }\n const inDuration = getInAnimationDuration(element.animations) || 0;\n const outDuration = getOutAnimationDuration(element.animations) || 0;\n const inTime = element.time + inDuration;\n const outTime = element.time + element.duration - outDuration;\n const tolerance = 0.000001;\n\n // Sometimes javascript gives you number like 7.6000000000000005 despite rounding.\n if (Math.abs(inTime - time) < tolerance || Math.abs(outTime - time) < tolerance) {\n return true;\n }\n // normal compare\n else if (time < inTime || time > outTime) {\n return false;\n }\n\n return true;\n}\n\nexport function validateKeyframeToStatesMapping(element: OneOfElementDataNodes | ISerializedDataElement): boolean {\n const keyframes = getAllKeyframes(element);\n for (const keyframe of keyframes) {\n if (keyframe.stateId) {\n if (!element.states?.some(state => state.id === keyframe.stateId)) {\n throw new Error('Keyframe is missing corresponding state');\n }\n }\n }\n // TODO: Add more cases when actions etc is applied\n if (element.states) {\n for (const state of element.states) {\n if (state.name) {\n continue;\n }\n\n /**\n * When creating animation keyframes, the state\n * is initially always empty without references\n */\n const stateProps = Object.keys(state);\n let emptyValidState = false;\n if (stateProps.length === 1 && stateProps[0] === 'id') {\n emptyValidState = true;\n }\n\n if ((!state.id) || !emptyValidState && !keyframes.some(keyframe => state.id === keyframe.stateId)) {\n throw new Error('State without any references detected');\n }\n }\n }\n return true;\n}\n\n\nexport function getAnimationsOfType(element: OneOfElementDataNodes, type: AnimationType): IAnimation[] {\n return (element.animations || []).filter(a => a.type === type);\n}\n\n\nexport function hasAnimationsOfType(element: OneOfElementDataNodes, type: AnimationType): boolean {\n return getAnimationsOfType(element, type).length > 0;\n}\n\n\nexport function isElementVisibleAtTime(element: OneOfDataNodes, time: number): boolean {\n return !isHidden(element) && isTimeAt(time, element);\n}\n\nexport function getAnimationTypeAtTime(element: OneOfElementDataNodes, time: number): 'in' | 'out' | 'keyframe' | undefined {\n const animations = getAnimationsAtTime(element, time);\n if (animations.length) {\n const transition = animations.find(a => isTransitionType(a.type));\n if (transition) {\n return transition.type as 'in' | 'out';\n }\n return animations[0].type as 'keyframe';\n }\n\n return undefined;\n}\n\nexport function getAnimationsAtTime(element: OneOfElementDataNodes, absoluteTime: number): IAnimation[] {\n const relativeTime = toRelativeTime(element, absoluteTime);\n\n return element.animations.filter(animation =>\n isTimeAt(relativeTime, getTimeAndDuration(...animation.keyframes))\n );\n}\n\nexport function getTimelineOverlap(position1: ITimeAndDuration, position2: ITimeAndDuration): ITimeAndDuration | undefined {\n const from = Math.max(position1.time, position2.time);\n const to = Math.min(position1.time + position1.duration, position2.time + position2.duration);\n const duration = to - from;\n if (duration > 0) {\n return {\n time: from,\n duration\n };\n }\n}\n\nexport function getMainStateOverlap(element1: OneOfElementDataNodes, element2: OneOfElementDataNodes): ITimeAndDuration | undefined {\n return getTimelineOverlap(getMainStateTimelinePosition(element1), getMainStateTimelinePosition(element2));\n}\n\nexport function isTimelineOverlap(position1: ITimeAndDuration, position2: ITimeAndDuration): boolean {\n return getTimelineOverlap(position1, position2) !== undefined;\n}\n\nexport function isMainStateOverlap(element1: OneOfElementDataNodes, element2: OneOfElementDataNodes): boolean {\n return isTimelineOverlap(getMainStateTimelinePosition(element1), getMainStateTimelinePosition(element2));\n}\n\nexport function getMainStateTimelinePosition(element: OneOfElementDataNodes): ITimeAndDuration {\n const inDuration = getInAnimationDuration(element.animations);\n const outDuration = getOutAnimationDuration(element.animations);\n return {\n time: element.time + inDuration,\n duration: element.duration - (inDuration + outDuration)\n };\n}\n\nexport function getAnimationByKeyframe(element: OneOfElementDataNodes, keyframe: IAnimationKeyframe): IAnimation | undefined {\n return element.animations.find(animation => animation.keyframes.some( k => k === keyframe));\n}\n\nexport function getAllKeyframes(elementOrAnimations: OneOfElementDataNodes | ISerializedDataElement | IAnimation[] | ISerializedAnimation[]): IAnimationKeyframe[] {\n const animations = Array.isArray(elementOrAnimations) ? elementOrAnimations : elementOrAnimations.animations;\n const keyframes: IAnimationKeyframe[] = [];\n animations?.forEach(animation => keyframes.push(...animation.keyframes));\n return keyframes;\n}\n\nexport function getElementOfAnimation(elements: ReadonlyArray, animation: IAnimation): OneOfElementDataNodes | undefined {\n return elements.find(el => el.animations.find(ani => ani === animation));\n}\n\nexport function getElementAndAnimationOfKeyframe(elements: ReadonlyArray, keyframe: IAnimationKeyframe): { element: OneOfElementDataNodes, animation: IAnimation } | undefined {\n for (const element of elements) {\n const animation = getAnimationOfKeyframe(element, keyframe);\n if (animation) {\n return { element, animation };\n }\n }\n}\n\nexport function getAnimationOfKeyframe(elementOrAnimations: OneOfElementDataNodes | IAnimation[], keyframe: IAnimationKeyframe): IAnimation | undefined {\n const animations = Array.isArray(elementOrAnimations) ? elementOrAnimations : elementOrAnimations.animations;\n return animations.find(animation => animation.keyframes.some(k => k === keyframe));\n}\n\nexport function createKeyframe(options: ITime & Partial): IAnimationKeyframe {\n const keyframe: IAnimationKeyframe = {\n id: uuidv4(),\n time: options.time,\n stateId: options.stateId,\n timingFunction: options.timingFunction || DEFAULT_TIMING_FUNCTION,\n duration: options.duration || 0\n };\n\n return keyframe;\n}\n\n\nexport function addKeyframe(element: OneOfElementDataNodes, animation: IAnimation, options: ITime & Partial): IAnimationKeyframe | undefined {\n const keyframe = createKeyframe({ ...options, time: -1 });\n\n animation.keyframes.unshift(keyframe);\n\n const time = moveKeyframeTo(element, animation, keyframe, options.time);\n\n // Could not place the element\n if (time === undefined) {\n handleError('Could not place keyframe', {\n level: 'warning'\n });\n\n animation.keyframes.shift();\n }\n\n return time === undefined ? undefined : keyframe;\n}\n\nexport function addKeyframeWithState(element: OneOfElementDataNodes, animation: IAnimation, properties: ITime & Partial): KeyframeAndState | undefined {\n const previousKeyframe = getPreviousTime(animation.keyframes, properties.time);\n const { keyframes, states } = createKeyframesWithStates({\n // If there is a previous timing function, duplicate that for the new keyframe\n timingFunction: previousKeyframe?.timingFunction,\n ...properties,\n });\n\n const keyframe = addKeyframe(element, animation, keyframes[0]);\n if (!keyframe) {\n console.warn('Cant add new keyframe');\n return;\n }\n const state = states[0];\n element.states.push(state);\n return { state, keyframe };\n}\n\nexport function getClosestGap(time: ITime, elements: ITime[], totalDuration: number, minDistance = 0): number | undefined {\n // Fastest way, no obstacles in the way from start\n if (!elements.some(element => getTimeBetween(element, time) < minDistance)) {\n return time.time;\n }\n // Do a more sophisticated calculation of the closest available position\n else if (elements.length) {\n const first = elements[0];\n const last = elements[elements.length - 1];\n\n // Get all gaps between keyframes that the keyframe to move can fit between\n const availableGaps = elements\n .slice(1)\n .map((k, i) => ({\n time: elements[i].time + (elements[i].duration || 0) + minDistance,\n duration: getTimeBetween(elements[i], k) - minDistance * 2\n }))\n .filter(k => k.duration >= (time.duration || 0));\n\n // Add available gap at start of element\n if (first.time >= (time.duration || 0) + minDistance) {\n availableGaps.unshift({\n time: 0,\n duration: first.time - minDistance\n });\n }\n // Add available gap of the end of element\n if (last.time + minDistance + (time.duration || 0) <= totalDuration) {\n availableGaps.push({\n time: last.time + (last.duration || 0) + minDistance,\n duration: time.duration || 0\n });\n }\n\n if (availableGaps.length) {\n return availableGaps\n // Convert to numeric time\n .map(g => clamp(time.time, g.time, g.time + g.duration - (time.duration || 0)))\n // Find position closest to relativeTime\n .reduce((prev, curr) => (Math.abs(curr - time.time) < Math.abs(prev - time.time) ? curr : prev));\n }\n }\n\n}\n\nexport function moveKeyframeTo(element: OneOfElementDataNodes, animation: IAnimation, keyframe: IAnimationKeyframe, relativeTime: number): number | undefined {\n const duration = keyframe.duration || 0;\n const type = animation.type;\n let keyframes = animation.keyframes;\n const index = keyframes.indexOf(keyframe);\n relativeTime = clamp(relativeTime, 0, element.duration - duration);\n\n // Snap first keyframe to start\n if (index === 0) {\n relativeTime = relativeTime <= KEYFRAME_SNAP_DISTANCE ? 0 : relativeTime;\n }\n // Snap last keyframe to end\n else if (index === keyframes.length - 1 && index !== -1) {\n relativeTime = relativeTime >= element.duration - KEYFRAME_SNAP_DISTANCE ? element.duration : relativeTime;\n }\n\n // Make sure we're not allowing in/out animations to overlap\n if (isTransitionType(type)) {\n const minDuration = getMinAnimationDuration(animation);\n const maxDuration = getMaxAnimationDuration(element, animation);\n const reference = type === 'in' ? keyframes[0] : keyframes[keyframes.length - 1];\n if (reference !== keyframe) {\n const min = type === 'in' ? minDuration - duration : reference.time + reference.duration - maxDuration;\n const max = type === 'in' ? reference.time + maxDuration : reference.time + reference.duration - minDuration;\n relativeTime = clamp(relativeTime, min, max);\n }\n }\n\n // Filter out the keyframe we want to move from the calculations\n keyframes = keyframes.filter(k => k !== keyframe);\n\n const newTime = getClosestGap(\n { time: relativeTime, duration },\n keyframes,\n element.duration,\n MIN_KEYFRAME_DISTANCE\n );\n\n if (typeof newTime === 'number') {\n keyframe.time = toFixedDecimal(newTime, 2);\n animation.keyframes.sort(sortByTime);\n }\n return newTime;\n}\n\nexport function setKeyframeDuration(element: OneOfElementDataNodes, animation: IAnimation, keyframe: IAnimationKeyframe, newDuration: number, direction: TimelineResizeDirection = 'right'): number {\n\n if (keyframe.duration !== newDuration) {\n newDuration = Math.min(newDuration, getMaxKeyframeDuration(element, animation, keyframe));\n const keyframes = animation.keyframes.filter(k => k !== keyframe);\n const next = getNextTime(keyframes, keyframe.time);\n const prev = getPreviousTime(keyframes, keyframe.time);\n const limit = {\n left: prev ? prev.time + prev.duration + MIN_KEYFRAME_DISTANCE : 0,\n right: next ? next.time - MIN_KEYFRAME_DISTANCE : element.duration\n };\n const { time, duration } = getDirectionalDurationChange(keyframe, newDuration, direction, limit);\n\n keyframe.duration = duration;\n keyframe.time = time;\n }\n return keyframe.duration;\n}\n\nexport function isEmptyKeyframe(element: OneOfElementDataNodes, keyframe: IAnimationKeyframe): boolean {\n const state = getStateById(element, keyframe.stateId);\n return !state || isEmptyState(state);\n}\n\nexport function keyframesHasEqualStates(element: OneOfElementDataNodes, ...keyframes: (IAnimationKeyframe | undefined)[]): boolean {\n keyframes = keyframes.filter(k => k !== undefined) as IAnimationKeyframe[];\n\n\n if (keyframes.length > 1) {\n\n // At least one keyframe with a state, do a compare.\n if (keyframes.some(k => k?.stateId)) {\n const states = keyframes.map(k => getStateById(element, k!.stateId));\n return isEqualStates(...states);\n }\n // This means all frames are default keyframes\n return true;\n }\n return false;\n}\n\nexport function getKeyframesAtTime(time: number, element: OneOfElementDataNodes, animations?: IAnimation[], type?: AnimationType, tolerance?: number): IAnimationKeyframe[] {\n animations = animations || element.animations;\n\n if (type) {\n animations = animations.filter(a => a.type === type);\n }\n\n const keyframes: IAnimationKeyframe[] = [];\n\n animations.forEach(animation => {\n keyframes.push(...getKeyframesOfAnimationAtTime(time, element, animation, tolerance));\n });\n\n return keyframes;\n}\n\nexport function getCustomKeyframes(element: OneOfElementDataNodes): IAnimationKeyframe[] {\n const keyframes = getAllKeyframes(getAnimationsOfType(element, 'keyframe'))\n .sort(sortByTime);\n\n return keyframes;\n}\n\nexport function getPreviousTime(times: T[], time: ITime | number, tolerance: number = 0): T | undefined {\n const t = numberToTime(time);\n return times\n .slice(0)\n .sort(sortByTimeReversed)\n .find(k => t !== k && k.time - tolerance <= t.time);\n}\n\nexport function getNextTime(times: T[], time: ITime | number, tolerance: number = 0): T | undefined {\n const t = numberToTime(time);\n return times\n .slice(0)\n .sort(sortByTime)\n .find(k => t !== k && t.time <= k.time + tolerance);\n}\n\nexport function getSurroundingTimes(keyframes: IAnimationKeyframe[], absoluteTime: number, elementTime: number = 0, tolerance: number = 0): ISurroundingKeyframes {\n\n const relativeTime = absoluteTime - elementTime;\n\n return {\n before: getPreviousTime(keyframes, relativeTime, tolerance),\n after: getNextTime(keyframes, relativeTime, tolerance)\n };\n}\n\nexport function getKeyframesOfAnimationAtTime(absoluteTime: number, element: OneOfElementDataNodes, animation: IAnimation, tolerance: number = 0.0001): IAnimationKeyframe[] {\n const relativeTime = toRelativeTime(element, absoluteTime);\n const keyframes = animation.keyframes.filter(keyframe =>\n isTimeAt(relativeTime, keyframe, tolerance)\n );\n\n return keyframes;\n}\n\nexport function getKeyframeById(element: OneOfElementDataNodes, id: string): IAnimationKeyframe | undefined {\n return getAllKeyframes(element).find(keyframe => keyframe.id === id);\n}\n\nexport function getKeyframeByStateId(element: OneOfElementDataNodes, stateId: string): IAnimationKeyframe | undefined {\n return getAllKeyframes(element).find(keyframe => keyframe.stateId && keyframe.stateId === stateId);\n}\n\nexport function getAnimationByStateId(element: OneOfElementDataNodes, stateId: string): IAnimation | undefined {\n for (const animation of element.animations) {\n for (const keyframe of animation.keyframes) {\n if (keyframe.stateId === stateId) {\n return animation;\n }\n }\n }\n}\n\nexport function isMainStateKeyframe(keyframe: IAnimationKeyframe): boolean {\n return keyframe.stateId === undefined;\n}\n\nexport function getSettingsOfAnimations(animations: IAnimation[]): IAnimationSettings {\n const settings: IAnimationSettings = {} as IAnimationSettings;\n animations.forEach(a => {\n if (a.settings) {\n for (const key in a.settings) {\n // TODO: duplicate or keep reference?\n settings[key] = a.settings[key];\n }\n }\n });\n return settings;\n}\n\nexport function getNameOfAnimations(animations: IAnimation[]): string {\n if (animations && animations.length) {\n const names = animations.map(a => a.name).filter(name => name);\n if (names.length) {\n return names.join(', ');\n }\n const type = capitalize(animations[0].type || '');\n return animations.length === 1 ? `${type} animation` : `${type} animations`;\n }\n return 'No animation';\n}\n\nexport function sortByTime(a: ITime, b: ITime): number {\n return a.time - b.time || (a.duration || 0) - (b.duration || 0);\n}\n\nexport function sortByTimeReversed(a: ITime, b: ITime): number {\n return b.time - a.time || (b.duration || 0) - (a.duration || 0);\n}\n\nexport function sortAnimations(a: IAnimation, b: IAnimation): number {\n return getAnimationSortPrio(b) - getAnimationSortPrio(a);\n}\n\nfunction getAnimationSortPrio(animation: IAnimation): number {\n if (animation.type === 'in') {\n return 1;\n }\n if (animation.type === 'out') {\n return 0;\n }\n return -1;\n}\n\nexport function validateAnimations(element: OneOfElementDataNodes): void {\n\n let inDuration = 0;\n let outDuration = 0;\n\n element.animations.forEach((a) => {\n const duration = getAnimationDuration(a);\n const first = a.keyframes[0];\n const last = a.keyframes[a.keyframes.length - 1];\n const tolerance = 0.00001;\n\n a.keyframes.forEach(k => {\n if (!k.id) {\n throw new Error('Keyframe is missing id');\n }\n\n if (k.time + k.duration > element.duration + 0.01 || k.time < 0) {\n throw new Error('Invalid keyframe time');\n }\n });\n\n if (a.type === 'out') {\n if (Math.abs(first.time - (element.duration - duration)) > tolerance || Math.abs(element.duration - (last.time + last.duration)) > tolerance) {\n handleError('Invalid out animation', {\n level: 'warning',\n contexts: {\n animation: a,\n }\n });\n fixTransitionKeyframesAlign(element, a);\n }\n outDuration = Math.max(outDuration, duration);\n }\n else if (a.type === 'in') {\n if (first.time !== 0) {\n handleError('Invalid in animation', {\n level: 'warning',\n contexts: {\n animation: a,\n }\n });\n fixTransitionKeyframesAlign(element, a);\n }\n inDuration = Math.max(inDuration, duration);\n }\n });\n\n if (inDuration + outDuration > element.duration) {\n throw new Error('Overlapping durations');\n }\n}\n\nexport function validateDuration(duration: number): boolean {\n if (typeof duration !== 'number' || !isFinite(duration) || duration < 0) {\n throw new Error(`Invalid duration \"${duration}\"`);\n }\n return true;\n}\n\n/**\n * Get an absolute time, a value releative to time 0 of timeline.\n * Expects a time relative to an element to be passed as argument.\n * Like keyframe.time\n * @param element\n * @param relativeTime\n */\nexport function toAbsoluteTime(element: OneOfElementDataNodes, relativeTime: number): number {\n return element.time + relativeTime;\n}\n\n/**\n * Get a relative time, a value releative to time of an element.\n * Expect a time relative to the start of timeline as argument.\n * Like element.time + keyframe.time\n * @param element\n * @param relativeTime\n */\nexport function toRelativeTime(element: OneOfElementDataNodes, absoluteTime: number): number {\n return absoluteTime - element.time;\n}\n\n/**\n * Get \"leftmost\" point in time of multiple objects\n * @param times\n */\nexport function getTime(...times: ITime[]): number {\n if (!times?.length) {\n return 0;\n }\n return Math.min(...times.map(t => t.time));\n}\n\n/**\n * Get total duration from multiple objects. IE: \"rightmost\" - \"leftmost\")\n * @param times\n */\nexport function getDuration(...times: ITime[]): number {\n if (!times?.length) {\n return 0;\n }\n const from = getTime(...times);\n const to = Math.max(...times.map(t => t.time + (t.duration || 0)));\n return to - from;\n}\n\nexport function isTimeAt(time: ITime | number, target: ITime | number, tolerance: number = 0): boolean {\n return isTimeBetween(time, target, target, tolerance);\n}\n\nexport function getEndTime(time: ITime): number {\n return time.time + (time.duration || 0);\n}\n\nexport function isTimeBetween(time: ITime | number, t1: ITime | number, t2: ITime | number, tolerance: number = 0): boolean {\n const t = toTimeAndDuration(time);\n const from = toTimeAndDuration(t1);\n const to = t1 === t2 ? from : toTimeAndDuration(t2);\n return from.time - tolerance <= t.time && t.time + t.duration <= to.time + to.duration + tolerance;\n}\n\nexport function mergeOverlappingTimeAndDurations(times: ITime[], tolerance: number = 0): ITimeAndDuration[] {\n return times\n .sort(sortByTime)\n .reduce((r: ITimeAndDuration[], timeSpan) => {\n const last = r[r.length - 1];\n const lastEnd = last && getEndTime(last);\n\n // if (last && last.time <= timeSpan.time && timeSpan.time <= lastEnd) {\n if (last && isTimeBetween(timeSpan.time, last.time, lastEnd, tolerance)) {\n const end = getEndTime(timeSpan);\n if (lastEnd < end) {\n last.duration = getDuration(last, timeSpan);\n }\n return r;\n }\n return r.concat(toTimeAndDuration(timeSpan));\n }, [])\n .sort(sortByTime);\n}\n\nexport function getTimeBetween(k1: ITime, k2: ITime): number {\n const from = k1.time < k2.time ? k1 : k2;\n const to = k1.time < k2.time ? k2 : k1;\n return Math.max(0, to.time - (from.time + (from.duration || 0)));\n}\n\nfunction numberToTime(time: ITime | number): ITime {\n return typeof time === 'number' ? { time } : time;\n}\n\nfunction toTimeAndDuration(time: ITime | number): ITimeAndDuration {\n if (typeof time === 'number') {\n return { time, duration: 0 };\n }\n if (time.duration === undefined) {\n time.duration = 0;\n }\n return time as ITimeAndDuration;\n}\n\nexport function getMinDurationOfElements(...elements: OneOfElementDataNodes[]): number {\n\n const totalDuration = getDuration(...elements);\n const diff = Math.max(\n ...elements.map(element => getMinElementDuration(element) - element.duration),\n -totalDuration\n );\n\n return totalDuration + diff;\n}\n\nexport function getMinElementDuration(element: OneOfElementDataNodes): number {\n const { animations } = element;\n\n const keyframeAnimations = getAnimationsOfType(element, 'keyframe');\n const inDuration = getInAnimationDuration(animations);\n const outDuration = getOutAnimationDuration(animations);\n\n const minInDuration = inDuration > 0 ? Math.max(MIN_ANIMATION_DURATION, inDuration) : 0;\n const minOutDuration = outDuration > 0 ? Math.max(MIN_ANIMATION_DURATION, outDuration) : 0;\n const minInOutDuration = minInDuration + minOutDuration > 0 ? minInDuration + IN_OUT_ANIMATION_GAP + minOutDuration : 0;\n\n let minKeyframeDuration = 0;\n\n if (keyframeAnimations.length) {\n const scales = keyframeAnimations\n .map(a => getMinAnimationDuration(a) / getAnimationDuration(a))\n .filter(s => s > 0);\n\n if (scales.length) {\n minKeyframeDuration = element.duration * (Math.max(...scales) || 0);\n }\n }\n return Math.max(minKeyframeDuration, minInOutDuration, MIN_ELEMENT_DURATION);\n}\n\nexport function getMinAnimationDuration(animation: IAnimation): number {\n const { type, keyframes } = animation;\n const duration = getAnimationDuration(animation);\n let min = isTransitionType(type) ? MIN_ANIMATION_DURATION : 0;\n\n // Respect distancs between keyframes\n if (keyframes.length > 1) {\n const distances = keyframes\n .slice(1)\n .map((k, i) => getTimeBetween(keyframes[i], k));\n\n const minDistance = Math.min(...distances);\n if (minDistance) {\n const scale = MIN_KEYFRAME_DISTANCE / minDistance;\n min = Math.max(min, scale * duration);\n }\n }\n return min;\n}\n\nexport function getMaxAnimationDuration(element: OneOfElementDataNodes, animation: IAnimation): number {\n const { animations, duration } = element;\n const { type } = animation;\n\n if (isTransitionType(type)) {\n return duration - (IN_OUT_ANIMATION_GAP + getAnimationDurationOfType(animations, invertInOutType(type)));\n }\n return duration;\n}\n\n/**\n * Get the available duration a certain keyframe might expand within.\n * Pass fromCurrentTime = true if you want to keep current keyframe.time\n */\nexport function getMaxKeyframeDuration(element: OneOfElementDataNodes, animation: IAnimation, keyframe: IAnimationKeyframe, fromCurrentTime?: boolean): number {\n\n const keyframes = animation.keyframes.filter(k => k !== keyframe);\n const time = keyframe.time;\n const next = getNextTime(keyframes, time);\n const prev = getPreviousTime(keyframes, time);\n const to = next ? next.time - MIN_KEYFRAME_DISTANCE : element.duration;\n let from = prev ? prev.time + prev.duration + MIN_KEYFRAME_DISTANCE : 0;\n\n if (fromCurrentTime) {\n from = keyframe.time;\n }\n\n return Math.max(0, to - from);\n}\n\n/**\n * Get timespans in which a property is animating\n * @param element\n * @param properties\n * @returns\n */\nexport function getTimePropertyIsAnimating(element: OneOfElementDataNodes, ...properties: OneOfStatePropertyKeys[]): ITimeAndDuration[] {\n const times: ITimeAndDuration[] = [];\n\n // No properties provided, => use all properties instead\n if (!properties?.length) {\n properties = [...animatableProperties];\n }\n\n element.animations.forEach(animation => {\n const keyframes = animation.keyframes;\n keyframes.forEach((keyframe, index) => {\n const next = keyframes[index + 1];\n if (next) {\n const state = getStateById(element, keyframe.stateId) || {};\n const nextState = getStateById(element, next.stateId) || {};\n const change = properties.some(p => !deepEqual(state[p], nextState[p]));\n\n if (change) {\n const duration = getTimeBetween(keyframe, next);\n times.push({ time: toAbsoluteTime(element, getEndTime(keyframe)), duration });\n }\n }\n });\n });\n\n return mergeOverlappingTimeAndDurations(times);\n}\n\n/**\n * Get total time and duration from multiple objects.\n * Basically the bounding box\n * @param times\n */\nexport function getTimeAndDuration(...times: ITime[]): ITimeAndDuration {\n return {\n time: getTime(...times),\n duration: getDuration(...times)\n };\n}\n\nexport const inAnimationFilter = (animation: IAnimation): boolean => animation.type === 'in';\nexport const outAnimationFilter = (animation: IAnimation): boolean => animation.type === 'out';\nexport const transitionAnimationFilter = (animation: IAnimation): boolean => animation.type === 'out' || animation.type === 'in';\n\nexport function isTransitionAnimation(animation: IAnimation): boolean {\n return isTransitionType(animation.type);\n}\n\nexport function isTransitionType(type?: AnimationType): type is 'in' | 'out' {\n return type === 'in' || type === 'out';\n}\n\nexport function isTransitionEdgeKeyframe(animation: IAnimation, keyframe: IAnimationKeyframe): boolean {\n\n const { type, keyframes } = animation;\n if (isTransitionType(type)) {\n const index = keyframes.indexOf(keyframe);\n const edgeIndex = type === 'in' ? 0 : keyframes.length - 1;\n return index === edgeIndex;\n }\n\n return false;\n}\n\nexport function isAnimation(animationOrKeyframe: IAnimation | IAnimationKeyframe | IAnimationKeyframe[]): animationOrKeyframe is IAnimation {\n return 'keyframes' in animationOrKeyframe;\n}\n\nfunction invertInOutType(type: 'in' | 'out'): 'in' | 'out' {\n if (type !== 'in' && type !== 'out') {\n throw new Error('Can only invert in/out types');\n }\n return type === 'in' ? 'out' : 'in';\n}\n\nfunction filterKeyframePropertiesFromKeyframeTemplate(template: KeyframeTemplate): IState {\n return omit(template, ...keyframeProperties);\n}\n\n\ninterface ISurroundingKeyframes {\n after?: IAnimationKeyframe;\n before?: IAnimationKeyframe;\n}\n","import { CreativeMode, ICreativeEnvironment } from '@creative/environment';\nimport { CreativeDataNode } from '@creative/nodes/base-data-node';\nimport { isSelectionVisibleAtTime } from '@creative/nodes/helpers';\nimport { inject, __inject } from '@studio/utils/di';\nimport { EventEmitter } from '@studio/utils/event-emitter';\nimport { getInAnimationDuration, getOutAnimationDuration } from './animation.utils';\nimport { IAnimator } from './animator.header';\nimport { T } from './creative.container';\nimport { IRenderer } from './renderer.header';\n\n\nexport class Animator extends EventEmitter implements IAnimator {\n\n /**\n * Current time in seconds.\n */\n time = 0;\n\n /**\n * If the creative is playing or not.\n */\n isPlaying = false;\n\n /**\n * Loop currently playing. First loop has index 1.\n */\n loop = 1;\n\n private _destroyed = false;\n\n /**\n * Duration of creative in seconds\n */\n get duration(): number {\n return getCreativeAnimationDuration(this.creative);\n }\n\n private _startTimestamp = 0;\n private _lastTime = 0;\n private _requestId: number | undefined;\n private _speed = 1;\n private _elementsAnimationState = new Map();\n /**\n * Queue of events that has to occur after the current tick is completed.\n * Required by e.g widgets to ensure that seeking happens after next (loop).\n */\n private _eventQueue: { fn: Function, value: any[] }[] = [];\n private _isOmniRender = location.href.indexOf('isOmniRender') >= 0;\n\n constructor(\n @inject(T.CREATIVE_DATA) public creative: CreativeDataNode,\n @inject(T.RENDERER) private _renderer: IRenderer,\n @inject(T.ENVIRONMENT) private _env: ICreativeEnvironment\n ) {\n super();\n }\n\n /**\n * Play the creative if not already playing\n */\n play(): Animator {\n if (!this.isPlaying && this.creative.elements.length > 0) {\n if (this._env.MODE === CreativeMode.ManageView && this.loop === 1) {\n this.time = this._getStartTime();\n }\n this._lastTime = this.time * 1000;\n this._requestId = requestAnimationFrame(this._tick);\n this.isPlaying = true;\n this._renderer.setPlaying_m(true);\n this.emit('play', [this.time]);\n }\n\n return this;\n }\n\n /**\n * Toggle between play and pause\n */\n toggle(): Animator {\n this.isPlaying ? this.pause() : this.play();\n return this;\n }\n\n /**\n * Pause the creative if the creative is playing\n */\n pause(): Animator {\n if (this.isPlaying) {\n this._cancelAnimation();\n this.isPlaying = false;\n this._renderer.setPlaying_m(false);\n this.emit('pause', [this.time]);\n }\n return this;\n }\n\n /**\n * Stop the creative. Except from pausing the creative it will also seek to the stopTime.\n * Defaults at duration - 1s\n */\n stop(): void {\n // Don't allow omniRender to stop the creative.\n if (!this._isOmniRender) {\n const stopTime = this._getStopTime();\n this.pause();\n this.setTime_m(stopTime);\n }\n this.emit('stop', [this.time]);\n }\n\n /**\n * Seek to a certain point in time in seconds.\n */\n seek(time: number): Animator {\n time = Math.max(time, 0) || 0;\n if (this.time !== time) {\n this._lastTime = time * 1000;\n this._startTimestamp = 0;\n this.setTime_m(time);\n this.emit('seek', [this.time]);\n }\n return this;\n }\n\n /**\n * Jump to next loop.\n * Will play from the beginning of the loop\n */\n next(replay: boolean = true, offset?: number): Animator {\n const loop = this.loop + (offset || 1);\n\n let exceededLimit = false;\n if (this._renderer.feedStore) {\n exceededLimit = this._renderer.feedStore.loop < 1;\n if (exceededLimit) {\n this._renderer.feedStore.setFeedLoop(offset || 1);\n }\n }\n\n this.setLoop(loop, replay, !exceededLimit);\n\n return this;\n }\n\n /**\n * Jump to previous loop.\n * Will play from the beginning of the loop\n */\n prev(replay: boolean = true, offset?: number, exceedLimit?: boolean): Animator {\n const loop = this.loop - (offset || 1);\n\n if (this._renderer.feedStore) {\n this._renderer.feedStore.setFeedLoop(this._renderer.feedStore.loop - (offset || 1), exceedLimit);\n }\n\n this.setLoop(loop, replay, false);\n\n return this;\n }\n\n /**\n * Replay current loop from beginning.\n */\n replay(): Animator {\n this.seek(0);\n this.emit('replay', [this.loop]);\n return this;\n }\n\n /**\n * Restart creative. Loops and time will be reset.\n */\n restart(): Animator {\n if (this._renderer.feedStore) {\n this._renderer.feedStore.resetIndexState();\n this._renderer.feedStore.skipNextIndexUpdate();\n }\n this.setLoop(1);\n this.play();\n this.emit('restart', [this.loop]);\n return this;\n }\n\n /**\n * Updates values on DOM\n */\n render_m(time?: number, forceUpdate?: boolean): void {\n this._updateElementsState();\n this._renderer.setAllViewElementsValues_m(typeof time === 'number' ? time : this.time, forceUpdate);\n }\n\n useCreative_m(creative: CreativeDataNode): void {\n this.creative = creative;\n }\n\n setTime_m(time: number, forceUpdate?: boolean): void {\n this.time = time;\n this.render_m(this.time, forceUpdate);\n }\n\n setLoop(loop: number, replay: boolean = true, setFeedLoop: boolean = true): void {\n\n if (this._renderer.feedStore) {\n if (setFeedLoop) {\n this._renderer.feedStore.setFeedLoop(this._renderer.feedStore.loop < 0 ? this._renderer.feedStore.loop : loop);\n }\n this._renderer.feedStore.updateElementsCurrentIndex();\n }\n\n if (replay) {\n this._lastTime = 0;\n this._startTimestamp = 0;\n this.setTime_m(0, /* forceUpdate */ true);\n }\n else {\n this.render_m(this.time, /* forceUpdate */ true);\n }\n\n this.loop = Math.max(1, loop);\n\n if (this.loop === 1) {\n this.time = this._getStartTime();\n }\n\n if (!this._isOmniRender) {\n this.emit('loop', [this.loop]);\n }\n }\n\n addToQueue(fn: Function, value: any[] = []): void {\n if (this.isPlaying) {\n this._eventQueue.push({ fn: fn.bind(this), value });\n }\n else {\n fn.bind(this)(...value);\n }\n }\n\n /**\n * Keeps track of the current state of all elements and emits events based on what changes\n * Tracks what kind of animation that latest ran, e.g the \"in\" or \"out\" part of the In transition\n */\n private _updateElementsState(): void {\n if (!this.isPlaying) {\n return;\n }\n for (let i = 0; i < this.creative.elements.length; i++) {\n const element = this.creative.elements[i];\n const animations = element.animations;\n if (!this._elementsAnimationState.has(element.id)) {\n this._elementsAnimationState.set(element.id, { visible: false });\n }\n\n const currentState = this._elementsAnimationState.get(element.id)!;\n let animationState: animationStateTypes = 'none';\n\n const inDuration = getInAnimationDuration(animations);\n const outDuration = getOutAnimationDuration(animations);\n\n if (inDuration) {\n if (this.time > element.time &&\n this.time < inDuration + element.time) {\n animationState = 'inTransitionIn';\n }\n else if (currentState.animationState === 'inTransitionIn' &&\n (this.time <= element.time ||\n this.time >= inDuration + element.time)) {\n animationState = 'inTransitionOut';\n }\n }\n\n if (outDuration) {\n\n const outDurationStart = element.time + element.duration - outDuration;\n\n if (this.time > outDurationStart &&\n this.time < element.time + element.duration) {\n animationState = 'outTransitionIn';\n }\n else if (currentState.animationState === 'outTransitionIn' &&\n (this.time < outDurationStart ||\n this.time >= element.duration + element.time)) {\n animationState = 'outTransitionOut';\n }\n }\n\n if (isSelectionVisibleAtTime(element, this.time)) {\n this._elementsAnimationState.set(element.id, { visible: true, animationState: animationState });\n }\n else {\n this._elementsAnimationState.set(element.id, { visible: false, animationState: animationState });\n }\n\n const isAtStartOfElement = this.time === 0 && element.time === 0;\n const isAtEndOfElement = this.time === element.duration + element.time;\n\n const state = this._elementsAnimationState.get(element.id)!;\n\n if (currentState.visible !== state.visible\n || isAtStartOfElement\n || isAtEndOfElement) {\n if (((state.visible && !isAtEndOfElement) || isAtStartOfElement) && currentState.animationState !== 'animationStarted') {\n state.animationState = 'animationStarted';\n this.emit('animation_start', [element]);\n }\n else if (((!state.visible && !isAtStartOfElement) || isAtEndOfElement)\n && (currentState.animationState !== 'animationEnded' && (currentState.animationState !== 'none' || outDuration === 0))) {\n state.animationState = 'animationEnded';\n this.emit('animation_end', [element]);\n }\n }\n\n if (currentState.animationState !== this._elementsAnimationState.get(element.id)!.animationState) {\n switch (this._elementsAnimationState.get(element.id)!.animationState) {\n case 'inTransitionOut':\n this.emit('in_transition_end', [element]);\n break;\n case 'outTransitionIn':\n this.emit('out_transition_start', [element]);\n break;\n }\n }\n }\n }\n\n private _tick = (t: number): void => {\n\n /**\n * We need to force-cancel if isPlaying is false as it seems\n * that if animator is paused from the Widget API then it occurs on a\n * different tick causing everything to go haywire\n */\n if (this._destroyed || !this.isPlaying) {\n this._cancelAnimation();\n return;\n }\n\n if (!this._startTimestamp) {\n this._startTimestamp = t;\n }\n\n const stopTime = this._getStopTime();\n const loops = this.creative.loops;\n const timeDiff = (t - this._startTimestamp) * this._speed;\n const timeInSeconds = (this._lastTime + timeDiff) / 1000;\n\n\n if (!this._infinite() && this.loop >= loops && timeInSeconds >= stopTime && !this._isOmniRender) {\n this.stop();\n return;\n }\n\n if (this._isOmniRender && timeInSeconds >= this.duration) {\n this.setTime_m(this.duration);\n this.pause();\n return;\n }\n\n if (timeInSeconds < this.duration) {\n this.setTime_m(timeInSeconds);\n }\n else if (timeInSeconds >= this.duration) {\n this.setTime_m(this.duration);\n this.next();\n }\n\n while (this._eventQueue.length) {\n const event = this._eventQueue.pop()!;\n event.fn(...event.value);\n }\n\n this.emit('tick', [this.time]);\n\n this._requestId = requestAnimationFrame(this._tick);\n };\n\n private _getStartTime(): number {\n return typeof this.creative.startTime === 'number' ? this.creative.startTime : 0;\n }\n\n private _getStopTime(): number {\n return typeof this.creative.stopTime === 'number' ? this.creative.stopTime : this.duration - 1;\n }\n\n private _cancelAnimation(): void {\n this._lastTime = 0;\n this._startTimestamp = 0;\n if (this._requestId) {\n cancelAnimationFrame(this._requestId);\n this._requestId = undefined;\n }\n }\n\n private _infinite(): boolean {\n if (this._env.MODE === CreativeMode.DesignView) {\n return true;\n }\n return !this.creative.loops;\n }\n\n destroy(): void {\n this._destroyed = true;\n this.clearEvents();\n this._cancelAnimation();\n }\n\n}\n\n__inject(T.CREATIVE_DATA, {}, Animator, 'creative', 0);\n__inject(T.RENDERER, {}, Animator, '_renderer', 1);\n__inject(T.ENVIRONMENT, {}, Animator, '_env', 2);\n\nexport function getCreativeAnimationDuration(creative: CreativeDataNode): number {\n let latestAnimationEnd = 0;\n for (const element of creative.elements) {\n if (element.time + element.duration > latestAnimationEnd) {\n latestAnimationEnd = element.time + element.duration;\n }\n }\n return latestAnimationEnd;\n}\n\ninterface IElementState {\n visible: boolean;\n animationState?: animationStateTypes;\n}\n\ntype animationStateTypes = 'none' | 'animationStarted' | 'animationEnded' | 'inTransitionIn' | 'inTransitionOut' | 'outTransitionIn' | 'outTransitionOut';\n\nexport type AnimatorEventType =\n 'play' |\n 'pause' |\n 'stop' |\n 'loop' |\n 'restart' |\n 'replay' |\n 'seek' |\n 'tick' |\n AnimationEvents;\n\ntype AnimationEvents =\n 'animation_start' |\n 'animation_end' |\n 'in_transition_end' |\n 'out_transition_start';\n","import { parseColor, RGBToHSL, toRGBA, toLinearGradient } from '@creative/color.utils';\nimport { IPosition, IColor, IColorStop, ColorType } from '@studio/domain';\n\nexport class Color implements IColor {\n\n /**\n * Value between 0 and 255\n */\n red: number;\n\n /**\n * Value between 0 and 255\n */\n green: number;\n\n /**\n * Value between 0 and 255\n */\n blue: number;\n hue: number;\n saturation: number;\n lightness: number;\n\n /**\n * Value between 0 and 100\n */\n alpha: number;\n\n type: ColorType = ColorType.Solid;\n\n stops: IColorStop[] = [];\n\n constructor(color?: IColor) {\n if (color) {\n this.setColor(color);\n } else {\n this.red = 0;\n this.green = 0;\n this.blue = 0;\n this.hue = this.saturation = this.lightness = 0;\n this.alpha = 100;\n\n const hsl = RGBToHSL(this.red, this.green, this.blue);\n this.hue = hsl.h;\n this.saturation = hsl.s;\n this.lightness = hsl.l;\n }\n }\n\n get angle(): number {\n if (this.stops.length > 1) {\n const angle = Math.atan2(\n this.end.position!.y - this.start.position!.y,\n this.end.position!.x - this.start.position!.x\n ) * 180 / Math.PI;\n\n return Math.round((90 + angle) % 360);\n }\n return 0;\n }\n\n get start(): IColorStop {\n return this.stops[0];\n }\n\n get end(): IColorStop {\n return this.stops[this.stops.length - 1];\n }\n\n copy(): Color {\n return new Color(this);\n }\n\n /**\n * This makes colors output nicely when using JSON.stringify\n */\n toJSON(): string {\n return this.toString();\n }\n\n toString(): string {\n switch (this.type) {\n case ColorType.Solid:\n return toRGBA(this);\n case ColorType.LinearGradient:\n return toLinearGradient(this);\n }\n }\n\n addColorStop(color: IColor, offset: number, position?: IPosition): void {\n this.stops.push({\n color,\n offset,\n position\n });\n }\n\n setColor(color: IColor): IColor {\n this.type = color.type;\n\n if (color.type === 'solid') {\n this.red = color.red;\n this.green = color.green;\n this.blue = color.blue;\n this.alpha = color.alpha;\n this.saturation = color.saturation;\n this.lightness = color.lightness;\n this.hue = color.hue;\n } else {\n this.alpha = color.alpha;\n // this.angle = color.angle;\n this.stops = color.stops.map(stop => ({\n color: parseColor(stop.color),\n offset: stop.offset,\n position: stop.position ? { ...stop.position } : undefined\n }));\n }\n\n return this;\n }\n\n /**\n * Parse color string into a color object. If not a recognized pattern\n * return color based on default value\n * @param color\n * @param defaultValue\n */\n static parse(color: string | Color, defaultValue: string = '#FFFFFF'): Color {\n return parseColor(color, defaultValue);\n }\n}\n","import { Color } from '@creative/color';\nimport { IColor, ColorType, IPosition } from '@studio/domain';\nimport { SimpleCache } from '@studio/utils/simple-cache';\nimport { clamp, decimal } from '@studio/utils/utils';\n\nexport const HEX_COLOR_PATTERN = /^#[0-9a-fA-F]{3}$|^#[0-9a-fA-F]{6}$/;\nexport const IMPLICIT_HEX_COLOR_PATTERN = /^[0-9a-fA-F]{3}$|^[0-9a-fA-F]{6}$/;\nexport const RGBA_COLOR_PATTERN = /^rgba\\((0|255|25[0-4]|2[0-4]\\d|1\\d\\d|0?\\d?\\d),(0|255|25[0-4]|2[0-4]\\d|1\\d\\d|0?\\d?\\d),(0|255|25[0-4]|2[0-4]\\d|1\\d\\d|0?\\d?\\d),(0?(\\.\\d+)?|1(\\.0)?)\\)$/;\nexport const RGB_COLOR_PATTERN = /^rgb\\(\\s*(0|255|25[0-4]|2[0-4]\\d|1\\d\\d|0?\\d?\\d)\\s*,\\s*(0|255|25[0-4]|2[0-4]\\d|1\\d\\d|0?\\d?\\d)\\s*,\\s*(0|255|25[0-4]|2[0-4]\\d|1\\d\\d|0?\\d?\\d)\\s*\\)$/;\n\nexport function isColorProperty(key: string): boolean {\n return key === 'fill' || key === 'textColor' || key === 'color';\n}\n\n/**\n * Test if string is a valid color or not\n * @param color\n */\nexport function isColor(color: string): boolean {\n return HEX_COLOR_PATTERN.test(color) || RGBA_COLOR_PATTERN.test(color) || RGB_COLOR_PATTERN.test(color) || IMPLICIT_HEX_COLOR_PATTERN.test(color) || color.indexOf('linear-gradient') === 0;\n}\n\n/**\n * Return a color if color string is a valid color.\n */\nexport function parseColorIfValid(color: string): Color | undefined {\n if (isColor(color)) {\n return parseColor(color);\n }\n}\n\n/**\n * Parse color string into a color object. If not a recognized pattern\n * return color based on default value\n * @param color\n * @param defaultValue\n */\nexport function parseColor(color: string | Color, defaultValue: string = '#FFFFFF'): Color {\n\n if (color instanceof Color) {\n return new Color(color);\n }\n\n const cachedColor = SimpleCache.get(color);\n\n if (cachedColor) {\n return cachedColor;\n }\n\n // Parsers can't handle spaces after commas\n color = typeof color === 'string' ? color.replace(/,\\s+/gi, ',') : color;\n\n let value: Color;\n\n if (HEX_COLOR_PATTERN.test(color) || IMPLICIT_HEX_COLOR_PATTERN.test(color)) {\n value = fromHEX(color);\n } else if (RGBA_COLOR_PATTERN.test(color)) {\n value = fromRGBAstring(color);\n } else if (RGB_COLOR_PATTERN.test(color)) {\n value = fromRGBstring(color);\n } else if (color.indexOf('linear-gradient') === 0) {\n value = fromLinearGradient(color);\n } else {\n value = parseColor(defaultValue);\n }\n\n SimpleCache.set(color, value);\n\n return value;\n}\n\n\nexport function fromHSV(h: number, s: number, v: number): IColor {\n const color = new Color();\n let r!: number;\n let g!: number;\n let b!: number;\n const i = Math.floor(h * 6);\n const f = h * 6 - i;\n const p = v * (1 - s);\n const q = v * (1 - f * s);\n const t = v * (1 - (1 - f) * s);\n\n switch (i % 6) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n case 5:\n r = v;\n g = p;\n b = q;\n break;\n }\n\n color.red = Math.round(r * 255);\n color.green = Math.round(g * 255);\n color.blue = Math.round(b * 255);\n\n const hsl = RGBToHSL(r, g, b);\n color.hue = hsl.h;\n color.saturation = hsl.s;\n color.lightness = hsl.l;\n\n return color;\n}\n\nexport function fromRGBA(r: number, g: number, b: number, a: number = 1): Color {\n const color = new Color();\n\n if (a > 1 || a < 0) {\n throw new Error('invalid alpha');\n }\n\n color.red = r;\n color.green = g;\n color.blue = b;\n color.alpha = Math.round(a * 100);\n\n const hsl = RGBToHSL(r, g, b);\n color.hue = hsl.h;\n color.saturation = hsl.s;\n color.lightness = hsl.l;\n\n return color;\n}\n\nexport function fromHSL(h: number, s: number, l: number, a: number = 1): Color {\n const color = new Color();\n color.hue = h;\n color.saturation = s;\n color.lightness = l;\n color.alpha = Math.round(a * 100);\n\n const rgb = HSLToRGB(h, s, l);\n color.red = rgb.r;\n color.green = rgb.g;\n color.blue = rgb.b;\n\n return color;\n}\n\nexport function fromHEX(hex: string): Color {\n if (hex[0] === '#') {\n hex = hex.substring(1, hex.length);\n }\n const color = new Color();\n if (hex.length === 3) {\n color.red = parseInt(hex.substring(0, 1) + hex.substring(0, 1), 16);\n color.green = parseInt(hex.substring(1, 2) + hex.substring(1, 2), 16);\n color.blue = parseInt(hex.substring(2, 3) + hex.substring(2, 3), 16);\n } else if (hex.length === 6) {\n color.red = parseInt(hex.substring(0, 2), 16);\n color.green = parseInt(hex.substring(2, 4), 16);\n color.blue = parseInt(hex.substring(4, 6), 16);\n } else {\n color.red = 255;\n color.green = 255;\n color.blue = 255;\n }\n const hsl = RGBToHSL(color.red, color.green, color.blue);\n color.hue = hsl.h;\n color.saturation = hsl.s;\n color.lightness = hsl.l;\n\n return color;\n}\n\nexport function fromRGBstring(rgb: string): Color {\n const color = new Color();\n\n const matchColors = /rgb\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)/;\n const match = matchColors.exec(rgb.replace(/\\s/g, ''));\n\n if (match) {\n color.red = parseInt(match[1], 10);\n color.green = parseInt(match[2], 10);\n color.blue = parseInt(match[3], 10);\n }\n\n const hsl = RGBToHSL(color.red, color.green, color.blue);\n color.hue = hsl.h;\n color.saturation = hsl.s;\n color.lightness = hsl.l;\n\n return color;\n}\n\nexport function fromRGBAstring(rgba: string): Color {\n const color = new Color();\n const matchColors = /^rgba\\(([^,]+),([^,]+),([^,]+),([^,]+)\\)$/g;\n const match = matchColors.exec(rgba.replace(/\\s/g, ''));\n if (match) {\n color.red = parseInt(match[1], 10);\n color.green = parseInt(match[2], 10);\n color.blue = parseInt(match[3], 10);\n color.alpha = Math.round(parseFloat(match[4]) * 100);\n }\n\n const hsl = RGBToHSL(color.red, color.green, color.blue);\n color.hue = hsl.h;\n color.saturation = hsl.s;\n color.lightness = hsl.l;\n\n return color;\n}\n\n/**\n * Takes 2 colors and returns a color in between. Position 0 will give first color, 0.5 the average and 1 the second color.\n */\nexport function mixColor(baseColor: Color, ...colors: { color: IColor, amount: number }[]): Color {\n return tintColor(new Color(baseColor), ...colors);\n}\n\n/**\n * Takes another color and applies that tinted on the target color instance.\n * amount = 0 will not affect the color, 0.5 the average and 1 the second color completely.\n */\nexport function tintColor(targetColor: IColor, ...colors: { color: IColor, amount: number }[]): IColor {\n\n let redOffset = 0;\n let greenOffset = 0;\n let blueOffset = 0;\n let alphaOffset = 0;\n const startPositionOffset = { x: 0, y: 0 };\n const endPositionOffset = { x: 0, y: 0 };\n let startOffset = 0;\n let endOffset = 0;\n\n colors.forEach(c => {\n const color = c.color;\n const amount = clamp(c.amount, 0, 1);\n const stops = color.type !== 'solid' ? [...color.stops] : [];\n\n redOffset += (color.red - targetColor.red) * amount;\n greenOffset += (color.green - targetColor.green) * amount;\n blueOffset += (color.blue - targetColor.blue) * amount;\n alphaOffset += (color.alpha - targetColor.alpha) * amount;\n\n // Gradient color\n if (stops?.length) {\n\n if (stops.length !== 2) {\n throw new Error('Tinting gradients with more than 2 stops is not supported currently');\n }\n\n // Turn default state to gradient if it's a solid\n if (!targetColor.stops?.length) {\n targetColor.stops = [];\n stops.forEach((s, index) => {\n const y = index === 0 ? 0 : 1;\n targetColor.stops.push({\n color: new Color(targetColor), // Same color as the solid\n position: s.position ? { ...s.position } : { x: 0.5, y },\n offset: s.offset\n });\n });\n targetColor.type = c.color.type;\n }\n\n startOffset += (stops[0].offset - targetColor.start.offset) * amount;\n endOffset += (stops[1].offset - targetColor.end.offset) * amount;\n\n if (stops[0].position && targetColor.start.position && stops[1].position && targetColor.end.position) {\n startPositionOffset.x += (stops[0].position.x - targetColor.start.position.x) * amount;\n startPositionOffset.y += (stops[0].position.y - targetColor.start.position.y) * amount;\n endPositionOffset.x += (stops[1].position.x - targetColor.end.position.x) * amount;\n endPositionOffset.y += (stops[1].position.y - targetColor.end.position.y) * amount;\n }\n }\n });\n\n if (targetColor.stops.length) {\n targetColor.start.offset += startOffset;\n targetColor.end.offset += endOffset;\n\n targetColor.start.position = {\n x: startPositionOffset.x + targetColor.start.position!.x,\n y: startPositionOffset.y + targetColor.start.position!.y\n };\n targetColor.end.position = {\n x: endPositionOffset.x + targetColor.end.position!.x,\n y: endPositionOffset.y + targetColor.end.position!.y\n };\n\n const startColors = colors.map(c => {\n let color = c.color.type === 'linear-gradient' ? new Color(c.color.start?.color) : undefined;\n if (!color) {\n color = fromRGBA(c.color.red, c.color.green, c.color.blue, c.color.alpha / 100);\n }\n return { color, amount: c.amount };\n });\n\n const endColors = colors.map(c => {\n let color = c.color.type === 'linear-gradient' ? new Color(c.color.end?.color) : undefined;\n if (!color) {\n color = fromRGBA(c.color.red, c.color.green, c.color.blue, c.color.alpha / 100);\n }\n return { color, amount: c.amount };\n });\n\n targetColor.start.color = mixColor(targetColor.start.color, ...startColors);\n targetColor.end.color = mixColor(targetColor.end.color, ...endColors);\n targetColor.alpha += alphaOffset;\n } else {\n targetColor.red += redOffset;\n targetColor.green += greenOffset;\n targetColor.blue += blueOffset;\n targetColor.alpha += alphaOffset;\n }\n\n return targetColor;\n}\n\nfunction extractColorStopPositionFromAngle(offset: number, cos: number, sin: number): IPosition {\n const offsetX = 0.5;\n const offsetY = 1 - offset / 100;\n const x = (cos * (offsetX - 0.5)) - (sin * (offsetY - 0.5)) + 0.5;\n const y = (cos * (offsetY - 0.5)) + (sin * (offsetX - 0.5)) + 0.5;\n return { x, y };\n}\n\nfunction createGradientFromString(splitStr: string[], angle: number | undefined): Color {\n const color = new Color();\n color.type = ColorType.LinearGradient;\n const rad = Math.PI * (angle || 0) / 180;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n\n for (let i = 0; i < splitStr.length; i++) {\n const data = splitStr[i].split(' ');\n let colorStr: string;\n let offset: number;\n let position: IPosition | undefined;\n // CSS format: linear-gradient(0deg,#000000 0%,#ffffff 100%)\n if (angle !== undefined) {\n colorStr = data[0].trim();\n offset = parseInt(data[1], 10);\n if (i === 0 || i === splitStr.length - 1) {\n position = extractColorStopPositionFromAngle(offset, cos, sin);\n }\n } else {\n colorStr = data[data.length - 1];\n offset = i === 0 ? 0 : 100;\n\n if (data.length === 3) {\n position = {\n x: parseFloat(data[0]),\n y: parseFloat(data[1])\n };\n } else {\n offset = parseFloat(data[0]);\n }\n }\n color.addColorStop(parseColor(colorStr), offset, position);\n }\n return color;\n}\n\nexport function fromLinearGradient(linearGradient: string): Color {\n const str = linearGradient.substring(linearGradient.indexOf('(') + 1, linearGradient.lastIndexOf(')'));\n const splitStr = str.split(/,(?![^(]*\\))(?![^\"']*[\"'](?:[^\"']*[\"'][^\"']*[\"'])*[^\"']*$)/);\n let angle: number | undefined;\n if (splitStr[0].indexOf('deg') > -1) {\n angle = parseInt(splitStr.shift() || '0', 10);\n }\n\n return createGradientFromString(splitStr, angle);\n}\n\n/**\n * Checks if a two color instances has the same color value\n */\nexport function isSameColor(color1?: Color, color2?: Color): boolean {\n if (!color1 && !color2) {\n return true;\n } else if (!color1 || !color2) {\n return false;\n } else {\n return toRGBA(color1) === toRGBA(color2);\n }\n}\n\n\n/**\n * Calculates HSL Color\n * RGB must be normalized\n * Must be executed in a Color object context\n * http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n */\nexport function RGBToHSL(r: number, g: number, b: number): { h: number, s: number, l: number } {\n r = r / 255;\n g = g / 255;\n b = b / 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h!: number;\n let s!: number;\n const l = (max + min) / 2;\n if (max === min) {\n h = s = 0; // achromatic\n } else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return { h: h, s: s, l: l };\n}\n\n/**\n * Calculates RGB color (normalized)\n * HSL must be normalized\n * Must be executed in a Color object context\n * http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n */\nexport function HSLToRGB(h: number, s: number, l: number): { r: number, g: number, b: number } {\n let r: number;\n let g: number;\n let b: number;\n const hue2rgb = (p: number, q: number, t: number): number => {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n };\n if (s === 0) {\n r = g = b = l;\n } else {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n\n\n/**\n * Round color channel and limit value between 0 and 255\n */\nexport function roundChannel(channel: number): number {\n return clamp(channel, 0, 255) >>> 0;\n}\n\n/**\n * Take a number between 0 and 255 and turn it into\n * a two digit hex string like: \"0F\", \"FF\" and \"99\"\n */\nexport function channelToHex(channel: number): string {\n channel = roundChannel(channel);\n return (channel < 16 ? '0' : '') + channel.toString(16).toUpperCase();\n}\n\n\nexport function isColorTransparent(color: IColor): boolean {\n if (color.type === ColorType.Solid) {\n return color.alpha < 100;\n }\n return color.stops.some(s => isColorTransparent(s.color));\n}\n\nexport function toHSV(color: IColor): { h: number, s: number, v: number } {\n if (color.type !== 'solid') {\n throw new Error('Cannot convert a none solid color to HSV format.');\n }\n\n let rr: number;\n let gg: number;\n let bb: number;\n const r = color.red / 255;\n const g = color.green / 255;\n const b = color.blue / 255;\n let h: number;\n let s: number;\n const v = Math.max(r, g, b);\n const diff = v - Math.min(r, g, b);\n const diffc = (c: number): number => (v - c) / 6 / diff + 1 / 2;\n\n if (diff === 0) {\n h = s = 0;\n } else {\n s = diff / v;\n rr = diffc(r);\n gg = diffc(g);\n bb = diffc(b);\n\n if (r === v) {\n h = bb - gg;\n } else if (g === v) {\n h = (1 / 3) + rr - bb;\n } else if (b === v) {\n h = (2 / 3) + gg - rr;\n }\n if (h! < 0) {\n h! += 1;\n } else if (h! > 1) {\n h! -= 1;\n }\n }\n\n return { h: h!, s, v };\n}\n\nexport function toHEX(color: IColor): string {\n if (color.type !== ColorType.Solid) {\n throw new Error('Cannot convert a none solid color to HEX format.');\n }\n\n return `#${channelToHex(color.red)}${channelToHex(color.green)}${channelToHex(color.blue)}`;\n}\n\n\nexport function toRGB(color: IColor): string {\n if (color.type !== ColorType.Solid) {\n throw new Error('Cannot convert a none solid color to RGB format.');\n }\n\n return `rgb(${roundChannel(color.red)},${roundChannel(color.green)},${roundChannel(color.blue)})`;\n}\n\nexport function toRGBA(color: IColor): string {\n if (color.type !== ColorType.Solid) {\n throw new Error('Cannot convert a none solid color to RGBA format.');\n }\n return `rgba(${roundChannel(color.red)},${roundChannel(color.green)},${roundChannel(color.blue)},${decimal(color.alpha / 100)})`;\n}\n\nexport function toLinearGradientCSS(color: IColor): string {\n return `linear-gradient(${color.angle}deg, ${color.stops.map(stop => {\n const stopColor = parseColor(stop.color);\n stopColor.alpha = Math.round(stopColor.alpha * (color.alpha / 100));\n return `${toRGBA(stopColor)} ${stop.offset}%`;\n }).join(',')})`;\n}\n\nexport function toLinearGradient(color: IColor): string {\n return `linear-gradient(${color.stops.map(stop => {\n const stopColor = parseColor(stop.color);\n stopColor.alpha = stopColor.alpha * (color.alpha / 100);\n\n let positionOrOffset = '';\n if (stop.position) {\n positionOrOffset = `${decimal(stop.position.x)} ${decimal(stop.position.y)}`;\n } else if (stop.offset) {\n positionOrOffset = `${decimal(stop.offset)}`;\n }\n\n return `${positionOrOffset} ${toRGBA(stopColor)}`;\n }).join(',')})`;\n}\n\nexport function toCSS(color: IColor): string {\n switch (color.type) {\n case ColorType.Solid:\n return toRGBA(color);\n case ColorType.LinearGradient:\n return toLinearGradientCSS(color);\n }\n}\n","import { isTextNode, isWidgetNode } from '@creative/nodes/helpers';\nimport { FeedType, IElementProperty, IFeed, IVersionProperty, IWidgetElementProperty, OneOfElementDataNodes } from '@studio/domain';\nimport { isVariableSpan } from '../rich-text/text-nodes';\n\nexport function encodeFeedPath(path: string): string {\n return path.replace(/\\s/g, '%20');\n}\n\nexport function decodeFeedPath(path: string): string {\n return path.replace(/%20/g, ' ');\n}\n\nexport function createFeed(id: string, path: string = '', type: FeedType = 'text'): IFeed {\n const feed: IFeed = {\n id: id,\n path: encodeFeedPath(path ?? ''),\n step: {\n occurrence: 'loop',\n size: 1,\n start: 1\n },\n fallback: '',\n type: type\n };\n return feed;\n}\n\nexport function isFeedValue(value: any): value is IFeed {\n if (typeof value !== 'object') {\n return false;\n }\n\n if ('id' in value && 'path' in value && 'step' in value) {\n return true;\n }\n\n return false;\n}\n\nexport function isVersionedFeed(property: IVersionProperty | IElementProperty | IWidgetElementProperty): property is IVersionProperty {\n if (isFeedValue(property.value)) {\n return true;\n }\n\n return false;\n}\n\nexport function hasFeededContent(element: OneOfElementDataNodes): boolean {\n if (element.feed) {\n return true;\n }\n\n if (isTextNode(element)) {\n const content = element.__dirtyContent?.spans || element.content.spans;\n for (const span of content) {\n if (isVariableSpan(span)) {\n return true;\n }\n }\n }\n\n if (isWidgetNode(element)) {\n for (const property of element.customProperties) {\n if (property.unit === 'feed' && JSON.parse(property.value as string).id) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function isFeedpathProperty(property: IElementProperty): boolean {\n return property.name.indexOf('feedPath') > -1;\n}\n","import { IFontStyle, IPadding, IShadow, IStyleIndexMaps, ITextSpan, IVersionedText, IVersionProperty, IWidgetElementProperty, OneOfVersionableProperties, OneOfViewNodes, textProperties } from '@studio/domain';\nimport { HorizontalAlignment, ICharacterProperties, IContentSpan, IRenderedSpans, ISpan, ISpanProperties, ISpans, IStyleIdMap, IText, ITextElementProperties, IVariableSpan, OneOfContentSpans, OneOfEditableSpans, OneOfRenderedSpans, PreviousStyleIdType, SpanType, TextDirection, VARIABLE_PREFIX, VerticalAlignment } from '../../../domain/text';\nimport { cloneDeep } from '../../../utils/clone';\nimport { CRC32checksum, deepEqual, omit } from '../../../utils/utils';\nimport { Color } from '../../color';\nimport { createDefaultTextProperties, isTextNode } from '../../nodes/helpers';\nimport { serializeCharacterProperties } from '../../serialization/character-properties-serializer';\nimport { deserializePropertyValue, serializePropertyValue } from '../../serialization/property-value-serializer';\nimport { deserializeVersionedText, serializeVersionedText } from '../../serialization/text-serializer';\nimport { decodeFeedPath } from '../feed/feeds.utils';\n\nexport const enum CharacterCode {\n At = 0x40,\n LineFeed = 0x0A, // \\n\n CarriageReturn = 0x0D, // \\r\n LineSeparator = 0x2028,\n ParagraphSeparator = 0x2029,\n NextLine = 0x0085,\n\n // Unicode 3.0 space characters\n Space = 0x0020, // \" \"\n NonBreakingSpace = 0x00A0, //\n EnQuad = 0x2000,\n EmQuad = 0x2001,\n EnSpace = 0x2002,\n EmSpace = 0x2003,\n ThreePerEmSpace = 0x2004,\n FourPerEmSpace = 0x2005,\n SixPerEmSpace = 0x2006,\n FigureSpace = 0x2007,\n PunctuationSpace = 0x2008,\n ThinSpace = 0x2009,\n HairSpace = 0x200A,\n ZeroWidthSpace = 0x200B,\n NarrowNoBreakSpace = 0x202F,\n IdeographicSpace = 0x3000,\n MathematicalSpace = 0x205F,\n Ogham = 0x1680,\n\n ZeroWidthNonJoiner = 0x200C,\n ZeroWidthJoiner = 0x200D,\n\n // Other white space\n Backspace = 0x08, // \\b\n FormFeed = 0x0C, // \\f\n ByteOrderMark = 0xFEFF,\n Tab = 0x09, // \\t\n VerticalTab = 0x0B, // \\v\n}\n\nexport function isSpaceLikeCharacter(ch: number): boolean {\n return ch === CharacterCode.Space ||\n ch === CharacterCode.Tab ||\n ch === CharacterCode.VerticalTab ||\n ch === CharacterCode.FormFeed ||\n ch === CharacterCode.NextLine ||\n ch === CharacterCode.Ogham ||\n ch >= CharacterCode.EnQuad && ch <= CharacterCode.ZeroWidthSpace ||\n ch === CharacterCode.MathematicalSpace ||\n ch === CharacterCode.IdeographicSpace ||\n ch === CharacterCode.ByteOrderMark;\n}\n\nexport function isStyledSpan(span: OneOfEditableSpans): span is OneOfContentSpans {\n return span.type === SpanType.Word\n || span.type === SpanType.Space\n || span.type === SpanType.Variable\n || span.type === SpanType.Newline;\n}\n\nfunction replaceSpaceAndNewLineChars(str: string): string {\n let sanitizedString = '';\n for (let i = 0; i < str.length; i++) {\n const ch = str.charCodeAt(i);\n\n if (isNewlineLikeCharacter(ch)) {\n sanitizedString += '\\n';\n continue;\n }\n\n if (isSpaceLikeCharacter(ch)) {\n sanitizedString += '\\u0020';\n continue;\n }\n\n sanitizedString += String.fromCharCode(ch);\n }\n\n return sanitizedString;\n}\n\n\nexport function sanitizeText(value: string): string {\n return replaceSpaceAndNewLineChars(value)\n .normalize('NFC')\n .replace(/\"/gi, '\\\"');\n}\n\nexport function isVariableSpan(span?: OneOfRenderedSpans): span is IVariableSpan {\n return span !== undefined && span.type === SpanType.Variable;\n}\n\nexport function isContentSpan(span?: OneOfRenderedSpans): span is OneOfContentSpans {\n return span !== undefined && (\n span.type === SpanType.Word\n || span.type === SpanType.Space\n || span.type === SpanType.Newline\n || span.type === SpanType.Variable\n );\n}\n\nexport function isVersionedTextContentSpan(span: ITextSpan): boolean {\n return span.type === SpanType.Word\n || span.type === SpanType.Space\n || span.type === SpanType.Newline\n || span.type === SpanType.Variable;\n}\n\nexport function isNewlineLikeCharacter(ch: number): boolean {\n return ch === CharacterCode.LineFeed\n || ch === CharacterCode.CarriageReturn\n || ch === CharacterCode.LineSeparator\n || ch === CharacterCode.ParagraphSeparator\n || ch === CharacterCode.NextLine;\n}\n\nexport function forEachSpan(text: IRenderedSpans, callback: (textNode: OneOfRenderedSpans, index: number) => void): void {\n if (text && text.spans && text.spans.length > 0) {\n let lastIndex = text.spans.length - 1;\n if (text.spans[lastIndex].type === SpanType.End) {\n lastIndex--;\n }\n for (let i = 0; i < text.spans.length; i++) {\n callback(text.spans[i], i);\n }\n }\n}\n\nexport function styleIdsAreEqual(source: IStyleIdMap, target: IStyleIdMap): boolean {\n if (source.size !== target.size) {\n return false;\n }\n for (const [documentId, sourceStyleId] of Object.entries(source)) {\n const targetStyleId = target[documentId];\n if (sourceStyleId !== targetStyleId) {\n return false;\n }\n }\n return true;\n}\n\nexport function toStringFromText(): string {\n return '';\n}\n\nexport function getHorizontalFlexAlignment(horizontalAlignment: HorizontalAlignment): string {\n switch (horizontalAlignment) {\n case 'left':\n return 'flex-start';\n case 'center':\n return 'center';\n case 'right':\n return 'flex-end';\n case 'justify':\n return 'flex-start';\n }\n}\n\nexport function getVerticalFlexAlignment(verticalAlignment: VerticalAlignment): string {\n switch (verticalAlignment) {\n case 'top':\n return 'flex-start';\n case 'middle':\n return 'center';\n case 'bottom':\n return 'flex-end';\n }\n}\n\nexport function createRichTextFromString(str: string): IText {\n return {\n style: createDefaultTextProperties(),\n spans: createSpansFromString(str).concat([{ type: SpanType.End, content: 'END', top: 0, left: 0, width: 0, height: 0, lineHeight: 0, attributes: {}, dir: TextDirection.Ltr }]),\n };\n}\n\nexport function createRichTextVariableFromString(str: string, attributes: ISpanProperties = {}, style?: Partial): IText {\n return {\n style: createDefaultTextProperties(),\n spans: createSpansFromString(str, attributes, style)\n .concat([{ type: SpanType.End, content: 'END', top: 0, left: 0, width: 0, height: 0, lineHeight: 0, attributes: {}, dir: TextDirection.Ltr }]),\n };\n}\n\nexport function createSpansFromString(str: string, properties: ISpanProperties = {}, style?: Partial, copyStyleFn?: (style: Partial) => Partial, styleId?: string, styleIds?: IStyleIdMap, previousStyleIds?: (string | PreviousStyleIdType)[], previousStyleIdToHistoryIndexMap?: Map): OneOfEditableSpans[] {\n const spans: OneOfEditableSpans[] = [];\n let currentTextSpan: OneOfEditableSpans | undefined;\n let lastSpanType: SpanType | undefined;\n str = (typeof str === 'number' ? (str as number).toString() : str);\n\n /**\n * Make sure variable artifacts are treated as a whole word\n * It's reverted after the spans has been assembled\n * Should only get in here when creating a new feeded element\n */\n if (style?.variable && str === VARIABLE_PREFIX + decodeFeedPath(style.variable.path)) {\n str = str.replace(/\\s/g, ' ');\n }\n\n for (let i = 0; i < str.length; i++) {\n const ch = str.charCodeAt(i);\n if (isSpaceLikeCharacter(ch)) {\n if (lastSpanType === SpanType.Space) {\n (currentTextSpan as ISpan).content += String.fromCharCode(ch);\n }\n else {\n currentTextSpan = {\n top: 0,\n left: 0,\n type: SpanType.Space,\n content: String.fromCharCode(ch),\n attributes: cloneDeep(properties.attributes || {}),\n style: style ? copyStyleFn!(style) : {},\n width: 0,\n height: 0,\n lineHeight: 0,\n styleIds: styleIds || {},\n styleId,\n __previousStyleIds: [...previousStyleIds || []],\n __previousStyleIdToHistoryIndexMap: new Map(previousStyleIdToHistoryIndexMap || []),\n };\n spans.push(currentTextSpan);\n lastSpanType = SpanType.Space;\n }\n }\n else if (isNewlineLikeCharacter(ch)) {\n currentTextSpan = {\n top: 0,\n left: 0,\n type: SpanType.Newline,\n content: String.fromCharCode(ch),\n width: 0,\n height: 0,\n lineHeight: 0,\n style: style ? copyStyleFn!(style) : {},\n attributes: cloneDeep(properties.attributes || {}),\n styleIds: styleIds || {},\n styleId,\n __previousStyleIds: [...previousStyleIds || []],\n __previousStyleIdToHistoryIndexMap: new Map(previousStyleIdToHistoryIndexMap || []),\n };\n spans.push(currentTextSpan);\n lastSpanType = SpanType.Newline;\n }\n else {\n if (lastSpanType === SpanType.Word || lastSpanType === SpanType.Variable) {\n (currentTextSpan as ISpan).content += String.fromCharCode(ch);\n }\n else {\n if (style && style.variable) {\n let newStyle = {};\n\n newStyle = copyStyleFn ? copyStyleFn!(style) : style;\n\n currentTextSpan = {\n type: SpanType.Variable,\n content: String.fromCharCode(ch),\n style: newStyle,\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n lineHeight: 0,\n attributes: cloneDeep(properties.attributes || {}),\n styleIds: styleIds || {},\n styleId,\n __previousStyleIds: [...previousStyleIds || []],\n __previousStyleIdToHistoryIndexMap: new Map(previousStyleIdToHistoryIndexMap || []),\n };\n }\n else {\n currentTextSpan = {\n type: SpanType.Word,\n content: String.fromCharCode(ch),\n style: style ? copyStyleFn!(style) : {},\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n lineHeight: 0,\n attributes: cloneDeep(properties.attributes || {}),\n styleIds: styleIds || {},\n styleId,\n __previousStyleIds: [...previousStyleIds || []],\n __previousStyleIdToHistoryIndexMap: new Map(previousStyleIdToHistoryIndexMap || []),\n };\n }\n spans.push(currentTextSpan);\n lastSpanType = style && style.variable ? SpanType.Variable : SpanType.Word;\n }\n }\n }\n\n for (const span of spans) {\n if (isVariableSpan(span)) {\n span.content = span.content.replace(/\\ \\;/gi, ' ');\n }\n span.attributes.shouldRenderNumber = false;\n }\n\n return spans;\n}\n\nexport function escapeSpanContent(content: string): string {\n return content\n .replace(/\\n/g, '\\\\n')\n .replace(/\"/g, '\\\\\"')\n .replace(/'/g, `\\\\'`)\n .replace(/&/g, '\\\\&')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\f/g, '\\\\f')\n .replace(/(\\\\)(?!n|\"|'|&|r|t|f|u\\d)/g, '\\\\\\\\') // Escape backslashes, if it's not unicode/metachar\n\n // Legacy: Some documents have newline characters that are not supported. Old Chrome browser cannot handle raw newline characters.\n // They will be converted next time they edit the text. But for now document.js is invalid with these characters.\n .replace(/\\u2028/g, '\\\\u2028') // Line Separator\n .replace(/\\u2029/g, '\\\\u2029') // Paragraph Separator\n .replace(/\\u0085/g, '\\\\u0085'); // Next Line\n}\n\nexport function remapStyles(text: IVersionedText, oldDocumentId: string, newDocumentId: string): IVersionedText {\n if (newDocumentId === oldDocumentId) {\n return text;\n }\n for (const span of text.styles) {\n const oldStyleIds = { ...span.styleIds };\n for (const [documentId, styleId] of Object.entries(oldStyleIds)) {\n if (documentId === oldDocumentId) {\n span.styleIds[newDocumentId] = styleId;\n delete span.styleIds[oldDocumentId];\n }\n }\n }\n return text;\n}\n\nexport function isVersionedText(property: IVersionProperty | IWidgetElementProperty | undefined): property is IVersionProperty {\n\n const propertyValue = property?.value;\n if (!propertyValue) {\n return false;\n }\n\n if (typeof propertyValue === 'string') {\n try {\n const parsed = JSON.parse(propertyValue) as IVersionedText;\n if (parsed.text !== undefined && parsed.styles !== undefined) {\n return true;\n }\n }\n // eslint-disable-next-line no-empty\n catch (e) { }\n }\n else {\n try {\n if (typeof propertyValue === 'object' && 'text' in propertyValue && propertyValue.text !== undefined && propertyValue.styles !== undefined) {\n return true;\n }\n }\n // eslint-disable-next-line no-empty\n catch (e) { }\n }\n\n return false;\n}\n\nexport function hasSameStyleIds(source: IStyleIdMap, target: IStyleIdMap): boolean {\n if (source.size !== target.size) {\n return false;\n }\n for (const [sourceDesignId, sourceStyleId] of Object.entries(source)) {\n if (!(target[sourceDesignId] && target[sourceDesignId] === sourceStyleId)) {\n return false;\n }\n }\n return true;\n}\n\nexport function copyVersionPropertyValue(property: IVersionProperty): OneOfVersionableProperties {\n const value = property.value;\n if (isVersionedText(property)) {\n return deserializeVersionedText(serializeVersionedText(property.value));\n }\n else {\n return deserializePropertyValue(property.name, serializePropertyValue(property.name, value)!)! as OneOfVersionableProperties;\n }\n}\n\n/**\n * Get raw string from IText (without formatting)\n * @param text\n * @param tw\n */\nexport function getTextContent(text: ISpans): string {\n let str = '';\n outer: for (const span of text.spans) {\n switch (span.type) {\n case SpanType.Newline:\n str += '\\n';\n break;\n case SpanType.Space:\n case SpanType.Word:\n str += span.content;\n break;\n case SpanType.Variable:\n str += span.content;\n break;\n case SpanType.End:\n break outer;\n default:\n throw new Error('Unknown span type.');\n }\n }\n return str;\n}\n\nexport function textSpanIsMergeable(source: ITextSpan, target: ITextSpan, checkPreviousStyles: boolean): boolean {\n if (source.type === SpanType.Newline || source.type === SpanType.End || source.type === SpanType.Variable) {\n return false;\n }\n if (source.type !== target.type) {\n return false;\n }\n if (!hasSameStyleIds(source.styleIds, target.styleIds)) {\n return false;\n }\n if (checkPreviousStyles) {\n if (!deepEqual(source.__previousStyleIds, target.__previousStyleIds)) {\n return false;\n }\n }\n return true;\n}\n\nexport function isSubStyleOf(source: Partial, target: Partial): boolean {\n const sourceStyle = omit(source, 'variable');\n const targetStyle = omit(target, 'variable');\n if (Object.keys(sourceStyle).length < Object.keys(targetStyle).length) {\n return false;\n }\n for (const property in targetStyle) {\n if (!hasSameStyleProperty(property as keyof ICharacterProperties, targetStyle, sourceStyle)) {\n return false;\n }\n }\n return true;\n}\n\nexport function hasSameStyle(source: Partial, target: Partial): boolean {\n const sourceStyle = omit(source, 'variable', '__fontFamilyId');\n const targetStyle = omit(target, 'variable', '__fontFamilyId');\n if (Object.keys(sourceStyle).length !== Object.keys(targetStyle).length) {\n return false;\n }\n for (const property in sourceStyle) {\n if (!hasSameStyleProperty(property as keyof ICharacterProperties, sourceStyle, targetStyle)) {\n return false;\n }\n }\n return true;\n}\n\nexport function hasSameStyleProperty(property: string, source: Partial, target: Partial, treatMissingAsFalse: boolean = true): boolean {\n const targetValue = target[property];\n if (targetValue === '$mixed') {\n return false;\n }\n const sourceValue = source[property]!;\n switch (property) {\n case 'uppercase':\n case 'underscore':\n case 'strikethrough':\n\n // We need to distinguish between 'missing' and 'false' values sometimes. An example, is when we want to promote commonly\n // styled properties across whole text to element styles. A 'uppercase: false' is not the same as 'uppercase: undefined'.\n // If we have in the first span 'uppercase: false' and all the rest of the spans has 'uppercase: undefined'. We don't want\n // to promote 'uppercase: false' to element style.\n if (!treatMissingAsFalse) {\n return sourceValue === targetValue;\n }\n return !!sourceValue === !!targetValue;\n\n case 'font': {\n const targetStyle = targetValue as IFontStyle;\n const sourceStyle = sourceValue as IFontStyle;\n if (sourceStyle === targetStyle) {\n return true;\n }\n if (targetStyle === undefined || sourceStyle === undefined) {\n return false;\n }\n return targetStyle.id === sourceStyle.id &&\n targetStyle.fontFamilyId === sourceStyle.fontFamilyId &&\n targetStyle.style === sourceStyle.style &&\n targetStyle.weight === sourceStyle.weight &&\n targetStyle.src === sourceStyle.src;\n }\n case 'textColor':\n if (sourceValue === targetValue) {\n return true;\n }\n if (sourceValue === undefined || targetValue === undefined) {\n return false;\n }\n if (!(sourceValue instanceof Color && targetValue instanceof Color)) {\n throw new Error(`Neither 'targetValue' nor 'sourceValue' is of type Color.`);\n }\n return sourceValue.toString() === targetValue!.toString();\n case 'padding':\n const targetPadding = targetValue as IPadding;\n const sourcePadding = sourceValue as IPadding;\n if (sourcePadding === targetPadding) {\n return true;\n }\n if (targetPadding === undefined || sourcePadding === undefined) {\n return false;\n }\n return targetPadding.top === sourcePadding.top &&\n targetPadding.bottom === sourcePadding.bottom &&\n targetPadding.left === sourcePadding.left &&\n targetPadding.right === sourcePadding.right;\n\n case 'textShadows': {\n const sourceShadows = sourceValue as IShadow[];\n const targetShadows = targetValue as IShadow[];\n if (typeof targetShadows !== typeof sourceShadows) {\n return false;\n }\n if (targetShadows === sourceShadows) {\n return true;\n }\n if (targetShadows.length !== sourceShadows.length) {\n return false;\n }\n for (let i = 0; i < sourceShadows.length; i++) {\n const sourceShadow = sourceShadows[i];\n const targetShadow = targetShadows[i];\n const isSame = sourceShadow.blur === targetShadow.blur &&\n sourceShadow.color === targetShadow.color &&\n sourceShadow.offsetX === targetShadow.offsetX &&\n sourceShadow.offsetY === targetShadow.offsetY &&\n sourceShadow.spread === targetShadow.spread;\n\n if (!isSame) {\n return false;\n }\n }\n return true;\n }\n default:\n return sourceValue === targetValue;\n }\n}\n\nexport function getMaxIndexFromStyleMap(styleIndexMap: Map): number {\n let maxIndex = 0;\n for (const index of styleIndexMap.values()) {\n if (index > maxIndex) {\n maxIndex = index;\n }\n }\n return maxIndex;\n}\n\nexport function createStyleIndexMap(text: IVersionedText, existingStyleIndexMap?: IStyleIndexMaps): IStyleIndexMaps {\n const styleHashToIndexMap = existingStyleIndexMap && existingStyleIndexMap.styleHashToIndexMap || new Map();\n const indexToStyleIdsMap = existingStyleIndexMap && existingStyleIndexMap.indexToStyleIdsMap || new Map();\n let currentStyleIndex = existingStyleIndexMap\n ? getMaxIndexFromStyleMap(existingStyleIndexMap.styleHashToIndexMap)\n : 0;\n\n for (let i = 0; i < text.styles.length; i++) {\n const span = text.styles[i];\n switch (span.type) {\n case SpanType.Word:\n case SpanType.Space:\n case SpanType.Variable:\n if (Object.keys(span.styleIds).length === 0) {\n continue;\n }\n let styleIndex: number | undefined;\n const sequencedStyleIds = sequenceStyleIds(span.styleIds);\n styleIndex = styleHashToIndexMap.get(sequencedStyleIds);\n if (styleIndex === undefined) {\n currentStyleIndex++;\n styleIndex = currentStyleIndex;\n }\n indexToStyleIdsMap.set(styleIndex, span.styleIds);\n styleHashToIndexMap.set(sequencedStyleIds, styleIndex);\n continue;\n }\n }\n\n return { styleHashToIndexMap, indexToStyleIdsMap };\n}\n\nexport function sequenceStyleIds(styleIds: IStyleIdMap): string {\n let serializedStyle = '';\n const sortedStyleIds = Array.from(Object.values(styleIds)).sort();\n for (const styleId of sortedStyleIds) {\n serializedStyle += styleId;\n }\n return serializedStyle;\n}\n\nexport function getHashFromStyle(style: Partial): string {\n return CRC32checksum(sequenceStyle(style));\n}\n\nexport function getCommonStyledPropertiesFromUniqueOnes(uniquelyStyledProperties: Set, style: Partial): Set {\n return new Set(Object.keys(style)\n .filter(property => !uniquelyStyledProperties.has(property)));\n}\n\nexport function sequenceStyle(style: Partial): string {\n let styleSequencedString = '';\n for (const property of textProperties) {\n if (!style) {\n continue;\n }\n if (property === '__fontFamilyId') {\n continue;\n }\n const styleValue = style[property];\n if (styleValue === undefined) {\n continue;\n }\n if (property === 'font') {\n styleSequencedString += property + (typeof styleValue === 'string' ? styleValue : (styleValue as IFontStyle).id);\n }\n else if (styleValue !== undefined) {\n styleSequencedString += property + JSON.stringify(serializeCharacterProperties({ [property]: styleValue })[property]);\n }\n }\n return styleSequencedString;\n}\n\nexport function copySpans(spans: OneOfEditableSpans[]): OneOfEditableSpans[] {\n const result: OneOfEditableSpans[] = [];\n for (const span of spans) {\n result.push(copySpan(span));\n }\n return result;\n}\n\nexport function copySpan(span: T): T {\n const copy = cloneDeep(span);\n if (isContentSpan(span)) {\n const contentSpanCopy = copy as IContentSpan;\n contentSpanCopy.styleId = span.styleId;\n contentSpanCopy.style = cloneDeep(span.style);\n contentSpanCopy.styleIds = { ...(span.styleIds || {}) };\n if (span.__previousStyleIdToHistoryIndexMap) {\n contentSpanCopy.__previousStyleIdToHistoryIndexMap = new Map([...span.__previousStyleIdToHistoryIndexMap]);\n }\n contentSpanCopy.__previousStyleIds = cloneDeep(span.__previousStyleIds);\n }\n return copy;\n}\n\nexport function copyStyle>(style: T): T {\n const styleCopy = {} as T;\n for (const property in style) {\n if (style[property] === undefined) {\n continue;\n }\n switch (property) {\n case 'textColor':\n styleCopy[property] = (style[property] as any).copy();\n break;\n case 'fontSize':\n styleCopy[property] = style[property];\n break;\n default:\n styleCopy[property] = cloneDeep(style[property]);\n break;\n }\n }\n return styleCopy;\n}\n\nexport function resolveElementTextStyle(element: T): T {\n if (isTextNode(element)) {\n const text = element.__richTextRenderer?.editor_m!.styleResolver.getResolvedText();\n if (!text) {\n return element;\n }\n for (const property in text.style) {\n if (!textProperties.includes(property as any)) {\n continue;\n }\n element[property] = element.__data[property] = text.style[property];\n }\n if (element.__dirtyContent) {\n element.__dirtyContent.spans = text.spans;\n }\n }\n return element;\n}\n","export enum WidgetEvent {\n\n /** Event that occurs when the widget's view node has changed. */\n ViewNodeChanged = 'viewNodeChange',\n\n /** Event that occurs when the widget's custom properties has changed. */\n PropertyChanged = 'propertyChanged',\n\n /** Event that occurs when the widget size has changed. */\n Resize = 'resize',\n\n /** Event that occurs when the widget position has changed. */\n Move = 'move',\n\n // Mouse events\n /** Event that occurs when the widget is clicked. */\n Click = 'click',\n\n /** Event that occurs when mouse movement happens in the widget. */\n MouseMove = 'mousemove',\n\n /** Event that occurs when mouse pointer enters the widget. */\n MouseOver = 'mouseover',\n\n /** Event that occurs when mouse pointer leaves the widget. */\n MouseOut = 'mouseout',\n\n /** Event that occurs when mouse button is pressed inside the widget. */\n MouseDown = 'mousedown',\n\n /** Event that occurs when mouse button is released inside the widget after mouse down. */\n MouseUp = 'mouseup',\n\n\n // Animations\n /** Event that occurs when the widget's animation starts on the timeline. */\n AnimationStart = 'animation_start',\n\n /** Event that occurs when the widget's animation ends on the timeline. */\n AnimationEnd = 'animation_end',\n\n /** Event that occurs when the widget's In Transition ends on the timeline. */\n InTransitionEnd = 'in_transition_end',\n\n /** Event that occurs when the widget's Out Transition starts on the timeline. */\n OutTransitionStart = 'out_transition_start',\n\n /** Event that occurs when the tcdata is resolved. */\n TCData = 'tcdata',\n\n /** Event that occurs when clicking show preload image */\n ShowPreloadImage = 'show_preload_image'\n}\n\nexport enum CreativeEvent {\n\n // Mouse events\n /** Event that occurs when the creative is clicked. */\n Click = 'click',\n\n /** Event that occurs when mouse movement happens in the creative. */\n MouseMove = 'mousemove',\n\n /** Event that occurs when mouse pointer enters the creative. */\n MouseOver = 'mouseover',\n\n /** Event that occurs when mouse pointer leaves the creative. */\n MouseOut = 'mouseout',\n\n /** Event that occurs when mouse button is pressed inside the creative. */\n MouseDown = 'mousedown',\n\n /** Event that occurs when mouse button is released inside the creative after mouse down. */\n MouseUp = 'mouseup',\n}\n\nexport enum TimelineEvent {\n /** Event that occurs when timeline starts playing. */\n Play = 'play',\n\n /** Event that occurs when timeline pauses. */\n Pause = 'pause',\n\n /** Event that occurs when timeline stops. */\n Stop = 'stop',\n\n /** Event that occurs when timeline skips to the next loop. */\n Loop = 'loop',\n\n /** Event that occurs when timeline restarts from the beginning. */\n Restart = 'restart',\n\n /** Event that occurs when timeline replays from the current loop. */\n Replay = 'replay',\n\n /** Event that occurs when seeking in the timeline. */\n Seek = 'seek',\n\n /** Event that occurs when the timeline skips to the next loop. */\n Tick = 'tick'\n}\n","\nexport enum CreativeMode {\n AnimatedCreative,\n ManageView,\n DesignView,\n ImageGenerator\n}\n\nexport interface ICreativeEnvironment {\n STUDIO_JS?: boolean; // rename to IN_STUDIO, scoped out for now\n IN_TEST?: boolean;\n MODE: CreativeMode;\n FONTSERVICE_API_ORIGIN: string;\n IMAGE_OPTIMIZER_ORIGIN: string;\n FEEDS_STORAGE_ORIGIN: string;\n VIDEOS_STORAGE_ORIGIN: string;\n FONTS_AZURE_STORAGE_CDN_ORIGIN?: string;\n CUSTOM_AD_DOMAIN?: string;\n}\n","import { distinctString, fixedEncodeURIComponent, trimEmojis } from '@studio/utils/utils';\n\nexport const FONT_SERVICE_TEXT_PARAMETER = '&t=';\n\nexport interface IFontServiceParams {\n textParams: string;\n distinctText: string;\n}\n\nexport const getFontServiceParamsFromString = (text: string): IFontServiceParams => {\n const distinctText = distinctString(trimEmojis(text));\n return {\n textParams: FONT_SERVICE_TEXT_PARAMETER + fixedEncodeURIComponent(distinctText),\n distinctText\n };\n};\n\n","import { fromRGBAstring } from '@creative/color.utils';\nimport { IBaseDataNode, IBorder, IColor, ICreativeSocialGuide, IGifExport, IGroupElementDataNode, IGuideline, INodeWithChildren, IPreloadImage, ISize, NodeKind, NodeKindWithChildren, OneOfDataNodes, OneOfElementDataNodes } from '@studio/domain';\nimport { isGroupDataNode, toFlatElementNodeList } from './index';\n/* webpack-strip-block:removed */\n\n/**\n * These base classes should be used for all data node types\n * eventually\n */\nexport abstract class BaseDataNode implements IBaseDataNode {\n id: string;\n kind: Kind;\n name: string;\n locked = false;\n hidden = false;\n __rootNode?: CreativeDataNode;\n __parentNode?: GroupDataNode;\n cidIndex?: number;\n parentId?: string;\n}\n\nexport abstract class BaseDataNodeWithChildren extends BaseDataNode implements INodeWithChildren {\n private _elements: OneOfElementDataNodes[] = [];\n get elements(): OneOfElementDataNodes[] {\n return Object.freeze(this._elements) as OneOfElementDataNodes[];\n }\n private _nodes: OneOfDataNodes[] = [];\n get nodes(): OneOfDataNodes[] {\n return Object.freeze(this._nodes) as OneOfDataNodes[];\n }\n protected get _duration(): number {\n let latestAnimationEnd = 0;\n for (const element of this.elements) {\n if (isGroupDataNode(element)) {\n continue;\n }\n\n if (element.time + element.duration > latestAnimationEnd) {\n latestAnimationEnd = element.time + element.duration;\n }\n }\n // Rounding workaround due to floating points\n return Math.round(latestAnimationEnd * 100) / 100;\n }\n\n constructor(input: IBaseDataNodeWithChildrenInput) {\n super();\n this.id = input.id;\n\n if (typeof this.id === 'undefined') {\n throw new Error(`No id was set when creating node ${this.name}`);\n }\n\n this.kind = input.kind as Kind;\n\n if (input.nodes) {\n this.setNodes_m(input.nodes);\n }\n else if (input.elements) {\n this.setNodes_m(input.elements);\n }\n }\n\n setNodes_m(nodes: OneOfDataNodes[]): void {\n this._nodes = nodes.slice();\n this._nodes.forEach(node => this._applyParentToNode(node));\n\n this._setFlatViewElementsList(nodes);\n }\n\n private _setFlatViewElementsList(nodes: OneOfDataNodes[]): void {\n this._elements = toFlatElementNodeList(nodes);\n\n const closestAncestor = this.__parentNode || this.__rootNode;\n\n closestAncestor?._setFlatViewElementsList(closestAncestor.nodes);\n }\n\n\n *nodeIterator_m(includeGroups = false, group?: INodeWithChildren): IterableIterator {\n if (!group) {\n group = this;\n }\n\n const nodes = group.nodes;\n\n switch (group.kind) {\n case NodeKind.Creative:\n case NodeKind.Group:\n for (const node of nodes) {\n switch (node.kind) {\n case NodeKind.Group:\n if (includeGroups) {\n yield node;\n }\n for (const n of this.nodeIterator_m(includeGroups, node)) {\n yield n;\n }\n break;\n default:\n yield node;\n }\n }\n break;\n default:\n throw new Error('Unknown group element.');\n }\n }\n\n private _applyParentToNode(node: OneOfDataNodes): void {\n if (isGroupDataNode(this)) {\n node.__parentNode = this;\n }\n else if (this instanceof CreativeDataNode) {\n node.__rootNode = this;\n node.__parentNode = undefined;\n }\n }\n\n protected _reverseNodes(): BaseDataNodeWithChildren {\n const nodeWithChildren = this;\n nodeWithChildren.setNodes_m(this.nodes.slice().reverse());\n\n for (const node of nodeWithChildren.nodes) {\n if (node instanceof BaseDataNodeWithChildren) {\n node.setNodes_m((node as BaseDataNodeWithChildren)._reverseNodes().nodes);\n }\n }\n\n return nodeWithChildren;\n }\n\n addNode_m(node: OneOfDataNodes, atIndex?: number): void {\n const newNodeList = this.nodes.slice();\n atIndex = atIndex ?? this.nodes.length;\n\n this._applyParentToNode(node);\n\n newNodeList.splice(atIndex, 0, node);\n\n this.setNodes_m(newNodeList);\n }\n\n remove_m(): void {\n if (isGroupDataNode(this)) {\n const parent = (this.__parentNode || this.__rootNode);\n const parentNodeIndex = parent?.nodes\n .findIndex(node => node.id === this.id) || 0;\n\n this.nodes.forEach((node, i) => {\n parent?.addNode_m(node, parentNodeIndex + i);\n this.removeNodeById_m(node.id);\n });\n }\n }\n\n /**\n * Recursively find a node in the tree\n */\n findNodeById_m(nodeId: string, includeGroups?: boolean): OneOfDataNodes | undefined {\n for (const node of this.nodeIterator_m(includeGroups)) {\n if (node.id === nodeId) {\n return node;\n }\n }\n }\n\n removeNodeById_m(nodeId: string): void {\n const newNodeTree: OneOfDataNodes[] = [];\n const nodes = this.nodes;\n\n for (const node of nodes) {\n if (node.id === nodeId) {\n continue;\n }\n\n if (isGroupDataNode(node)) {\n node.removeNodeById_m(nodeId);\n }\n\n newNodeTree.push(node);\n }\n\n this.setNodes_m(newNodeTree);\n }\n}\n\nexport interface IBaseDataNodeInput {\n id: string;\n kind: NodeKind;\n}\n\nexport interface IBaseDataNodeWithChildrenInput extends IBaseDataNodeInput {\n nodes?: OneOfDataNodes[];\n elements?: OneOfElementDataNodes[];\n}\n\nexport class CreativeDataNode extends BaseDataNodeWithChildren implements ISize {\n /**\n * These properites are obsolete for the\n * creative data node but gets inherited from the base\n * They are deleted in the constructor\n */\n name: any;\n locked: any;\n hidden: any;\n /** ----- */\n\n fill: IColor;\n loops = 0;\n stopTime?: number;\n startTime?: number;\n border?: IBorder;\n width: number;\n height: number;\n noEmit = false;\n guidelines: IGuideline[] = [];\n preloadImage: IPreloadImage;\n gifExport: IGifExport;\n socialGuide?: ICreativeSocialGuide;\n\n get duration(): number {\n return this._duration;\n }\n\n constructor(creative: ICreativeInput) {\n super({ ...creative, kind: NodeKind.Creative, nodes: creative.nodes });\n delete this.hidden;\n delete this.locked;\n delete this.name;\n this.width = creative.width;\n this.height = creative.height;\n this.fill = creative.fill || fromRGBAstring('rgba(255, 255, 255, 1)');\n this.loops = creative.loops || 0;\n this.stopTime = creative.stopTime;\n this.startTime = creative.startTime;\n this.guidelines = creative.guidelines || [];\n this.gifExport = {\n frames: [],\n show: false,\n ...creative.gifExport\n };\n this.preloadImage = {\n quality: 70,\n format: 'jpg',\n frames: [],\n ...creative.preloadImage\n };\n this.socialGuide = creative.socialGuide;\n }\n\n /* webpack-strip-block:removed */\n\n getFirstPreloadImageFrame(): number {\n if (this.preloadImage.frames.length > 0) {\n return this.preloadImage.frames[0];\n }\n return 1;\n }\n\n getStopTime_m(): number {\n if (typeof this.stopTime === 'number') {\n return this.stopTime;\n }\n else {\n return this.duration - 1;\n }\n }\n}\n\n\nexport interface ICreativeInput extends Omit {\n width: number;\n height: number;\n fill?: IColor;\n textColor?: IColor;\n loops?: number;\n startTime?: number;\n stopTime?: number;\n guidelines?: IGuideline[];\n preloadImage?: IPreloadImage;\n gifExport?: IGifExport;\n socialGuide?: ICreativeSocialGuide;\n}\n\n\nexport class GroupDataNode extends BaseDataNodeWithChildren implements IGroupElementDataNode {\n name: string;\n __rootNode?: CreativeDataNode;\n __parentNode?: GroupDataNode;\n cidIndex?: number;\n parentId?: string;\n get time(): number {\n const times = new Set();\n for (const node of this.elements) {\n times.add(node.time);\n }\n return Math.min(...times);\n }\n get duration(): number {\n return this._duration - this.time;\n }\n\n constructor(input: IGroupDataNodeInput) {\n super({ ...input, kind: NodeKind.Group });\n this.name = input.name;\n this.locked = input.locked ?? false;\n this.hidden = input.hidden ?? false;\n this.__rootNode = input.__rootNode;\n this.__parentNode = input.__parentNode as GroupDataNode;\n this.cidIndex = input.cidIndex;\n this.parentId = input.parentId;\n }\n\n /* webpack-strip-block:removed */\n}\n\ninterface IGroupDataNodeInput extends Omit {\n name: string;\n locked?: boolean;\n hidden?: boolean;\n __rootNode?: CreativeDataNode;\n __parentNode?: GroupDataNode | IGroupElementDataNode;\n cidIndex?: number;\n parentId?: string;\n}\n","import { IBoundingBox, IGroupElementDataNode, IPosition, ISize, OneOfDataNodes, ITimelineNode, OneOfGroupDataNodes, ICreativeDataNode } from '../../domain';\nimport { forEachParentNode, isCreativeViewNode, isGroupDataNode, toFlatNodeList } from './helpers';\nimport { ElementSelection } from './selection';\n\n/* webpack-strip-block:removed */\n\nexport function hasLockedAncestor(node: OneOfDataNodes): boolean {\n let hasLockedParent = false;\n\n forEachParentNode(node, parent => {\n if (parent.locked) {\n hasLockedParent = true;\n return true;\n }\n });\n\n return hasLockedParent;\n}\n\nexport function hasHiddenAncestor(node: OneOfDataNodes): boolean {\n let hasHiddenParent = false;\n\n forEachParentNode(node, parent => {\n if (parent.hidden) {\n hasHiddenParent = true;\n return true;\n }\n });\n\n return hasHiddenParent;\n}\n\n/**\n * Looks for the first expanded ancestor of node\n */\nexport function findExpandedAncestor(\n node: OneOfDataNodes,\n nodeList: ITimelineNode[]\n): IGroupElementDataNode | undefined {\n let ancestor: IGroupElementDataNode | undefined;\n\n forEachParentNode(node, parent => {\n const isParentExpanded = nodeList.some(tl => tl.node.__parentNode?.id === parent.id && !tl.collapsed);\n if (isGroupDataNode(parent) && isParentExpanded) {\n ancestor = parent;\n return true;\n }\n });\n\n return ancestor;\n}\n\n/**\n * Checks if parent of node is selected\n */\nexport function isParentNodeSelected(\n node: OneOfDataNodes,\n selection: ElementSelection\n): boolean {\n return selection.nodes.some(n => isGroupDataNode(n) && node.__parentNode?.id === n.id);\n}\n\n\nexport function getBoundingBoxOfGroup(node: IGroupElementDataNode): IBoundingBox {\n let x1, y1, x2, y2;\n node.elements.forEach(element => {\n if (x1 === undefined || element.x < x1) {\n x1 = element.x;\n }\n if (y1 === undefined || element.y < y1) {\n y1 = element.y;\n }\n if (x2 === undefined || element.x + element.width > x2) {\n x2 = element.x + element.width;\n }\n if (y2 === undefined || element.y + element.height > y2) {\n y2 = element.y + element.height;\n }\n });\n\n return {\n x: x1,\n y: y1,\n width: x2 - x1,\n height: y2 - y1\n };\n}\n\nexport function getSizeAndPositionOfNode(node: OneOfDataNodes): ISize & IPosition {\n if (isGroupDataNode(node)) {\n const box = getBoundingBoxOfGroup(node);\n const { x, y, width, height } = box;\n return { x, y, width, height };\n } else {\n const { x, y, width, height } = node;\n return { x, y, width, height };\n }\n}\n\nexport function getCommonParent(nodes: OneOfDataNodes[], creativeDocument: ICreativeDataNode): IGroupElementDataNode | ICreativeDataNode {\n const creativeNodes = toFlatNodeList(creativeDocument).reverse();\n const parentGroup = creativeNodes\n .find(node =>\n nodes.some(n => n.id === node.id)\n )?.__parentNode;\n\n const nodeInRoot = nodes.some(n => !n.__parentNode);\n\n const commonParent = nodeInRoot\n ? creativeDocument\n : parentGroup || creativeDocument;\n\n return commonParent;\n}\n\nexport function canCreateGroup(nodes: OneOfDataNodes[], creativeDocument: ICreativeDataNode): boolean {\n const commonParent = getCommonParent(nodes, creativeDocument);\n\n const MAX_NESTED_GROUPS = 7;\n const descendantLevels = Math.max(...nodes.map(node => isGroupDataNode(node) ? getInnerNestingLevel(node) : 0));\n let parent: OneOfGroupDataNodes | undefined = commonParent;\n let parentAmount = nodes.some(node => isGroupDataNode(node)) ? 1 : 0;\n\n while (parent && isGroupDataNode(parent) && parent !== parent.__parentNode) {\n parent = parent.__parentNode;\n parentAmount++;\n }\n return parentAmount + descendantLevels < MAX_NESTED_GROUPS;\n}\n\nexport function getInnerNestingLevel(group: OneOfGroupDataNodes): number {\n const levels = group.nodes.map(node => {\n if (isGroupDataNode(node) || isCreativeViewNode(node)) {\n return 1 + getInnerNestingLevel(node);\n } else {\n return 0;\n }\n });\n return Math.max(...levels);\n}\n","import { Creativeset, Element } from '@studio/data/collections/creativeset.data';\nimport { characterProperties, IBoundingBox, IBounds, ICharacterProperties, ICharacterStylesMap, ICollection, IElement, IElementDataNode, IElementPropertyValues, IElementValues, IElementViewNode, IEndSpan, IFontFamily, IGroupElementDataNode, IGroupViewElement, IImageElementDataNode, IInlinedStyledTextSpan, IInlineStyledText, INewlineSpan, INodeWithChildren, IPosition, IScale, ISpaceSpan, IState, ISVGBackgroundNode, IText, ITextDataNode, ITextProperties, ITextSpan, IVersionedText, IWordSpan, NodeKind, NodeKindIcon, NodeWithKind, OneOfDataNodes, OneOfEditableSpans, OneOfElementDataNodes, OneOfGroupDataNodes, OneOfGroupViewNodes, OneOfSelectableElements, OneOfTextDataNodes, OneOfViewNodes, SpanType, VARIABLE_PREFIX } from '@studio/domain';\nimport { cloneDeep } from '@studio/utils/clone';\nimport { isElementVisibleAtTime } from '../animation.utils';\nimport { isVersionedText } from '../elements/rich-text/text-nodes';\nimport { getFontStyleById, tryGetFontStyleById } from '../font-families.utils';\nimport { serializePropertyValue } from '../serialization/property-value-serializer'; // attention: dont change this import to alias, breaks the script build\nimport { deserializeVersionedText, serializeVersionedText } from '../serialization/text-serializer';\nimport { CreativeDataNode } from './base-data-node';\nimport { hasHiddenAncestor } from './data-node.utils';\n\nexport function getKindAsString(kind: NodeKind | 'feeds'): string {\n switch (kind) {\n case NodeKind.Text:\n return 'texts';\n case NodeKind.Button:\n return 'buttons';\n case NodeKind.Rectangle:\n return 'shapes';\n case NodeKind.Ellipse:\n return 'shapes';\n case NodeKind.Image:\n return 'images';\n case NodeKind.Video:\n return 'videos';\n case NodeKind.Widget:\n return 'widgets';\n case NodeKind.Video:\n return 'video';\n case NodeKind.AnyElement:\n return 'elements';\n case 'feeds':\n return 'feeds';\n case NodeKind.Selection:\n return 'selection';\n }\n throw new Error('Unknown element kind');\n}\n\nexport function getKindTitleAsString(kind: NodeKind | 'feeds'): string {\n switch (kind) {\n case NodeKind.Text:\n return 'Text Tool';\n case NodeKind.Button:\n return 'Button Tool';\n case NodeKind.Rectangle:\n return 'Rectangle Tool';\n case NodeKind.Ellipse:\n return 'Ellipse Tool';\n case NodeKind.Image:\n return 'Images';\n case NodeKind.Video:\n return 'Videos';\n case NodeKind.Widget:\n return 'Widgets';\n case NodeKind.Video:\n return 'Video';\n case NodeKind.AnyElement:\n return 'Brand Library';\n case 'feeds':\n return 'Dynamic Content';\n case NodeKind.Selection:\n return '';\n }\n throw new Error('Unknown element kind');\n}\n\nexport function getKindMessageAsString(kind: NodeKind | 'feeds'): string {\n switch (kind) {\n case NodeKind.Text:\n return 'Click/drag on canvas to\\ncreate a new text area';\n case NodeKind.Button:\n return 'Click/drag on canvas to\\ncreate a new button';\n case NodeKind.Rectangle:\n return 'Click/drag on canvas to\\ncreate a new rectangle';\n case NodeKind.Ellipse:\n return 'Click/drag on canvas to\\ncreate a new ellipse';\n case NodeKind.Image:\n return 'Drag in or upload an image\\n to store it here';\n case NodeKind.Video:\n return 'Drag in or upload an video\\n to store it here';\n case NodeKind.Widget:\n return 'Import a stock widget or\\ncreate a new one from scratch';\n case NodeKind.Video:\n return 'Drag in or upload an video\\n to store it here';\n case NodeKind.AnyElement:\n return 'Store elements that you\\nwant to reuse across\\ncreative sets in the library';\n case 'feeds':\n return 'Dynamic feed variables\\nwill show up here';\n case NodeKind.Selection:\n return '';\n }\n throw new Error('Unknown element kind');\n}\n\nconst SEARCH_PLACEHOLDER_MAP: Partial> = {\n [NodeKind.Text]: 'Search text elements',\n [NodeKind.Button]: 'Search buttons',\n [NodeKind.Rectangle]: 'Search rectangles',\n [NodeKind.Ellipse]: 'Search ellipses',\n [NodeKind.Image]: 'Search images',\n [NodeKind.Widget]: 'Search widgets',\n [NodeKind.Video]: 'Search videos',\n feeds: 'Search dynamic content',\n library: 'Search in library'\n};\n\nexport function getSearchPlaceholderAsString(kind?: NodeKind | 'feeds'): string {\n return SEARCH_PLACEHOLDER_MAP[kind || 'library'] || SEARCH_PLACEHOLDER_MAP.library!;\n}\n\nexport function mergeWidgetKind(kind: NodeKind): NodeKind {\n if (isWidgetNode({ kind })) {\n return NodeKind.Widget;\n }\n return kind;\n}\n\n// Helper function to in order to make typing easier\nfunction isNodeWithKind, Kind extends NodeKind = NodeKind>(element: Element | undefined | {}): element is Element {\n return Boolean(element && 'kind' in element);\n}\n\nfunction buildIsNodeKind(...kinds: Kinds) {\n return function | {}>\n (node?: Element): node is Extract {\n if (!isNodeWithKind(node)) {\n return false;\n }\n return kinds.findIndex(testKind => node.kind === testKind) !== -1;\n };\n}\n\nexport const isTextNode = buildIsNodeKind(NodeKind.Button, NodeKind.Text);\nexport const isEllipseNode = buildIsNodeKind(NodeKind.Ellipse);\nexport const isRectangleNode = buildIsNodeKind(NodeKind.Rectangle);\nexport const isCreativeViewNode = buildIsNodeKind(NodeKind.Creative);\nexport const isSelection = buildIsNodeKind(NodeKind.Selection);\nexport const isVideoNode = buildIsNodeKind(NodeKind.Video);\nexport const isImageNode = buildIsNodeKind(NodeKind.Image);\nexport function isGroupDataNode(element?: OneOfDataNodes | OneOfViewNodes | INodeWithChildren): element is IGroupElementDataNode {\n return !!element && buildIsNodeKind(NodeKind.Group)(element);\n}\nexport const isWidgetNode = buildIsNodeKind(\n NodeKind.Widget,\n NodeKind.BannerflowLibraryWidget,\n NodeKind.BannerflowLibraryWidgetInstance\n);\n\nexport function isVideoElement(element?: IElement): boolean {\n return element !== undefined && element.type === NodeKind.Video;\n}\nexport function isImageElement(element?: IElement): boolean {\n return element !== undefined && element.type === NodeKind.Image;\n}\n\nexport function isTextDataElement(node?: Partial | OneOfElementDataNodes | IElementDataNode>): node is ITextDataNode {\n return node !== undefined && (node.kind === NodeKind.Button || node.kind === NodeKind.Text) && !isViewElementNode(node);\n}\n\nexport function isWidgetElement(element?: IElement): boolean {\n return element !== undefined && [\n NodeKind.Widget,\n NodeKind.BannerflowLibraryWidget,\n NodeKind.BannerflowLibraryWidgetInstance\n ].includes(element.type);\n}\n\nexport function isCustomWidgetElement(element?: IElement): boolean {\n return element !== undefined && element.type === NodeKind.Widget;\n}\n\nexport function isTextElement(element?: IElement): boolean {\n return element !== undefined && [\n NodeKind.Text,\n NodeKind.Button,\n ].includes(element.type);\n}\n\nexport function isViewElementNode(node: OneOfSelectableElements | Partial | Partial | OneOfElementDataNodes): node is IElementViewNode {\n if (node === undefined || !('kind' in node)) {\n return false;\n }\n\n return (node.kind !== NodeKind.Creative\n && node.kind !== NodeKind.AnyElement\n && node.kind !== NodeKind.Selection\n && node.kind !== NodeKind.Group\n && node['__data']);\n}\n\nexport function isSelectionVisibleAtTime(element: OneOfDataNodes, time: number): boolean {\n return !isHidden(element) && time >= element.time\n && time <= (element.time + element.duration);\n}\n\nexport function isState(element: OneOfElementDataNodes | IState | undefined): element is IState {\n if (!element) {\n return false;\n }\n return !('kind' in element) || typeof element.kind !== 'string';\n}\n\nexport function isElementDataNode(element: OneOfDataNodes | IState | OneOfViewNodes): element is OneOfElementDataNodes {\n return !isState(element) && !isViewElementNode(element);\n}\n\nexport function createDefaultTextProperties(): ITextProperties {\n const properties = {\n padding: { top: 0, left: 0, right: 0, bottom: 0 },\n verticalAlignment: 'top',\n maxRows: Infinity,\n textOverflow: 'expand',\n characterSpacing: 0,\n lineHeight: 1.3,\n __fontFamilyId: '',\n } as ITextProperties;\n return properties;\n}\n\nconst characters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];\nlet currentCidIndex = 1;\n\nexport function createElementCid(): string {\n const position = currentCidIndex++;\n return getNumberSystemEncoding(position);\n}\n\nexport function getNumberSystemEncoding(position: number): string {\n const numberSystem = characters.length;\n if (position <= numberSystem) {\n return characters[position - 1];\n }\n const numerals: string[] = [];\n let currentNumber = position;\n while (currentNumber >= numberSystem) {\n const remainder = currentNumber % numberSystem;\n currentNumber = (currentNumber - remainder) / numberSystem;\n numerals.push(characters[remainder]);\n }\n numerals.push(characters[currentNumber - 1]);\n return numerals.reverse().join('');\n}\n\nexport function resetNodeCid(): void {\n currentCidIndex = 1;\n}\n\nexport function getCurrentCidIndex(): number {\n return currentCidIndex;\n}\n\nexport function forEachElement(group: OneOfGroupViewNodes, callback: (node: Element, group: IGroupViewElement | undefined, index: number) => void, atTime?: number, reverse?: boolean): void {\n forEachNode(group, callback, atTime, reverse);\n}\n\nexport function forEachDataElement(group: OneOfGroupDataNodes | OneOfDataNodes[], callback: (element: Node, group: IGroupElementDataNode | undefined, index: number) => void, atTime?: number, reverse?: boolean): void {\n forEachNode(group, callback, atTime, reverse);\n}\n\nfunction forEachNode<\n T extends OneOfViewNodes | OneOfElementDataNodes,\n Group extends IGroupElementDataNode | IGroupViewElement>\n (\n group: OneOfGroupDataNodes | OneOfDataNodes[] | OneOfGroupViewNodes,\n callback: (node: T, group: Group | undefined, index: number) => void,\n atTime?: number,\n reverse?: boolean\n ): void {\n\n let nodes: OneOfDataNodes[] | OneOfViewNodes[] = [];\n if (isNodeWithKind(group)) {\n switch (group.kind) {\n case NodeKind.Creative:\n case NodeKind.Group:\n nodes = group.nodes;\n break;\n default:\n throw new Error('Unknown group element.');\n }\n }\n else {\n nodes = group;\n }\n\n if (reverse) {\n nodes = nodes.slice().reverse();\n }\n\n let i = 0;\n for (const node of nodes) {\n if (isGroupDataNode(node)) {\n forEachNode(node, groupNode => {\n callback(groupNode as T, node as Group, i);\n }, atTime, reverse);\n }\n else {\n if (typeof atTime !== 'number' || isElementVisibleAtTime(node as OneOfElementDataNodes, atTime)) {\n callback(node as T, undefined, i);\n }\n }\n\n i++;\n }\n}\n\n/**\n * @returns Returns a flat nodelist of element nodes. Groups are excluded.\n */\nexport function toFlatElementNodeList(nodes: OneOfGroupDataNodes | OneOfDataNodes[]): OneOfElementDataNodes[] {\n const flatNodeList: OneOfElementDataNodes[] = [];\n\n forEachDataElement(nodes, element => {\n if (isGroupDataNode(element)) {\n return;\n }\n flatNodeList.push(element);\n });\n\n return flatNodeList;\n}\n\n/**\n * @returns Returns a completely flattened array of all nodes, including groups.\n */\nexport function toFlatNodeList(nodes: OneOfGroupDataNodes | OneOfDataNodes[]): OneOfDataNodes[] {\n\n if (Array.isArray(nodes) && nodes.every(node => !isGroupDataNode(node))) {\n return nodes;\n }\n\n const flatNodeListArr: OneOfDataNodes[] = [];\n const nodeArr = 'nodes' in nodes\n ? nodes.nodes\n : nodes;\n\n for (const node of nodeArr.slice().reverse()) {\n if (isGroupDataNode(node)) {\n flatNodeListArr.unshift(node);\n flatNodeListArr.unshift(...toFlatNodeList(node));\n }\n else if (flatNodeListArr.indexOf(node) === -1) {\n flatNodeListArr.unshift(node);\n }\n }\n\n return flatNodeListArr;\n}\n\nexport function isHidden(node: OneOfDataNodes): boolean {\n return node.hidden || hasHiddenAncestor(node);\n}\n\n/**\n * @param {OneOfDataNodes|undefined} node\n * @param {(parent:IGroupElementDataNode)=>boolean|void} callback\n * Return true to break loop\n */\nexport function forEachParentNode(node: OneOfDataNodes | undefined, callback: (parent: IGroupElementDataNode) => boolean | void): void {\n\n if (!node) {\n return;\n }\n\n let parentNode = node.__parentNode;\n while (parentNode) {\n const cancel = callback(parentNode);\n if (cancel) {\n return;\n }\n parentNode = parentNode.__parentNode;\n }\n}\n\nexport function positionIsInBounds(position: IPosition, bounds: IBounds & Partial | IBoundingBox & Partial, tolerance: IPosition = { x: 0, y: 0 }): boolean {\n let checkLeftBound: boolean;\n let checkTopBound: boolean;\n let checkRightBound: boolean;\n let checkBottomBound: boolean;\n if ('scaleX' in bounds && bounds.scaleX) {\n checkLeftBound = position.x >= bounds.x + (bounds.width / 2) - ((bounds.width * bounds.scaleX) / 2);\n checkRightBound = position.x <= bounds.x + (bounds.width / 2) + ((bounds.width * bounds.scaleX) / 2);\n } else {\n const minX = bounds.x - tolerance.x;\n const maxX = bounds.x + bounds.width + tolerance.x;\n checkLeftBound = position.x >= minX;\n checkRightBound = position.x <= maxX;\n }\n if ('scaleY' in bounds && bounds.scaleY) {\n checkTopBound = position.y >= bounds.y + (bounds.height / 2) - ((bounds.height * bounds.scaleY) / 2);\n checkBottomBound = position.y <= bounds.y + (bounds.height / 2) + ((bounds.height * bounds.scaleY) / 2);\n } else {\n const minY = bounds.y - tolerance.y;\n const maxY = bounds.y + bounds.height + tolerance.y;\n checkTopBound = position.y >= minY;\n checkBottomBound = position.y <= maxY;\n }\n if (checkLeftBound && checkRightBound) {\n if (checkTopBound && checkBottomBound) {\n return true;\n }\n }\n return false;\n}\n\nexport function isNumberBetween(origin: number, num2: number, margin: number = 5): boolean {\n return (origin - num2 - margin) * (origin - num2 + margin) <= 0;\n}\n\nexport function getElementTextProperties(data: OneOfTextDataNodes): Partial {\n const style: Partial = {};\n for (const characterProperty of characterProperties) {\n const value = data[characterProperty];\n if (value !== undefined) {\n style[characterProperty] = value as any; // TODO: WHY I HAVE TO DO THIS?\n }\n }\n return style;\n}\n\nexport function getElementIndex(element: OneOfDataNodes): number {\n return element.__rootNode!.elements.findIndex(e => e.id === element.id);\n}\n\nexport function getElementIdentifier(elementOrSelection: OneOfSelectableElements): string {\n if (elementOrSelection.kind === NodeKind.Selection) {\n if (elementOrSelection.length === 1) {\n const element = elementOrSelection.element!;\n return `${element.kind}:${element.id}`;\n }\n else {\n return `${elementOrSelection.kind}:${elementOrSelection.length}`;\n }\n }\n else {\n const element = elementOrSelection;\n return `${element.kind}:${element.id}`;\n }\n}\n\nexport function createViewElement(element: OneOfElementDataNodes): OneOfViewNodes {\n if (isGroupDataNode(element)) {\n throw new Error('View elements can not be created from a group node.');\n }\n\n const viewElement = {\n kind: element.kind,\n __data: element,\n get '__dirtyContent'() {\n return viewElement.__data['__dirtyContent'];\n }\n } as OneOfViewNodes;\n\n viewElement.elementCid = createElementCid();\n viewElement.cidIndex = getCurrentCidIndex();\n viewElement.id = element.id;\n viewElement.name = element.name;\n viewElement.ratio = element.ratio;\n\n viewElement.time = element.time;\n viewElement.duration = element.duration;\n\n if (isTextNode(viewElement) && isTextNode(element)) {\n viewElement.font = element.font;\n viewElement.content = element.content;\n }\n else if (isImageNode(element) && isImageNode(viewElement)) {\n viewElement.feed = element.feed;\n }\n else if (isWidgetNode(viewElement) && isWidgetNode(element)) {\n viewElement.customProperties = element.customProperties;\n }\n\n return viewElement;\n}\n\nexport function initializeElements(\n creative: CreativeDataNode,\n elements: ICollection | IElement[],\n values: IElementValues): void {\n for (const node of creative.nodeIterator_m(true)) {\n const globalElement = (elements as IElement[]).find(el => el.id === node.id);\n\n if (!globalElement) {\n throw new Error(`Could not find global element with id '${node.id}'.`);\n }\n\n if (isGroupDataNode(node)) {\n node.name = globalElement.name;\n continue;\n }\n node.name = globalElement.name;\n\n initializeElementProperties(node,\n {\n elementProperties: globalElement.properties,\n versionProperties: values.versionProperties,\n defaultVersionProperties: values.defaultVersionProperties,\n fontFamilies: values.fontFamilies,\n }\n );\n }\n}\n\nexport function initializeFonts(textElement: ITextDataNode, fontFamilies: Readonly): void {\n for (const style of textElement.characterStyles.values()) {\n if (style.font) {\n if (typeof style.font === 'string') {\n try {\n const fontStyle = getFontStyleById(fontFamilies, style.font);\n style.font = {\n id: fontStyle!.id,\n src: fontStyle!.fontUrl,\n weight: fontStyle!.weight,\n style: fontStyle!.italic ? 'italic' : 'normal',\n fontFamilyId: fontStyle!.fontFamilyId!,\n };\n }\n catch (err) {\n console.error(err);\n delete style.font;\n }\n }\n }\n }\n}\n\nexport function initializeElementProperties(\n element: OneOfElementDataNodes,\n values: IElementPropertyValues): void {\n const { elementProperties, versionProperties: versionValues, defaultVersionProperties: defaultVersionValues } = values;\n\n if (isTextNode(element)) {\n const fontStyleId = element.font?.id || element.__fontStyleId;\n const fontStyle = tryGetFontStyleById(values.fontFamilies, fontStyleId || '');\n element.font = undefined;\n if (fontStyle) {\n // Note: font is undefined before initialization, we just store the font style id as a reference.\n element.font = {\n id: fontStyle.id,\n src: fontStyle.fontUrl,\n weight: fontStyle.weight,\n style: fontStyle.italic ? 'italic' : 'normal',\n fontFamilyId: fontStyle.fontFamilyId!,\n };\n }\n }\n\n for (const property of elementProperties) {\n if (property.versionPropertyId) {\n let versionValue = versionValues.find(v => v.id === property.versionPropertyId);\n if (!versionValue) {\n versionValue = defaultVersionValues.find(e => e.id === property.versionPropertyId);\n }\n if (!versionValue) {\n throw new Error(`Could not find value from global elements, selected version or original. ID: ${property.versionPropertyId}`);\n }\n const name = property.name;\n if (name === 'content' && isTextNode(element) && isVersionedText(versionValue)) {\n initializeFonts(element, values.fontFamilies);\n element[name] = createTextFromVersionedText(element, versionValue.value, element.characterStyles);\n }\n else if (isWidgetNode(element)) {\n const versionProperty = element.customProperties\n .find(prop => prop.versionPropertyId === property.versionPropertyId);\n if (versionProperty) {\n if (isVersionedText(versionValue)) {\n versionProperty.value = serializeVersionedText(versionValue.value);\n }\n else {\n versionProperty.value = serializePropertyValue(versionProperty.unit, versionValue.value)!;\n }\n }\n }\n else {\n element[name] = versionValue.value;\n }\n }\n else {\n element[property.name] = property.value;\n }\n }\n}\n\nexport function createVersionedTextFromText(text: IText): IVersionedText {\n let position = 0;\n const textSpans: ITextSpan[] = [];\n let _text = '';\n for (const span of text.spans) {\n if (span.type === SpanType.End) {\n break;\n }\n const length = span.type === SpanType.Variable ? span.style.variable!.path.length + 1 : span.content.length;\n textSpans.push({\n position,\n length,\n type: span.type,\n styleIds: { ...(span.styleIds || {}) },\n variable: span.style.variable,\n __previousStyleIds: [...span.__previousStyleIds || []],\n __previousStyleIdToHistoryIndexMap: new Map(span.__previousStyleIdToHistoryIndexMap || [])\n });\n position += length;\n _text += span.type === SpanType.Variable ? VARIABLE_PREFIX + span.style.variable!.path : span.content;\n }\n return {\n text: _text,\n styles: textSpans,\n };\n}\n\nexport function createInlineStyledTextFromText(text: IText): IInlineStyledText {\n let position = 0;\n const textSpans: IInlinedStyledTextSpan[] = [];\n let _text = '';\n\n const copyText = JSON.parse(JSON.stringify(text));\n\n for (const span of copyText.spans) {\n if (span.type === SpanType.End) {\n break;\n }\n\n const length = span.content.length;\n textSpans.push({\n position,\n length,\n type: span.type,\n style: span.style,\n variable: span.style.variable\n });\n position += length;\n _text += span.content;\n }\n return {\n text: _text,\n styles: textSpans,\n };\n}\n\nexport function createTextFromInlineStyledText(inlineStyledText: IInlineStyledText, textProperties?: ITextProperties): IText {\n const text = inlineStyledText.text;\n const spans: OneOfEditableSpans[] = [];\n for (const span of inlineStyledText.styles) {\n switch (span.type) {\n case SpanType.Word:\n case SpanType.Variable:\n case SpanType.Space: {\n spans.push({\n type: span.type,\n attributes: {},\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n lineHeight: 0,\n content: text.substr(span.position, span.length),\n style: cloneDeep(span.style),\n styleIds: {},\n __previousStyleIds: [],\n __previousStyleIdToHistoryIndexMap: new Map(),\n } as IWordSpan | ISpaceSpan);\n break;\n }\n case SpanType.Newline: {\n spans.push({\n type: span.type,\n attributes: {},\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n lineHeight: 0,\n content: '\\n',\n style: cloneDeep(span.style),\n styleIds: {},\n __previousStyleIds: [],\n __previousStyleIdToHistoryIndexMap: new Map(),\n } as INewlineSpan);\n break;\n }\n default:\n throw new TypeError(`Expected span of type 'word', 'space' 'newline', instead got '${span.type}'.`);\n }\n }\n\n spans.push({\n type: SpanType.End,\n content: 'END',\n } as IEndSpan);\n\n return {\n style: textProperties ?? createDefaultTextProperties(),\n spans,\n };\n}\n\nexport function createTextFromVersionedText(element: OneOfElementDataNodes, versionedText: IVersionedText, elementsCharacterStyles: ICharacterStylesMap): IText {\n // This should hopefully not be a problem since the types have been updated, but I'll leave it here\n // just in case\n if (!element.__rootNode) {\n throw new Error(`Expected versioned text with root node, received '${typeof element.__rootNode}'`);\n }\n\n if (typeof versionedText === 'string') {\n versionedText = deserializeVersionedText(versionedText);\n }\n const text = versionedText.text;\n const spans: OneOfEditableSpans[] = [];\n for (const span of versionedText.styles) {\n switch (span.type) {\n case SpanType.Variable: {\n const styleId = span.styleIds[element.__rootNode.id]!;\n spans.push({\n type: span.type,\n attributes: {},\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n lineHeight: 0,\n content: VARIABLE_PREFIX + span.variable!.path,\n style: Object.assign(cloneDeep(elementsCharacterStyles.get(styleId) || {}), {\n variable: span.variable,\n }),\n styleIds: cloneDeep(span.styleIds),\n styleId,\n __previousStyleIds: [...span.__previousStyleIds || []],\n __previousStyleIdToHistoryIndexMap: new Map(span.__previousStyleIdToHistoryIndexMap || [])\n });\n break;\n }\n case SpanType.Word:\n case SpanType.Space: {\n const styleId = span.styleIds[element.__rootNode.id]!;\n spans.push({\n type: span.type,\n attributes: {},\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n lineHeight: 0,\n content: text.substr(span.position, span.length),\n style: cloneDeep(elementsCharacterStyles.get(styleId) || {}),\n styleIds: cloneDeep(span.styleIds),\n styleId,\n __previousStyleIds: [...span.__previousStyleIds || []],\n __previousStyleIdToHistoryIndexMap: new Map(span.__previousStyleIdToHistoryIndexMap || [])\n } as IWordSpan | ISpaceSpan);\n break;\n }\n case SpanType.Newline: {\n const styleId = span.styleIds[element.__rootNode.id]!;\n spans.push({\n type: span.type,\n attributes: {},\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n lineHeight: 0,\n content: '\\n',\n style: cloneDeep(elementsCharacterStyles.get(span.styleIds[element.__rootNode.id]!) || {}),\n styleIds: cloneDeep(span.styleIds),\n styleId,\n __previousStyleIds: [...span.__previousStyleIds || []],\n __previousStyleIdToHistoryIndexMap: new Map(span.__previousStyleIdToHistoryIndexMap || [])\n } as INewlineSpan);\n break;\n }\n default:\n throw new TypeError(`Expected span of type 'word', 'space' 'newline', instead got '${span.type}'.`);\n }\n }\n\n spans.push({\n type: SpanType.End,\n content: 'END',\n } as IEndSpan);\n\n return {\n style: createDefaultTextProperties(),\n spans,\n };\n}\n\nexport function isBannerFlowLibraryWidget(element: IElement): boolean {\n // If the type is of bannerflowLibraryWidget then it's imported\n return element.type === NodeKind.BannerflowLibraryWidget || !!(element.properties && element.properties.find(prop => prop.name === 'bannerflowLibraryWidgetReference'));\n}\n\nexport function isOriginalBannerFlowLibraryWidget(element: IElement): boolean {\n // If the type is of bannerflowLibraryWidget then it's imported\n return !!(isCustomWidgetElement(element) && element.properties && element.properties.find(prop => prop.name === 'bannerflowLibraryWidgetReference'));\n}\n\nexport function nodeKindToIcon(kind: NodeKind): NodeKindIcon | undefined {\n let icon: NodeKindIcon | undefined;\n Object.keys(NodeKind).forEach(key => {\n if (NodeKind[key] === kind) {\n icon = NodeKindIcon[key];\n }\n });\n\n return icon;\n}\n\nexport function getTextElements(creative: CreativeDataNode): OneOfTextDataNodes[] {\n const result: OneOfTextDataNodes[] = [];\n forEachDataElement(creative, (element) => {\n if (isTextNode(element)) {\n result.push(element);\n }\n });\n return result;\n}\n\nexport function isOrphanElement(element: Element, creativeset: Creativeset): boolean {\n for (const design of creativeset.designs) {\n if (design.hasElement(element)) {\n return false;\n }\n }\n return true;\n}\n\n\nexport function ratioLockSvgElement(url: string, imageNode: IImageElementDataNode): void {\n const isSvg = /(\\.(svg))(\\/?(\\?.*)?)$/gi;\n\n if ((url || '').match(isSvg)) {\n imageNode.ratio = imageNode.width / imageNode.height;\n }\n}\n","import { ISize, IPosition, IAnimationSettings, AnimatableProperty, OneOfElementDataNodes, Formula } from '../../domain';\nimport { getBoundingRectangleOfRotatedBox } from '../../utils/geom';\nimport { deepEqual, roundToNearestMultiple } from '../../utils/utils';\nimport { SafeEval } from '../../utils/safe-eval';\n\n/**\n * Detect if string is a formula.\n * Currently the rule is that it should contain an '@'\n */\nexport function isFormulaValue(value?: number | string): value is Formula {\n if (typeof value === 'string' && value.indexOf('@') >= 0) {\n return true;\n }\n return false;\n}\n\nexport function formulaToValue(formula: Formula, dependencies: IFormulaDependecies): undefined | number | string {\n // Formula is just @value (default value). TODO: SHOULDN't be the case anymore\n if (formula === '@value') {\n return undefined;\n }\n // Value is a formula\n else if (isFormulaValue(formula)) {\n\n // Reuse already resolved formulas if nothing have changed\n const cache = getCachedEval(formula, dependencies);\n if (typeof cache === 'number') {\n return cache;\n }\n\n const { settings, canvasSize, element } = dependencies;\n const mainValue = dependencies.propertyName && element[dependencies.propertyName];\n\n const {\n x,\n y,\n width,\n height,\n rotationX,\n rotationY,\n rotationZ\n } = element;\n\n const boundingBox = getBoundingRectangleOfRotatedBox({\n x: 0,\n y: 0,\n width,\n height,\n rotationZ\n });\n\n // Exposed properties and method\n const props: any = {\n x,\n y,\n rotationX,\n rotationY,\n rotationZ,\n width: boundingBox.width,\n height: boundingBox.height,\n creativeWidth: canvasSize.width,\n creativeHeight: canvasSize.height,\n edgePoint: (angle: number) => {\n const edge = getEdgePointBasedOnAngle(\n { x, y },\n boundingBox,\n angle,\n canvasSize\n );\n edge.x -= x;\n edge.y -= y;\n return edge;\n },\n transition: {},\n settings: {}\n };\n\n // Let us use \"@value\" inside the transition formula\n props.value = mainValue;\n\n if (settings) {\n for (const key in settings) {\n props.settings[key] = settings[key].value;\n props.transition[key] = settings[key].value; // Deprecated\n }\n }\n\n const expression = formulaToEvalExpression(formula);\n const parsedValue = SafeEval.eval(expression, props);\n\n // Detect any errors early in the chain to not pass around NaN values\n if (isNaN(parsedValue)) {\n throw new Error(`Could not resolve formula: ${formula}`);\n }\n\n // Store value in chache\n evalCacheValueMap.set(getCacheValidationKey(element, formula), parsedValue);\n\n return parsedValue;\n }\n // Not a formula but can be converted to a number. TODO: TOO NICE?\n else if (typeof formula === 'string' && !isNaN(+formula)) {\n return +formula;\n }\n // TODO: SHOULD WE EVEN COME HERE?\n else {\n return formula;\n }\n}\n\nconst evalCacheValidationMap = new Map();\nconst evalCacheValueMap = new Map();\n\nfunction getCachedEval(formula: Formula, dependencies: IFormulaDependecies): number | undefined {\n\n const validation = getCacheValidationObject(dependencies);\n const key = getCacheValidationKey(dependencies.element, formula);\n const cache = evalCacheValidationMap.get(key);\n\n if (cache && deepEqual(cache, validation)) {\n return evalCacheValueMap.get(key);\n }\n else {\n evalCacheValidationMap.set(key, validation);\n evalCacheValueMap.delete(key);\n }\n}\n\nfunction getCacheValidationKey(element: OneOfElementDataNodes, formula: string): string {\n return `${element.id}:${formula}`;\n}\n\nfunction getCacheValidationObject(dependencies: IFormulaDependecies): any {\n const { settings, canvasSize, element } = dependencies;\n const value = dependencies.propertyName && element[dependencies.propertyName];\n\n const {\n x,\n y,\n width,\n height,\n rotationX,\n rotationY,\n rotationZ\n } = element;\n return {\n x,\n y,\n width,\n height,\n rotationX,\n rotationY,\n rotationZ,\n value,\n settings,\n creativeWidth: canvasSize.width,\n creativeHeight: canvasSize.height\n };\n}\n\nfunction formulaToEvalExpression(formula: Formula): string {\n return formula.replace(/\\@/g, '');\n}\n\n\nfunction getEdgePointBasedOnAngle(position: IPosition, elementSize: ISize, angle: number, canvasSize: ISize): IPosition {\n angle = (angle - 90) * (Math.PI / 180);\n const roundTo = 0.00001;\n const dx = roundToNearestMultiple(Math.cos(angle), roundTo);\n const dy = roundToNearestMultiple(Math.sin(angle), roundTo);\n const d = dy / dx;\n const vertical = dx === 0;\n const horizontal = dy === 0;\n\n // Left border\n if (dx < 1.0e-16 && !vertical) {\n const y = (position.x) * d + (canvasSize.height - position.y);\n if (y >= -elementSize.height && y <= canvasSize.height + elementSize.height) {\n return {\n x: -elementSize.width,\n y: canvasSize.height - y - elementSize.height * -(dy * 0.5)\n };\n }\n }\n\n // Right border\n if (dx > 1.0e-16 && !vertical) {\n const y = (canvasSize.width - position.x) * d + position.y;\n if (y >= -elementSize.height && y <= canvasSize.height + elementSize.height) {\n return {\n x: canvasSize.width,\n y: y + elementSize.height * (dy * 0.5)\n };\n }\n }\n\n // Top border\n if (dy < 1.0e-16 && !horizontal) {\n const x = (position.y) * dx / dy + (canvasSize.width - position.x);\n\n if (x >= -elementSize.width && x <= canvasSize.width + elementSize.width) {\n return {\n x: canvasSize.width - x - elementSize.width * -(dx * 0.5),\n y: -elementSize.height\n };\n }\n }\n\n // Bottom border\n if (dy > 1.0e-16 && !horizontal) {\n const x = (canvasSize.height - position.y) * dx / dy + position.x;\n if (x >= -elementSize.width && x <= canvasSize.width + elementSize.width) {\n return {\n x: x + elementSize.width * (dx * 0.5),\n y: canvasSize.height\n };\n }\n }\n\n return position;\n}\n\nexport interface IFormulaDependecies {\n element: OneOfElementDataNodes;\n canvasSize: ISize;\n settings?: IAnimationSettings;\n propertyName: AnimatableProperty | string;\n}\n","import { IState, OneOfStatePropertyKeys, StateProperties, propertyToUnitMap, OneOfElementPropertyKeys, textPropertyToUnitMap, ScalableProperties, IAnimation, IAnimationKeyframe, ITime, IRadius } from '@studio/domain';\nimport { IElementDataNode, FILTER_MAP, animatableProperties, AnimatableProperty, ISize, IBorder, OneOfElementDataNodes, ITextElementDataNode, IShadow, ITextShadow, IColor, IBoundingBox, AnimatablePropertyValue, statePropertyToUnitMap, propertyMinValues, propertyMaxValues, IActionOperation, IAction, IFilterMap, IPadding } from '../../domain';\nimport { getBoundsOfScaledRectangle } from '../../utils/geom';\nimport { deepEqual, isUUID, lerp, omit, uuidv4 } from '../../utils/utils';\nimport { isReservedAction } from '../actions/actions.utils';\nimport { getAllKeyframes, getNextTime, getPreviousTime, isTimeAt, toRelativeTime } from '../animation.utils';\nimport { Color } from '../color';\nimport { parseColor, mixColor } from '../color.utils';\nimport { getTimingFunctionFromKeyframe, getTimingFunctionValueBetween } from '../timing-functions';\nimport { isFormulaValue, formulaToValue } from './formula.utils';\n\nconst AdditiveProperties = [ 'x', 'y', 'rotationX', 'rotationY', 'rotationZ' ];\n\nexport const DEFAULT_EMPTY_STATE: Readonly = Object.freeze({\n ratio: 1,\n});\n\nexport function createEmptyState(name?: string): IState {\n const state: IState = {\n ...DEFAULT_EMPTY_STATE,\n id: uuidv4()\n };\n\n if (name !== undefined) {\n state.name = name;\n }\n\n return state;\n}\n\nexport function isEmptyState(state: IState): boolean {\n return getPropertyKeysInStates(state).length === 0;\n}\n\n/**\n * Merges all states with current element values\n * @param timeStates\n * @param element\n */\nexport function mergeStates(timeStates: ITimeState[], element: IElementDataNode, lerpAdditive?: boolean): IState {\n const merged: IState = {};\n\n // Last states will overwrite previous states so reverse the array to prio actions and animation order...\n timeStates.forEach(timeState => {\n const state = timeState.state;\n const ratio = timeState.rate !== undefined ? timeState.rate : 1;\n\n if (ratio === 0) {\n return;\n }\n\n for (const property in state) {\n if (animatableProperties.some(p => p === property)) {\n\n let currentValue = merged[property];\n const unit = propertyToUnitMap[property];\n const value = state[property];\n const currentOrElementValue = currentValue !== undefined ? currentValue : element[property];\n\n if (value !== undefined) {\n\n if (unit === 'number') {\n // Different default values depending on if it's an additive property or a state property\n if (currentValue === undefined) {\n currentValue = isAdditiveProperty(property) ? 0 : element[property];\n }\n merged[property] = mergeNumbers(property as AnimatableProperty, currentValue, value, ratio, lerpAdditive);\n }\n else {\n merged[property] = mergeProperty(property as AnimatableProperty, currentOrElementValue, value, ratio);\n }\n }\n }\n else {\n merged[property] = state[property];\n }\n }\n });\n return merged;\n}\n\nexport function mergeProperty(property: AnimatableProperty, from: T | undefined, to: T | undefined, ratio: number): AnimatablePropertyValue | undefined {\n const unit = propertyToUnitMap[property];\n\n switch (unit) {\n case 'number':\n // Different default values depending on if it's an additive property or a state property\n // if (currentValue === undefined) {\n // // currentValue = isAdditiveProperty(property) ? 0 : element[property];\n // }\n return mergeNumbers(property, from as number, to as number, ratio);\n case 'Radius':\n return mergeRadius(from as IRadius, to as IRadius, ratio);\n case 'Color':\n return mergeColors(from as IColor, to as IColor, ratio);\n case 'Shadow[]':\n case 'TextShadow[]':\n return mergeShadows(from as IShadow[], to as IShadow[], ratio);\n case 'FilterMap':\n return mergeFilters(ratio, from as IFilterMap, to as IFilterMap);\n case 'Border':\n return mergeBorders(from as IBorder, to as IBorder, ratio);\n default:\n // For non numerical values, only set value when rate is 1\n if (ratio === 1) {\n return to;\n }\n break;\n }\n}\n\n/**\n * Merge two shadows with eachother. Amount control where they should meet.\n * @param fromShadows\n * @param toShadows\n * @param amount\n */\nfunction mergeShadows(fromShadows: IShadow[], toShadows: IShadow[], amount: number): ITextShadow[] | IShadow[] {\n\n const shadows: IShadow[] | ITextShadow[] = [];\n\n // Total amount of shadows\n const length = Math.max(fromShadows?.length || 0, toShadows?.length || 0);\n\n for (let i = 0; i < length; i++) {\n let from = fromShadows && fromShadows[i] as IShadow | undefined;\n let to = toShadows && toShadows[i] as IShadow | undefined;\n\n const fromColor = from?.color;\n const toColor = to?.color;\n\n if (!from) {\n from = { ...to! };\n }\n if (!to) {\n to = { ...from! };\n }\n\n shadows[i] = {\n blur: Math.max(0, lerp(from.blur, to.blur, amount)),\n offsetX: lerp(from.offsetX, to.offsetX, amount),\n offsetY: lerp(from.offsetY, to.offsetY, amount),\n color: mergeColors(fromColor, toColor, amount)\n };\n\n if (from.spread !== undefined) {\n (shadows[i] as IShadow).spread = Math.max(0, lerp((from as IShadow).spread, (to as IShadow).spread, amount));\n }\n }\n\n return shadows;\n}\n\nfunction mergeFilters(amount: number, from: IFilterMap = {}, to: IFilterMap = {}): IFilterMap {\n const filterKeySet = new Set([...Object.keys(from), ...Object.keys(to)]) as Set;\n\n return [...filterKeySet]\n .filter(key => from[key] !== undefined || to[key] !== undefined)\n .reduce((memo, key) => {\n const filter = FILTER_MAP[key];\n return {\n ...memo,\n [key]: {\n value: lerp(\n from[key]?.value ?? (filter?.default || 0),\n to[key]?.value ?? (filter?.default || 0),\n amount\n )\n }\n };\n }, {});\n}\n\nfunction mergeBorders(from: IBorder | undefined, to: IBorder | undefined, amount: number): IBorder | undefined {\n\n if (from || to) {\n\n from = from || { ...to!, thickness: 0 };\n to = to || { ...from!, thickness: 0 };\n\n if (to && from) {\n return {\n thickness: Math.max(0, lerp(from.thickness, to.thickness, amount)),\n style: amount === 1 ? to.style : from.style, // Swap style when 100% in\n color: mixColor(from.color, { color: to.color, amount }),\n };\n }\n }\n}\n\nfunction mergeColors(from: IColor | undefined, to: IColor | undefined, amount: number): IColor {\n\n if (!to) {\n to = parseColor(from!);\n to.alpha = 0;\n }\n if (!from) {\n from = parseColor(to);\n from.alpha = 0;\n }\n const tint = { color: to, amount };\n return mixColor(from, tint);\n}\n\nfunction mergeRadius(from: IRadius | undefined, to: IRadius | undefined, amount: number): IRadius | undefined {\n if (to && from) {\n return {\n type: to.type,\n topLeft: mergeNumbers('radius', from.topLeft, to.topLeft, amount),\n topRight: mergeNumbers('radius', from.topRight, to.topRight, amount),\n bottomLeft: mergeNumbers('radius', from.bottomLeft, to.bottomLeft, amount),\n bottomRight: mergeNumbers('radius', from.bottomRight, to.bottomRight, amount),\n };\n }\n}\n\nfunction mergeNumbers(property: AnimatableProperty, from: number | undefined, to: number | undefined, ratio: number, lerpAdditive: boolean = false): number {\n if (typeof to !== 'number') {\n if (typeof from === 'number') {\n return from;\n }\n throw new Error ('Can only merge numeric values');\n }\n // Additive properties like x, y, rotations\n if (isAdditiveProperty(property) && !lerpAdditive) {\n if (typeof from !== 'number') {\n from = 0;\n }\n return limitNumberProperty(property, from + to * ratio);\n }\n // Average properties like scale etc\n else {\n if (typeof from !== 'number') {\n from = 1;\n }\n return limitNumberProperty(property, lerp(from, to, ratio));\n }\n}\n\nfunction limitNumberProperty(property: AnimatableProperty, value: number): number {\n const min = propertyMinValues[property];\n const max = propertyMaxValues[property];\n if (typeof min === 'number') {\n value = Math.max(min, value);\n }\n if (typeof max === 'number') {\n value = Math.min(max, value);\n }\n return value;\n}\n\n/**\n * Resolve values so they can be rendered.\n * Typically turn any formulas into numbers\n * @param element\n * @param animation\n * @param canvasSize\n * @param property\n * @param value\n */\nexport function resolveStateFormulaValue(element: OneOfElementDataNodes, animation: IAnimation, canvasSize: ISize, property: AnimatableProperty | string, value: any, ): StateProperties {\n\n const unit = propertyToUnitMap[property];\n\n switch (unit) {\n case 'number':\n if ((typeof value === 'number' && !isNaN(value)) || value === undefined) {\n return value;\n }\n else if (typeof value === 'object' && value.type === 'number') {\n return value.value;\n }\n else if (isFormulaValue(value)) {\n return formulaToValue(value, {\n element,\n propertyName: property,\n settings: animation.settings,\n canvasSize\n });\n }\n else if (typeof value === 'string' && !isNaN(+value)) {\n return +value;\n }\n throw new Error('Unexpected number value.');\n }\n return value;\n}\n\nexport function getValueFromKeyframe(property: AnimatableProperty | string, keyframe: IAnimationKeyframe, animation: IAnimation, element: OneOfElementDataNodes, canvasSize: ISize): StateProperties {\n const state = getStateById(element, keyframe.stateId);\n const value = state && state[property];\n return resolveStateFormulaValue(element, animation, canvasSize, property, value);\n}\n\nexport function getViewElementProperty(property: OneOfElementPropertyKeys, element: IElementDataNode, mergedState: IState = {}, scale: number = 1): any {\n const unit = propertyToUnitMap[property];\n const value = element[property];\n const stateValue = mergedState[property];\n const stateValueOrValue = stateValue !== undefined ? stateValue : value;\n\n if (stateValueOrValue !== undefined) {\n if (unit === 'number') {\n const numericValue = getNumericPropertyValue(property, value, stateValue, stateValueOrValue);\n\n if (isScalableProperty(property)) {\n return scaleNumericValue(numericValue, scale);\n }\n return numericValue;\n }\n else if (unit === 'Color') {\n return new Color(stateValueOrValue);\n }\n else if (unit === 'Border') {\n return getViewElementBorder(stateValueOrValue, scale);\n }\n else if (unit === 'Shadow[]' || unit === 'TextShadow[]') {\n return stateValueOrValue.map(shadow => getShadowPropertyValue(unit, shadow, scale));\n }\n else if (unit === 'ImageAsset') {\n return { ...stateValueOrValue };\n }\n else if (unit === 'ImageSettings') {\n return { ...stateValueOrValue };\n }\n else if (unit === 'Padding') {\n return getViewElementPadding(stateValueOrValue, scale);\n }\n else if (unit === 'Radius') {\n return {\n ...stateValueOrValue,\n topLeft: stateValueOrValue.topLeft * scale,\n topRight: stateValueOrValue.topRight * scale,\n bottomLeft: stateValueOrValue.bottomLeft * scale,\n bottomRight: stateValueOrValue.bottomRight * scale,\n };\n }\n }\n return stateValueOrValue;\n}\n\nfunction isScalableProperty(property: OneOfElementPropertyKeys): boolean {\n return ScalableProperties.includes(property);\n}\n\nfunction getNumericPropertyValue(property: OneOfElementPropertyKeys, value: any, stateValue: any, stateValueOrValue: any): number {\n if (typeof stateValue !== 'number') {\n return value;\n } else if (isAdditiveProperty(property)) {\n return value + (stateValue || 0);\n } else {\n return stateValueOrValue;\n }\n}\n\nfunction scaleNumericValue(value: number, scale: number): number {\n return value * scale;\n}\n\nexport function getShadowPropertyValue(unit, shadow: IShadow | ITextShadow, scale: number): IShadow | ITextShadow {\n const newShadow = { ...shadow };\n if (unit === 'Shadow[]') {\n newShadow.offsetX! *= scale;\n newShadow.offsetY! *= scale;\n (newShadow as IShadow).spread *= scale;\n newShadow.blur! *= scale;\n } else if (unit === 'TextShadow[]') {\n newShadow.offsetX! *= scale;\n newShadow.offsetY! *= scale;\n newShadow.blur! *= scale;\n }\n return newShadow;\n}\n\n\nfunction getViewElementBorder(stateValueOrValue: any, scale: number): IBorder {\n return {\n thickness: stateValueOrValue.thickness * scale,\n color: stateValueOrValue.color,\n style: stateValueOrValue.style,\n };\n}\n\nfunction getViewElementPadding(stateValueOrValue: any, scale: number): IPadding {\n return {\n bottom: stateValueOrValue.bottom * scale,\n top: stateValueOrValue.top * scale,\n right: stateValueOrValue.right * scale,\n left: stateValueOrValue.left * scale,\n };\n}\n/**\n * Merge an animation to a \"relative\" state. Pass extra states to show states not added by timeline\n */\nexport function animationsToState(element: OneOfElementDataNodes, canvasSize: ISize, time: number = 0, states: ITimeState[] = []): IState {\n\n // Merge states from actions\n states = mergeActionStates(element, states);\n\n if (element.animations) {\n element.animations\n .filter(animation => !animation.hidden)\n .forEach((animation) => {\n const animationStates = animationToStates(element, animation, canvasSize, time)\n .filter(state => !states.some(s => state.state === s.state)); // Make sure we don't render states twice\n\n states.unshift(...animationStates);\n });\n }\n\n const merged = mergeStates(states, element);\n\n return merged;\n}\n\nexport function mergeActionStates(element: OneOfElementDataNodes, states: ITimeState[]): ITimeState[] {\n if (states.length > 1) {\n const maxRate = Math.max(...states.map(s => s.rate), 0);\n\n // No need to spend cpu on when completely \"faded\" out\n if (maxRate === 0) {\n return [];\n }\n\n // States scaled so highest rate is 1\n const normalizedStates = states.map(s => {\n // Later all values will be scaled by maxRate so compensate for that\n const rate = s.rate / maxRate;\n return {\n rate,\n state: s.state\n };\n });\n const state = mergeStates(normalizedStates, element, true);\n return [{rate: maxRate, state}];\n }\n\n // Return shallow clone to not overwrite original\n return states.slice(0);\n}\n\nexport function getStateById(element: OneOfElementDataNodes, id?: string): IState | undefined {\n if (element.states?.length && id) {\n return element.states.find(state => state.id === id);\n }\n}\n\nexport function resolveFormulasOnKeyframe(keyframe: IAnimationKeyframe, animation: IAnimation, element: OneOfElementDataNodes, canvasSize: ISize): IState {\n\n const state = getStateById(element, keyframe.stateId);\n\n if (state) {\n const resolvedState: IState = {\n id: state.id,\n };\n for (const property in state) {\n // Ignore properties like id, absolute etc.\n if (animatableProperties.some(p => p === property)) {\n resolvedState[property] = getValueFromKeyframe(property, keyframe, animation, element, canvasSize);\n }\n else {\n resolvedState[property] = state[property];\n }\n }\n return resolvedState;\n }\n throw new Error('No state to resolve');\n}\n\nexport function cloneState(state: IState): IState {\n const clone = {};\n for (const property in state) {\n const value = state[property];\n const type = typeof value;\n\n if (type === 'string' || type === 'number' || type === 'object') {\n clone[property] = value;\n }\n }\n return clone;\n}\n\n/**\n * Calulate a state of an animation at a certain point in time.\n * Note: Don't use this to render element\n */\nexport function calculateStateFromAnimationAtTime(element: OneOfElementDataNodes, animation: IAnimation, canvasSize: ISize, time: number = 0): IState {\n const states = animationToStates(element, animation, canvasSize, time);\n return omit(mergeStates(states, element), 'id');\n}\n\n/**\n * Get a combination of all states until that point of time\n * @param element\n * @param animation\n * @param relativeTime\n */\nexport function getMergedStateAtTime(element: OneOfElementDataNodes, animation: IAnimation, relativeTime: number, canvasSize: ISize): IState | undefined {\n const mergedState: IState = {};\n\n const keyframes = animation.keyframes\n .filter(k => k.time <= relativeTime);\n\n // Find index of last default state visible (from end)\n const index = keyframes\n .slice()\n .reverse()\n .findIndex(k => !k.stateId);\n\n // Remove all states before last default state since they are irrelevant\n if (index > -1) {\n keyframes.splice(0, keyframes.length - index);\n }\n\n const states = keyframes.filter(k => k.stateId).map(k => getStateById(element, k.stateId!));\n\n if (!states.length) {\n return;\n }\n\n // Last property will prevail\n states.forEach((state) => {\n for (const key in state) {\n if (state[key] !== undefined && animatableProperties.indexOf(key as AnimatableProperty) > -1) {\n mergedState[key] = state[key];\n }\n }\n });\n\n // Resolve any formulas\n return resolveStateFormulas(element, animation, canvasSize, mergedState);\n}\n\n/**\n * Go through all properties in a state and resolve any formulas found\n * @param element\n * @param animation\n * @param canvasSize\n * @param state\n * @returns\n */\nfunction resolveStateFormulas(element: OneOfElementDataNodes, animation: IAnimation, canvasSize: ISize, state: IState): IState {\n const resolvedState: IState = {};\n // Resolve any formulas\n for (const key in state) {\n resolvedState[key] = resolveStateFormulaValue(element, animation, canvasSize, key, state[key]);\n }\n return resolvedState;\n}\n\n/**\n * Get all states from an animation with a \"rate\"\n * which is how much from 0 to 1 that this state should be \"visible\"\n */\nexport function animationToStates(element: OneOfElementDataNodes, animation: IAnimation, canvasSize: ISize, absoluteTime: number = 0): ITimeState[] {\n const states: ITimeState[] = [];\n const { keyframes } = animation;\n if (!keyframes || !keyframes.length || !isTimeAt(absoluteTime, element)) {\n return states;\n }\n\n const time = toRelativeTime(element, absoluteTime);\n const tolerance = 0.000001;\n\n const prev = getPreviousTime(keyframes, time, tolerance);\n const next = getNextTime(keyframes, time, tolerance);\n const prevState = prev?.stateId && { ...resolveStateFormulas(element, animation, canvasSize, getStateById(element, prev.stateId)!) };\n const nextState = next?.stateId && { ...resolveStateFormulas(element, animation, canvasSize, getStateById(element, next.stateId)!) };\n\n // Should only happen if no keyframes is defined\n if (!prev && !next) {\n throw new Error('Animation has no keyframes');\n }\n // When within the duration of a keyframe,\n else if (prev === next || !next || (prev && isTimeAt(time, prev))) {\n\n // Ignore double default state case\n if (prevState) {\n states.push({state: prevState, rate: 1 });\n }\n }\n // In between two states => apply easing\n else if (prev && next) {\n const timingFunction = getTimingFunctionFromKeyframe(animation, next);\n const rate = getTimingFunctionValueBetween(time, prev, next, timingFunction);\n\n // Inverted rate when animating to the default state.\n // Between states the previous value should always be at 100%\n if (prevState) {\n\n // Both states defined\n if (nextState) {\n const props = getPropertyKeysInStates(prevState, nextState);\n\n // Make sure both states have the same values\n props.forEach(p => {\n\n const defaultValue = isAdditiveProperty(p) ? 0 : element[p];\n\n if (prevState[p] === undefined && defaultValue !== undefined) {\n prevState[p] = defaultValue as any;\n }\n if (nextState[p] === undefined) {\n nextState[p] = defaultValue !== undefined ? defaultValue : mergeProperty(p, prevState[p], defaultValue, 1) as any;\n }\n });\n\n const additive = getAdditiveStateProperties(prevState);\n const nonAdditive = getNonAdditiveStateProperties(prevState);\n if (nonAdditive) {\n states.push( {state: nonAdditive, rate: 1 } );\n }\n if (additive) {\n states.push( {state: additive, rate: 1 - rate } );\n }\n }\n else {\n states.push( {state: prevState, rate: 1 - rate } );\n }\n }\n if (nextState) {\n states.push({state: nextState, rate });\n }\n }\n return states;\n}\n\n\nexport function getStateAtTime(element: OneOfElementDataNodes, relativeTime: number | ITime, tolerance: number = 0): IState | undefined {\n for (const animation of element.animations) {\n const keyframe = animation.keyframes.find(kf =>\n isTimeAt(kf, relativeTime, tolerance)\n );\n\n if (keyframe?.stateId) {\n return getStateById(element, keyframe.stateId!)!;\n }\n }\n}\n\nexport function setNewPropertyIds(originalElement: OneOfElementDataNodes, newElement: OneOfElementDataNodes): Map {\n\n const idChangeMap = new Map();\n function isActionOperation(value: any): value is IActionOperation {\n return typeof value === 'object'\n && 'target' in value\n && 'method' in value;\n }\n\n function setNewIdOnItem(item: IAction | IActionOperation | IState | IAnimation | IAnimationKeyframe): void {\n const newId = uuidv4();\n let oldId: string | undefined;\n\n if (isActionOperation(item)) {\n oldId = item.value;\n item.value = newId;\n }\n else {\n oldId = item.id;\n item.id = newId;\n }\n\n idChangeMap.set(oldId!, newId);\n }\n const stateIdsMap = {};\n for (const state of newElement.states) {\n const oldId = state?.id;\n if (oldId) {\n setNewIdOnItem(state);\n stateIdsMap[oldId] = state.id;\n }\n }\n for (const animation of newElement.animations) {\n setNewIdOnItem(animation);\n for (const keyframe of animation.keyframes) {\n setNewIdOnItem(keyframe);\n /**\n * Migrated IDs (e.g keyframe-0) may be the same\n * on mulitple elements hence we need to set the stateId\n * reference here right away. The ID patching is otherwise\n * done in designView.patchPropertyIds.\n * This can probably be removed once all design elements\n * has been migrated.\n */\n const keyframeStateId = keyframe?.stateId;\n if (keyframeStateId && stateIdsMap[keyframeStateId] && !isUUID(keyframeStateId)) {\n keyframe.stateId = stateIdsMap[keyframeStateId];\n }\n }\n }\n\n for (const action of newElement.actions) {\n setNewIdOnItem(action);\n }\n\n /**\n * Validate that all ids are unique\n */\n\n const idSet = new Set();\n\n const properties: OneOfElementPropertyKeys[] = ['animations', 'actions', 'states'];\n\n const recursiveFindIds = (object: any): void => {\n if (typeof object !== 'object') {\n return;\n }\n\n if (idSet.has(object.id)) {\n throw new Error('Duplicate IDs found.');\n }\n\n if (object.id) {\n idSet.add(object.id);\n }\n\n if (Array.isArray(object)) {\n for (const prop of object) {\n recursiveFindIds(prop);\n }\n }\n else {\n for (const prop in object) {\n recursiveFindIds(object[prop]);\n }\n }\n };\n\n for (const key of Object.keys(originalElement) as OneOfElementPropertyKeys[]) {\n if (!properties.includes(key)) {\n continue;\n }\n recursiveFindIds(originalElement[key]);\n recursiveFindIds(newElement[key]);\n }\n\n return idChangeMap;\n}\n\nexport function isStateProperty(property: string): property is OneOfStatePropertyKeys {\n return !!property && Object.keys(statePropertyToUnitMap).indexOf(property) > -1;\n}\n\nexport function isTextState(state: IState | OneOfElementDataNodes, property: OneOfElementPropertyKeys): state is IState & ITextElementDataNode {\n return property in textPropertyToUnitMap;\n}\n\nexport function isActionState(element: OneOfElementDataNodes, state: IState): boolean {\n return element.actions.some(action =>\n !isReservedAction(action) && action.operations.some(op => op.value === state.id)\n );\n}\n\nexport function isReservedActionState(element: OneOfElementDataNodes, state: IState): boolean {\n return element.actions.some(action =>\n isReservedAction(action) && action.operations.some(op => op.value === state.id)\n );\n}\n\nexport function isAnimationState(element: OneOfElementDataNodes, state: IState): boolean {\n if (!state.id) {\n return false;\n }\n return getAllKeyframes(element).some(keyframe =>\n keyframe.stateId === state.id\n );\n}\n\n/**\n * Check if all bounds provided have the same size & position\n * @param bounds\n */\nexport function isEqualStates(...states: (IState | undefined)[]): boolean {\n\n if (!states || states.length < 2) {\n throw new Error('2 or more states must be passed to compare them');\n }\n\n // Id is irrelevant\n states = states.map(s => s && omit(s, 'id'));\n\n const first = states[0];\n const toCompare = states.slice(1);\n\n if (toCompare.some(s => !deepEqual(first, s))) {\n return false;\n }\n return true;\n}\n\nexport function getReservedStates(element: OneOfElementDataNodes): IState[] {\n return element.states\n .filter(state =>\n isReservedActionState(element, state)\n );\n}\n\n/**\n * Custom states that are states that are not related to\n * reserved States (actions) and not related to any keyframe animation\n */\nexport function getCustomStates(element: OneOfElementDataNodes): IState[] {\n return element.states\n .filter(state =>\n !isAnimationState(element, state) && !isReservedActionState(element, state)\n );\n}\n\nexport function getBoundingBoxOfElementWithState(element: IBoundingBox | OneOfElementDataNodes, state: IState = {}, includeScale?: boolean): IBoundingBox {\n\n const scaleX = 'scaleX' in element && typeof element.scaleX === 'number' ? element.scaleX : 1;\n const scaleY = 'scaleY' in element && typeof element.scaleY === 'number' ? element.scaleY : 1;\n const originX = 'originX' in element && typeof element.originX === 'number' ? element.originX : 0.5;\n const originY = 'originY' in element && typeof element.originY === 'number' ? element.originY : 0.5;\n\n const box = {\n x: element.x + (typeof state.x === 'number' ? state.x : 0),\n y: element.y + (typeof state.y === 'number' ? state.y : 0),\n scaleX: scaleX * (typeof state.scaleX === 'number' ? state.scaleX : 1),\n scaleY: scaleY * (typeof state.scaleY === 'number' ? state.scaleY : 1),\n originX: typeof state.originX === 'number' ? state.originX : originX,\n originY: typeof state.originY === 'number' ? state.originY : originY,\n // Note state shouldn't have width and height ATM\n width: element.width,\n height: element.height,\n rotationZ: (element.rotationZ || 0) + (typeof state.rotationZ === 'number' ? state.rotationZ : 0)\n };\n\n if (includeScale) {\n return getBoundsOfScaledRectangle(box);\n }\n\n return box;\n}\n\nexport function getPropertyKeysInStates(...states: (IState | undefined)[]): AnimatableProperty[] {\n const keys: AnimatableProperty[] = [];\n states.forEach(state => {\n for (const k in state) {\n const key = k as AnimatableProperty;\n if (state[key] !== undefined && keys.indexOf(key) === -1 && animatableProperties.indexOf(key) > -1) {\n keys.push(key);\n }\n }\n });\n return keys;\n}\n\nexport function statePropertyFormulaToValue(value: number | string | undefined): number {\n if (typeof value === 'string') {\n return 0;\n }\n else {\n return value || 0;\n }\n}\n\nexport function isAdditiveProperty(property: string): boolean {\n return AdditiveProperties.indexOf(property) > -1;\n}\n\nexport function getAdditiveStateProperties(state: IState): IState | undefined {\n const additive: IState = {};\n\n for (const key in state) {\n if (isAdditiveProperty(key)) {\n additive[key] = state[key];\n }\n }\n return !isEmptyState(additive) ? additive : undefined;\n}\n\nexport function getNonAdditiveStateProperties(state: IState): IState | undefined {\n const nonAdditive: IState = {};\n\n for (const key in state) {\n if (!isAdditiveProperty(key)) {\n nonAdditive[key] = state[key];\n }\n }\n return Object.keys(nonAdditive).length ? nonAdditive : undefined;\n}\n\nexport interface ITimeState {\n /**\n * How much from 0-1 this states is active.\n * Note that when elastic easings are in use this number may be a bit over 1.\n */\n rate: number;\n\n /**\n *\n */\n state: IState;\n}\n","import { isUrl } from '@ad/utils/url';\nimport { IBorder, IFeed, IFontStyle, IImageAsset, IPadding, ISerializedVersionProperty, IShadow, ITextShadow, IVersionProperty, OneOfElementPropertyKeys, propertyToUnitMap, PropertyValue, WidgetPropertyKeys, widgetPropertyToUnitMap } from '@studio/domain';\nimport { Color } from '../color';\nimport { parseColor } from '../color.utils';\nimport { deserializeVersionedText, serializeInlineStyledText, serializeVersionedText } from './text-serializer';\n\n/**\n * Clone value by serializing and deserializing. Compared to a deep clone this will also work with color properties\n * @param propertyName\n * @param value\n */\nexport function clonePropertyValue(propertyName: string, value: any): PropertyValue | undefined {\n return deserializePropertyValue(propertyName, serializePropertyValue(propertyName, value));\n}\n\nexport function deserializePropertyValue(propertyName: OneOfElementPropertyKeys | WidgetPropertyKeys | string, value: any, isKeyFrame: boolean = false): PropertyValue | undefined {\n\n const unit = propertyToUnitMap[propertyName] || widgetPropertyToUnitMap[propertyName];\n\n if (value === null) {\n value = undefined;\n }\n\n // Should maybe not affect all types?\n if (typeof value === 'string' && isKeyFrame) {\n return value;\n }\n switch (unit) {\n case 'angle':\n return parseFloat(value!) * Math.PI / 180;\n case 'integer':\n return parseInt(value, 10);\n case 'number':\n case 'px':\n return parseFloat(value!);\n case 'boolean':\n return typeof value === 'string'\n ? value.toLowerCase() === 'true'\n : value;\n case 'FontStyle':\n if (value === undefined) {\n return undefined;\n }\n const fontStyle = value.split(' ') as IFontStyle;\n let src = fontStyle[3];\n try {\n\n // Support old font url that where encoded with base64 without data prefix.\n //\n // Note: that exported HTML creatives can have base64 encoded fonts which begins with data prefix.\n if (!src.startsWith('data') && !isUrl(src)) {\n if (typeof window !== 'undefined') {\n src = atob(src);\n }\n else {\n src = Buffer.from(src, 'base64').toString();\n }\n }\n }\n // eslint-disable-next-line no-empty\n catch { }\n\n return {\n id: fontStyle[0],\n weight: parseInt(fontStyle[1], 10),\n style: fontStyle[2],\n src,\n fontFamilyId: fontStyle[4],\n };\n case 'ImageAsset':\n const imageAsset = value.split(' ');\n return {\n id: imageAsset[0],\n url: imageAsset[1],\n width: parseInt(imageAsset[2], 10),\n height: parseInt(imageAsset[3], 10)\n };\n case 'Padding':\n const padding = value!.split(' ') || [];\n return {\n top: padding[0] ? parseFloat(padding[0]) : 0,\n right: padding[1] ? parseFloat(padding[1]) : 0,\n bottom: padding[2] ? parseFloat(padding[2]) : 0,\n left: padding[3] ? parseFloat(padding[3]) : 0,\n } as IPadding;\n case 'Border':\n const border = value!.split(' ');\n return border.length > 1 ? {\n thickness: parseInt(border[0], 10),\n style: border[1],\n color: border[2]\n } as IBorder : undefined;\n case 'Radius':\n return JSON.parse(value);\n case 'Shadow[]':\n const shadows = value ? value!.split(/,(?![^\\(]*\\))/) : undefined;\n return shadows ? shadows.map(s => {\n const shadow = s.split(' ');\n return {\n offsetX: parseInt(shadow[0], 10),\n offsetY: parseInt(shadow[1], 10),\n blur: parseInt(shadow[2], 10),\n spread: parseInt(shadow[3], 10),\n color: parseColor(shadow[4])\n } as IShadow;\n }) : undefined;\n case 'TextShadow[]':\n if (Array.isArray(value)) {\n return value;\n }\n const textShadows = value ? value!.split(/,(?![^\\(]*\\))/) : undefined;\n return textShadows ? textShadows.map(s => {\n const shadow = s.split(' ');\n return {\n offsetX: parseInt(shadow[0], 10),\n offsetY: parseInt(shadow[1], 10),\n blur: parseInt(shadow[2], 10),\n color: parseColor(shadow[3])\n } as ITextShadow;\n }) : undefined;\n case 'Color':\n return parseColor(value);\n case 'Feed':\n case 'variable':\n if (typeof value !== 'string') {\n return value as IFeed;\n }\n try {\n const feed = JSON.parse(value);\n if (!('path' in feed)) {\n // Continue to old deserialization\n throw new Error();\n }\n\n return feed;\n }\n catch (_) {\n const feed = value.split(' ');\n return {\n id: feed[0],\n path: feed[1] ?? '',\n step: {\n start: parseInt(feed[2] ?? 1, 10),\n size: parseInt(feed[3] ?? 1, 10),\n occurrence: feed[4] ?? 'loop'\n },\n fallback: feed[5] ?? ''\n } as IFeed;\n }\n case 'string[]':\n case 'CustomProperty[]':\n let decodedValue;\n if (typeof window !== 'undefined') {\n decodedValue = JSON.parse(atob(value));\n }\n else {\n decodedValue = Buffer.from(value, 'base64').toString();\n }\n return decodedValue;\n case 'FilterMap':\n case 'ImageSettings':\n case 'Transition':\n case 'State[]':\n case 'Animation[]':\n case 'VideoAsset':\n case 'VideoSettings':\n case 'Action[]':\n if (typeof Array.isArray(value)) {\n return value.length\n ? JSON.parse(value)\n : value;\n }\n return JSON.parse(value);\n case 'text': {\n\n // Elements doesn't have \"content\" and value will instead be fetched from Version.properties\n if (value === undefined) {\n return undefined;\n }\n return typeof value === 'string' ? deserializeVersionedText(value) : value;\n }\n default:\n return value;\n }\n}\n\n/**\n * Serialize propertyValue to a string\n * @param propertyName\n * @param value\n */\nexport function serializePropertyValue(propertyName: string, value: any): string | undefined {\n let unit = propertyToUnitMap[propertyName] || widgetPropertyToUnitMap[propertyName];\n\n if (propertyName === 'id' ||\n propertyName === 'kind' ||\n propertyName === 'feededImageReference'\n ) {\n unit = 'string';\n }\n\n switch (unit) {\n case 'angle':\n return `${Math.round(value * 180 / Math.PI)}`;\n case 'number':\n return `${value}`;\n case 'integer':\n return value;\n case 'string':\n case 'enum':\n return value;\n case 'boolean':\n return value.toString();\n case 'FontStyle':\n const fontStyle = value as IFontStyle;\n const src = fontStyle.src;\n return `${fontStyle.id} ${fontStyle.weight} ${fontStyle.style} ${src} ${fontStyle.fontFamilyId}`;\n case 'ImageAsset':\n const imageAsset = value as IImageAsset;\n return `${imageAsset.id} ${imageAsset.url} ${imageAsset.width} ${imageAsset.height}`;\n case 'Border':\n const border = value as IBorder;\n return border ? `${border.thickness} ${border.style} ${border.color}` : '';\n case 'Padding':\n const padding = value as IPadding;\n return `${padding.top} ${padding.right || ''} ${padding.bottom || ''} ${padding.left || ''}`;\n case 'Shadow[]':\n const shadows = value as IShadow[];\n return shadows ? shadows.map(s => `${s.offsetX} ${s.offsetY} ${s.blur} ${s.spread} ${s.color}`).join(',') : '';\n case 'TextShadow[]':\n return value ? value.map((s) => `${s.offsetX}px ${s.offsetY}px ${s.blur}px ${s.color}`).join(',') : '';\n case 'Color':\n const color = value as Color;\n if (!color) {\n return '';\n } else {\n return color.toString();\n }\n case 'inline-styled-text':\n return serializeInlineStyledText(value);\n case 'text':\n return serializeVersionedText(value);\n case 'variable':\n case 'Feed':\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return value;\n case 'string[]':\n case 'CustomProperty[]':\n let encodedValue;\n if (typeof window !== 'undefined') {\n encodedValue = btoa(JSON.stringify(value));\n }\n else {\n encodedValue = Buffer.from(value).toString('base64');\n }\n return encodedValue;\n case 'Transition':\n case 'FilterMap':\n case 'State[]':\n case 'Animation[]':\n case 'Action[]':\n case 'ImageSettings':\n case 'VideoSettings':\n case 'VideoAsset':\n case 'Radius':\n return JSON.stringify(value);\n default:\n return value;\n }\n}\n\nexport function deserializeVersionProperties(epv: Array = []): IVersionProperty[] {\n const properties = epv.map(p => {\n const prop: any = {\n id: p.id as string,\n name: p.name as string,\n value: deserializePropertyValue(p.name, p.value)\n };\n return prop;\n });\n return properties;\n}\n\nexport function serializeVersionProperties(versionProperties: IVersionProperty[] = []): ISerializedVersionProperty[] {\n return versionProperties.map((property) => serializeVersionProperty(property));\n}\n\nexport function serializeVersionProperty(versionProperty: IVersionProperty): ISerializedVersionProperty {\n return {\n id: versionProperty.id,\n name: versionProperty.name,\n value: serializePropertyValue(versionProperty.name, versionProperty.value)\n };\n}\n","import { deserializePropertyValue, serializePropertyValue } from '@creative/serialization/property-value-serializer';\nimport { ICharacterProperties, IColor, IFontStyle, IInlineStyledText, IStyleIdMap, ITextShadow, IVariable, IVersionedText, OneOfCharacterProperty, SpanType } from '@studio/domain';\n\ninterface ISerializedStyleMap {\n documentId: string;\n styleId: string;\n}\n\ninterface ISerializedTextSpan {\n type: SpanType;\n position: number;\n length: number;\n styleIds: ISerializedStyleMap[];\n variable?: IVariable;\n}\n\ninterface ISerializedInlineStyledTextSpan {\n type: SpanType;\n position: number;\n length: number;\n style: string;\n}\n\ninterface ISerializedInlineStyledText {\n text: string;\n styles: ISerializedInlineStyledTextSpan[];\n}\n\ninterface ISerializedVersionedText {\n text: string;\n styles: ISerializedTextSpan[];\n}\n\n\nexport function deserializeVersionedText(text: string): IVersionedText {\n let versionedText: ISerializedVersionedText;\n\n // Try to serialize\n try {\n versionedText = JSON.parse(text) as ISerializedVersionedText;\n } catch (e) {\n const msg = `Could not deserialize text: '${text}'`;\n\n // JSON is provided but could not parse anyway\n if (text !== undefined && text.charAt(0) === '{' || text.charAt(0) === '<') {\n throw new Error(msg);\n } else if (process.env.STUDIO_JS) {\n if (typeof (self as any).TrackerService !== 'undefined') {\n (self as any).TrackerService.captureError(msg);\n }\n }\n versionedText = { text: text, styles: [] };\n }\n const remappedSpans = versionedText.styles.map((span) => {\n const styleIdMap: IStyleIdMap = {};\n for (const style of span.styleIds) {\n styleIdMap[style.documentId] = style.styleId;\n }\n return {\n ...span,\n styleIds: styleIdMap\n };\n });\n return {\n text: versionedText.text,\n styles: remappedSpans\n };\n}\n\nexport function serializeStyle(style: Partial): string {\n const styleText: string[] = [];\n for (const property in style) {\n if (property === '__fontFamilyId') {\n continue;\n }\n const value = style[property];\n if (value !== undefined) {\n styleText.push(`${property}:${serializePropertyValue(property === 'variable' ? 'feed' : property, value)}`);\n }\n }\n return styleText.sort().join(';');\n}\n\nexport function deserializeStyle(text: string): Partial {\n const properties: [string, string][] = text.split(';').filter(p => p.includes(':')).map(p => {\n // Handle links which includes 'http://'.\n const propertyLastIndex = p.indexOf(':');\n return [p.substring(0, propertyLastIndex), p.substring(propertyLastIndex + 1)];\n }) as [string, string][];\n const style: Partial = {};\n for (const property of properties) {\n style[property[0]] = deserializePropertyValue(property[0] === 'variable' ? 'feed' : property[0], property[1]);\n }\n return style;\n}\n\nexport function deserializeElementStyle(element: HTMLElement): Partial {\n const propertiesToUse = element.dataset.studioValues ? element.dataset.studioValues.split(' ') : [];\n\n const style: Partial = {};\n for (const property of propertiesToUse) {\n switch (property as OneOfCharacterProperty) {\n case 'font':\n const font = deserializePropertyValue('font', element.dataset.font) as IFontStyle;\n style.font = font;\n break;\n case 'textColor':\n style.textColor = deserializePropertyValue('color', element.style.color) as IColor;\n break;\n case 'fontSize':\n style.fontSize = deserializePropertyValue('number', element.style.fontSize) as number;\n break;\n case 'strikethrough':\n case 'underline':\n if (element.style.textDecoration!.indexOf('line-through') > -1) {\n style.strikethrough = true;\n }\n if (element.style.textDecoration!.indexOf('underline') > -1) {\n style.underline = true;\n }\n break;\n case 'uppercase':\n style.uppercase = element.style.textTransform!.indexOf('uppercase') > -1;\n break;\n case 'characterSpacing':\n style.characterSpacing = deserializePropertyValue('number', element.style.letterSpacing) as number;\n break;\n case 'lineHeight':\n style.lineHeight = deserializePropertyValue('number', element.style.lineHeight) as number;\n break;\n case 'textShadows':\n style.textShadows = deserializePropertyValue('textShadows', element.style.textShadow) as ITextShadow[];\n break;\n case 'variable':\n style.variable = deserializePropertyValue('feed', element.dataset.variable) as IVariable;\n }\n }\n return style;\n}\n\nexport function serializeInlineStyledText(text: IInlineStyledText): string {\n const spans: ISerializedInlineStyledTextSpan[] = [];\n for (const span of text.styles) {\n if (span.type === SpanType.End) {\n break;\n }\n spans.push({\n type: span.type,\n length: span.length,\n position: span.position,\n style: serializeStyle(span.style)\n });\n }\n return JSON.stringify({ text: text.text, styles: spans } as ISerializedInlineStyledText);\n}\n\nexport function serializeVersionedText(text: IVersionedText): string {\n const spans: ISerializedTextSpan[] = [];\n for (const span of text.styles) {\n if (span.type === SpanType.End) {\n break;\n }\n if (span.type === SpanType.Composition) {\n continue;\n }\n const styleIds: ISerializedStyleMap[] = [];\n for (const [documentId, styleId] of Object.entries(span.styleIds)) {\n styleIds.push({ documentId, styleId });\n }\n\n spans.push({\n type: span.type,\n length: span.length,\n position: span.position,\n styleIds: styleIds.sort((a, b) => {\n if (a.documentId > b.documentId) {\n return 1;\n } else if (a.documentId < b.documentId) {\n return -1;\n } else if (a.styleId > b.styleId) {\n return 1;\n } else if (a.styleId < b.styleId) {\n return -1;\n }\n throw new Error('StyleId is not unique');\n }),\n variable: span.variable\n });\n }\n return JSON.stringify({ text: text.text, styles: spans });\n}\n\nexport function deserializeInlineStyledText(text: string): IInlineStyledText {\n const inlineStyledText = JSON.parse(text) as ISerializedInlineStyledText;\n const remappedSpans = inlineStyledText.styles.map((span) => ({\n ...span,\n style: deserializeStyle(span.style)\n }));\n return {\n text: inlineStyledText.text,\n styles: remappedSpans\n };\n}\n","import { clamp } from '../utils/utils';\nimport { IAnimation, IAnimationKeyframe, ITime } from '../domain/animation';\nimport { ITimingFunction, TimingFunctionKey, TimingFunctionFn, TimingFunctionKeyMacro } from '../domain/timing-functions';\nimport { getTimeBetween, isTimeAt } from './animation.utils';\n\nexport const DEFAULT_TIMING_FUNCTION: TimingFunctionKey = 'easeInOutCubic';\n\nexport function getTimingFunctionValueBetween(time: number, before: ITime, after: ITime, timingFunction: TimingFunctionFn): number {\n\n const duration = getTimeBetween(before, after);\n const startTime = before.time + (before.duration || 0);\n\n // No time between before after\n if (!duration) {\n return isTimeAt(time, before) ? 1 : 0;\n }\n\n // Progress of animation between two times/keyframes (between 0 and 1)\n const progress = clamp((time - startTime) / duration, 0, 1);\n\n // Apply timing function on that value\n return timingFunction(progress);\n}\n\nexport function getTimingFunctionFromKeyframe(animation: IAnimation, keyframe: IAnimationKeyframe): TimingFunctionFn {\n let key = keyframe.timingFunction;\n if (key === '@timingFunction') {\n key = animation.timingFunction;\n }\n return getTimingFunctionByKey(key);\n}\n\nexport function getTimingFunctionByKey(key: TimingFunctionKey = 'linear'): TimingFunctionFn {\n return timingFunctions[key].func;\n}\n\n/**\n * easeOutBack should become easeInBack and vice versa. easeInOut should stay the same\n * @param timing\n */\nexport function getOppositeTimingFunctionKey(timing: TimingFunctionKey | TimingFunctionKeyMacro): TimingFunctionKey {\n\n if (timing.indexOf('InOut') === -1 && timing.indexOf('@') === -1) {\n let reverse: string | undefined;\n if (timing.indexOf('In') > -1) {\n reverse = timing.replace(/In/g, 'Out');\n }\n else if (timing.indexOf('Out') > -1) {\n reverse = timing.replace(/Out/g, 'In');\n }\n\n if (reverse !== undefined && timingFunctions[reverse]) {\n return reverse as TimingFunctionKey;\n }\n }\n\n return timing as TimingFunctionKey;\n}\n\nexport const timingFunctions: {[key in TimingFunctionKey]: ITimingFunction} = {\n linear: {\n name: 'Linear',\n type: 'none',\n func: (t: number) => t\n },\n easeInExpo: {\n name: 'InExpo',\n type: 'in',\n func: (t: number) => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1))\n },\n easeOutExpo: {\n name: 'OutExpo',\n type: 'in',\n func: (t: number) => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1\n },\n easeInOutExpo: {\n name: 'InOutExpo',\n type: 'inout',\n func: (t: number) => {\n if (t === 0) {\n return 0;\n }\n if (t === 1) {\n return 1;\n }\n if ((t /= 0.5) < 1) {\n return 0.5 * Math.pow(2, 10 * (t - 1));\n }\n return 0.5 * (-Math.pow(2, -10 * --t) + 2);\n }\n },\n easeInQuad: {\n name: 'InQuad',\n type: 'in',\n func: (t: number) => t * t\n },\n easeOutQuad: {\n name: 'OutQuad',\n type: 'out',\n func: (t: number) => t * (2 - t)\n },\n easeInOutQuad: {\n name: 'InOutQuad',\n type: 'inout',\n func: (t: number) => t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t\n },\n easeInCubic: {\n name: 'InCubic',\n type: 'in',\n func: (t: number) => t * t * t\n },\n easeOutCubic: {\n name: 'OutCubic',\n type: 'out',\n func: (t: number) => (--t) * t * t + 1\n },\n easeInOutCubic: {\n name: 'InOutCubic',\n type: 'inout',\n func: (t: number) => t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1\n },\n easeInQuart: {\n name: 'InQuart',\n type: 'in',\n func: (t: number) => t * t * t * t\n },\n easeOutQuart: {\n name: 'OutQuart',\n type: 'out',\n func: (t: number) => 1 - (--t) * t * t * t\n },\n easeInOutQuart: {\n name: 'InOutQuart',\n type: 'inout',\n func: (t: number) => t < 0.5 ? 8 * t * t * t * t : 1 - 8 * (--t) * t * t * t\n },\n easeInQuint: {\n name: 'InQuint',\n type: 'in',\n func: (t: number) => t * t * t * t * t\n },\n easeOutQuint: {\n name: 'OutQuint',\n type: 'out',\n func: (t: number) => 1 + (--t) * t * t * t * t\n },\n easeInOutQuint: {\n name: 'InOutQuint',\n type: 'inout',\n func: (t: number) => t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * (--t) * t * t * t * t\n },\n easeInElastic: {\n name: 'InElastic',\n type: 'in',\n func: (t: number) => {\n if (t === 1) {\n return 1;\n }\n return .04 * t / (--t) * Math.sin(25 * t);\n }\n },\n easeOutElastic: {\n name: 'OutElastic',\n type: 'out',\n func: (t: number) => {\n if (t === 0) {\n return 0;\n }\n return (.04 - .04 / t) * Math.sin(25 * t) + 1;\n }\n },\n easeInOutElastic: {\n name: 'InOutElastic',\n type: 'inout',\n func: (t: number) => {\n if (t === 0.5) {\n return 0.5;\n }\n return (t -= .5) < 0 ? (.02 + .01 / t) * Math.sin(50 * t) : (.02 - .01 / t) * Math.sin(50 * t) + 1;\n }\n },\n easeInBack: {\n name: 'InBack',\n type: 'in',\n func: (t: number) => { let overshoot = 1; if (!overshoot && overshoot !== 0) { overshoot = 1.70158; } return 1 * t * t * ( (overshoot + 1) * t - overshoot ); }\n },\n easeOutBack: {\n name: 'OutBack',\n type: 'out',\n func: (t: number) => { let overshoot = 1; if (!overshoot && overshoot !== 0) { overshoot = 1.70158; } t = t - 1; return t * t * ((overshoot + 1) * t + overshoot) + 1; }\n },\n easeInOutBack: {\n name: 'InOutBack',\n type: 'inout',\n func: (t: number) => { let overshoot = 1; if (overshoot === undefined) { overshoot = 1.70158; } if ((t /= .5) < 1) { return .5 * (t * t * (((overshoot *= (1.525)) + 1) * t - overshoot)); } return .5 * ((t -= 2) * t * (((overshoot *= (1.525)) + 1) * t + overshoot) + 2); }\n },\n easeInBounce: {\n name: 'InBounce',\n type: 'in',\n func: (t: number) => 1 - bounce(1 - t)\n },\n easeOutBounce: {\n name: 'OutBounce',\n type: 'out',\n func: (t: number) => bounce(t)\n },\n easeInOutBounce: {\n name: 'InOutBounce',\n type: 'inout',\n func: (t: number) => { if (t < 0.5) { return bounce(t * 2) * 0.5; } return bounce(t * 2 - 1) * 0.5 + 1 * 0.5; }\n }\n};\n\n\nfunction bounce(t: number): number {\n if (t < 0.36363636363636365) {\n return 7.5625 * t * t;\n } else if (t < 0.7272727272727273) {\n t = t - 0.5454545454545454;\n return 7.5625 * t * t + 0.75;\n } else if (t < 0.9090909090909091) {\n t = t - 0.8181818181818182;\n return 7.5625 * t * t + 0.9375;\n } else {\n t = t - 0.9545454545454546;\n return 7.5625 * t * t + 0.984375;\n }\n}\n","import { TimingFunctionKey } from './timing-functions';\n\nexport interface IAction {\n id: string;\n triggers: ActionTrigger[];\n operations: IActionOperation[];\n conditions: IActionCondition[];\n disabled: boolean;\n preventClickThrough?: boolean;\n templateId?: ReservedActionId;\n}\n\nexport interface IActionCondition {\n operator: ActionConditionOperator;\n property: ActionConditionProperty;\n value: number;\n}\n\nexport interface IActionOperation {\n /**\n * SET_STATE and REMOVE_STATE always require a state id as value.\n *\n * If set to CLEAR_STATES, then operation value is `undefined`\n */\n method: ActionOperationMethod;\n /**\n * State ID, url (`string`) or `undefined`\n *\n * Setting the state to `undefined` removes all applied States (`CLEAR_STATES`)\n * */\n value: ActionOperationValue;\n delay?: number;\n /** DataElement ID or undefined. Should always be available if value is a state ID */\n target?: string;\n animation?: {\n timingFunction: TimingFunctionKey;\n duration: number;\n };\n}\n\nexport type ActionConditionOperator =\n | '<'\n | '<='\n | '='\n | '>'\n | '>=';\n\nexport type ActionConditionProperty =\n | 'creative.width'\n | 'ceative.height';\n\nexport type ActionOperationValue = string | undefined;\n\nexport enum ActionOperationMethod {\n SetState = 'SET_STATE',\n RemoveState = 'REMOVE_STATE',\n ClearStates = 'CLEAR_STATES',\n OpenUrl = 'OPEN_URL'\n}\n\nexport enum ActionTrigger {\n Click = 'click',\n MouseDown = 'mousedown',\n MouseUp = 'mouseup',\n MouseEnter = 'mouseenter',\n MouseLeave = 'mouseleave',\n TouchStart = 'touchstart',\n TouchEnd = 'touchend',\n // TouchMove = 'touchmove',\n TouchCancel = 'touchcancel',\n}\n\nexport type ReservedActionId =\n | 'reserved-pressed'\n | 'reserved-hover';\n\nexport interface IActionListener {\n trigger: ActionTrigger;\n event: (event: MouseOrTouchEvent, forceClearStates?: boolean) => void;\n action: IAction;\n}\n\nexport type MouseOrTouchEvent = MouseEvent | TouchEvent;\n","import { IState } from './state';\nimport { TimingFunctionKey, TimingFunctionKeyMacro } from './timing-functions';\n\nexport interface ITime {\n time: number;\n duration?: number;\n}\n\nexport interface ITimeAndDuration extends ITime {\n duration: number;\n}\n\nexport enum AnimationTypes {\n in,\n out,\n repeating,\n action,\n keyframe\n}\n\n\n// This is equivalent to:\n// export type AnimationType = 'in' | 'out' | 'repeating' | 'action' | 'keyframe';\nexport type AnimationType = keyof typeof AnimationTypes;\n\nexport interface IAnimation {\n name: string;\n id: string;\n templateId?: string;\n type?: AnimationType;\n keyframes: IAnimationKeyframe[];\n timingFunction: TimingFunctionKey;\n hidden: boolean;\n /**\n * Inherited from old transition. TODO: Should we use the same\n */\n settings?: IAnimationSettings;\n\n}\n\nexport interface IAnimationTemplate {\n id: string;\n name: string;\n type: AnimationType;\n keyframes: IAnimationTemplateKeyframe[];\n timingFunction: TimingFunctionKey;\n settings?: IAnimationSettings;\n}\n\nexport interface IAnimationTemplateKeyframe extends ITime {\n id?: string;\n\n /**\n * How much of the state should be visible.\n * Defaults to 1 if not set which means that the full state should be visible\n */\n value?: number;\n\n /**\n * Template of a a state. Undefined means that this refers to main state.\n * If color etc is needed, turn this to a ISerializedState\n */\n state?: IState;\n\n /**\n * Function returning value between 0-1 (some like Elastic will be over 1).\n * The value decides how much of the keyframe that should be visible.\n * \"@timingFunction\" means that it should inherit the value from the animation\n */\n timingFunction?: TimingFunctionKeyMacro | TimingFunctionKey;\n}\n\nexport interface IAnimationKeyframe extends ITimeAndDuration {\n id: string;\n\n /**\n * Time of the keyframe. Note that this is relative to the time of the element.\n */\n time: number;\n\n /**\n * How much of the state should be visible.\n * Defaults to 1 if not set which means that the full state should be visible\n */\n value?: number;\n\n /**\n * Reference to a state. Undefined means that this refers to main state.\n */\n stateId?: string;\n\n /**\n * Function returning value between 0-1 (some like Elastic will be over 1).\n * The value decides how much of the keyframe that should be visible.\n * \"@timingFunction\" means that it should inherit the value from the animation\n */\n timingFunction?: TimingFunctionKeyMacro | TimingFunctionKey;\n}\n\nexport const keyframeProperties: (keyof IAnimationKeyframe)[] = [\n 'time',\n 'value',\n 'timingFunction',\n 'id',\n 'stateId',\n 'duration'\n];\n\nexport type IAnimationSettings = {\n direction?: IAnimationSetting;\n distance?: IAnimationSetting;\n};\n\nexport interface IAnimationSetting {\n name?: string;\n value?: number | string;\n}\n","import { IPosition } from './dimension';\n\nexport enum ColorType {\n Solid = 'solid',\n LinearGradient = 'linear-gradient'\n}\n\nexport interface IColor {\n\n /**\n * Value between 0 and 255\n */\n red: number;\n\n /**\n * Value between 0 and 255\n */\n green: number;\n\n /**\n * Value between 0 and 255\n */\n blue: number;\n hue: number;\n saturation: number;\n lightness: number;\n\n /**\n * Value between 0 and 100\n */\n alpha: number;\n\n type: ColorType;\n\n stops: IColorStop[];\n\n angle: number;\n\n start: IColorStop;\n\n end: IColorStop;\n\n copy: () => IColor;\n\n toJSON: () => string;\n\n toString: () => string;\n\n addColorStop: (color: IColor, offset: number, position?: IPosition) => void;\n\n setColor: (color: IColor) => IColor;\n\n}\n\nexport interface IColorStop {\n\n /**\n * Color of stop\n */\n color: IColor;\n\n /**\n * Percentage (100 = end of element)\n */\n offset: number;\n\n /**\n * Position of point relative to the element ({ x: 0.5, y: 0.5 } = center).\n * Only applies to start and en position.\n */\n position?: IPosition;\n}\n","import { ITime } from './animation';\n\nexport enum ApprovalStatus {\n None = '',\n NoStatus = 'No status',\n NotApproved = 'Not approved',\n InProgress = 'In progress',\n ForReview = 'For review',\n Approved = 'Approved',\n}\n\nexport enum CreativeType {\n Animated\n}\n\nexport interface IPreloadImage {\n frames: number[];\n format: 'jpg' | 'gif' | 'png';\n quality: number;\n}\n\nexport interface IGifExport {\n frames: ITime[];\n show: boolean;\n}\n","\nexport interface IImageAsset {\n id: string;\n url: string;\n __loading?: boolean;\n width?: number;\n height?: number;\n}\n\nexport interface IImageSettings {\n\n /**\n * How the image should be rendered in size.\n * Similar to the CSS \"background-size\" property\n */\n sizeMode: ImageSizeMode;\n\n /**\n * A decimal value of the image position when \"cropping\" or \"containing\" the image.\n * Ranges from 0 to 1. Simliar to the CSS background-position property.\n * 0 = left, 0.5 = center, 1 = right\n */\n x: number;\n\n /**\n * A decimal value of the image position when \"cropping\" or \"containing\" the image.\n * Ranges from 0 to 1. Simliar to the CSS background-position property.\n * 0 = top, 0.5 = left, 1 = bottom\n */\n y: number;\n\n /**\n * Quality on image from 0 to 100. Undefined means that no optimization should be done\n */\n quality?: number;\n\n /**\n * Enable retina resolution for devices supporting it.\n * Defaults to false if not provided\n */\n highDpi?: boolean;\n\n}\n\nexport const imageSettingsPropertyToUnitMap = {\n 'sizeMode': 'enum',\n 'x': 'number',\n 'y': 'number',\n 'quality': 'number',\n 'highDpi': 'boolean'\n};\n\nexport const imageSettingsProperties = Object.keys(imageSettingsPropertyToUnitMap);\nexport type ImageSettingsKeys = keyof typeof imageSettingsPropertyToUnitMap;\n\nexport enum ImageSizeMode {\n Fit = 'fit',\n Stretch = 'stretch',\n Crop = 'crop'\n}\n\n/**\n * Deprecated, use ImageSizeMode\n */\nexport type ImageFitOption = 'contain' | 'distort' | 'cover';\n\n\nexport const DEFAULT_IMAGE_QUALITY = 85;\n\nexport const DEFAULT_IMAGE_SETTINGS: Readonly = {\n x: 0.5,\n y: 0.5,\n quality: DEFAULT_IMAGE_QUALITY,\n sizeMode: ImageSizeMode.Fit,\n highDpi: false\n};\n","import { RichText } from '@creative/elements/rich-text/rich-text';\nimport { IVideoAsset, IVideoSettings } from '@creative/elements/video/video';\nimport { IVideoRenderer } from '@creative/elements/video/video-renderer.header';\nimport { CreativeDataNode } from '@creative/nodes/base-data-node';\nimport { ElementSelection } from '@creative/nodes/selection';\nimport { SVGBackground } from '@creative/svg-background';\nimport { IAction, IActionListener } from './action';\nimport { IAnimation } from './animation';\nimport { IColor } from './color';\nimport { IGifExport, IPreloadImage } from './creative';\nimport { IBounds, IPosition, ISize } from './dimension';\nimport { IFeed } from './feed';\nimport { IFontStyle } from './font';\nimport { IImageAsset, IImageSettings } from './image';\nimport { ICreativeSocialGuide } from './social';\nimport { IState } from './state';\nimport { AppearenceStyles, IBorder, IFilter, IFilterMap, IPadding, IRadius, IShadow, ITextShadow } from './style';\nimport { HorizontalAlignment, ICharacterProperties, IText, ITextElementProperties, TextOverflow, VerticalAlignment } from './text';\nimport { IWidgetElementDataNode, IWidgetViewElement } from './widget';\nimport { IGuideline } from './workspace';\n\nexport interface INodeId {\n id: string;\n cidIndex?: number;\n parentId?: string;\n}\n\nexport interface IId {\n id: string;\n}\n\nexport interface IBaseDataNode extends INodeId {\n name: string;\n locked: boolean;\n hidden: boolean;\n __rootNode?: CreativeDataNode;\n __parentNode?: IGroupElementDataNode;\n}\n\ninterface IBaseViewNode extends INodeId {\n /**\n * The DOM-element of the element\n */\n __rootElement?: HTMLDivElement;\n __data: Extract;\n}\n\nexport interface INewBaseNode extends IBounds {\n parentId?: string;\n}\n\nexport interface ICreativeDataNode extends IRootDataNode, INodeWithChildren {\n id: string;\n kind: NodeKind.Creative;\n fill?: IColor;\n border?: IBorder;\n width: number;\n height: number;\n guidelines?: IGuideline[];\n startTime?: number;\n stopTime?: number;\n loops: number;\n preloadImage?: IPreloadImage;\n gifExport?: IGifExport;\n socialGuide?: ICreativeSocialGuide;\n}\n\nexport interface ISVGBackground {\n render_m: (element: ISVGBackgroundNode, overrides?: AppearenceStyles) => Promise | undefined;\n}\n\nexport interface IGroupViewElement extends NodeWithKind, IBaseViewNode, IChildren { }\n\nexport interface IRootDataNode extends INodeWithChildren { }\n\nexport interface IChildren {\n nodes: OneOfViewNodes[];\n}\n\nexport interface IDataNodeChildren {\n nodes: OneOfDataNodes[];\n}\n\nexport enum NodeName {\n Rectangle = 'Rectangle',\n Ellipse = 'Ellipse',\n Text = 'Text',\n Button = 'Button',\n Image = 'Image',\n Widget = 'Widget',\n Video = 'Video',\n Group = 'Group'\n}\n\nexport enum NodeKind {\n Creative = 'creative',\n Rectangle = 'rectangle',\n Text = 'text',\n Image = 'image',\n Video = 'video',\n Group = 'group',\n Selection = 'selection',\n AnyElement = 'any',\n Ellipse = 'ellipse',\n Button = 'button',\n Widget = 'widget',\n /** Only set when bfl-widget is in bl. Only applied to `element.type` */\n BannerflowLibraryWidget = 'bannerflowLibraryWidget',\n /** Only set when bfl-widget is on canvas. Only applied to `element.type`, never on `node.kind` */\n BannerflowLibraryWidgetInstance = 'bannerflowLibraryWidgetInstance',\n}\n\nexport enum NodeKindIcon {\n Creative = 'creative',\n Rectangle = 'shape-rectangle',\n Text = 'text',\n Video = 'video',\n Image = 'image',\n Group = 'group',\n Selection = 'selection',\n AnyElement = 'any',\n Ellipse = 'shape-oval',\n Button = 'button',\n Widget = 'widget',\n BannerflowLibraryWidget = 'widget',\n BannerflowLibraryWidgetInstance = 'widget'\n}\n\nexport type OneOfViewNodes =\n IEllipseViewElement |\n IRectangleViewElement |\n IButtonViewElement |\n ITextViewElement |\n IImageViewElement |\n IWidgetViewElement |\n IVideoViewElement |\n IAnyViewElement;\n\nexport type OneOfSelectableElements =\n OneOfElementDataNodes |\n ElementSelection;\n\nexport type OneOfSelectableNodes =\n OneOfDataNodes |\n ElementSelection;\n\n// Is this union type needed?\nexport type OneOfGroupViewNodes =\n IGroupViewElement |\n ICreativeViewNode;\n\nexport type OneOfGroupDataNodes =\n IGroupElementDataNode |\n IRootDataNode;\n\nexport type OneOfTextViewElements =\n IButtonViewElement |\n ITextViewElement;\n\nexport type OneOfTextDataNodes =\n IButtonElementDataNode |\n ITextElementDataNode;\n\nexport interface ICreativeViewNode extends IChildren, ISVGBackgroundNode, ISize {\n}\n\nexport interface NodeWithKind {\n readonly kind: Kind;\n}\n\nexport interface ISVGBackgroundNode extends ISize, NodeWithKind {\n fill?: IColor;\n border?: IBorder;\n shadows?: IShadow[];\n filters?: IFilterMap;\n radius?: IRadius;\n rotationZ?: number;\n __rootElement?: HTMLDivElement;\n __svgBackground?: SVGBackground;\n}\n\n/**\n * The view element. I.E computed state of an element at a certain point in time\n * We should probably not explicitly set a nodekind here as that should be taken care of by the caller\n * it is however easier to do it this way since I can't be bothered to change all the places it exists\n */\nexport interface IElementViewNode extends INodeId, IPosition, ISize, ISVGBackgroundNode, IBaseViewNode {\n name: string;\n ratio?: number;\n originX?: number;\n originY?: number;\n rotationX?: number;\n rotationY?: number;\n rotationZ?: number;\n mirrorX?: boolean;\n mirrorY?: boolean;\n scaleX: number;\n scaleY: number;\n opacity?: number;\n time: number;\n duration: number;\n perspective?: number;\n filter?: IFilter[];\n feed?: IFeed;\n elementCid?: string;\n\n /**\n * Safari overlaps elements if they do not have their own stacking context.\n * Only way to create this seems to be to create a parent div with transform: 'translate(0)'.\n */\n __safari3dElement?: HTMLDivElement;\n\n /**\n * The DOM-element of the element\n */\n __rootElement?: HTMLDivElement;\n __actionListeners?: IActionListener[];\n}\n\nexport type OneOfElementDataNodes =\n | IRectangleElementDataNode\n | IEllipseElementDataNode\n | ITextElementDataNode\n | IButtonElementDataNode\n | IImageElementDataNode\n | IWidgetElementDataNode\n | IVideoElementDataNode;\n\nexport type OneOfDataNodes =\n | OneOfElementDataNodes\n | IGroupElementDataNode;\n\nexport type NodeKindWithChildren = NodeKind.Creative | NodeKind.Group;\n\nexport interface INodeWithChildren extends NodeWithKind, IDataNodeChildren, INodeId {\n get elements(): OneOfElementDataNodes[];\n setNodes_m(nodes: OneOfDataNodes[]): void;\n addNode_m(node: OneOfDataNodes, atIndex?: number): void;\n removeNodeById_m(nodeId: string): void;\n findNodeById_m(nodeId: string, includeGroups?: boolean): OneOfDataNodes | undefined;\n nodeIterator_m(includeGroups?: boolean, group?: INodeWithChildren): IterableIterator;\n}\n\nexport interface IGroupElementDataNode extends IBaseDataNode, INodeWithChildren {\n /** Calculated based on the child nodes of the group */\n get time(): number;\n /** Calculated based on the child nodes of the group */\n get duration(): number;\n /* webpack-strip-block:removed */\n}\n\n\nexport interface ITimelineNode {\n node: OneOfDataNodes;\n isGroup: boolean;\n collapsed: boolean;\n inHiddenNodeTree: boolean;\n}\n\nexport interface IPrimitiveNode\n extends IId, NodeWithKind { }\n\nexport interface IBaseElementDataNode\n extends IBaseDataNode, IPrimitiveNode, IBounds { }\n\n/**\n * Data node. I.E what's actually saved (all states on timeline)\n */\nexport interface IElementDataNode extends IBaseElementDataNode {\n ratio?: number;\n feed?: IFeed;\n time: number;\n duration: number;\n\n // Animatable properties\n radius: IRadius;\n mirrorX: boolean;\n mirrorY: boolean;\n opacity: number;\n originX: number;\n originY: number;\n rotationX: number;\n rotationY: number;\n rotationZ: number;\n scaleX: number;\n scaleY: number;\n\n // Optional properties\n fill?: IColor;\n border?: IBorder;\n shadows?: IShadow[];\n filters?: IFilterMap;\n\n states: IState[];\n actions: IAction[];\n animations: IAnimation[];\n\n __rootNode?: CreativeDataNode;\n}\n\nexport type IInitializationElementNode = { -readonly [P in keyof IElementDataNode]: IElementDataNode[P] };\n\nexport interface ITextDataNode extends IElementDataNode {\n content: IText;\n textColor: IColor;\n textShadows?: ITextShadow[];\n uppercase: boolean;\n underline: boolean;\n strikethrough: boolean;\n horizontalAlignment: HorizontalAlignment;\n verticalAlignment: VerticalAlignment;\n lineHeight: number;\n characterSpacing: number;\n fontSize: number;\n maxRows?: number;\n padding?: IPadding;\n textOverflow?: TextOverflow;\n font?: IFontStyle;\n\n characterStyles: Map>;\n __styleHashMap: Map;\n\n // We have to store the deleted style's ids to refer to them if we happen to create new style\n // with exact same styles.\n __deletedStyleHashMap: Map;\n __fontStyleId?: string;\n __rootElement?: HTMLDivElement;\n __backgroundElement?: SVGSVGElement;\n __centerElement?: HTMLDivElement;\n __textElement?: HTMLDivElement;\n\n // We store the dirty content to enable global undo. Pls. check docs char-styles.md.\n __dirtyContent?: IText;\n}\n\n\nexport interface IRectangleElementDataNode extends IElementDataNode { }\nexport interface IEllipseElementDataNode extends IElementDataNode { }\nexport interface ITextElementDataNode extends ITextDataNode { }\nexport interface IButtonElementDataNode extends ITextDataNode { }\n\nexport interface IImageElementDataNode extends IElementDataNode {\n imageAsset?: IImageAsset;\n feed?: IFeed;\n imageSettings: IImageSettings;\n}\n\nexport interface IVideoElementDataNode extends IElementDataNode {\n videoSettings: IVideoSettings;\n videoAsset?: IVideoAsset;\n feed?: IFeed;\n}\n\nexport type IMediaElementDataNode = IVideoElementDataNode | IImageElementDataNode;\n\nexport interface ITextNode extends ITextElementProperties, ICharacterProperties, IElementViewNode {\n content: IText;\n horizontalAlignment: HorizontalAlignment;\n verticalAlignment: VerticalAlignment;\n maxRows: number;\n padding: IPadding;\n textOverflow: TextOverflow;\n __rootElement?: HTMLDivElement;\n __centerElement?: HTMLDivElement;\n __textElement?: HTMLDivElement;\n // Set to optional, since we're getting many errors in sentry\n // https://bannerflow.sentry.io/issues/3922120810/?project=1496801&referrer=release-issue-stream\n // https://bannerflow.sentry.io/share/issue/4a101d06f27d40678c90675e44911ac8/\n // TODO: check out why is this happening\n __richTextRenderer?: RichText;\n __dirtyContent?: IText;\n}\n\nexport interface ITextViewElement extends ITextNode { }\n\nexport interface IButtonViewElement extends ITextNode { }\n\nexport interface IEllipseViewElement extends IElementViewNode { }\n\nexport interface IRectangleViewElement extends IElementViewNode { }\n\nexport interface IAnyViewElement extends IElementViewNode { }\n\nexport interface IImageViewElement extends IElementViewNode {\n imageUrl?: string;\n\n // Should view element have this property?\n feed?: IFeed;\n}\n\nexport interface IVideoViewElement extends IElementViewNode {\n __videoRenderer: IVideoRenderer;\n}\n","import { IVideoAsset } from '@creative/elements/video/video';\nimport { omit } from '@studio/utils/utils';\nimport { ICollection } from './array';\nimport { IAsset } from './asset';\nimport { IColor } from './color';\nimport { IElementProperty } from './element';\nimport { IFeed } from './feed';\nimport { IFontStyle } from './font';\nimport { IFontFamily, IFontFamilyStyle } from './font-families';\nimport { IImageAsset } from './image';\nimport { ITextElementDataNode } from './index';\nimport { IElementDataNode, IImageElementDataNode, IVideoElementDataNode, NodeKind } from './nodes';\nimport { IBorder, IFilterMap, IPadding, IRadius, IShadow, ITextShadow } from './style';\nimport { IText, ITextElementCharacterProperties, ITextElementProperties } from './text';\nimport { IVersion, IVersionedText, IVersionProperty } from './version';\nimport { IWidgetLibraryAsset } from './widget';\n\nexport interface IProperty {\n id: string;\n name: string;\n value?: OneOfElementPropertyValue;\n label?: string;\n}\n\nexport interface IElementValues {\n versionProperties: IVersionProperty[];\n defaultVersionProperties: IVersionProperty[];\n fontFamilies: IFontFamily[];\n}\n\nexport interface IElementPropertyValues extends IElementValues {\n elementProperties: ICollection;\n newDefaultVersionId?: string;\n}\n\nexport interface IElementPropertyCopyValues {\n versions: IVersion[];\n elementProperties: ICollection;\n defaultVersionProperties: IVersionProperty[];\n newDefaultVersionId?: string;\n images?: ICollection;\n videos?: ICollection;\n fontFamilies: IFontFamily[];\n}\n\nexport type OneOfElementPropertyValue = IFontFamilyStyle\n | IAsset\n | string\n | IVersionedText\n | IText\n | IFeed;\nexport type WidgetPropertyKeys = keyof typeof widgetPropertyToUnitMap;\n// This is the thing\nexport type OneOfElementPropertyKeys = keyof typeof propertyToUnitMap;\nexport type OneOfTextElementPropertyKeys = keyof typeof textPropertyToUnitMap;\nexport type OneOfImageElementPropertyKeys = keyof typeof imagePropertyToUnitMap;\nexport type OneOfViewNodesSharedPropertyKeys = keyof typeof sharedPropertyToUnitMap;\n\nexport interface ICustomProperty extends IElementProperty { }\n\n// This should probably be all type of the properties added together\n// export type PropertyValueTyped = Exclude;\n\nexport type PropertyValue =\n string |\n number |\n boolean |\n IColor |\n IShadow[] |\n ITextShadow[] |\n IFilterMap |\n IBorder |\n IFontStyle |\n IImageAsset |\n IPadding |\n IWidgetLibraryAsset |\n ICustomProperty[] |\n IFeed |\n IRadius |\n IVersionedText;\n\nexport const characterPropertyToUnitMap: Record = {\n 'font': 'FontStyle',\n 'textColor': 'Color',\n 'fontSize': 'number',\n 'lineHeight': 'number',\n 'characterSpacing': 'number',\n 'uppercase': 'boolean',\n 'underline': 'boolean',\n 'strikethrough': 'boolean',\n 'textShadows': 'TextShadow[]',\n 'variable': 'Feed',\n\n // A helper property to display, font family in dropdown, when font style is undefined.\n '__fontFamilyId': 'string'\n};\n\nconst textPropertiesOnlyToUnitMap: Record = {\n 'maxRows': 'integer',\n 'padding': 'Padding',\n 'textOverflow': 'enum',\n 'horizontalAlignment': 'enum',\n 'verticalAlignment': 'enum',\n};\n\nexport const textPropertyToUnitMap = {\n ...characterPropertyToUnitMap,\n ...textPropertiesOnlyToUnitMap\n};\n\nfunction getObjectKeys(object: O): (keyof O)[] {\n return Object.keys(object) as (keyof O)[];\n}\n\n\nexport const textProperties = getObjectKeys(textPropertyToUnitMap);\n\nexport const characterProperties = getObjectKeys(omit(characterPropertyToUnitMap, '__fontFamilyId'));\n\nexport const widgetPropertyToUnitMap = {\n 'js': 'string',\n 'ts': 'string',\n 'html': 'string',\n 'css': 'string',\n 'customProperties': 'CustomProperty[]',\n 'widgetReference': 'string',\n 'bannerflowLibraryWidgetReference': 'string',\n 'select': 'CustomProperty[]',\n 'number': 'number',\n 'image': 'ImageAsset',\n 'boolean': 'boolean',\n 'color': 'Color',\n 'widgetAsset': 'WidgetAsset',\n};\n\n// The keyframe types stuff is a bit weird, is this really how it's supposed to be constructed?\ntype ImagePropertyMap =\n { imageReference: 'string' } &\n Pick<\n IImageElementDataNode,\n 'imageAsset' | 'imageSettings'\n >;\nconst imagePropertyToUnitMap: Record | 'imageReference' = {\n 'imageReference': 'string',\n 'imageAsset': 'ImageAsset',\n 'imageSettings': 'ImageSettings',\n};\n\ntype VideoPropertyMap = Pick;\nconst videoPropertyToUnitMap: Record = {\n 'videoAsset': 'VideoAsset',\n 'videoSettings': 'VideoSettings'\n};\n\n// Seems to have some types from states, why?\ntype SharedPropertyMap = Omit<\n IElementDataNode,\n | 'name'\n | 'imageAsset'\n | '__rootNode'\n | '__parentNode'\n | 'elementCid'\n | 'cidIndex'\n | 'parentId'\n | 'id'\n | 'kind'>\n & { 'fontReference': 'string' }\n & Pick;\n\nexport const sharedPropertyToUnitMap: Record = {\n 'x': 'number',\n 'y': 'number',\n 'width': 'number',\n 'height': 'number',\n 'duration': 'number',\n 'fill': 'Color',\n 'textColor': 'Color',\n 'originX': 'number',\n 'originY': 'number',\n 'rotationX': 'number',\n 'rotationY': 'number',\n 'rotationZ': 'number',\n 'radius': 'Radius',\n 'opacity': 'number',\n 'shadows': 'Shadow[]',\n 'filters': 'FilterMap',\n 'border': 'Border',\n 'hidden': 'boolean',\n 'locked': 'boolean',\n 'mirrorX': 'boolean',\n 'mirrorY': 'boolean',\n 'scaleX': 'number',\n 'scaleY': 'number',\n 'ratio': 'number',\n 'feed': 'Feed',\n 'states': 'State[]',\n 'animations': 'Animation[]',\n 'actions': 'Action[]',\n 'time': 'number',\n // TODO: SHOULD NOT BE IN SHARED\n 'fontReference': 'string',\n 'content': 'text'\n};\n\nexport const statePropertyToUnitMap = {\n ...omit(sharedPropertyToUnitMap,\n 'states',\n 'animations',\n 'actions',\n 'feed',\n 'time',\n 'duration',\n 'hidden',\n 'locked',\n 'width',\n 'height',\n // Currently not supported\n 'fontReference',\n 'content'\n ),\n 'name': 'enum'\n};\n\nexport const propertyToUnitMap = {\n ...textPropertyToUnitMap,\n ...widgetPropertyToUnitMap,\n ...imagePropertyToUnitMap,\n ...videoPropertyToUnitMap,\n ...sharedPropertyToUnitMap,\n ...statePropertyToUnitMap\n};\n\nexport const properties = getObjectKeys(propertyToUnitMap);\nexport const sharedProperties = getObjectKeys(sharedPropertyToUnitMap);\n\n/**\n * Element properties that need to be scaled in order to scale a creative to any particular size\n */\nexport const ScalableProperties = ['x', 'y', 'width', 'height', 'scaleX', 'scaleY', 'fitPositionX', 'fitPositionY', 'radius', 'border', 'fontSize', 'padding', 'shadows', 'textShadows'];\n\nexport function isElementProperty(key: string): key is OneOfElementPropertyKeys {\n return properties.some(p => key === p);\n}\n\nexport const propertyMaxValues = {\n opacity: 1\n};\n\nexport const propertyMinValues = {\n radius: 0,\n opacity: 0,\n scaleX: 0,\n scaleY: 0,\n};\n","export type SocialPlacement = MetaPlacement | TiktokPlacement | PinterestPlacement | SnapchatPlacement;\n\nexport enum MetaPlacement {\n Instagram = 'meta-instagram',\n Facebook = 'meta-facebook',\n Messenger = 'meta-messenger',\n FacebookReels = 'meta-facebookreels',\n InstagramReels = 'meta-instagramreels',\n}\n\nexport enum TiktokPlacement {\n Default = 'tiktok-default',\n After9s = 'tiktok-after-9s',\n After9sWithCard = 'tiktok-after-9s-with-card'\n}\n\nexport enum PinterestPlacement {\n BrowseImage = 'browse-image',\n BrowseVideo = 'browse-video',\n WatchVideo = 'watch-video'\n}\n\nexport enum SocialNetworkType {\n Meta = 'meta',\n TikTok = 'tiktok',\n Pinterest = 'Pinterest',\n Snapchat = 'snapchat'\n}\n\nexport enum SnapchatPlacement {\n Default = 'snapchat-default'\n}\n\nexport interface ISocialPlacement {\n type: SocialPlacement;\n text: string;\n position: PlacementPostion;\n}\n\nexport interface ISocialNetwork {\n type: SocialNetworkType;\n text: string;\n icon: string;\n placements: ISocialPlacement[];\n placementText?: string;\n ratios: string[];\n}\n\nexport interface ISocialGuide {\n network: ISocialNetwork;\n placement: ISocialPlacement;\n overlay: boolean;\n guidelines: boolean;\n}\n\nexport interface ICreativeSocialGuide {\n network: SocialNetworkType;\n placement: SocialPlacement;\n overlay: boolean;\n guidelines: boolean;\n}\n\nexport interface PlacementPostion {\n top: number;\n bottom: number;\n left?: number;\n right?: number;\n}\n\nconst DEFAULT_PLACEMENT_POSITION: PlacementPostion = { top: 0.14, bottom: 0.14 };\n\nconst META_PLACEMENTS: ISocialPlacement[] = [\n {\n type: MetaPlacement.Instagram,\n text: 'Instagram Story',\n position: DEFAULT_PLACEMENT_POSITION\n },\n {\n type: MetaPlacement.Facebook,\n text: 'Facebook Story',\n position: DEFAULT_PLACEMENT_POSITION\n },\n {\n type: MetaPlacement.Messenger,\n text: 'Messenger Story',\n position: DEFAULT_PLACEMENT_POSITION\n },\n {\n type: MetaPlacement.FacebookReels,\n text: 'Facebook Reels',\n position: { top: 0.12, bottom: 0.21, left: 0.07, right: 0.14 }\n },\n {\n type: MetaPlacement.InstagramReels,\n text: 'Instagram Reels',\n position: { top: 0.12, bottom: 0.21, left: 0.07, right: 0.13 }\n }\n];\n\nconst TIKTOK_PLACEMENTS: ISocialPlacement[] = [\n {\n type: TiktokPlacement.Default,\n text: 'Default',\n position: { top: 0.11, bottom: 0.17, left: 0.11, right: 0.15 }\n },\n {\n type: TiktokPlacement.After9s,\n text: 'After 9s',\n position: { top: 0.11, bottom: 0.22, left: 0.11, right: 0.15 }\n },\n {\n type: TiktokPlacement.After9sWithCard,\n text: 'After 9s with card',\n position: { top: 0.11, bottom: 0.25, left: 0.11, right: 0.15 }\n },\n];\n\nconst PINTEREST_PLACEMENTS: ISocialPlacement[] = [\n {\n type: PinterestPlacement.BrowseImage,\n text: '\"Browse\" Image',\n position: { top: 0.11, bottom: 0.252, left: 0.09, right: 0.092 }\n },\n {\n type: PinterestPlacement.BrowseVideo,\n text: '\"Browse\" Video',\n position: { top: 0.11, bottom: 0.252, left: 0.09, right: 0.092 }\n },\n {\n type: PinterestPlacement.WatchVideo,\n text: '\"Watch\" Video',\n position: { top: 0.10, bottom: 0.24, left: 0.0245, right: 0.115 }\n },\n];\n\n\nconst SNAPCHAT_PLACEMENTS: ISocialPlacement[] = [\n {\n type: SnapchatPlacement.Default,\n text: 'Default',\n position: { top: 0.16, bottom: 0.084, left: 0.11, right: 0.09 }\n }\n];\n\nexport const SOCIAL_PLACEMENTS: ISocialPlacement[] = [\n ...META_PLACEMENTS,\n ...TIKTOK_PLACEMENTS,\n ...SNAPCHAT_PLACEMENTS,\n ...PINTEREST_PLACEMENTS\n];\n\nexport const SOCIAL_NETWORKS: ISocialNetwork[] = [\n {\n type: SocialNetworkType.Meta,\n text: 'Meta',\n icon: 'meta',\n placementText: 'Placement',\n placements: META_PLACEMENTS,\n ratios: ['9:16']\n },\n {\n type: SocialNetworkType.TikTok,\n text: 'TikTok',\n icon: 'tiktok',\n placementText: 'CTA Style',\n placements: TIKTOK_PLACEMENTS,\n ratios: ['9:16']\n },\n {\n type: SocialNetworkType.Pinterest,\n text: 'Pinterest',\n icon: 'pinterest',\n placementText: 'Placement',\n placements: PINTEREST_PLACEMENTS,\n ratios: ['9:16']\n },\n {\n type: SocialNetworkType.Snapchat,\n text: 'Snapchat',\n icon: 'snapchat',\n placements: SNAPCHAT_PLACEMENTS,\n ratios: ['9:16']\n }\n];\n","import { Color } from '../creative/color';\nimport { IColor } from './color';\nimport { ISize } from './dimension';\n\nexport type AppearenceStyles = Partial;\n\nexport interface IAppearence {\n fill: IColor;\n fillSize: string;\n radius: IRadius;\n opacity: number;\n border: IBorder;\n shadows: IShadow[];\n}\n\nexport enum RadiusType {\n Joint = 'joint',\n Separate = 'separate'\n}\n\nexport interface IRadius {\n type: RadiusType;\n topLeft: number;\n topRight: number;\n bottomRight: number;\n bottomLeft: number;\n}\n\nexport type BorderStyle = 'solid' | 'dotted' | 'dashed';\n\nexport interface IBorder {\n thickness: number;\n color: T;\n style: BorderStyle;\n}\n\nexport interface IShadow {\n offsetX: number;\n offsetY: number;\n blur: number;\n spread: number;\n color: T;\n}\nexport interface ITextShadow {\n offsetX?: number;\n offsetY?: number;\n blur?: number;\n color: Color;\n}\n\nexport interface IPadding {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\nexport enum FilterType {\n Blur = 'blur',\n Contrast = 'contrast',\n Invert = 'invert',\n Grayscale = 'grayscale',\n Saturation = 'saturate',\n Sepia = 'sepia'\n}\n\nexport enum FilterUnit {\n Length = 'px',\n Percentage = '%',\n}\n\nexport interface IFilter {\n value?: number;\n}\n\nexport type IFilterMap = Partial>;\n\nexport interface FilterInfo {\n id: FilterType,\n name: string,\n icon: string,\n unit: FilterUnit,\n max: number,\n default?: number\n}\n\nexport const FILTER_MAP: Record> = {\n [FilterType.Blur]: { name: 'Blur', icon: 'filter-blur', unit: FilterUnit.Length, max: 100 },\n [FilterType.Contrast]: { name: 'Contrast', icon: 'filter-contrast', unit: FilterUnit.Percentage, max: 200, default: 100 },\n [FilterType.Invert]: { name: 'Invert', icon: 'filter-invert', unit: FilterUnit.Percentage, max: 100 },\n [FilterType.Grayscale]: { name: 'Grayscale', icon: 'filter-grayscale', unit: FilterUnit.Percentage, max: 100 },\n [FilterType.Saturation]: { name: 'Saturation', icon: 'filter-saturate', unit: FilterUnit.Percentage, max: 200, default: 100 },\n [FilterType.Sepia]: { name: 'Sepia', icon: 'filter-sepia', unit: FilterUnit.Percentage, max: 100 },\n};\n\n// Construct an array of FilterInfos with added ids for easy lookup and rendering.\nexport const FILTER_LIST = (Object.entries(FILTER_MAP) as ReadonlyArray<[FilterType, typeof FILTER_MAP[keyof typeof FILTER_MAP]]>)\n .reduce(\n (memo: ReadonlyArray, [key, filter]) => [\n ...memo,\n { id: key, ...filter },\n ],\n []\n );\n","import { stringLiteralArray } from '@studio/utils/utils';\nimport { TimingFunctionKey } from './timing-functions';\nimport { IBorder, IFilterMap, IRadius, IShadow, ITextShadow } from './style';\nimport { IColor } from './color';\n\n\nexport interface ITransition {\n id?: string;\n type: 'in' | 'out';\n name: string;\n timingFunction?: TimingFunctionKey;\n template?: string;\n settings?: TransitionSettings;\n __time?: number;\n}\n\nexport type TransitionSettings = { [key: string]: ITransitionSetting; };\n\nexport interface ITransitionSetting {\n name: string;\n value: any;\n}\n\nexport const animatableProperties = stringLiteralArray([\n 'x',\n 'y',\n 'originX',\n 'originY',\n 'rotationX',\n 'rotationY',\n 'rotationZ',\n 'opacity',\n 'scaleX',\n 'scaleY',\n 'fill',\n 'radius',\n 'shadows',\n 'filters',\n 'textColor',\n 'border'\n]);\nexport type AnimatableProperty = typeof animatableProperties[number];\n\nexport type AnimatablePropertyValue = IFilterMap | IColor | IShadow[] | ITextShadow[] | IBorder | IRadius | number;\n\nexport const transitionSettingPropertyToUnitMap = {\n 'direction': 'angle',\n 'distance': 'number',\n};\n\n","import { User as OidcUser} from 'oidc-client';\nexport interface ConnectedUser {\n connectionId: string;\n isActive: boolean;\n name: string;\n shortName: string;\n color: string;\n}\n\nexport interface UserActivity {\n action: string;\n user: ConnectedUser;\n timestamp: string;\n}\n\nexport interface UsersUpdate {\n users: ConnectedUser[];\n}\n\nexport interface IUser {\n isEmployee?: boolean;\n permissions?: Permissions[];\n user?: OidcUser;\n role?: Role;\n}\n\nexport enum Role {\n None = 0,\n User = 1,\n Admin = 2,\n Owner = 3,\n AccountAdmin = 4,\n ExternalUser = 5,\n TextEditor = 6,\n Designer = 7,\n TextEditorExtended = 8,\n UserWithoutAccessOthersContent = 9,\n Publisher = 10,\n Analyzer = 11,\n TextEditorWithAnalyzer = 12,\n PublisherExtended = 13\n}\n\n/**\n * Permissions defined in AccountManager on an account level\n */\nexport type Permissions =\n | 'AccessOthersContent'\n | 'Actions'\n | 'AdvancedFormats'\n | 'AllowHeavyVideos'\n | 'Analytics'\n | 'AnalyticsDemoData'\n | 'Analyzer'\n | 'Approve'\n | 'BannerflowLibrary'\n | 'BannersetDoneMark'\n | 'BannerSetDuplicate'\n | 'CreativesetDoneMark'\n | 'CreativesetDuplicate'\n | 'Comments'\n | 'ConversionTracking'\n | 'Creator'\n | 'CustomAssets'\n | 'CustomBannerScript'\n | 'CustomCreativecript'\n | 'DeleteComments'\n | 'DirectPublishing'\n | 'DownloadButton'\n | 'DuplicateTo'\n | 'Editor'\n | 'EditorKeyFrames'\n | 'EmailMarketing'\n | 'ExternalTranslations'\n | 'Facebook'\n | 'FallbackSharpness'\n | 'Feeds'\n | 'FeedsAutomated'\n | 'FeedsLive'\n | 'KeyframeAnimations'\n | 'LandingPage'\n | 'Lock'\n | 'Marketplace'\n | 'MediaBuyer'\n | 'MediaBuyerPublish'\n | 'MessageSystem'\n | 'MultipleBrands'\n | 'MultipleUsers'\n | 'OpenApi'\n | 'OutdoorFormats'\n | 'Publisher'\n | 'RequirePasswordForNewBrands'\n | 'Scheduling'\n | 'Settings'\n | 'Share'\n | 'SocialMedia'\n | 'Store'\n | 'Studio'\n | 'TextEditor'\n | 'ThemeEnterprise'\n | 'TrackingPixels'\n | 'VideoConverter'\n | 'ExportHtmlFromStudio'\n | 'StudioVideoLibrary'\n | 'SocialCampaignManager';\n","import { WidgetPropertyKeys, OneOfElementPropertyKeys } from './index';\nimport { IColor } from './color';\nimport { IFontStyle } from './font';\nimport { IFeed, IFeedData } from './feed';\nimport { IElementViewNode, NodeKind, IElementDataNode } from './nodes';\nimport { Widget } from '../creative/elements/widget/widget';\nimport { IAsset } from './asset';\n\nexport interface ILibraryWidget {\n id?: string;\n name: string;\n thumbnailUrl?: string;\n comment: string;\n\n // Should be WidgetProperty[] extends ElementProperties\n properties: IWidgetElementProperty[];\n exportable: boolean;\n state?: LibraryWidgetState;\n versionId?: number;\n imported?: boolean;\n}\n\nexport interface IWidgetElementDataNode extends IElementDataNode {\n html: string;\n js: string;\n ts: string;\n css: string;\n customProperties: IWidgetCustomProperty[];\n parentId?: string;\n widgetReference?: string;\n __widget?: Widget;\n}\n\nexport type WidgetProperties = keyof IWidgetElementDataNode;\n\n\nexport interface IWidgetViewElement extends IElementViewNode {\n widgetAsset: IWidgetLibraryAsset;\n html: string;\n js: string;\n css: string;\n customProperties?: IWidgetCustomProperty[];\n parentId?: string;\n}\n\nexport interface IWidgetLibraryAsset {\n thumbnail: string;\n bannerflowLibraryId: string;\n}\n\n// New interface\nexport interface IWidgetElementProperty {\n name: OneOfElementPropertyKeys | WidgetPropertyKeys | string;\n label?: string;\n value?: OneOfCustomPropertyValue;\n unit?: WidgetUnits;\n\n versionPropertyId?: string;\n}\n\nexport interface IWidgetImage extends Omit, 'width' | 'height'> {}\n\nexport type OneOfCustomPropertyValue =\n string |\n number |\n boolean |\n IWidgetSelectOption[] |\n IColor |\n IFontStyle |\n IWidgetImage |\n IFeed;\n\nexport interface IWidgetCustomProperty {\n name: string;\n label: string;\n value?: OneOfCustomPropertyValue;\n unit: WidgetUnits;\n versionPropertyId?: string;\n clientId?: string;\n}\n\nexport type WidgetCustomProperties = keyof IWidgetCustomProperty;\n\nexport enum LibraryWidgetState {\n Active = 0,\n Inactive = 1\n}\n\nexport interface IWidgetSelectOption {\n value: string;\n selected: boolean;\n}\n\nexport type WidgetUnits = 'number' | 'boolean' | 'select' | 'text' | 'color' | 'font' | 'feed' | 'image';\n\nexport interface IFeedHelper {\n id: string;\n /**\n * Returns a promise which resolves with FeedData\n */\n load: () => Promise;\n data: IFeedData;\n loaded: boolean;\n change: (callback: FeedHelperCallback) => void;\n}\n\nexport type FeedHelperCallback = ((feedData: IFeedData) => void);\n\nexport const WIDGET_PROPERTY_PREFIX = 'custom:';\n","import { IResizeDirection, RotationLocation, IPosition } from './dimension';\nimport { IBTreeItem } from '@studio/utils/btree';\n\nexport const enum TransformMode {\n None,\n Resize,\n Rotate,\n Move,\n TextEdit,\n Select,\n GradientEdit,\n CreateElement,\n Clone,\n Zoom,\n Guidelines,\n PositionImage\n}\n\nexport enum LockedDirection {\n VERTICAL,\n HORIZONTAL,\n NONE,\n}\n\nexport interface ITransformDirection {\n resize?: IResizeDirection;\n rotate?: RotationLocation;\n}\n\nexport interface IQueryPoint {\n value: number;\n offset: number;\n crossValues: number[];\n}\n\nexport interface ISnapLine {\n base: number;\n start: number;\n end: number;\n circles: Set;\n}\n\nexport interface ICrossValue {\n crossValue: number;\n}\n\nexport interface IGuideline {\n id: string;\n position: IPosition;\n type: 'horizontal' | 'vertical';\n preview: boolean;\n social?: boolean;\n}\nexport interface ISnapPoint {\n position: number;\n offset: number;\n}\n\nexport interface ISnapPoints {\n x?: ISnapPoint;\n y?: ISnapPoint;\n}\n\nexport interface ISnapLines {\n vertical: ISnapLine[];\n horizontal: ISnapLine[];\n}\n\nexport interface IPositionToCrossValuesMap {\n xToCrossValuesMap: Map;\n yToCrossValuesMap: Map;\n}\n\nexport interface IPointResult {\n item: IBTreeItem;\n point: IQueryPoint;\n}\n","import { IColor } from './color';\nimport { ISize } from './dimension';\nimport { IFeed } from './feed';\nimport { IFontStyle } from './font';\nimport { IPadding, IShadow, ITextShadow } from './style';\n\nexport type HorizontalAlignment =\n 'left' |\n 'center' |\n 'right' |\n 'justify';\n\nexport type VerticalAlignment =\n 'top' |\n 'middle' |\n 'bottom';\n\nexport type TextOverflow =\n 'shrink' |\n 'truncate' |\n 'expand' |\n 'scroll';\n\nexport const enum TextNodeKind {\n Root,\n TextSpan,\n}\n\nexport const enum SpanType {\n Word = 'word',\n Space = 'space',\n Newline = 'newline',\n Ellipsis = 'ellipsis',\n End = 'end',\n Variable = 'variable',\n Composition = 'composition', // Used for showing whats being written while composing a text (i.e. writting a Chinese character using Pinyin)\n}\n\nexport const enum RenderedLineKind {\n AutoLine, // Overflowed line\n ExplicitLine, // User typed newline\n}\n\nexport interface IContentLine {\n dir: TextDirection;\n lineHeight: number;\n maxFontSize: number;\n lineWidth: number;\n // Trailing spaces are trailing character spacing, spaces, newlines\n trailingSpaceWidth: number;\n characterWidth: number;\n endsWithNewline: boolean;\n isLastLine: boolean;\n spans: OneOfRenderedSpans[];\n}\n\nexport type TextStyle = ITextProperties & Partial;\n\nexport interface IText {\n style: TextStyle;\n spans: OneOfEditableSpans[];\n}\n\nexport interface ISpans {\n spans: OneOfEditableSpans[];\n}\n\nexport interface IRenderedSpans {\n spans: OneOfRenderedSpans[];\n}\n\n\nexport const enum JoinType {\n None = 0,\n ZeroWidthNoJoint = '\\u200C',\n ZeroWidthJoint = '\\u200D',\n}\n\nexport interface ISpan {\n top: number;\n left: number;\n type: SpanType;\n content: string;\n width: number;\n height: number;\n lineHeight: number;\n attributes: ISpanAttributes;\n\n // JoinType are needed in arabic and hindi languages, where a join span can alter the glyph of a character.\n startJoint?: JoinType;\n endJoint?: JoinType;\n __viewElement?: HTMLSpanElement;\n}\n\nexport interface ISpanProperties {\n attributes?: ISpanAttributes;\n styleIds?: IStyleIdMap;\n}\n\nexport interface ISpanAttributes {\n styleIndex?: number;\n shouldRenderNumber?: boolean;\n [attribute: string]: any;\n}\n\nexport type StyleProperty =\n 'textColor';\n\nexport interface IStyle {\n [property: string]: any;\n}\n\nexport interface IStyleIdMap {\n [documentId: string]: /* styleId */string;\n}\n// export type IStyleIdMap = Map;\n\nexport type ICharacterStylesMap = Map>;\n\nexport interface IElementIdToCharacterStylesMap {\n [elementId: string]: ICharacterStylesMap;\n}\n\nexport const enum PreviousStyleIdType {\n Undefined,\n Unchanged,\n}\n\n\nexport const enum TextDirection {\n // Infer from context, if it is first or last it is LTR, otherwise it infers it from the next sibling.\n InferFromContext = 'infer',\n // Only for special chars.\n Previous = 'previous',\n Ltr = 'ltr',\n Rtl = 'rtl',\n Both = 'both',\n}\n\n\nexport type ResolvedTextDirection = TextDirection.Ltr | TextDirection.Rtl;\n\nexport interface IContentSpan {\n line?: number;\n column?: number;\n dir?: TextDirection;\n style: Partial;\n styleIds: IStyleIdMap;\n styleId?: string;\n\n // We resolve style changes on edit end. We have to keep track of the style before the text edit\n // in situations where you clear styles and then reapply a different style, which should be the\n // same as reapplying the styles directly.\n __previousStyleIds?: (string | PreviousStyleIdType)[];\n __previousStyleIdToHistoryIndexMap?: Map;\n\n}\n\nexport interface ISpaceSpan extends IContentSpan, ISpan {\n type: SpanType.Space;\n}\n\nexport interface IWordSpan extends IContentSpan, ISpan {\n type: SpanType.Word;\n}\n\n\nexport interface ICompositionSpan extends IContentSpan, ISpan {\n type: SpanType.Composition;\n width: number;\n}\n\nexport interface IVariableSpan extends IContentSpan, ISpan {\n type: SpanType.Variable;\n}\n\nexport interface INewlineSpan extends IContentSpan, ISpan {\n type: SpanType.Newline;\n}\n\nexport interface IEndSpan extends ISpan {\n type: SpanType.End;\n dir: TextDirection;\n}\n\nexport interface IEllipsesSpan extends ISpan {\n type: SpanType.Ellipsis;\n style: Partial; // Takes the last span style before truncation\n dir?: TextDirection;\n}\n\nexport type OneOfContentSpans = IWordSpan | ISpaceSpan | IVariableSpan | INewlineSpan | ICompositionSpan;\nexport type OneOfEditableSpans = OneOfContentSpans | IEndSpan;\nexport type OneOfRenderedSpans = OneOfEditableSpans | IEllipsesSpan;\n\n/**\n * Properties that can be changed by character styling\n */\nexport interface ICharacterProperties {\n textColor?: IColor;\n fontSize?: number; /* relative */\n font?: IFontStyle;\n uppercase?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n characterSpacing: number;\n lineHeight: number;\n textShadows?: ITextShadow[];\n variable?: IVariable;\n __fontFamilyId?: string;\n}\n\nexport type OneOfCharacterProperty = keyof ICharacterProperties;\n\nexport interface ITextElementProperties {\n horizontalAlignment: HorizontalAlignment;\n verticalAlignment: VerticalAlignment;\n maxRows: number;\n padding: IPadding;\n textOverflow: TextOverflow;\n}\n\nexport interface IMixedCharacterProperties {\n textColor?: IColor;\n fontSize?: number;\n font?: IFontStyle | '$mixed';\n uppercase: boolean;\n underline: boolean;\n strikethrough: boolean;\n characterSpacing: number;\n lineHeight: number;\n textShadows?: ITextShadow[];\n variable?: IFeed;\n __fontFamilyId: string | '$mixed';\n}\n\nexport interface ITextElementCharacterProperties extends ICharacterProperties { }\n\nexport type ITextProperties = ITextElementProperties & ITextElementCharacterProperties;\n\nexport interface IVariable extends IFeed {\n spanId?: string;\n}\nexport const VARIABLE_PREFIX = '@';\n\nexport interface ITextStyles {\n color: IColor;\n shadows: IShadow[];\n transform: 'uppercase' | null;\n decorations: string | null;\n horizontalAlignment: HorizontalAlignment;\n verticalAlignment: VerticalAlignment;\n characterSpacing: number;\n lineHeight: number;\n fontSize: number;\n maxRows?: number;\n padding: IPadding;\n textOverflow: TextOverflow;\n fontStyle: IFontStyle;\n}\n\nexport interface IStyleIndexMaps {\n styleHashToIndexMap: Map;\n indexToStyleIdsMap: Map;\n}\n","export function cloneDeep(value: T): T {\n return cloneDeepHelper(value, new Map());\n}\n\nfunction cloneDeepHelper(val: any, seen: any): any {\n switch (Object.prototype.toString.call(val)) {\n case '[object Array]': {\n if (seen.has(val)) {\n return seen.get(val);\n }\n const copy_1 = val.slice(0);\n seen.set(val, copy_1);\n copy_1.forEach((child, i) => {\n copy_1[i] = cloneDeepHelper(child, seen);\n });\n return copy_1;\n }\n case '[object Object]': {\n if (seen.has(val)) {\n return seen.get(val);\n }\n const copy_2 = Object.create(Object.getPrototypeOf(val));\n seen.set(val, copy_2);\n Object.keys(val).forEach(key => {\n if (key !== '__widget') {\n copy_2[key] = cloneDeepHelper(val[key], seen);\n }\n });\n return copy_2;\n }\n default:\n return val;\n }\n}\n\nexport function cloneMapDeep | undefined>(map?: M): M {\n if (!map) {\n return map as M;\n }\n const clonedMap = new Map() as M;\n for (const [key, value] of map.entries()) {\n clonedMap!.set(key, cloneDeep(value));\n }\n return clonedMap;\n}\n\nexport function simpleClone(value: T): T {\n return JSON.parse(JSON.stringify(value));\n}\n","export interface IInjectionParameter {\n optional: boolean;\n token: T;\n forwardRef: boolean;\n}\n\nexport interface IChildContainerInjection {\n parameterIndex: number;\n target: new (...args: any[]) => any;\n}\n\nexport interface IInjectionOption {\n optional?: boolean;\n forwardRef?: boolean;\n}\n\nexport type ParameterMap = Map>;\nexport type ContainerReferenceMap = Set;\nexport type DecorationFactory = (target: Object, propertyKey: string | symbol, parameterIndex: number) => void;\n\nconst metadata = new Map>();\n\nexport function defineMetadata(name: string, value: any, target: any): void {\n let decorations = metadata.get(target);\n if (!decorations) {\n decorations = new Map();\n }\n decorations.set(name, value);\n metadata.set(target, decorations);\n}\n\nexport function getOwnMetadata(name: string, target: any, _?: string | symbol): any {\n const decorations = metadata.get(target);\n if (!decorations) {\n return undefined;\n }\n return decorations.get(name);\n}\n\n/**\n * USE TOGETHER WITH __inject\n *\n * Inject dependency to a class.\n *\n * @example\n * class RichText {\n * constructor(@inject(T.RichTextSelection) selection: IRichTextSelection)\n * }\n */\nexport function inject(token: T, option: IInjectionOption = {}): DecorationFactory {\n return function(target: any, propertyKey: string | symbol, parameterIndex: number): void {\n const parameterMap: ParameterMap = getOwnMetadata('i', target, propertyKey) || new Map>();\n parameterMap.set(parameterIndex, {\n token,\n optional: option.optional ?? false,\n forwardRef: option.forwardRef ?? false,\n });\n defineMetadata('i', parameterMap, target);\n };\n}\n\n/**\n * Angular remove decorators. So we need this helper decorator.\n * https://github.com/angular/angular-cli/issues/9306\n */\nexport function __inject(token: T, option: IInjectionOption = {}, target: any, propertyKey: string | symbol, parameterIndex: number): void {\n const parameterMap: ParameterMap = getOwnMetadata('i', target, propertyKey) || new Map>();\n parameterMap.set(parameterIndex, {\n token,\n optional: option.optional ?? false,\n forwardRef: option.forwardRef ?? false,\n });\n defineMetadata('i', parameterMap, target);\n}\n\n/**\n * USE TOGETHER WITH __parent\n *\n * Inject parent to a class.\n *\n * @example\n * class RichText {\n * constructor(@parent() text: IRichText)\n * }\n */\nexport function parent(): DecorationFactory {\n return function(target: Object, propertyKey: string | symbol, parameterIndex: number): void {\n defineMetadata('p', parameterIndex, target);\n };\n}\n\n/**\n * Angular remove decorators. So we need this helper decorator.\n * https://github.com/angular/angular-cli/issues/9306\n */\nexport function __parent(target: any, propertyKey: string | symbol, parameterIndex: number): void {\n defineMetadata('p', parameterIndex, target);\n}\n\n\nexport function DIContainer(): DecorationFactory {\n return function(target: any, propertyKey: string | symbol, parameterIndex: number): void {\n defineMetadata('c', parameterIndex, target);\n };\n}\n\n/**\n * Angular remove decorators. So we need this helper decorator.\n * https://github.com/angular/angular-cli/issues/9306\n */\nexport function __container(target: any, propertyKey: string | symbol, parameterIndex: number): void {\n defineMetadata('c', parameterIndex, target);\n}\n","export * from './di.decorators';\nimport { ParameterMap, getOwnMetadata } from './di.decorators';\n\ninterface IConstructorMetadataStore {\n parameterMap: ParameterMap;\n parentParameterIndex?: number;\n containerParameterIndex?: number;\n target: Function | any;\n}\n\ninterface IParentParameterResolvement {\n parentParameterIndex?: number;\n target?: any;\n}\n\ninterface IRecursiveItemResolvment {\n item: T extends MetadataType.Metadata ? IConstructorMetadataStore :\n T extends MetadataType.Factory ? | ((...args: any[]) => any) : object;\n container: Container;\n}\ninterface IChildWithParent {\n target: any;\n parentParameterIndex: number;\n}\n\nconst enum MetadataType {\n Metadata,\n Factory,\n Object,\n ParentInjection,\n ContainerRef,\n}\n\nexport class Container {\n private _constructorMetadataMap = new Map>();\n private _objectMap = new Map();\n private _instanceMap = new Map();\n private _factoryMap = new Map any>();\n\n constructor(public parent?: Container) { }\n\n register_m(token: T, target: any): void {\n const parameterMap = getOwnMetadata('i', target) as ParameterMap;\n const parentParameterIndex = getOwnMetadata('p', target) as number;\n const containerParameterIndex = getOwnMetadata('c', target) as number;\n if (target instanceof Function) {\n const constructorMetadata = {\n target,\n parameterMap,\n parentParameterIndex,\n containerParameterIndex,\n };\n this._constructorMetadataMap.set(token, constructorMetadata);\n }\n else {\n this._objectMap.set(token, target);\n }\n }\n\n unregister_m(token: T): void {\n this._constructorMetadataMap.delete(token);\n this._objectMap.delete(token);\n this._factoryMap.delete(token);\n }\n\n maybeResolve(token: T): R | undefined {\n const { target } = this._recursivelyResolve(token, true);\n return target;\n }\n\n clear(): void {\n this._instanceMap.clear();\n }\n\n resolve(token: T, isOptional: boolean = false): R {\n const { target } = this._recursivelyResolve(token, isOptional);\n if (!target) {\n throw new Error(`Could not resolve token '${token}'.`);\n }\n return target;\n }\n\n registerFactory_m(token: T, context: (container: Container) => R): void {\n this._factoryMap.set(token, context);\n }\n\n private _recursivelyResolve(token: T, isOptional: boolean): IParentParameterResolvement {\n const metadata = this._recursivelyGetMetadata(token, MetadataType.Metadata);\n const args: any[] = [];\n if (metadata) {\n const item = metadata.item;\n if (typeof item.target === 'function') {\n const cachedInstance = metadata.container._instanceMap.get(token);\n if (cachedInstance) {\n return { target: cachedInstance, parentParameterIndex: undefined };\n }\n const childrenWithParent: IChildWithParent[] = [];\n if (item.parameterMap) {\n for (const [index, parameter] of item.parameterMap.entries()) {\n const { target, parentParameterIndex } = this._recursivelyResolve(parameter.token, parameter.optional || isOptional);\n if (!target) {\n if (!isOptional && !parameter.optional) {\n throw new Error(`Could not resolve symbol '${parameter.token}'.`);\n }\n continue;\n }\n args[index] = target;\n if (parentParameterIndex !== undefined) {\n childrenWithParent.push({\n target,\n parentParameterIndex,\n });\n }\n }\n }\n if (item.containerParameterIndex !== undefined) {\n args[item.containerParameterIndex] = this;\n }\n const instance = new item.target(...args);\n\n for (const child of childrenWithParent) {\n let enumKeyIndex = 0;\n for (const key in child.target) {\n if (enumKeyIndex === child.parentParameterIndex) {\n child.target[key] = instance;\n }\n enumKeyIndex++;\n }\n }\n metadata.container._instanceMap.set(token, instance);\n return { target: instance, parentParameterIndex: item.parentParameterIndex };\n }\n }\n const object = this._recursivelyGetMetadata(token, MetadataType.Object);\n if (object) {\n return { target: object.item };\n }\n const factory = this._recursivelyGetMetadata(token, MetadataType.Factory);\n if (factory) {\n return { target: factory.item(factory.container) };\n }\n return { target: undefined };\n }\n\n private _recursivelyGetMetadata(token: T, type: M): IRecursiveItemResolvment | undefined {\n let container: Container | undefined = this;\n while (container) {\n let item: any;\n switch (type) {\n case MetadataType.Metadata:\n item = container._constructorMetadataMap.get(token);\n break;\n case MetadataType.Object:\n item = container._objectMap.get(token);\n break;\n case MetadataType.Factory:\n item = container._factoryMap.get(token);\n break;\n }\n if (item !== undefined) {\n return { item, container };\n }\n container = container.parent;\n }\n return undefined;\n }\n}\n","class BaseError extends Error { }\n\nexport class BadRequestException extends BaseError {\n statusCode = 400;\n}\n\nexport class NotFoundError extends BaseError {\n statusCode = 404;\n id?: number | string;\n}\n\nexport class ForbiddenError extends BaseError {\n statusCode = 403;\n constructor(public message: string) {\n super();\n }\n}\n\nexport class BadParameterException extends BaseError {\n statusCode = 422;\n}\n\nexport class UnauthenticatedError extends Error {\n errorMeta?: IUnauthenticatedErrorMeta; // seems obsolete to pass the window location around. Can just use it if we still need it for the signinRedirect\n kind = 'autherror';\n\n constructor(errorMeta?: IUnauthenticatedErrorMeta) {\n super();\n this.errorMeta = errorMeta;\n }\n\n /**\n * UnauthenticatedError will be an instanceof \"Error\" in client so this is simply a better typecheck\n */\n static isInstanceOf(error: any): error is UnauthenticatedError {\n return error instanceof UnauthenticatedError || (error instanceof Error && (error as UnauthenticatedError).kind === 'autherror');\n }\n\n static isUnauthenticated(error: any = {}): boolean {\n error = getPrimaryError(error);\n return UnauthenticatedError.isInstanceOf(error) || error.statusCode === 401 || error.message?.includes('login_required') /* Happens when IDP somehows generates mismatch between user_info.sub and current_sub */;\n }\n}\n\nclass IUnauthenticatedErrorMeta {\n locationUri: string;\n}\n\n\n/**\n * Sometimes errors are wrapped, return real error in those cases\n * @param error\n */\nexport function getPrimaryError(error: any): any {\n if (error) {\n // Promise rejection, use rejection instead\n if (error.rejection) {\n return error.rejection;\n }\n // Errors from graphql\n else if (error.networkError) {\n return error.networkError;\n }\n // Errors from express?\n else if (error.originalError) {\n return error.originalError;\n }\n }\n return error || {};\n}\n\n\ninterface ErrorContext {\n enabled?: boolean;\n level?: string;\n contexts?: { [key: string]: any; };\n}\n\nconst defaultErrorContext: ErrorContext = { enabled: true, level: 'error' };\n\nfunction isErrorContext(value: any): value is ErrorContext {\n return !!(value && value.contexts);\n}\n\nexport function isNativeError(error: any): error is Error {\n return error instanceof Error;\n}\n\nexport function handleError(message: string, context?: ErrorContext | unknown): void {\n let errorContext: ErrorContext;\n\n if (!isErrorContext(context)) {\n errorContext = { ...defaultErrorContext, ...{ contexts: { context } } };\n }\n else {\n errorContext = { ...defaultErrorContext, ...context };\n }\n\n const tracker = (window as any).TrackerService;\n\n if (errorContext.enabled && tracker) {\n tracker.captureMessage(message, errorContext.level, errorContext.contexts);\n }\n\n if (errorContext.level === 'error') {\n console.error(message, errorContext.contexts);\n } else {\n console.warn(message, errorContext.contexts);\n }\n}\n","\nexport type Callback = (...args: any[]) => any;\n\ninterface IEventCallbackStore {\n [event: string]: Callback[];\n}\n\nexport interface IEventEmitter {\n on(event: T, callback: Callback): this;\n on(event: T, prop: string, callback: Callback): this;\n\n once(event: T, callback: Callback): this;\n once(event: T, prop: string, callback: Callback): this;\n\n off(event: T): this;\n off(event: T, callback: Callback): this;\n off(event: T, prop: string, callback: Callback): this;\n\n emit(event: T, args?: any[]): this;\n emit(event: T, prop: string, args?: any[]): this;\n\n clearEvents(): void;\n}\n\nexport class EventEmitter implements IEventEmitter {\n private _eventCallbacks: IEventCallbackStore = {};\n private _thisArg = null;\n protected skipEmission = false;\n\n on(event: T, callback: Callback): this;\n on(event: T, prop: string, callback: Callback): this;\n on(event: T, propOrCallback: string | Callback, callback?: Callback): this;\n on(event: T, propOrCallback: string | Callback, callback?: Callback): this {\n if (typeof propOrCallback === 'string') {\n event = event + ':' + propOrCallback as T;\n }\n else {\n callback = propOrCallback;\n }\n if (!this._eventCallbacks[event]) {\n this._eventCallbacks[event] = [];\n }\n if (this._eventCallbacks[event].indexOf(callback!) === -1) {\n this._eventCallbacks[event].push(callback!);\n }\n return this;\n }\n\n once(event: T, callback: Callback): this;\n once(event: T, prop: string, callback: Callback): this;\n once(event: T, propOrCallback: string | Callback, callback?: Callback): this {\n if (typeof propOrCallback === 'string') {\n event = event + ':' + propOrCallback as T;\n }\n else {\n callback = propOrCallback;\n }\n const temporary = (args: any[]): void => {\n if (typeof callback === 'function') {\n callback.apply(this._thisArg, [args]);\n }\n this.off(event, temporary);\n };\n this.on(event, temporary);\n return this;\n }\n\n off(event: T, callback: Callback): this;\n off(event: T, prop: string, callback: Callback): this;\n off(event: T): this;\n off(event: T, propOrCallback?: string | Callback, callback?: Callback): this {\n if (typeof propOrCallback !== 'undefined') {\n if (typeof propOrCallback === 'string') {\n event = event + ':' + propOrCallback as T;\n }\n else {\n callback = propOrCallback;\n }\n }\n if (typeof event === 'undefined') {\n this.clearEvents();\n return this;\n }\n if (!callback) {\n delete this._eventCallbacks[event];\n return this;\n }\n const callbacks = this._eventCallbacks[event];\n if (callbacks?.length) {\n let i = callbacks.length;\n // Do this way to make sure no index is skipped when reducing size of array\n while (i-- > 0) {\n if (callbacks[i] === callback) {\n callbacks.splice(i, 1);\n }\n }\n }\n\n return this;\n }\n\n emit(event: T, args?: any[]): this;\n emit(event: T, prop: string, args?: any[]): this;\n emit(event: T, propOrArgs?: string | any[], args?: any[]): this {\n if (this.skipEmission) {\n return this;\n }\n if (typeof propOrArgs === 'string') {\n event = event + ':' + propOrArgs as T;\n }\n else {\n args = propOrArgs;\n }\n\n // Clone array to make sure all events are fired even when reducing size of array (see this.once())\n const callbacks = this._eventCallbacks[event]?.slice();\n if (callbacks) {\n for (const callback of callbacks) {\n try {\n callback.apply(this._thisArg, args || []);\n } catch (err: unknown) {\n console.error('CallbackError: ', err);\n }\n }\n }\n\n return this;\n }\n\n clearEvents(): void {\n this._eventCallbacks = {};\n }\n}\n","import { IPosition, IBoundingBox, IBoundingCorners, IBounds, IPointRect, ISize, IScale, IOrigin } from '../domain/dimension';\nimport { clamp, rotatePosition } from './utils';\nimport { Matrix } from './matrix';\n\nexport function getBoundingCorners(boundingBox: IBoundingBox, inset: number = 0, calculateCenter: boolean = false): IBoundingCorners {\n const { x, y, width, height, rotationZ } = boundingBox;\n\n const origin: IPosition = { x: x + width / 2, y: y + height / 2 };\n let topLeft: IPosition = { x: x + inset, y: y + inset };\n let topRight: IPosition = { x: x + width - inset, y: y + inset };\n let bottomLeft: IPosition = { x: x + inset, y: y + height - inset };\n let bottomRight: IPosition = { x: x + width - inset, y: y + height - inset };\n\n if (typeof rotationZ !== 'undefined') {\n topLeft = rotatePosition(topLeft, origin, -rotationZ);\n topRight = rotatePosition(topRight, origin, -rotationZ);\n bottomLeft = rotatePosition(bottomLeft, origin, -rotationZ);\n bottomRight = rotatePosition(bottomRight, origin, -rotationZ);\n }\n\n const result: IBoundingCorners = {\n topLeft,\n topRight,\n bottomLeft,\n bottomRight,\n };\n\n if (calculateCenter) {\n result.center = {\n x: (Math.min(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x) + Math.max(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x)) / 2,\n y: (Math.min(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y) + Math.max(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y)) / 2,\n };\n }\n\n return result;\n}\n\nexport function getBoundingRectangleOfRotatedBox(boundingBox: IBoundingBox): IBounds {\n const corners = getBoundingCorners(boundingBox);\n\n const minX = Math.min(...[corners.topLeft.x, corners.bottomLeft.x, corners.topRight.x, corners.bottomRight.x]);\n const minY = Math.min(...[corners.topLeft.y, corners.bottomLeft.y, corners.topRight.y, corners.bottomRight.y]);\n const maxX = Math.max(...[corners.topLeft.x, corners.bottomLeft.x, corners.topRight.x, corners.bottomRight.x]);\n const maxY = Math.max(...[corners.topLeft.y, corners.bottomLeft.y, corners.topRight.y, corners.bottomRight.y]);\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\n\nexport function withinImageBounds(fitX: number, fitY: number, imageWidth: number, width: number, imageHeight: number, height: number): { fitX: number, fitY: number, percentX: number, percentY: number } {\n const maxY = Math.round(imageHeight - height);\n const minY = Math.round(-Math.abs(maxY));\n const maxX = Math.round(imageWidth - width);\n const minX = Math.round(-Math.abs(maxX));\n\n if (fitX > maxX) {\n fitX = maxX;\n }\n if (fitX < minX) {\n fitX = minX;\n }\n if (fitY > maxY) {\n fitY = maxY;\n }\n if (fitY < minY) {\n fitY = minY;\n }\n\n function getPercentage(startpos: number, endpos: number, currentpos: number): number {\n const posDistance = endpos - startpos;\n const displacement = currentpos - startpos;\n return (displacement / posDistance);\n }\n\n return { fitX, fitY, percentX: getPercentage(maxX, minX, fitX), percentY: getPercentage(maxY, minY, fitY) };\n}\n\n\nexport function imageScaleFactor(imageWidth: number, boxWidth: number, imageHeight: number, boxHeight: number): { scale: number, width: number, height: number } {\n const scale = Math.max(boxWidth / imageWidth, boxHeight / imageHeight);\n const width = imageWidth * scale;\n const height = imageHeight * scale;\n\n return { scale, width, height };\n}\n\n/**\n * Get a new IBounds covering all of the IBounds provided\n * @param bounds\n */\nexport function getOuterBounds(...bounds: IBounds[]): IBounds {\n let left = Infinity;\n let top = Infinity;\n let right = -Infinity;\n let bottom = -Infinity;\n\n for (const b of bounds) {\n left = Math.min(b.x, left);\n top = Math.min(b.y, top);\n right = Math.max(b.x + b.width, right);\n bottom = Math.max(b.y + b.height, bottom);\n }\n return {\n x: left,\n y: top,\n width: right - left,\n height: bottom - top,\n };\n}\n\nexport function getBoundsOfScaledRectangle(rect: IBoundingBox & IScale & IOrigin): IBoundingBox {\n\n const originX = 'originX' in rect && rect.originX !== undefined ? rect.originX : 0.5;\n const originY = 'originY' in rect && rect.originY !== undefined ? rect.originY : 0.5;\n const scaleX = rect?.scaleX !== undefined ? Math.abs(rect.scaleX) : 1;\n const scaleY = rect?.scaleY !== undefined ? Math.abs(rect.scaleY) : 1;\n\n return {\n x: rect.x - rect.width * (scaleX - 1) * originX,\n y: rect.y - rect.height * (scaleY - 1) * originY,\n width: rect.width * scaleX,\n height: rect.height * scaleY,\n rotationZ: rect.rotationZ\n };\n}\n\nconst compareSize = (a: ISize, b: ISize): boolean => a.width === b.width && a.height === b.height;\n\nconst comparePosition = (a: IPosition, b: IPosition): boolean => a.x === b.x && a.y === b.y;\n\nconst compareRotation = (a: IBoundingBox, b: IBoundingBox): boolean => a.rotationZ === b.rotationZ;\n\n/**\n * Check if all boxes provided have the same size, position and rotation as the first box\n * @param comparativeBox a box object that should be compared with\n * @param boxes the boxes that should be compared with the comparativeBox\n */\nexport function isSameBoundsAndRotation(comparativeBox: IBoundingBox, ...boxes: IBoundingBox[]): boolean {\n return boxes.every(box =>\n compareSize(comparativeBox, box) &&\n comparePosition(comparativeBox, box) &&\n compareRotation(comparativeBox, box)\n );\n}\n/**\n * Check if all bounds provided have the same size and position as the first bounds\n * @param comparativeBound a bound object that should be compared with\n * @param bounds the bounds that should be compared with the comparativeBound\n */\nexport function isSameBounds(comparativeBound: IBounds, ...bounds: IBounds[]): boolean {\n return bounds.every(bound =>\n compareSize(comparativeBound, bound) &&\n comparePosition(comparativeBound, bound)\n );\n}\n\nexport function isSameSize(comparativeSize: ISize, ...sizes: ISize[]): boolean {\n return sizes.every(size => compareSize(comparativeSize, size));\n}\n\nexport function isSamePosition(comparativePosition: IPosition, ...positions: IPosition[]): boolean {\n return positions.every(position => comparePosition(comparativePosition, position));\n}\n\n/**\n * Get distance between two points as a vector (x, y).\n * @param from\n * @param to\n * @param absolute\n */\nexport function distance2D(from: IPosition, to: IPosition, absolute?: boolean): IPosition {\n const abs = absolute\n ? Math.abs\n : (n: number): number => n;\n\n return {\n x: abs(to.x - from.x),\n y: abs(to.y - from.y)\n };\n}\n\n/**\n * Cypress and old browsers doesn't support event.x so fallback on clientX\n */\nexport function eventToPosition(event: MouseEvent): IPosition {\n return {\n x: typeof event.x === 'number' ? event.x : event.clientX,\n y: typeof event.y === 'number' ? event.y : event.clientY,\n };\n}\n\n/**\n * Get the diagonal by using pythagoras.\n * @param width\n * @param height\n */\nexport function diagonal(width: number, height: number): number {\n return Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2));\n}\n\n/**\n * Get distance between two points as a positive number\n * @param from\n * @param to\n */\nexport function distance(from: IPosition, to: IPosition): number {\n const dist = distance2D(from, to);\n return diagonal(dist.x, dist.y);\n}\n\nexport function normalizeAngleDegrees(degrees: number): number {\n degrees = (degrees % 360 + 360) % 360;\n\n // force into the minimum absolute value residue class, so that -180 < angle <= 180\n if (degrees > 180) {\n\n degrees -= 360;\n }\n return degrees;\n}\n\nexport function getCenter(bounds: ISize | IBounds): IPosition {\n\n const box = sizeToBounds(bounds) as IBounds;\n\n return {\n x: box.x + box.width / 2,\n y: box.y + box.height / 2,\n };\n}\n\n/**\n * Angle between positions in radians\n * @param from\n * @param to\n */\nexport function pointsToAngle(from: IPosition, to: IPosition): number {\n return Math.atan2(to.y - from.y, to.x - from.x);\n}\n\n/**\n * Get the intersecting rectangle of two rectangles\n * @param r1\n * @param r2\n */\nexport function getIntersectingRectangle(rect1: IBounds | ISize, rect2: IBounds | ISize): IBounds | undefined {\n\n\n const r1 = boundsToPointRect(sizeToBounds(rect1));\n const r2 = boundsToPointRect(sizeToBounds(rect2));\n\n const noIntersect = r2.x1 > r1.x2 || r2.x2 < r1.x1 ||\n r2.y1 > r1.y2 || r2.y2 < r1.y1;\n\n return noIntersect ? undefined : pointRectToBounds({\n x1: Math.max(r1.x1, r2.x1), // _[0] is the lesser,\n y1: Math.max(r1.y1, r2.y1), // _[1] is the greater\n x2: Math.min(r1.x2, r2.x2),\n y2: Math.min(r1.y2, r2.y2)\n });\n}\n\nexport function coversHorizontally(element: IBounds | ISize, container: IBounds | ISize, tolerance: number = 1): boolean {\n const intersection = getIntersectingRectangle(element, container);\n return !!intersection && Math.abs(intersection.width - container.width) <= tolerance * 2 && intersection.x <= tolerance;\n}\n\nexport function coversVertically(element: IBounds | ISize, container: IBounds | ISize, tolerance: number = 1): boolean {\n const intersection = getIntersectingRectangle(element, container);\n return !!intersection && Math.abs(intersection.height - container.height) <= tolerance * 2 && intersection.y <= tolerance;\n}\n\n/**\n * How much much of an element covers the container (from 0 to 1)\n * @param element\n * @param container\n */\nexport function intersectionFactor(element: IBounds | ISize, container: IBounds | ISize): number {\n const elementBounds = sizeToBounds(element);\n const containerBounds = sizeToBounds(container);\n const intersectionRect = getIntersectingRectangle(elementBounds, containerBounds);\n if (intersectionRect) {\n return areaRelation(intersectionRect, element);\n }\n return 0;\n}\n\nexport function sizeToBounds(size: IBounds | ISize): IBounds {\n return {\n x: 0,\n y: 0,\n ...size\n };\n}\n\n/**\n * Get relation between area of two object. >1 means that the first object is bigger\n * @param size\n * @param reference\n */\nexport function areaRelation(size: ISize, reference: ISize): number {\n return (size.width * size.height) / (reference.width * reference.height);\n}\n\nexport function isHorizontallyCentered(element: IBounds, container: IBounds, tolerance: number = 0.5): boolean {\n return Math.abs((element.x + element.width / 2) - (container.x + container.width / 2)) <= tolerance;\n}\n\nexport function isVerticallyCentered(element: IBounds, container: IBounds, tolerance: number = 0.5): boolean {\n return Math.abs((element.y + element.height / 2) - (container.y + container.height / 2)) <= tolerance;\n}\n\n\nexport function boundsToPointRect(bounds: IBounds): IPointRect {\n return {\n x1: bounds.x,\n y1: bounds.y,\n x2: bounds.x + bounds.width,\n y2: bounds.y + bounds.height\n };\n}\n\nexport function pointRectToBounds(rect: IPointRect): IBounds {\n return {\n x: Math.min(rect.x1, rect.x2),\n y: Math.min(rect.y1, rect.y2),\n width: Math.abs(rect.x1 - rect.x2),\n height: Math.abs(rect.y1 - rect.y2),\n };\n}\n\nexport function scaleRectWithinBounds(element: IBoundingBox, bounds: IBounds): IBoundingBox {\n if (!element.rotationZ) {\n return { ...bounds };\n }\n\n const originalRotatedBoundingBox = getBoundingRectangleOfRotatedBox(element);\n\n const scaleX = bounds.width / originalRotatedBoundingBox.width;\n const scaleY = bounds.height / originalRotatedBoundingBox.height;\n const center = getCenter(bounds);\n const matrix = new Matrix();\n\n // 1. Move the 1x1 \"pixel\" to the center of new bounding box\n matrix.translate_m(center.x, center.y);\n // 2. Set width and height to the original element size\n matrix.scale_m(element.width, element.height);\n // 3. Rotate original\n matrix.rotateZ_m(element.rotationZ);\n // 4. Scale rotated element to the size of new bounding box\n matrix.scale_m(scaleX, scaleY);\n // 5. Rotate back to get the right x & y\n matrix.rotateZ_m(-element.rotationZ);\n\n // TODO: Also return skew to be fully accurate\n return {\n x: matrix.getTranslateX_m() - matrix.getScaleX_m() / 2,\n y: matrix.getTranslateY_m() - matrix.getScaleY_m() / 2,\n width: matrix.getScaleX_m(),\n height: matrix.getScaleY_m(),\n rotationZ: element.rotationZ\n };\n}\n\nexport function aspectRatioScale(element: ISize | IBounds, bounds: ISize | IBounds, fit: 'cover' | 'contain' = 'contain', rounding?: NumberRoundingFn): IBounds {\n const scaleFn = fit === 'cover' ? Math.max : Math.min;\n const roundFn = getRoundingFn(rounding);\n const scale = scaleFn(bounds.width / element.width, bounds.height / element.height);\n const width = roundFn(element.width * scale);\n const height = roundFn(element.height * scale);\n\n // Return with centered position\n return alignWithinBounds({ width, height }, bounds, 'center', 'center', rounding);\n}\n\nexport function alignWithinBounds(element: ISize, bounds: ISize | IBounds, horizontalAlign: HorizontalAlign = 'center', verticalAlign: VerticalAlign = 'center', rounding?: NumberRoundingFn): IBounds {\n const roundFn = getRoundingFn(rounding);\n const x = roundFn(alignHorizontallyWithinBounds(element.width, bounds, horizontalAlign));\n const y = roundFn(alignVerticallyWithinBounds(element.height, bounds, verticalAlign));\n return { x, y, width: element.width, height: element.height };\n}\n\nexport function alignHorizontallyWithinBounds(width: number, bounds: { x?: number, width: number }, horizontalAlign: HorizontalAlign = 'center'): number {\n\n const alignX = alignToNumber(horizontalAlign);\n return (bounds.x || 0) - (width - bounds.width) * alignX;\n}\n\nexport function alignVerticallyWithinBounds(height: number, bounds: { y?: number, height: number }, verticalAlign: VerticalAlign = 'center'): number {\n const alignY = alignToNumber(verticalAlign);\n return (bounds.y || 0) - (height - bounds.height) * alignY;\n}\n\nexport function roundBounds(bounds: IBounds, rounding: NumberRoundingFn = 'round'): IBounds {\n return {\n ...bounds,\n ...roundPosition(bounds, rounding),\n ...roundSize(bounds, rounding),\n };\n}\n\nexport function roundSize(bounds: ISize, rounding: NumberRoundingFn = 'round'): ISize {\n const roundFn = getRoundingFn(rounding);\n const { width, height } = bounds;\n return {\n width: typeof width === 'number' ? roundFn(width) : width,\n height: typeof height === 'number' ? roundFn(height) : height\n };\n}\n\nexport function roundPosition(bounds: IPosition, rounding: NumberRoundingFn = 'round'): IPosition {\n const roundFn = getRoundingFn(rounding);\n const { x, y } = bounds;\n return {\n x: typeof x === 'number' ? roundFn(x) : x,\n y: typeof y === 'number' ? roundFn(y) : y,\n };\n}\n\nfunction getRoundingFn(rounding?: NumberRoundingFn): (num: number) => number {\n return rounding && rounding !== 'none'\n ? Math[rounding]\n : (num: number): number => num;\n}\n\n/**\n * Converts an alignment to a number between 0 and 1\n * @param align\n */\nexport function alignToNumber(align: HorizontalAlign | VerticalAlign): number {\n if (typeof align === 'number') {\n return clamp(align, 0, 1);\n }\n switch (align) {\n case 'center':\n return 0.5;\n case 'left':\n case 'top':\n return 0;\n case 'right':\n case 'bottom':\n return 1;\n }\n throw new Error(`Could not convert align '${align}' to number`);\n}\n\nexport function getRatio(width: number, height: number): number {\n if (width === 0 && height === 0) {\n return 1;\n }\n if (height === 0) {\n return Number.MAX_VALUE;\n }\n return width / height;\n}\n\nexport function getBoundingboxWithinBoundary(\n box: ISize,\n maxBoundaries: ISize,\n position?: IPosition\n): IBoundingBox {\n let ratio = 1;\n if (box.width > maxBoundaries.width) {\n ratio = getRatio(maxBoundaries.width, box.width);\n }\n\n if ((box.height * ratio) > maxBoundaries.height) {\n ratio = getRatio(maxBoundaries.height, box.height);\n }\n\n const width = box.width * ratio;\n const height = box.height * ratio;\n const centerX = width / 2;\n const centerY = height / 2;\n const centerBoundaryX = maxBoundaries.width / 2;\n const centerBoundaryY = maxBoundaries.height / 2;\n\n const x = position\n ? position.x - centerX\n : centerBoundaryX - width / 2;\n\n const y = position\n ? position.y - centerY\n : centerBoundaryY - height / 2;\n\n return {\n x,\n y,\n width,\n height,\n };\n}\n\nexport function getAspectRatio(width: number, height: number): string {\n function gcd(a: number, b: number): number {\n return (b === 0) ? a : gcd(b, a % b);\n }\n const r = gcd(width, height);\n const w = width / r;\n const h = height / r;\n return `${w}:${h}`;\n}\n\nexport type HorizontalAlign = 'left' | 'center' | 'right' | number;\nexport type VerticalAlign = 'top' | 'center' | 'bottom' | number;\ntype NumberRoundingFn = 'ceil' | 'floor' | 'round' | 'none';\n","\nexport const IdentityMatrix = [\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1\n];\n\n/**\n * Class to mimic the behaviour of transform and output a matrix3d\n * Useful resources on understanding matrix3d:\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Matrix_math_for_the_web\n * https://dev.opera.com/articles/understanding-the-css-transforms-matrix/\n * https://github.com/jlmakes/rematrix\n * https://drafts.csswg.org/css-transforms-2/#decomposing-a-3d-matrix\n * https://www.senocular.com/flash/tutorials/transformmatrix/\n */\n\nconst cos = Math.cos;\nconst sin = Math.sin;\nconst tan = Math.tan;\nconst sqrt = Math.sqrt;\nconst pow = Math.pow;\n\nexport class Matrix {\n\n private _matrix: number[];\n\n constructor(matrix?: string) {\n if (matrix) {\n this.parse_m(matrix);\n }\n else {\n // Set default matrix\n this._matrix = this._getIdentityMatrix();\n }\n }\n\n parse_m(matrixString: string): Matrix {\n const c = matrixString.split(/\\s*[(),]\\s*/).slice(1, -1);\n\n if (c.length === 6) {\n // 'matrix()' (3x2)\n this._matrix = [\n +c[0], +c[2], 0, +c[4],\n +c[1], +c[3], 0, +c[5],\n 0, 0, 1, 0,\n 0, 0, 0, 1\n ];\n }\n // matrix3d() (4x4)\n else if (c.length === 16) {\n this._matrix = [\n +c[0], +c[4], +c[8], +c[12],\n +c[1], +c[5], +c[9], +c[13],\n +c[2], +c[6], +c[10], +c[14],\n +c[3], +c[7], +c[11], +c[15]\n ];\n }\n // handle 'none' or invalid values.\n else {\n this._getIdentityMatrix();\n }\n return this;\n }\n\n /**\n * Get matrix as a CSS-transform\n */\n toCSS_m(): string {\n return `matrix3d(${this._matrix.join(',')})`;\n }\n\n /**\n * Multiply current matrix with another matrix\n * @param factorMatrix\n */\n multiply_m(factorMatrix: number[]): Matrix {\n this._matrix = this._multiplyMatrices(this._matrix, factorMatrix);\n\n return this;\n }\n\n /**\n * Rotate on the x,y and z axis. Values are in radians.\n * @param x\n * @param y\n * @param z\n * @returns\n */\n rotate_m(x: number = 0, y: number = 0, z: number = 0): Matrix {\n const sinX = sin(x);\n const cosX = cos(x);\n const sinY = sin(y);\n const cosY = cos(y);\n const sinZ = sin(z);\n const cosZ = cos(z);\n\n const rotationMatrixX = [\n 1, 0, 0, 0,\n 0, cosX, -sinX, 0,\n 0, sinX, cosX, 0,\n 0, 0, 0, 1\n ];\n\n const rotationMatrixY = [\n cosY, 0, sinY, 0,\n 0, 1, 0, 0,\n -sinY, 0, cosY, 0,\n 0, 0, 0, 1\n ];\n\n const rotationMatrixZ = [\n cosZ, sinZ, 0, 0,\n -sinZ, cosZ, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1\n ];\n\n const m = this._multiplyMatrices(this._multiplyMatrices(rotationMatrixX, rotationMatrixY), rotationMatrixZ);\n\n return this.multiply_m(m);\n }\n\n /**\n * Rotate around the x axis.\n * @param radians\n * @returns\n */\n rotateX_m(radians: number): Matrix {\n const s = sin(radians);\n const c = cos(radians);\n\n return this.multiply_m([\n 1, 0, 0, 0,\n 0, c, -s, 0,\n 0, s, c, 0,\n 0, 0, 0, 1\n ]);\n }\n\n /**\n * Rotate around the y axis\n * @param radians\n * @returns\n */\n rotateY_m(radians: number): Matrix {\n const s = sin(radians);\n const c = cos(radians);\n\n return this.multiply_m([\n c, 0, s, 0,\n 0, 1, 0, 0,\n -s, 0, c, 0,\n 0, 0, 0, 1\n ]);\n }\n\n /**\n * Rotate around the z axis\n * @param radians\n * @returns\n */\n rotateZ_m(radians: number): Matrix {\n const s = sin(radians);\n const c = cos(radians);\n\n return this.multiply_m([\n c, s, 0, 0,\n -s, c, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1\n ]);\n }\n\n skew_m(x: number, y: number): Matrix {\n const tanX = tan(x);\n const tanY = tan(y);\n\n return this.multiply_m([\n 1, tanX, 0, 0,\n tanY, 1, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1\n ]);\n }\n\n translate_m(x: number, y: number, z: number = 0): Matrix {\n return this.multiply_m([\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n x, y, z, 1\n ]);\n }\n\n scale_m(x: number = 1, y: number = 1, z: number = 1): Matrix {\n return this.multiply_m([\n x, 0, 0, 0,\n 0, y, 0, 0,\n 0, 0, z, 0,\n 0, 0, 0, 1\n ]);\n }\n\n getTranslateX_m(): number {\n return this._getValue(1, 4);\n }\n getTranslateY_m(): number {\n return this._getValue(2, 4);\n }\n\n /**\n *\n */\n getTranslateZ_m(): number {\n return this._getValue(3, 4);\n }\n\n getScaleX_m(): number {\n return this._getVectorLength(this._getValue(1, 1), this._getValue(1, 2), this._getValue(1, 3));\n }\n getScaleY_m(): number {\n return this._getVectorLength(this._getValue(2, 1), this._getValue(2, 2), this._getValue(2, 3));\n }\n\n perspective_m(distance: number): Matrix {\n const matrix = this._getIdentityMatrix();\n matrix[11] = -1 / distance;\n return this.multiply_m(matrix);\n }\n\n isMirrorX_m(): boolean {\n return this._getValue(1, 1) < 0;\n }\n\n isMirrorY_m(): boolean {\n return this._getValue(2, 2) < 0;\n }\n\n // TODO: Skew\n // getSkewX(): number {\n // return -atan2(this.getValue(1, 2), this.getValue(1, 1));\n\n\n // // var my_matrix = my_mc.transform.matrix;\n\n // // var px = new flash.geom.Point(0, 1);\n // // px = my_matrix.deltaTransformPoint(px);\n // // var py = new flash.geom.Point(1, 0);\n // // py = my_matrix.deltaTransformPoint(py);\n\n // // return -atan2(this.getValue(1, 2), this.getValue(1, 1));\n\n // // trace(\"x skew: \" +((180/PI) * atan2(px.y, px.x) - 90));\n // // trace(\"y skew: \" +((180/PI) * atan2(py.y, py.x)));\n // }\n\n // getSkewY(): number {\n\n\n // // return -atan2(this.getValue(1, 1), this.getValue(1, 2));\n\n\n // // var my_matrix = my_mc.transform.matrix;\n\n // // var px = new flash.geom.Point(0, 1);\n // // px = my_matrix.deltaTransformPoint(px);\n // // var py = new flash.geom.Point(1, 0);\n // // py = my_matrix.deltaTransformPoint(py);\n\n // // return -atan2(this.getValue(1, 2), this.getValue(1, 1));\n\n // // trace(\"x skew: \" +((180/PI) * atan2(px.y, px.x) - 90));\n // // trace(\"y skew: \" +((180/PI) * atan2(py.y, py.x)));\n // }\n\n // toFormattedString(matrix: number[] = this.matrix): string {\n // let str = '';\n // matrix.forEach((num, index) => {\n // if (index > 0) {\n // str += index % 4 === 0 ? '\\n' : '\\t';\n // }\n // str += `${ num.toFixed(2) },`;\n // });\n // return str;\n // }\n\n // print(matrix: number[] = this.matrix): void {\n // console.log(this.toFormattedString(matrix));\n // }\n\n private _multiplyMatrixAndPoint(matrix: number[], point: number[]): number[] {\n\n // Give a simple variable name to each part of the matrix, a column and row number\n const c0r0 = matrix[0];\n const c1r0 = matrix[1];\n const c2r0 = matrix[2];\n const c3r0 = matrix[3];\n\n const c0r1 = matrix[4];\n const c1r1 = matrix[5];\n const c2r1 = matrix[6];\n const c3r1 = matrix[7];\n\n const c0r2 = matrix[8];\n const c1r2 = matrix[9];\n const c2r2 = matrix[10];\n const c3r2 = matrix[11];\n\n const c0r3 = matrix[12];\n const c1r3 = matrix[13];\n const c2r3 = matrix[14];\n const c3r3 = matrix[15];\n\n // Now set some simple names for the point\n const x = point[0] || 0;\n const y = point[1] || 0;\n const z = point[2] || 0;\n const w = point[3] || 0;\n\n // Multiply the point against each part of the 1st column, then add together\n const resultX = (x * c0r0) + (y * c0r1) + (z * c0r2) + (w * c0r3);\n\n // Multiply the point against each part of the 2nd column, then add together\n const resultY = (x * c1r0) + (y * c1r1) + (z * c1r2) + (w * c1r3);\n\n // Multiply the point against each part of the 3rd column, then add together\n const resultZ = (x * c2r0) + (y * c2r1) + (z * c2r2) + (w * c2r3);\n\n // Multiply the point against each part of the 4th column, then add together\n const resultW = (x * c3r0) + (y * c3r1) + (z * c3r2) + (w * c3r3);\n\n return [resultX, resultY, resultZ, resultW];\n }\n\n private _multiplyMatrices(matrixA: number[], matrixB: number[]): number[] {\n\n // A faster implementation of this function would not create\n // any new arrays. This creates arrays for code clarity.\n\n // Slice the second matrix up into rows\n const row0 = [matrixB[0], matrixB[1], matrixB[2], matrixB[3]];\n const row1 = [matrixB[4], matrixB[5], matrixB[6], matrixB[7]];\n const row2 = [matrixB[8], matrixB[9], matrixB[10], matrixB[11]];\n const row3 = [matrixB[12], matrixB[13], matrixB[14], matrixB[15]];\n\n // Multiply each row by the matrix\n const result0 = this._multiplyMatrixAndPoint( matrixA, row0 );\n const result1 = this._multiplyMatrixAndPoint( matrixA, row1 );\n const result2 = this._multiplyMatrixAndPoint( matrixA, row2 );\n const result3 = this._multiplyMatrixAndPoint( matrixA, row3 );\n\n // Turn the results back into a single matrix\n return [\n result0[0], result0[1], result0[2], result0[3],\n result1[0], result1[1], result1[2], result1[3],\n result2[0], result2[1], result2[2], result2[3],\n result3[0], result3[1], result3[2], result3[3],\n ];\n }\n\n private _getValue(col: number, row: number): number {\n return this._matrix[(row - 1) * 4 + (col - 1)];\n }\n\n private _getIdentityMatrix(): number[] {\n return IdentityMatrix.slice();\n }\n\n private _getVectorLength(x: number, y: number, z: number): number {\n return sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2));\n }\n}\n\n","import { sanitizeUrl } from './sanitizer';\n\nexport function loadImagePromise(url: string): PromiseResolver {\n return loadHtmlElement(new Image(), url);\n}\n\nexport function loadHtmlElement(element: T, url?: string): PromiseResolver {\n url = url && sanitizeUrl(url);\n const resolver = new PromiseResolver();\n element.onload = (): void => {\n resolver.resolve(element);\n };\n element.onerror = (e): void => {\n resolver.reject(e);\n };\n if (typeof url === 'string') {\n element.src = url;\n }\n return resolver;\n}\n\nexport function eventToPromise(element: HTMLElement, eventName: string): Promise {\n\n const resolver = new PromiseResolver();\n const options: AddEventListenerOptions = { once: true };\n\n element.addEventListener(eventName, resolver.resolve, options);\n return resolver.promise;\n}\n\nexport class PromiseResolver {\n resolve: (value: T | PromiseLike) => void;\n reject: any;\n promise: Promise;\n\n constructor() {\n this.promise = new Promise((res, rej) => {\n this.resolve = res;\n this.reject = rej;\n });\n }\n}\n\nexport function requestAnimationFramePromise(): Promise {\n return new Promise((resolve) => {\n requestAnimationFrame((time: number) => {\n resolve(time);\n });\n });\n}\n\nexport function sleep(milliseconds: number = 0): Promise {\n return new Promise((resolve) => {\n setTimeout(resolve, milliseconds);\n });\n}\n\n\n/**\n * Skip a number of animation frames.\n * 1 means that you skip the first and resolves on the second frame\n * @param frameToSkip\n */\nexport async function skipAnimationFrames(frameToSkip: number = 1): Promise {\n for (let i = 0; i < frameToSkip + 1; i++) {\n await requestAnimationFramePromise();\n }\n}\n","import { loadHtmlElement } from './promises';\nimport { getCookie } from './utils';\n\nlet iframe: HTMLIFrameElement | undefined;\nlet iframePromise: Promise;\n\ntype EvalWindow = Window & {\n context: IEvalWindowContext,\n evalMathExpression: Function\n};\n\ninterface IEvalWindowContext {\n sin: (x: number) => number;\n cos: (x: number) => number;\n pi: number;\n PI: number;\n abs: (x: number) => number;\n round: (x: number) => number;\n ceil: (x: number) => number;\n floor: (x: number) => number;\n pow: (x: number, p: number) => number;\n sqrt: (x: number) => number;\n random: () => number;\n}\n\n// Always include math operations\nconst defaultContext: IEvalWindowContext = {\n sin: Math.sin,\n cos: Math.cos,\n pi: Math.PI,\n PI: Math.PI,\n abs: Math.abs,\n round: Math.round,\n ceil: Math.ceil,\n floor: Math.floor,\n pow: Math.pow,\n sqrt: Math.sqrt,\n random: Math.random,\n};\n\nlet isSandboxed = false; // Checks whether in sandboxed(i.e