{"version":3,"file":"svg.min.js","sources":["../src/utils/methods.js","../src/utils/utils.js","../src/modules/core/namespaces.js","../src/utils/window.js","../src/types/Base.js","../src/utils/adopter.js","../src/modules/optional/arrange.js","../src/modules/core/regex.js","../src/types/Color.js","../src/modules/optional/class.js","../src/modules/optional/css.js","../src/modules/optional/data.js","../src/modules/optional/memory.js","../src/types/Point.js","../src/types/Matrix.js","../src/modules/core/parser.js","../src/types/Box.js","../src/types/List.js","../src/modules/core/selector.js","../src/modules/core/event.js","../src/types/EventTarget.js","../src/modules/core/defaults.js","../src/types/SVGArray.js","../src/types/SVGNumber.js","../src/modules/core/attr.js","../src/elements/Dom.js","../src/elements/Element.js","../src/modules/optional/sugar.js","../src/modules/optional/transform.js","../src/elements/Container.js","../src/elements/Defs.js","../src/elements/Shape.js","../src/modules/core/circled.js","../src/elements/Ellipse.js","../src/elements/Fragment.js","../src/modules/core/gradiented.js","../src/elements/Gradient.js","../src/elements/Pattern.js","../src/elements/Image.js","../src/types/PointArray.js","../src/modules/core/pointed.js","../src/elements/Line.js","../src/elements/Marker.js","../src/animation/Controller.js","../src/utils/pathParser.js","../src/types/PathArray.js","../src/animation/Morphable.js","../src/elements/Path.js","../src/modules/core/poly.js","../src/elements/Polygon.js","../src/elements/Polyline.js","../src/elements/Rect.js","../src/animation/Queue.js","../src/animation/Animator.js","../src/animation/Timeline.js","../src/animation/Runner.js","../src/elements/Svg.js","../src/elements/Symbol.js","../src/modules/core/textable.js","../src/elements/Text.js","../src/elements/Tspan.js","../src/elements/Circle.js","../src/elements/ClipPath.js","../src/elements/ForeignObject.js","../src/modules/core/containerGeometry.js","../src/elements/G.js","../src/elements/A.js","../src/elements/Mask.js","../src/elements/Stop.js","../src/elements/Style.js","../src/elements/TextPath.js","../src/elements/Use.js","../src/main.js","../src/svg.js"],"sourcesContent":["const methods = {}\r\nconst names = []\r\n\r\nexport function registerMethods (name, m) {\r\n if (Array.isArray(name)) {\r\n for (const _name of name) {\r\n registerMethods(_name, m)\r\n }\r\n return\r\n }\r\n\r\n if (typeof name === 'object') {\r\n for (const _name in name) {\r\n registerMethods(_name, name[_name])\r\n }\r\n return\r\n }\r\n\r\n addMethodNames(Object.getOwnPropertyNames(m))\r\n methods[name] = Object.assign(methods[name] || {}, m)\r\n}\r\n\r\nexport function getMethodsFor (name) {\r\n return methods[name] || {}\r\n}\r\n\r\nexport function getMethodNames () {\r\n return [ ...new Set(names) ]\r\n}\r\n\r\nexport function addMethodNames (_names) {\r\n names.push(..._names)\r\n}\r\n","// Map function\r\nexport function map (array, block) {\r\n let i\r\n const il = array.length\r\n const result = []\r\n\r\n for (i = 0; i < il; i++) {\r\n result.push(block(array[i]))\r\n }\r\n\r\n return result\r\n}\r\n\r\n// Filter function\r\nexport function filter (array, block) {\r\n let i\r\n const il = array.length\r\n const result = []\r\n\r\n for (i = 0; i < il; i++) {\r\n if (block(array[i])) {\r\n result.push(array[i])\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\n// Degrees to radians\r\nexport function radians (d) {\r\n return d % 360 * Math.PI / 180\r\n}\r\n\r\n// Radians to degrees\r\nexport function degrees (r) {\r\n return r * 180 / Math.PI % 360\r\n}\r\n\r\n// Convert dash-separated-string to camelCase\r\nexport function camelCase (s) {\r\n return s.toLowerCase().replace(/-(.)/g, function (m, g) {\r\n return g.toUpperCase()\r\n })\r\n}\r\n\r\n// Convert camel cased string to dash separated\r\nexport function unCamelCase (s) {\r\n return s.replace(/([A-Z])/g, function (m, g) {\r\n return '-' + g.toLowerCase()\r\n })\r\n}\r\n\r\n// Capitalize first letter of a string\r\nexport function capitalize (s) {\r\n return s.charAt(0).toUpperCase() + s.slice(1)\r\n}\r\n\r\n// Calculate proportional width and height values when necessary\r\nexport function proportionalSize (element, width, height, box) {\r\n if (width == null || height == null) {\r\n box = box || element.bbox()\r\n\r\n if (width == null) {\r\n width = box.width / box.height * height\r\n } else if (height == null) {\r\n height = box.height / box.width * width\r\n }\r\n }\r\n\r\n return {\r\n width: width,\r\n height: height\r\n }\r\n}\r\n\r\n/**\r\n * This function adds support for string origins.\r\n * It searches for an origin in o.origin o.ox and o.originX.\r\n * This way, origin: {x: 'center', y: 50} can be passed as well as ox: 'center', oy: 50\r\n**/\r\nexport function getOrigin (o, element) {\r\n const origin = o.origin\r\n // First check if origin is in ox or originX\r\n let ox = o.ox != null\n ? o.ox\r\n : o.originX != null\n ? o.originX\r\n : 'center'\r\n let oy = o.oy != null\n ? o.oy\r\n : o.originY != null\n ? o.originY\r\n : 'center'\r\n\r\n // Then check if origin was used and overwrite in that case\r\n if (origin != null) {\r\n [ ox, oy ] = Array.isArray(origin)\n ? origin\r\n : typeof origin === 'object'\n ? [ origin.x, origin.y ]\r\n : [ origin, origin ]\r\n }\r\n\r\n // Make sure to only call bbox when actually needed\r\n const condX = typeof ox === 'string'\r\n const condY = typeof oy === 'string'\r\n if (condX || condY) {\r\n const { height, width, x, y } = element.bbox()\r\n\r\n // And only overwrite if string was passed for this specific axis\r\n if (condX) {\r\n ox = ox.includes('left')\n ? x\r\n : ox.includes('right')\n ? x + width\r\n : x + width / 2\r\n }\r\n\r\n if (condY) {\r\n oy = oy.includes('top')\n ? y\r\n : oy.includes('bottom')\n ? y + height\r\n : y + height / 2\r\n }\r\n }\r\n\r\n // Return the origin as it is if it wasn't a string\r\n return [ ox, oy ]\r\n}\r\n","// Default namespaces\nexport const svg = 'http://www.w3.org/2000/svg'\nexport const html = 'http://www.w3.org/1999/xhtml'\nexport const xmlns = 'http://www.w3.org/2000/xmlns/'\nexport const xlink = 'http://www.w3.org/1999/xlink'\nexport const svgjs = 'http://svgjs.dev/svgjs'\n","export const globals = {\r\n window: typeof window === 'undefined' ? null : window,\r\n document: typeof document === 'undefined' ? null : document\r\n}\r\n\r\nexport function registerWindow (win = null, doc = null) {\r\n globals.window = win\r\n globals.document = doc\r\n}\r\n\r\nconst save = {}\r\n\r\nexport function saveWindow () {\r\n save.window = globals.window\r\n save.document = globals.document\r\n}\r\n\r\nexport function restoreWindow () {\r\n globals.window = save.window\r\n globals.document = save.document\r\n}\r\n\r\nexport function withWindow (win, fn) {\r\n saveWindow()\r\n registerWindow(win, win.document)\r\n fn(win, win.document)\r\n restoreWindow()\r\n}\r\n\r\nexport function getWindow () {\r\n return globals.window\r\n}\r\n","export default class Base {\r\n // constructor (node/*, {extensions = []} */) {\r\n // // this.tags = []\r\n // //\r\n // // for (let extension of extensions) {\r\n // // extension.setup.call(this, node)\r\n // // this.tags.push(extension.name)\r\n // // }\r\n // }\r\n}\r\n","import { addMethodNames } from './methods.js'\nimport { capitalize } from './utils.js'\nimport { svg } from '../modules/core/namespaces.js'\nimport { globals } from '../utils/window.js'\nimport Base from '../types/Base.js'\n\nconst elements = {}\nexport const root = '___SYMBOL___ROOT___'\n\n// Method for element creation\nexport function create (name, ns = svg) {\n // create element\n return globals.document.createElementNS(ns, name)\n}\n\nexport function makeInstance (element, isHTML = false) {\n if (element instanceof Base) return element\n\n if (typeof element === 'object') {\n return adopter(element)\n }\n\n if (element == null) {\n return new elements[root]()\n }\n\n if (typeof element === 'string' && element.charAt(0) !== '<') {\n return adopter(globals.document.querySelector(element))\n }\n\n // Make sure, that HTML elements are created with the correct namespace\n const wrapper = isHTML ? globals.document.createElement('div') : create('svg')\n wrapper.innerHTML = element\n\n // We can use firstChild here because we know,\n // that the first char is < and thus an element\n element = adopter(wrapper.firstChild)\n\n // make sure, that element doesnt have its wrapper attached\n wrapper.removeChild(wrapper.firstChild)\n return element\n}\n\nexport function nodeOrNew (name, node) {\n return (node && node.ownerDocument && node instanceof node.ownerDocument.defaultView.Node) ? node : create(name)\n}\n\n// Adopt existing svg elements\nexport function adopt (node) {\n // check for presence of node\n if (!node) return null\n\n // make sure a node isn't already adopted\n if (node.instance instanceof Base) return node.instance\n\n if (node.nodeName === '#document-fragment') {\n return new elements.Fragment(node)\n }\n\n // initialize variables\n let className = capitalize(node.nodeName || 'Dom')\n\n // Make sure that gradients are adopted correctly\n if (className === 'LinearGradient' || className === 'RadialGradient') {\n className = 'Gradient'\n\n // Fallback to Dom if element is not known\n } else if (!elements[className]) {\n className = 'Dom'\n }\n\n return new elements[className](node)\n}\n\nlet adopter = adopt\n\nexport function mockAdopt (mock = adopt) {\n adopter = mock\n}\n\nexport function register (element, name = element.name, asRoot = false) {\n elements[name] = element\n if (asRoot) elements[root] = element\n\n addMethodNames(Object.getOwnPropertyNames(element.prototype))\n\n return element\n}\n\nexport function getClass (name) {\n return elements[name]\n}\n\n// Element id sequence\nlet did = 1000\n\n// Get next named element id\nexport function eid (name) {\n return 'Svgjs' + capitalize(name) + (did++)\n}\n\n// Deep new id assignment\nexport function assignNewId (node) {\n // do the same for SVG child nodes as well\n for (let i = node.children.length - 1; i >= 0; i--) {\n assignNewId(node.children[i])\n }\n\n if (node.id) {\n node.id = eid(node.nodeName)\n return node\n }\n\n return node\n}\n\n// Method for extending objects\nexport function extend (modules, methods) {\n let key, i\n\n modules = Array.isArray(modules) ? modules : [ modules ]\n\n for (i = modules.length - 1; i >= 0; i--) {\n for (key in methods) {\n modules[i].prototype[key] = methods[key]\n }\n }\n}\n\nexport function wrapWithAttrCheck (fn) {\n return function (...args) {\n const o = args[args.length - 1]\n\n if (o && o.constructor === Object && !(o instanceof Array)) {\n return fn.apply(this, args.slice(0, -1)).attr(o)\n } else {\n return fn.apply(this, args)\n }\n }\n}\n","import { makeInstance } from '../../utils/adopter.js'\r\nimport { registerMethods } from '../../utils/methods.js'\r\n\r\n// Get all siblings, including myself\r\nexport function siblings () {\r\n return this.parent().children()\r\n}\r\n\r\n// Get the current position siblings\r\nexport function position () {\r\n return this.parent().index(this)\r\n}\r\n\r\n// Get the next element (will return null if there is none)\r\nexport function next () {\r\n return this.siblings()[this.position() + 1]\r\n}\r\n\r\n// Get the next element (will return null if there is none)\r\nexport function prev () {\r\n return this.siblings()[this.position() - 1]\r\n}\r\n\r\n// Send given element one step forward\r\nexport function forward () {\r\n const i = this.position()\r\n const p = this.parent()\r\n\r\n // move node one step forward\r\n p.add(this.remove(), i + 1)\r\n\r\n return this\r\n}\r\n\r\n// Send given element one step backward\r\nexport function backward () {\r\n const i = this.position()\r\n const p = this.parent()\r\n\r\n p.add(this.remove(), i ? i - 1 : 0)\r\n\r\n return this\r\n}\r\n\r\n// Send given element all the way to the front\r\nexport function front () {\r\n const p = this.parent()\r\n\r\n // Move node forward\r\n p.add(this.remove())\r\n\r\n return this\r\n}\r\n\r\n// Send given element all the way to the back\r\nexport function back () {\r\n const p = this.parent()\r\n\r\n // Move node back\r\n p.add(this.remove(), 0)\r\n\r\n return this\r\n}\r\n\r\n// Inserts a given element before the targeted element\r\nexport function before (element) {\r\n element = makeInstance(element)\r\n element.remove()\r\n\r\n const i = this.position()\r\n\r\n this.parent().add(element, i)\r\n\r\n return this\r\n}\r\n\r\n// Inserts a given element after the targeted element\r\nexport function after (element) {\r\n element = makeInstance(element)\r\n element.remove()\r\n\r\n const i = this.position()\r\n\r\n this.parent().add(element, i + 1)\r\n\r\n return this\r\n}\r\n\r\nexport function insertBefore (element) {\r\n element = makeInstance(element)\r\n element.before(this)\r\n return this\r\n}\r\n\r\nexport function insertAfter (element) {\r\n element = makeInstance(element)\r\n element.after(this)\r\n return this\r\n}\r\n\r\nregisterMethods('Dom', {\r\n siblings,\r\n position,\r\n next,\r\n prev,\r\n forward,\r\n backward,\r\n front,\r\n back,\r\n before,\r\n after,\r\n insertBefore,\r\n insertAfter\r\n})\r\n","// Parse unit value\r\nexport const numberAndUnit = /^([+-]?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?)([a-z%]*)$/i\r\n\r\n// Parse hex value\r\nexport const hex = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i\r\n\r\n// Parse rgb value\r\nexport const rgb = /rgb\\((\\d+),(\\d+),(\\d+)\\)/\r\n\r\n// Parse reference id\r\nexport const reference = /(#[a-z_][a-z0-9\\-_]*)/i\r\n\r\n// splits a transformation chain\r\nexport const transforms = /\\)\\s*,?\\s*/\r\n\r\n// Whitespace\r\nexport const whitespace = /\\s/g\r\n\r\n// Test hex value\r\nexport const isHex = /^#[a-f0-9]{3}$|^#[a-f0-9]{6}$/i\r\n\r\n// Test rgb value\r\nexport const isRgb = /^rgb\\(/\r\n\r\n// Test for blank string\r\nexport const isBlank = /^(\\s+)?$/\r\n\r\n// Test for numeric string\r\nexport const isNumber = /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i\r\n\r\n// Test for image url\r\nexport const isImage = /\\.(jpg|jpeg|png|gif|svg)(\\?[^=]+.*)?/i\r\n\r\n// split at whitespace and comma\r\nexport const delimiter = /[\\s,]+/\r\n\r\n// Test for path letter\r\nexport const isPathLetter = /[MLHVCSQTAZ]/i\r\n","\r\nimport { hex, isHex, isRgb, rgb, whitespace } from '../modules/core/regex.js'\r\n\r\nfunction sixDigitHex (hex) {\r\n return hex.length === 4\r\n ? [ '#',\r\n hex.substring(1, 2), hex.substring(1, 2),\r\n hex.substring(2, 3), hex.substring(2, 3),\r\n hex.substring(3, 4), hex.substring(3, 4)\r\n ].join('')\r\n : hex\r\n}\r\n\r\nfunction componentHex (component) {\r\n const integer = Math.round(component)\r\n const bounded = Math.max(0, Math.min(255, integer))\r\n const hex = bounded.toString(16)\r\n return hex.length === 1 ? '0' + hex : hex\r\n}\r\n\r\nfunction is (object, space) {\r\n for (let i = space.length; i--;) {\r\n if (object[space[i]] == null) {\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n\r\nfunction getParameters (a, b) {\r\n const params = is(a, 'rgb')\n ? { _a: a.r, _b: a.g, _c: a.b, _d: 0, space: 'rgb' }\r\n : is(a, 'xyz')\n ? { _a: a.x, _b: a.y, _c: a.z, _d: 0, space: 'xyz' }\r\n : is(a, 'hsl')\n ? { _a: a.h, _b: a.s, _c: a.l, _d: 0, space: 'hsl' }\r\n : is(a, 'lab')\n ? { _a: a.l, _b: a.a, _c: a.b, _d: 0, space: 'lab' }\r\n : is(a, 'lch')\n ? { _a: a.l, _b: a.c, _c: a.h, _d: 0, space: 'lch' }\r\n : is(a, 'cmyk')\n ? { _a: a.c, _b: a.m, _c: a.y, _d: a.k, space: 'cmyk' }\r\n : { _a: 0, _b: 0, _c: 0, space: 'rgb' }\r\n\r\n params.space = b || params.space\r\n return params\r\n}\r\n\r\nfunction cieSpace (space) {\r\n if (space === 'lab' || space === 'xyz' || space === 'lch') {\r\n return true\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nfunction hueToRgb (p, q, t) {\r\n if (t < 0) t += 1\r\n if (t > 1) t -= 1\r\n if (t < 1 / 6) return p + (q - p) * 6 * t\r\n if (t < 1 / 2) return q\r\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6\r\n return p\r\n}\r\n\r\nexport default class Color {\r\n constructor (...inputs) {\r\n this.init(...inputs)\r\n }\r\n\r\n // Test if given value is a color\n static isColor (color) {\r\n return color && (\r\n color instanceof Color\r\n || this.isRgb(color)\r\n || this.test(color)\r\n )\r\n }\n\n // Test if given value is an rgb object\n static isRgb (color) {\r\n return color && typeof color.r === 'number'\r\n && typeof color.g === 'number'\r\n && typeof color.b === 'number'\r\n }\n\n /*\r\n Generating random colors\r\n */\n static random (mode = 'vibrant', t, u) {\r\n\r\n // Get the math modules\r\n const { random, round, sin, PI: pi } = Math\r\n\r\n // Run the correct generator\r\n if (mode === 'vibrant') {\r\n\r\n const l = (81 - 57) * random() + 57\r\n const c = (83 - 45) * random() + 45\r\n const h = 360 * random()\r\n const color = new Color(l, c, h, 'lch')\r\n return color\r\n\r\n } else if (mode === 'sine') {\r\n\r\n t = t == null ? random() : t\r\n const r = round(80 * sin(2 * pi * t / 0.5 + 0.01) + 150)\r\n const g = round(50 * sin(2 * pi * t / 0.5 + 4.6) + 200)\r\n const b = round(100 * sin(2 * pi * t / 0.5 + 2.3) + 150)\r\n const color = new Color(r, g, b)\r\n return color\r\n\r\n } else if (mode === 'pastel') {\r\n\r\n const l = (94 - 86) * random() + 86\r\n const c = (26 - 9) * random() + 9\r\n const h = 360 * random()\r\n const color = new Color(l, c, h, 'lch')\r\n return color\r\n\r\n } else if (mode === 'dark') {\r\n\r\n const l = 10 + 10 * random()\r\n const c = (125 - 75) * random() + 86\r\n const h = 360 * random()\r\n const color = new Color(l, c, h, 'lch')\r\n return color\r\n\r\n } else if (mode === 'rgb') {\r\n\r\n const r = 255 * random()\r\n const g = 255 * random()\r\n const b = 255 * random()\r\n const color = new Color(r, g, b)\r\n return color\r\n\r\n } else if (mode === 'lab') {\r\n\r\n const l = 100 * random()\r\n const a = 256 * random() - 128\r\n const b = 256 * random() - 128\r\n const color = new Color(l, a, b, 'lab')\r\n return color\r\n\r\n } else if (mode === 'grey') {\r\n\r\n const grey = 255 * random()\r\n const color = new Color(grey, grey, grey)\r\n return color\r\n\r\n } else {\r\n\r\n throw new Error('Unsupported random color mode')\r\n\r\n }\r\n }\n\n // Test if given value is a color string\n static test (color) {\r\n return (typeof color === 'string')\r\n && (isHex.test(color) || isRgb.test(color))\r\n }\n\n cmyk () {\r\n\r\n // Get the rgb values for the current color\r\n const { _a, _b, _c } = this.rgb()\r\n const [ r, g, b ] = [ _a, _b, _c ].map(v => v / 255)\r\n\r\n // Get the cmyk values in an unbounded format\r\n const k = Math.min(1 - r, 1 - g, 1 - b)\r\n\r\n if (k === 1) {\r\n // Catch the black case\r\n return new Color(0, 0, 0, 1, 'cmyk')\r\n }\r\n\r\n const c = (1 - r - k) / (1 - k)\r\n const m = (1 - g - k) / (1 - k)\r\n const y = (1 - b - k) / (1 - k)\r\n\r\n // Construct the new color\r\n const color = new Color(c, m, y, k, 'cmyk')\r\n return color\r\n }\n\n hsl () {\r\n\r\n // Get the rgb values\r\n const { _a, _b, _c } = this.rgb()\r\n const [ r, g, b ] = [ _a, _b, _c ].map(v => v / 255)\r\n\r\n // Find the maximum and minimum values to get the lightness\r\n const max = Math.max(r, g, b)\r\n const min = Math.min(r, g, b)\r\n const l = (max + min) / 2\r\n\r\n // If the r, g, v values are identical then we are grey\r\n const isGrey = max === min\r\n\r\n // Calculate the hue and saturation\r\n const delta = max - min\r\n const s = isGrey\n ? 0\r\n : l > 0.5\n ? delta / (2 - max - min)\r\n : delta / (max + min)\r\n const h = isGrey\n ? 0\r\n : max === r\n ? ((g - b) / delta + (g < b ? 6 : 0)) / 6\r\n : max === g\n ? ((b - r) / delta + 2) / 6\r\n : max === b\n ? ((r - g) / delta + 4) / 6\r\n : 0\r\n\r\n // Construct and return the new color\r\n const color = new Color(360 * h, 100 * s, 100 * l, 'hsl')\r\n return color\r\n }\n\n init (a = 0, b = 0, c = 0, d = 0, space = 'rgb') {\r\n // This catches the case when a falsy value is passed like ''\r\n a = !a ? 0 : a\r\n\r\n // Reset all values in case the init function is rerun with new color space\r\n if (this.space) {\r\n for (const component in this.space) {\r\n delete this[this.space[component]]\r\n }\r\n }\r\n\r\n if (typeof a === 'number') {\r\n // Allow for the case that we don't need d...\r\n space = typeof d === 'string' ? d : space\r\n d = typeof d === 'string' ? 0 : d\r\n\r\n // Assign the values straight to the color\r\n Object.assign(this, { _a: a, _b: b, _c: c, _d: d, space })\r\n // If the user gave us an array, make the color from it\r\n } else if (a instanceof Array) {\r\n this.space = b || (typeof a[3] === 'string' ? a[3] : a[4]) || 'rgb'\r\n Object.assign(this, { _a: a[0], _b: a[1], _c: a[2], _d: a[3] || 0 })\r\n } else if (a instanceof Object) {\r\n // Set the object up and assign its values directly\r\n const values = getParameters(a, b)\r\n Object.assign(this, values)\r\n } else if (typeof a === 'string') {\r\n if (isRgb.test(a)) {\r\n const noWhitespace = a.replace(whitespace, '')\r\n const [ _a, _b, _c ] = rgb.exec(noWhitespace)\r\n .slice(1, 4).map(v => parseInt(v))\r\n Object.assign(this, { _a, _b, _c, _d: 0, space: 'rgb' })\r\n } else if (isHex.test(a)) {\r\n const hexParse = v => parseInt(v, 16)\r\n const [ , _a, _b, _c ] = hex.exec(sixDigitHex(a)).map(hexParse)\r\n Object.assign(this, { _a, _b, _c, _d: 0, space: 'rgb' })\r\n } else throw Error('Unsupported string format, can\\'t construct Color')\r\n }\r\n\r\n // Now add the components as a convenience\r\n const { _a, _b, _c, _d } = this\r\n const components = this.space === 'rgb'\n ? { r: _a, g: _b, b: _c }\r\n : this.space === 'xyz'\n ? { x: _a, y: _b, z: _c }\r\n : this.space === 'hsl'\n ? { h: _a, s: _b, l: _c }\r\n : this.space === 'lab'\n ? { l: _a, a: _b, b: _c }\r\n : this.space === 'lch'\n ? { l: _a, c: _b, h: _c }\r\n : this.space === 'cmyk'\n ? { c: _a, m: _b, y: _c, k: _d }\r\n : {}\r\n Object.assign(this, components)\r\n }\r\n\r\n lab () {\r\n // Get the xyz color\r\n const { x, y, z } = this.xyz()\r\n\r\n // Get the lab components\r\n const l = (116 * y) - 16\r\n const a = 500 * (x - y)\r\n const b = 200 * (y - z)\r\n\r\n // Construct and return a new color\r\n const color = new Color(l, a, b, 'lab')\r\n return color\r\n }\n\n lch () {\r\n\r\n // Get the lab color directly\r\n const { l, a, b } = this.lab()\r\n\r\n // Get the chromaticity and the hue using polar coordinates\r\n const c = Math.sqrt(a ** 2 + b ** 2)\r\n let h = 180 * Math.atan2(b, a) / Math.PI\r\n if (h < 0) {\r\n h *= -1\r\n h = 360 - h\r\n }\r\n\r\n // Make a new color and return it\r\n const color = new Color(l, c, h, 'lch')\r\n return color\r\n }\n /*\r\n Conversion Methods\r\n */\r\n\r\n rgb () {\r\n if (this.space === 'rgb') {\r\n return this\r\n } else if (cieSpace(this.space)) {\r\n // Convert to the xyz color space\r\n let { x, y, z } = this\r\n if (this.space === 'lab' || this.space === 'lch') {\r\n // Get the values in the lab space\r\n let { l, a, b } = this\r\n if (this.space === 'lch') {\r\n const { c, h } = this\r\n const dToR = Math.PI / 180\r\n a = c * Math.cos(dToR * h)\r\n b = c * Math.sin(dToR * h)\r\n }\r\n\r\n // Undo the nonlinear function\r\n const yL = (l + 16) / 116\r\n const xL = a / 500 + yL\r\n const zL = yL - b / 200\r\n\r\n // Get the xyz values\r\n const ct = 16 / 116\r\n const mx = 0.008856\r\n const nm = 7.787\r\n x = 0.95047 * ((xL ** 3 > mx) ? xL ** 3 : (xL - ct) / nm)\r\n y = 1.00000 * ((yL ** 3 > mx) ? yL ** 3 : (yL - ct) / nm)\r\n z = 1.08883 * ((zL ** 3 > mx) ? zL ** 3 : (zL - ct) / nm)\r\n }\r\n\r\n // Convert xyz to unbounded rgb values\r\n const rU = x * 3.2406 + y * -1.5372 + z * -0.4986\r\n const gU = x * -0.9689 + y * 1.8758 + z * 0.0415\r\n const bU = x * 0.0557 + y * -0.2040 + z * 1.0570\r\n\r\n // Convert the values to true rgb values\r\n const pow = Math.pow\r\n const bd = 0.0031308\r\n const r = (rU > bd) ? (1.055 * pow(rU, 1 / 2.4) - 0.055) : 12.92 * rU\r\n const g = (gU > bd) ? (1.055 * pow(gU, 1 / 2.4) - 0.055) : 12.92 * gU\r\n const b = (bU > bd) ? (1.055 * pow(bU, 1 / 2.4) - 0.055) : 12.92 * bU\r\n\r\n // Make and return the color\r\n const color = new Color(255 * r, 255 * g, 255 * b)\r\n return color\r\n } else if (this.space === 'hsl') {\r\n // https://bgrins.github.io/TinyColor/docs/tinycolor.html\r\n // Get the current hsl values\r\n let { h, s, l } = this\r\n h /= 360\r\n s /= 100\r\n l /= 100\r\n\r\n // If we are grey, then just make the color directly\r\n if (s === 0) {\r\n l *= 255\r\n const color = new Color(l, l, l)\r\n return color\r\n }\r\n\r\n // TODO I have no idea what this does :D If you figure it out, tell me!\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s\r\n const p = 2 * l - q\r\n\r\n // Get the rgb values\r\n const r = 255 * hueToRgb(p, q, h + 1 / 3)\r\n const g = 255 * hueToRgb(p, q, h)\r\n const b = 255 * hueToRgb(p, q, h - 1 / 3)\r\n\r\n // Make a new color\r\n const color = new Color(r, g, b)\r\n return color\r\n } else if (this.space === 'cmyk') {\r\n // https://gist.github.com/felipesabino/5066336\r\n // Get the normalised cmyk values\r\n const { c, m, y, k } = this\r\n\r\n // Get the rgb values\r\n const r = 255 * (1 - Math.min(1, c * (1 - k) + k))\r\n const g = 255 * (1 - Math.min(1, m * (1 - k) + k))\r\n const b = 255 * (1 - Math.min(1, y * (1 - k) + k))\r\n\r\n // Form the color and return it\r\n const color = new Color(r, g, b)\r\n return color\r\n } else {\r\n return this\r\n }\r\n }\r\n\n toArray () {\r\n const { _a, _b, _c, _d, space } = this\r\n return [ _a, _b, _c, _d, space ]\r\n }\n\n toHex () {\r\n const [ r, g, b ] = this._clamped().map(componentHex)\r\n return `#${r}${g}${b}`\r\n }\n\n toRgb () {\r\n const [ rV, gV, bV ] = this._clamped()\r\n const string = `rgb(${rV},${gV},${bV})`\r\n return string\r\n }\n\n toString () {\r\n return this.toHex()\r\n }\n\n xyz () {\r\n\r\n // Normalise the red, green and blue values\r\n const { _a: r255, _b: g255, _c: b255 } = this.rgb()\r\n const [ r, g, b ] = [ r255, g255, b255 ].map(v => v / 255)\r\n\r\n // Convert to the lab rgb space\r\n const rL = (r > 0.04045) ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92\r\n const gL = (g > 0.04045) ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92\r\n const bL = (b > 0.04045) ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92\r\n\r\n // Convert to the xyz color space without bounding the values\r\n const xU = (rL * 0.4124 + gL * 0.3576 + bL * 0.1805) / 0.95047\r\n const yU = (rL * 0.2126 + gL * 0.7152 + bL * 0.0722) / 1.00000\r\n const zU = (rL * 0.0193 + gL * 0.1192 + bL * 0.9505) / 1.08883\r\n\r\n // Get the proper xyz values by applying the bounding\r\n const x = (xU > 0.008856) ? Math.pow(xU, 1 / 3) : (7.787 * xU) + 16 / 116\r\n const y = (yU > 0.008856) ? Math.pow(yU, 1 / 3) : (7.787 * yU) + 16 / 116\r\n const z = (zU > 0.008856) ? Math.pow(zU, 1 / 3) : (7.787 * zU) + 16 / 116\r\n\r\n // Make and return the color\r\n const color = new Color(x, y, z, 'xyz')\r\n return color\r\n }\r\n\n /*\r\n Input and Output methods\r\n */\r\n\r\n _clamped () {\r\n const { _a, _b, _c } = this.rgb()\r\n const { max, min, round } = Math\r\n const format = v => max(0, min(round(v), 255))\r\n return [ _a, _b, _c ].map(format)\r\n }\r\n\r\n /*\r\n Constructing colors\r\n */\r\n\r\n}\r\n","import { delimiter } from '../core/regex.js'\r\nimport { registerMethods } from '../../utils/methods.js'\r\n\r\n// Return array of classes on the node\r\nexport function classes () {\r\n const attr = this.attr('class')\r\n return attr == null ? [] : attr.trim().split(delimiter)\r\n}\r\n\r\n// Return true if class exists on the node, false otherwise\r\nexport function hasClass (name) {\r\n return this.classes().indexOf(name) !== -1\r\n}\r\n\r\n// Add class to the node\r\nexport function addClass (name) {\r\n if (!this.hasClass(name)) {\r\n const array = this.classes()\r\n array.push(name)\r\n this.attr('class', array.join(' '))\r\n }\r\n\r\n return this\r\n}\r\n\r\n// Remove class from the node\r\nexport function removeClass (name) {\r\n if (this.hasClass(name)) {\r\n this.attr('class', this.classes().filter(function (c) {\r\n return c !== name\r\n }).join(' '))\r\n }\r\n\r\n return this\r\n}\r\n\r\n// Toggle the presence of a class on the node\r\nexport function toggleClass (name) {\r\n return this.hasClass(name) ? this.removeClass(name) : this.addClass(name)\r\n}\r\n\r\nregisterMethods('Dom', {\r\n classes, hasClass, addClass, removeClass, toggleClass\r\n})\r\n","import { camelCase } from '../../utils/utils.js'\r\nimport { isBlank } from '../core/regex.js'\r\nimport { registerMethods } from '../../utils/methods.js'\r\n\r\n// Dynamic style generator\r\nexport function css (style, val) {\r\n const ret = {}\r\n if (arguments.length === 0) {\r\n // get full style as object\r\n this.node.style.cssText.split(/\\s*;\\s*/)\r\n .filter(function (el) {\r\n return !!el.length\r\n })\r\n .forEach(function (el) {\r\n const t = el.split(/\\s*:\\s*/)\r\n ret[t[0]] = t[1]\r\n })\r\n return ret\r\n }\r\n\r\n if (arguments.length < 2) {\r\n // get style properties as array\r\n if (Array.isArray(style)) {\r\n for (const name of style) {\r\n const cased = camelCase(name)\r\n ret[name] = this.node.style[cased]\r\n }\r\n return ret\r\n }\r\n\r\n // get style for property\r\n if (typeof style === 'string') {\r\n return this.node.style[camelCase(style)]\r\n }\r\n\r\n // set styles in object\r\n if (typeof style === 'object') {\r\n for (const name in style) {\r\n // set empty string if null/undefined/'' was given\r\n this.node.style[camelCase(name)]\r\n = (style[name] == null || isBlank.test(style[name])) ? '' : style[name]\r\n }\r\n }\r\n }\r\n\r\n // set style for property\r\n if (arguments.length === 2) {\r\n this.node.style[camelCase(style)]\r\n = (val == null || isBlank.test(val)) ? '' : val\r\n }\r\n\r\n return this\r\n}\r\n\r\n// Show element\r\nexport function show () {\r\n return this.css('display', '')\r\n}\r\n\r\n// Hide element\r\nexport function hide () {\r\n return this.css('display', 'none')\r\n}\r\n\r\n// Is element visible?\r\nexport function visible () {\r\n return this.css('display') !== 'none'\r\n}\r\n\r\nregisterMethods('Dom', {\r\n css, show, hide, visible\r\n})\r\n","import { registerMethods } from '../../utils/methods.js'\r\nimport { filter, map } from '../../utils/utils.js'\r\n\r\n// Store data values on svg nodes\r\nexport function data (a, v, r) {\r\n if (a == null) {\r\n // get an object of attributes\r\n return this.data(map(filter(this.node.attributes, (el) => el.nodeName.indexOf('data-') === 0), (el) => el.nodeName.slice(5)))\r\n } else if (a instanceof Array) {\r\n const data = {}\r\n for (const key of a) {\r\n data[key] = this.data(key)\r\n }\r\n return data\r\n } else if (typeof a === 'object') {\r\n for (v in a) {\r\n this.data(v, a[v])\r\n }\r\n } else if (arguments.length < 2) {\r\n try {\r\n return JSON.parse(this.attr('data-' + a))\r\n } catch (e) {\r\n return this.attr('data-' + a)\r\n }\r\n } else {\r\n this.attr('data-' + a,\r\n v === null\n ? null\r\n : r === true || typeof v === 'string' || typeof v === 'number'\n ? v\r\n : JSON.stringify(v)\r\n )\r\n }\r\n\r\n return this\r\n}\r\n\r\nregisterMethods('Dom', { data })\r\n","import { registerMethods } from '../../utils/methods.js'\r\n\r\n// Remember arbitrary data\r\nexport function remember (k, v) {\r\n // remember every item in an object individually\r\n if (typeof arguments[0] === 'object') {\r\n for (const key in k) {\r\n this.remember(key, k[key])\r\n }\r\n } else if (arguments.length === 1) {\r\n // retrieve memory\r\n return this.memory()[k]\r\n } else {\r\n // store memory\r\n this.memory()[k] = v\r\n }\r\n\r\n return this\r\n}\r\n\r\n// Erase a given memory\r\nexport function forget () {\r\n if (arguments.length === 0) {\r\n this._memory = {}\r\n } else {\r\n for (let i = arguments.length - 1; i >= 0; i--) {\r\n delete this.memory()[arguments[i]]\r\n }\r\n }\r\n return this\r\n}\r\n\r\n// This triggers creation of a new hidden class which is not performant\r\n// However, this function is not rarely used so it will not happen frequently\r\n// Return local memory object\r\nexport function memory () {\r\n return (this._memory = this._memory || {})\r\n}\r\n\r\nregisterMethods('Dom', { remember, forget, memory })\r\n","import Matrix from './Matrix.js'\r\n\r\nexport default class Point {\r\n // Initialize\r\n constructor (...args) {\r\n this.init(...args)\r\n }\r\n\r\n // Clone point\n clone () {\r\n return new Point(this)\r\n }\n\n init (x, y) {\r\n const base = { x: 0, y: 0 }\r\n\r\n // ensure source as object\r\n const source = Array.isArray(x)\n ? { x: x[0], y: x[1] }\r\n : typeof x === 'object'\n ? { x: x.x, y: x.y }\r\n : { x: x, y: y }\r\n\r\n // merge source\r\n this.x = source.x == null ? base.x : source.x\r\n this.y = source.y == null ? base.y : source.y\r\n\r\n return this\r\n }\r\n\r\n toArray () {\r\n return [ this.x, this.y ]\r\n }\n\n transform (m) {\r\n return this.clone().transformO(m)\r\n }\r\n\r\n // Transform point with matrix\r\n transformO (m) {\r\n if (!Matrix.isMatrixLike(m)) {\r\n m = new Matrix(m)\r\n }\r\n\r\n const { x, y } = this\r\n\r\n // Perform the matrix multiplication\r\n this.x = m.a * x + m.c * y + m.e\r\n this.y = m.b * x + m.d * y + m.f\r\n\r\n return this\r\n }\r\n\r\n}\r\n\r\nexport function point (x, y) {\r\n return new Point(x, y).transform(this.screenCTM().inverse())\r\n}\r\n","import { delimiter } from '../modules/core/regex.js'\r\nimport { radians } from '../utils/utils.js'\r\nimport { register } from '../utils/adopter.js'\r\nimport Element from '../elements/Element.js'\r\nimport Point from './Point.js'\r\n\r\nfunction closeEnough (a, b, threshold) {\r\n return Math.abs(b - a) < (threshold || 1e-6)\r\n}\r\n\r\nexport default class Matrix {\r\n constructor (...args) {\r\n this.init(...args)\r\n }\r\n\r\n static formatTransforms (o) {\r\n // Get all of the parameters required to form the matrix\r\n const flipBoth = o.flip === 'both' || o.flip === true\r\n const flipX = o.flip && (flipBoth || o.flip === 'x') ? -1 : 1\r\n const flipY = o.flip && (flipBoth || o.flip === 'y') ? -1 : 1\r\n const skewX = o.skew && o.skew.length\n ? o.skew[0]\r\n : isFinite(o.skew)\n ? o.skew\r\n : isFinite(o.skewX)\n ? o.skewX\r\n : 0\r\n const skewY = o.skew && o.skew.length\n ? o.skew[1]\r\n : isFinite(o.skew)\n ? o.skew\r\n : isFinite(o.skewY)\n ? o.skewY\r\n : 0\r\n const scaleX = o.scale && o.scale.length\n ? o.scale[0] * flipX\r\n : isFinite(o.scale)\n ? o.scale * flipX\r\n : isFinite(o.scaleX)\n ? o.scaleX * flipX\r\n : flipX\r\n const scaleY = o.scale && o.scale.length\n ? o.scale[1] * flipY\r\n : isFinite(o.scale)\n ? o.scale * flipY\r\n : isFinite(o.scaleY)\n ? o.scaleY * flipY\r\n : flipY\r\n const shear = o.shear || 0\r\n const theta = o.rotate || o.theta || 0\r\n const origin = new Point(o.origin || o.around || o.ox || o.originX, o.oy || o.originY)\r\n const ox = origin.x\r\n const oy = origin.y\r\n // We need Point to be invalid if nothing was passed because we cannot default to 0 here. Thats why NaN\r\n const position = new Point(o.position || o.px || o.positionX || NaN, o.py || o.positionY || NaN)\r\n const px = position.x\r\n const py = position.y\r\n const translate = new Point(o.translate || o.tx || o.translateX, o.ty || o.translateY)\r\n const tx = translate.x\r\n const ty = translate.y\r\n const relative = new Point(o.relative || o.rx || o.relativeX, o.ry || o.relativeY)\r\n const rx = relative.x\r\n const ry = relative.y\r\n\r\n // Populate all of the values\r\n return {\r\n scaleX, scaleY, skewX, skewY, shear, theta, rx, ry, tx, ty, ox, oy, px, py\r\n }\r\n }\n\n static fromArray (a) {\r\n return { a: a[0], b: a[1], c: a[2], d: a[3], e: a[4], f: a[5] }\r\n }\n\n static isMatrixLike (o) {\r\n return (\r\n o.a != null\r\n || o.b != null\r\n || o.c != null\r\n || o.d != null\r\n || o.e != null\r\n || o.f != null\r\n )\r\n }\n\n // left matrix, right matrix, target matrix which is overwritten\n static matrixMultiply (l, r, o) {\r\n // Work out the product directly\r\n const a = l.a * r.a + l.c * r.b\r\n const b = l.b * r.a + l.d * r.b\r\n const c = l.a * r.c + l.c * r.d\r\n const d = l.b * r.c + l.d * r.d\r\n const e = l.e + l.a * r.e + l.c * r.f\r\n const f = l.f + l.b * r.e + l.d * r.f\r\n\r\n // make sure to use local variables because l/r and o could be the same\r\n o.a = a\r\n o.b = b\r\n o.c = c\r\n o.d = d\r\n o.e = e\r\n o.f = f\r\n\r\n return o\r\n }\n\n around (cx, cy, matrix) {\r\n return this.clone().aroundO(cx, cy, matrix)\r\n }\n\n // Transform around a center point\n aroundO (cx, cy, matrix) {\r\n const dx = cx || 0\r\n const dy = cy || 0\r\n return this.translateO(-dx, -dy).lmultiplyO(matrix).translateO(dx, dy)\r\n }\n\n // Clones this matrix\n clone () {\r\n return new Matrix(this)\r\n }\n\n // Decomposes this matrix into its affine parameters\n decompose (cx = 0, cy = 0) {\r\n // Get the parameters from the matrix\r\n const a = this.a\r\n const b = this.b\r\n const c = this.c\r\n const d = this.d\r\n const e = this.e\r\n const f = this.f\r\n\r\n // Figure out if the winding direction is clockwise or counterclockwise\r\n const determinant = a * d - b * c\r\n const ccw = determinant > 0 ? 1 : -1\r\n\r\n // Since we only shear in x, we can use the x basis to get the x scale\r\n // and the rotation of the resulting matrix\r\n const sx = ccw * Math.sqrt(a * a + b * b)\r\n const thetaRad = Math.atan2(ccw * b, ccw * a)\r\n const theta = 180 / Math.PI * thetaRad\r\n const ct = Math.cos(thetaRad)\r\n const st = Math.sin(thetaRad)\r\n\r\n // We can then solve the y basis vector simultaneously to get the other\r\n // two affine parameters directly from these parameters\r\n const lam = (a * c + b * d) / determinant\r\n const sy = ((c * sx) / (lam * a - b)) || ((d * sx) / (lam * b + a))\r\n\r\n // Use the translations\r\n const tx = e - cx + cx * ct * sx + cy * (lam * ct * sx - st * sy)\r\n const ty = f - cy + cx * st * sx + cy * (lam * st * sx + ct * sy)\r\n\r\n // Construct the decomposition and return it\r\n return {\r\n // Return the affine parameters\r\n scaleX: sx,\r\n scaleY: sy,\r\n shear: lam,\r\n rotate: theta,\r\n translateX: tx,\r\n translateY: ty,\r\n originX: cx,\r\n originY: cy,\r\n\r\n // Return the matrix parameters\r\n a: this.a,\r\n b: this.b,\r\n c: this.c,\r\n d: this.d,\r\n e: this.e,\r\n f: this.f\r\n }\r\n }\n\n // Check if two matrices are equal\n equals (other) {\r\n if (other === this) return true\r\n const comp = new Matrix(other)\r\n return closeEnough(this.a, comp.a) && closeEnough(this.b, comp.b)\r\n && closeEnough(this.c, comp.c) && closeEnough(this.d, comp.d)\r\n && closeEnough(this.e, comp.e) && closeEnough(this.f, comp.f)\r\n }\n\n // Flip matrix on x or y, at a given offset\n flip (axis, around) {\r\n return this.clone().flipO(axis, around)\r\n }\n\n flipO (axis, around) {\r\n return axis === 'x'\n ? this.scaleO(-1, 1, around, 0)\r\n : axis === 'y'\n ? this.scaleO(1, -1, 0, around)\r\n : this.scaleO(-1, -1, axis, around || axis) // Define an x, y flip point\r\n }\n\n // Initialize\r\n init (source) {\r\n const base = Matrix.fromArray([ 1, 0, 0, 1, 0, 0 ])\r\n\r\n // ensure source as object\r\n source = source instanceof Element\n ? source.matrixify()\r\n : typeof source === 'string'\n ? Matrix.fromArray(source.split(delimiter).map(parseFloat))\r\n : Array.isArray(source)\n ? Matrix.fromArray(source)\r\n : (typeof source === 'object' && Matrix.isMatrixLike(source))\n ? source\r\n : (typeof source === 'object')\n ? new Matrix().transform(source)\r\n : arguments.length === 6\n ? Matrix.fromArray([].slice.call(arguments))\r\n : base\r\n\r\n // Merge the source matrix with the base matrix\r\n this.a = source.a != null ? source.a : base.a\r\n this.b = source.b != null ? source.b : base.b\r\n this.c = source.c != null ? source.c : base.c\r\n this.d = source.d != null ? source.d : base.d\r\n this.e = source.e != null ? source.e : base.e\r\n this.f = source.f != null ? source.f : base.f\r\n\r\n return this\r\n }\r\n\n inverse () {\r\n return this.clone().inverseO()\r\n }\n\n // Inverses matrix\n inverseO () {\r\n // Get the current parameters out of the matrix\r\n const a = this.a\r\n const b = this.b\r\n const c = this.c\r\n const d = this.d\r\n const e = this.e\r\n const f = this.f\r\n\r\n // Invert the 2x2 matrix in the top left\r\n const det = a * d - b * c\r\n if (!det) throw new Error('Cannot invert ' + this)\r\n\r\n // Calculate the top 2x2 matrix\r\n const na = d / det\r\n const nb = -b / det\r\n const nc = -c / det\r\n const nd = a / det\r\n\r\n // Apply the inverted matrix to the top right\r\n const ne = -(na * e + nc * f)\r\n const nf = -(nb * e + nd * f)\r\n\r\n // Construct the inverted matrix\r\n this.a = na\r\n this.b = nb\r\n this.c = nc\r\n this.d = nd\r\n this.e = ne\r\n this.f = nf\r\n\r\n return this\r\n }\n\n lmultiply (matrix) {\r\n return this.clone().lmultiplyO(matrix)\r\n }\n\n lmultiplyO (matrix) {\r\n const r = this\r\n const l = matrix instanceof Matrix\r\n ? matrix\r\n : new Matrix(matrix)\r\n\r\n return Matrix.matrixMultiply(l, r, this)\r\n }\n\n // Left multiplies by the given matrix\n multiply (matrix) {\r\n return this.clone().multiplyO(matrix)\r\n }\n\n multiplyO (matrix) {\r\n // Get the matrices\r\n const l = this\r\n const r = matrix instanceof Matrix\r\n ? matrix\r\n : new Matrix(matrix)\r\n\r\n return Matrix.matrixMultiply(l, r, this)\r\n }\n\n // Rotate matrix\n rotate (r, cx, cy) {\r\n return this.clone().rotateO(r, cx, cy)\r\n }\n\n rotateO (r, cx = 0, cy = 0) {\r\n // Convert degrees to radians\r\n r = radians(r)\r\n\r\n const cos = Math.cos(r)\r\n const sin = Math.sin(r)\r\n\r\n const { a, b, c, d, e, f } = this\r\n\r\n this.a = a * cos - b * sin\r\n this.b = b * cos + a * sin\r\n this.c = c * cos - d * sin\r\n this.d = d * cos + c * sin\r\n this.e = e * cos - f * sin + cy * sin - cx * cos + cx\r\n this.f = f * cos + e * sin - cx * sin - cy * cos + cy\r\n\r\n return this\r\n }\n\n // Scale matrix\n scale (x, y, cx, cy) {\r\n return this.clone().scaleO(...arguments)\r\n }\n\n scaleO (x, y = x, cx = 0, cy = 0) {\r\n // Support uniform scaling\r\n if (arguments.length === 3) {\r\n cy = cx\r\n cx = y\r\n y = x\r\n }\r\n\r\n const { a, b, c, d, e, f } = this\r\n\r\n this.a = a * x\r\n this.b = b * y\r\n this.c = c * x\r\n this.d = d * y\r\n this.e = e * x - cx * x + cx\r\n this.f = f * y - cy * y + cy\r\n\r\n return this\r\n }\n\n // Shear matrix\n shear (a, cx, cy) {\r\n return this.clone().shearO(a, cx, cy)\r\n }\n\n shearO (lx, cx = 0, cy = 0) {\r\n const { a, b, c, d, e, f } = this\r\n\r\n this.a = a + b * lx\r\n this.c = c + d * lx\r\n this.e = e + f * lx - cy * lx\r\n\r\n return this\r\n }\n\n // Skew Matrix\n skew (x, y, cx, cy) {\r\n return this.clone().skewO(...arguments)\r\n }\n\n skewO (x, y = x, cx = 0, cy = 0) {\r\n // support uniformal skew\r\n if (arguments.length === 3) {\r\n cy = cx\r\n cx = y\r\n y = x\r\n }\r\n\r\n // Convert degrees to radians\r\n x = radians(x)\r\n y = radians(y)\r\n\r\n const lx = Math.tan(x)\r\n const ly = Math.tan(y)\r\n\r\n const { a, b, c, d, e, f } = this\r\n\r\n this.a = a + b * lx\r\n this.b = b + a * ly\r\n this.c = c + d * lx\r\n this.d = d + c * ly\r\n this.e = e + f * lx - cy * lx\r\n this.f = f + e * ly - cx * ly\r\n\r\n return this\r\n }\n\n // SkewX\n skewX (x, cx, cy) {\r\n return this.skew(x, 0, cx, cy)\r\n }\n\n // SkewY\n skewY (y, cx, cy) {\r\n return this.skew(0, y, cx, cy)\r\n }\n\n toArray () {\r\n return [ this.a, this.b, this.c, this.d, this.e, this.f ]\r\n }\n\n // Convert matrix to string\n toString () {\r\n return 'matrix(' + this.a + ',' + this.b + ',' + this.c + ',' + this.d + ',' + this.e + ',' + this.f + ')'\r\n }\n\n // Transform a matrix into another matrix by manipulating the space\r\n transform (o) {\r\n // Check if o is a matrix and then left multiply it directly\r\n if (Matrix.isMatrixLike(o)) {\r\n const matrix = new Matrix(o)\r\n return matrix.multiplyO(this)\r\n }\r\n\r\n // Get the proposed transformations and the current transformations\r\n const t = Matrix.formatTransforms(o)\r\n const current = this\r\n const { x: ox, y: oy } = new Point(t.ox, t.oy).transform(current)\r\n\r\n // Construct the resulting matrix\r\n const transformer = new Matrix()\r\n .translateO(t.rx, t.ry)\r\n .lmultiplyO(current)\r\n .translateO(-ox, -oy)\r\n .scaleO(t.scaleX, t.scaleY)\r\n .skewO(t.skewX, t.skewY)\r\n .shearO(t.shear)\r\n .rotateO(t.theta)\r\n .translateO(ox, oy)\r\n\r\n // If we want the origin at a particular place, we force it there\r\n if (isFinite(t.px) || isFinite(t.py)) {\r\n const origin = new Point(ox, oy).transform(transformer)\r\n // TODO: Replace t.px with isFinite(t.px)\r\n // Doesnt work because t.px is also 0 if it wasnt passed\r\n const dx = isFinite(t.px) ? t.px - origin.x : 0\r\n const dy = isFinite(t.py) ? t.py - origin.y : 0\r\n transformer.translateO(dx, dy)\r\n }\r\n\r\n // Translate now after positioning\r\n transformer.translateO(t.tx, t.ty)\r\n return transformer\r\n }\r\n\n // Translate matrix\r\n translate (x, y) {\r\n return this.clone().translateO(x, y)\r\n }\r\n\n translateO (x, y) {\r\n this.e += x || 0\r\n this.f += y || 0\r\n return this\r\n }\r\n\n valueOf () {\r\n return {\r\n a: this.a,\r\n b: this.b,\r\n c: this.c,\r\n d: this.d,\r\n e: this.e,\r\n f: this.f\r\n }\r\n }\r\n\r\n}\r\n\r\nexport function ctm () {\r\n return new Matrix(this.node.getCTM())\r\n}\r\n\r\nexport function screenCTM () {\r\n /* https://bugzilla.mozilla.org/show_bug.cgi?id=1344537\r\n This is needed because FF does not return the transformation matrix\r\n for the inner coordinate system when getScreenCTM() is called on nested svgs.\r\n However all other Browsers do that */\r\n if (typeof this.isRoot === 'function' && !this.isRoot()) {\r\n const rect = this.rect(1, 1)\r\n const m = rect.node.getScreenCTM()\r\n rect.remove()\r\n return new Matrix(m)\r\n }\r\n return new Matrix(this.node.getScreenCTM())\r\n}\r\n\r\nregister(Matrix, 'Matrix')\r\n","import { globals } from '../../utils/window.js'\r\nimport { makeInstance } from '../../utils/adopter.js'\r\n\r\nexport default function parser () {\r\n // Reuse cached element if possible\r\n if (!parser.nodes) {\r\n const svg = makeInstance().size(2, 0)\r\n svg.node.style.cssText = [\r\n 'opacity: 0',\r\n 'position: absolute',\r\n 'left: -100%',\r\n 'top: -100%',\r\n 'overflow: hidden'\r\n ].join(';')\r\n\r\n svg.attr('focusable', 'false')\r\n svg.attr('aria-hidden', 'true')\r\n\r\n const path = svg.path().node\r\n\r\n parser.nodes = { svg, path }\r\n }\r\n\r\n if (!parser.nodes.svg.node.parentNode) {\r\n const b = globals.document.body || globals.document.documentElement\r\n parser.nodes.svg.addTo(b)\r\n }\r\n\r\n return parser.nodes\r\n}\r\n","import { delimiter } from '../modules/core/regex.js'\r\nimport { globals } from '../utils/window.js'\r\nimport { register } from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport Matrix from './Matrix.js'\r\nimport Point from './Point.js'\r\nimport parser from '../modules/core/parser.js'\r\n\r\nexport function isNulledBox (box) {\r\n return !box.width && !box.height && !box.x && !box.y\r\n}\r\n\r\nexport function domContains (node) {\r\n return node === globals.document\r\n || (globals.document.documentElement.contains || function (node) {\r\n // This is IE - it does not support contains() for top-level SVGs\r\n while (node.parentNode) {\r\n node = node.parentNode\r\n }\r\n return node === globals.document\r\n }).call(globals.document.documentElement, node)\r\n}\r\n\r\nexport default class Box {\r\n constructor (...args) {\r\n this.init(...args)\r\n }\r\n\r\n addOffset () {\r\n // offset by window scroll position, because getBoundingClientRect changes when window is scrolled\r\n this.x += globals.window.pageXOffset\r\n this.y += globals.window.pageYOffset\r\n return new Box(this)\r\n }\r\n\r\n init (source) {\r\n const base = [ 0, 0, 0, 0 ]\r\n source = typeof source === 'string'\n ? source.split(delimiter).map(parseFloat)\r\n : Array.isArray(source)\n ? source\r\n : typeof source === 'object'\n ? [ source.left != null\n ? source.left\r\n : source.x, source.top != null ? source.top : source.y, source.width, source.height ]\r\n : arguments.length === 4\n ? [].slice.call(arguments)\r\n : base\r\n\r\n this.x = source[0] || 0\r\n this.y = source[1] || 0\r\n this.width = this.w = source[2] || 0\r\n this.height = this.h = source[3] || 0\r\n\r\n // Add more bounding box properties\r\n this.x2 = this.x + this.w\r\n this.y2 = this.y + this.h\r\n this.cx = this.x + this.w / 2\r\n this.cy = this.y + this.h / 2\r\n\r\n return this\r\n }\r\n\r\n isNulled () {\r\n return isNulledBox(this)\r\n }\r\n\r\n // Merge rect box with another, return a new instance\r\n merge (box) {\r\n const x = Math.min(this.x, box.x)\r\n const y = Math.min(this.y, box.y)\r\n const width = Math.max(this.x + this.width, box.x + box.width) - x\r\n const height = Math.max(this.y + this.height, box.y + box.height) - y\r\n\r\n return new Box(x, y, width, height)\r\n }\r\n\r\n toArray () {\r\n return [ this.x, this.y, this.width, this.height ]\r\n }\r\n\r\n toString () {\r\n return this.x + ' ' + this.y + ' ' + this.width + ' ' + this.height\r\n }\r\n\r\n transform (m) {\r\n if (!(m instanceof Matrix)) {\r\n m = new Matrix(m)\r\n }\r\n\r\n let xMin = Infinity\r\n let xMax = -Infinity\r\n let yMin = Infinity\r\n let yMax = -Infinity\r\n\r\n const pts = [\r\n new Point(this.x, this.y),\r\n new Point(this.x2, this.y),\r\n new Point(this.x, this.y2),\r\n new Point(this.x2, this.y2)\r\n ]\r\n\r\n pts.forEach(function (p) {\r\n p = p.transform(m)\r\n xMin = Math.min(xMin, p.x)\r\n xMax = Math.max(xMax, p.x)\r\n yMin = Math.min(yMin, p.y)\r\n yMax = Math.max(yMax, p.y)\r\n })\r\n\r\n return new Box(\r\n xMin, yMin,\r\n xMax - xMin,\r\n yMax - yMin\r\n )\r\n }\r\n\r\n}\r\n\r\nfunction getBox (el, getBBoxFn, retry) {\r\n let box\r\n\r\n try {\r\n // Try to get the box with the provided function\r\n box = getBBoxFn(el.node)\r\n\r\n // If the box is worthless and not even in the dom, retry\r\n // by throwing an error here...\r\n if (isNulledBox(box) && !domContains(el.node)) {\r\n throw new Error('Element not in the dom')\r\n }\r\n } catch (e) {\r\n // ... and calling the retry handler here\r\n box = retry(el)\r\n }\r\n\r\n return box\r\n}\r\n\r\nexport function bbox () {\r\n // Function to get bbox is getBBox()\r\n const getBBox = (node) => node.getBBox()\r\n\r\n // Take all measures so that a stupid browser renders the element\r\n // so we can get the bbox from it when we try again\r\n const retry = (el) => {\r\n try {\r\n const clone = el.clone().addTo(parser().svg).show()\r\n const box = clone.node.getBBox()\r\n clone.remove()\r\n return box\r\n } catch (e) {\r\n // We give up...\r\n throw new Error(`Getting bbox of element \"${el.node.nodeName}\" is not possible: ${e.toString()}`)\r\n }\r\n }\r\n\r\n const box = getBox(this, getBBox, retry)\r\n const bbox = new Box(box)\r\n\r\n return bbox\r\n}\r\n\r\nexport function rbox (el) {\r\n const getRBox = (node) => node.getBoundingClientRect()\r\n const retry = (el) => {\r\n // There is no point in trying tricks here because if we insert the element into the dom ourselves\r\n // it obviously will be at the wrong position\r\n throw new Error(`Getting rbox of element \"${el.node.nodeName}\" is not possible`)\r\n }\r\n\r\n const box = getBox(this, getRBox, retry)\r\n const rbox = new Box(box)\r\n\r\n // If an element was passed, we want the bbox in the coordinate system of that element\r\n if (el) {\r\n return rbox.transform(el.screenCTM().inverseO())\r\n }\r\n\r\n // Else we want it in absolute screen coordinates\r\n // Therefore we need to add the scrollOffset\r\n return rbox.addOffset()\r\n}\r\n\r\n// Checks whether the given point is inside the bounding box\r\nexport function inside (x, y) {\r\n const box = this.bbox()\r\n\r\n return x > box.x\r\n && y > box.y\r\n && x < box.x + box.width\r\n && y < box.y + box.height\r\n}\r\n\r\nregisterMethods({\r\n viewbox: {\r\n viewbox (x, y, width, height) {\r\n // act as getter\r\n if (x == null) return new Box(this.attr('viewBox'))\r\n\r\n // act as setter\r\n return this.attr('viewBox', new Box(x, y, width, height))\r\n },\r\n\r\n zoom (level, point) {\r\n // Its best to rely on the attributes here and here is why:\r\n // clientXYZ: Doesn't work on non-root svgs because they dont have a CSSBox (silly!)\r\n // getBoundingClientRect: Doesn't work because Chrome just ignores width and height of nested svgs completely\r\n // that means, their clientRect is always as big as the content.\r\n // Furthermore this size is incorrect if the element is further transformed by its parents\r\n // computedStyle: Only returns meaningful values if css was used with px. We dont go this route here!\r\n // getBBox: returns the bounding box of its content - that doesnt help!\r\n let { width, height } = this.attr([ 'width', 'height' ])\r\n\r\n // Width and height is a string when a number with a unit is present which we can't use\r\n // So we try clientXYZ\r\n if ((!width && !height) || (typeof width === 'string' || typeof height === 'string')) {\r\n width = this.node.clientWidth\r\n height = this.node.clientHeight\r\n }\r\n\r\n // Giving up...\r\n if (!width || !height) {\r\n throw new Error('Impossible to get absolute width and height. Please provide an absolute width and height attribute on the zooming element')\r\n }\r\n\r\n const v = this.viewbox()\r\n\r\n const zoomX = width / v.width\r\n const zoomY = height / v.height\r\n const zoom = Math.min(zoomX, zoomY)\r\n\r\n if (level == null) {\r\n return zoom\r\n }\r\n\r\n let zoomAmount = zoom / level\r\n\r\n // Set the zoomAmount to the highest value which is safe to process and recover from\r\n // The * 100 is a bit of wiggle room for the matrix transformation\r\n if (zoomAmount === Infinity) zoomAmount = Number.MAX_SAFE_INTEGER / 100\r\n\r\n point = point || new Point(width / 2 / zoomX + v.x, height / 2 / zoomY + v.y)\r\n\r\n const box = new Box(v).transform(\r\n new Matrix({ scale: zoomAmount, origin: point })\r\n )\r\n\r\n return this.viewbox(box)\r\n }\r\n }\r\n})\r\n\r\nregister(Box, 'Box')\r\n","import { extend } from '../utils/adopter.js'\r\n// import { subClassArray } from './ArrayPolyfill.js'\r\n\r\nclass List extends Array {\r\n constructor (arr = [], ...args) {\r\n super(arr, ...args)\r\n if (typeof arr === 'number') return this\r\n this.length = 0\r\n this.push(...arr)\r\n }\r\n}\r\n\r\n/* = subClassArray('List', Array, function (arr = []) {\r\n // This catches the case, that native map tries to create an array with new Array(1)\r\n if (typeof arr === 'number') return this\r\n this.length = 0\r\n this.push(...arr)\r\n}) */\r\n\r\nexport default List\r\n\r\nextend([ List ], {\r\n each (fnOrMethodName, ...args) {\r\n if (typeof fnOrMethodName === 'function') {\r\n return this.map((el, i, arr) => {\r\n return fnOrMethodName.call(el, el, i, arr)\r\n })\r\n } else {\r\n return this.map(el => {\r\n return el[fnOrMethodName](...args)\r\n })\r\n }\r\n },\r\n\r\n toArray () {\r\n return Array.prototype.concat.apply([], this)\r\n }\r\n})\r\n\r\nconst reserved = [ 'toArray', 'constructor', 'each' ]\r\n\r\nList.extend = function (methods) {\r\n methods = methods.reduce((obj, name) => {\r\n // Don't overwrite own methods\r\n if (reserved.includes(name)) return obj\r\n\r\n // Don't add private methods\r\n if (name[0] === '_') return obj\r\n\r\n // Relay every call to each()\r\n obj[name] = function (...attrs) {\r\n return this.each(name, ...attrs)\r\n }\r\n return obj\r\n }, {})\r\n\r\n extend([ List ], methods)\r\n}\r\n","import { adopt } from '../../utils/adopter.js'\r\nimport { globals } from '../../utils/window.js'\r\nimport { map } from '../../utils/utils.js'\r\nimport List from '../../types/List.js'\r\n\r\nexport default function baseFind (query, parent) {\r\n return new List(map((parent || globals.document).querySelectorAll(query), function (node) {\r\n return adopt(node)\r\n }))\r\n}\r\n\r\n// Scoped find method\r\nexport function find (query) {\r\n return baseFind(query, this.node)\r\n}\r\n\r\nexport function findOne (query) {\r\n return adopt(this.node.querySelector(query))\r\n}\r\n","import { delimiter } from './regex.js'\r\nimport { makeInstance } from '../../utils/adopter.js'\r\nimport { globals } from '../../utils/window.js'\r\n\r\nlet listenerId = 0\r\nexport const windowEvents = {}\r\n\r\nexport function getEvents (instance) {\r\n let n = instance.getEventHolder()\r\n\r\n // We dont want to save events in global space\r\n if (n === globals.window) n = windowEvents\r\n if (!n.events) n.events = {}\r\n return n.events\r\n}\r\n\r\nexport function getEventTarget (instance) {\r\n return instance.getEventTarget()\r\n}\r\n\r\nexport function clearEvents (instance) {\r\n let n = instance.getEventHolder()\r\n if (n === globals.window) n = windowEvents\r\n if (n.events) n.events = {}\r\n}\r\n\r\n// Add event binder in the SVG namespace\r\nexport function on (node, events, listener, binding, options) {\r\n const l = listener.bind(binding || node)\r\n const instance = makeInstance(node)\r\n const bag = getEvents(instance)\r\n const n = getEventTarget(instance)\r\n\r\n // events can be an array of events or a string of events\r\n events = Array.isArray(events) ? events : events.split(delimiter)\r\n\r\n // add id to listener\r\n if (!listener._svgjsListenerId) {\r\n listener._svgjsListenerId = ++listenerId\r\n }\r\n\r\n events.forEach(function (event) {\r\n const ev = event.split('.')[0]\r\n const ns = event.split('.')[1] || '*'\r\n\r\n // ensure valid object\r\n bag[ev] = bag[ev] || {}\r\n bag[ev][ns] = bag[ev][ns] || {}\r\n\r\n // reference listener\r\n bag[ev][ns][listener._svgjsListenerId] = l\r\n\r\n // add listener\r\n n.addEventListener(ev, l, options || false)\r\n })\r\n}\r\n\r\n// Add event unbinder in the SVG namespace\r\nexport function off (node, events, listener, options) {\r\n const instance = makeInstance(node)\r\n const bag = getEvents(instance)\r\n const n = getEventTarget(instance)\r\n\r\n // listener can be a function or a number\r\n if (typeof listener === 'function') {\r\n listener = listener._svgjsListenerId\r\n if (!listener) return\r\n }\r\n\r\n // events can be an array of events or a string or undefined\r\n events = Array.isArray(events) ? events : (events || '').split(delimiter)\r\n\r\n events.forEach(function (event) {\r\n const ev = event && event.split('.')[0]\r\n const ns = event && event.split('.')[1]\r\n let namespace, l\r\n\r\n if (listener) {\r\n // remove listener reference\r\n if (bag[ev] && bag[ev][ns || '*']) {\r\n // removeListener\r\n n.removeEventListener(ev, bag[ev][ns || '*'][listener], options || false)\r\n\r\n delete bag[ev][ns || '*'][listener]\r\n }\r\n } else if (ev && ns) {\r\n // remove all listeners for a namespaced event\r\n if (bag[ev] && bag[ev][ns]) {\r\n for (l in bag[ev][ns]) {\r\n off(n, [ ev, ns ].join('.'), l)\r\n }\r\n\r\n delete bag[ev][ns]\r\n }\r\n } else if (ns) {\r\n // remove all listeners for a specific namespace\r\n for (event in bag) {\r\n for (namespace in bag[event]) {\r\n if (ns === namespace) {\r\n off(n, [ event, ns ].join('.'))\r\n }\r\n }\r\n }\r\n } else if (ev) {\r\n // remove all listeners for the event\r\n if (bag[ev]) {\r\n for (namespace in bag[ev]) {\r\n off(n, [ ev, namespace ].join('.'))\r\n }\r\n\r\n delete bag[ev]\r\n }\r\n } else {\r\n // remove all listeners on a given node\r\n for (event in bag) {\r\n off(n, event)\r\n }\r\n\r\n clearEvents(instance)\r\n }\r\n })\r\n}\r\n\r\nexport function dispatch (node, event, data, options) {\r\n const n = getEventTarget(node)\r\n\r\n // Dispatch event\r\n if (event instanceof globals.window.Event) {\r\n n.dispatchEvent(event)\r\n } else {\r\n event = new globals.window.CustomEvent(event, { detail: data, cancelable: true, ...options })\r\n n.dispatchEvent(event)\r\n }\r\n return event\r\n}\r\n","import { dispatch, off, on } from '../modules/core/event.js'\nimport { register } from '../utils/adopter.js'\nimport Base from './Base.js'\n\nexport default class EventTarget extends Base {\n addEventListener () {}\n\n dispatch (event, data, options) {\n return dispatch(this, event, data, options)\n }\n\n dispatchEvent (event) {\n const bag = this.getEventHolder().events\n if (!bag) return true\n\n const events = bag[event.type]\n\n for (const i in events) {\n for (const j in events[i]) {\n events[i][j](event)\n }\n }\n\n return !event.defaultPrevented\n }\n\n // Fire given event\n fire (event, data, options) {\n this.dispatch(event, data, options)\n return this\n }\n\n getEventHolder () {\n return this\n }\n\n getEventTarget () {\n return this\n }\n\n // Unbind event from listener\n off (event, listener, options) {\n off(this, event, listener, options)\n return this\n }\n\n // Bind given event to listener\n on (event, listener, binding, options) {\n on(this, event, listener, binding, options)\n return this\n }\n\n removeEventListener () {}\n}\n\nregister(EventTarget, 'EventTarget')\n","\r\nexport function noop () {}\r\n\r\n// Default animation values\r\nexport const timeline = {\r\n duration: 400,\r\n ease: '>',\r\n delay: 0\r\n}\r\n\r\n// Default attribute values\r\nexport const attrs = {\r\n\r\n // fill and stroke\r\n 'fill-opacity': 1,\r\n 'stroke-opacity': 1,\r\n 'stroke-width': 0,\r\n 'stroke-linejoin': 'miter',\r\n 'stroke-linecap': 'butt',\r\n fill: '#000000',\r\n stroke: '#000000',\r\n opacity: 1,\r\n\r\n // position\r\n x: 0,\r\n y: 0,\r\n cx: 0,\r\n cy: 0,\r\n\r\n // size\r\n width: 0,\r\n height: 0,\r\n\r\n // radius\r\n r: 0,\r\n rx: 0,\r\n ry: 0,\r\n\r\n // gradient\r\n offset: 0,\r\n 'stop-opacity': 1,\r\n 'stop-color': '#000000',\r\n\r\n // text\r\n 'text-anchor': 'start'\r\n}\r\n","import { delimiter } from '../modules/core/regex.js'\r\n\r\nexport default class SVGArray extends Array {\r\n constructor (...args) {\r\n super(...args)\r\n this.init(...args)\r\n }\r\n\r\n clone () {\r\n return new this.constructor(this)\r\n }\n\n init (arr) {\r\n // This catches the case, that native map tries to create an array with new Array(1)\r\n if (typeof arr === 'number') return this\r\n this.length = 0\r\n this.push(...this.parse(arr))\r\n return this\r\n }\r\n\r\n // Parse whitespace separated string\n parse (array = []) {\r\n // If already is an array, no need to parse it\r\n if (array instanceof Array) return array\r\n\r\n return array.trim().split(delimiter).map(parseFloat)\r\n }\n\n toArray () {\r\n return Array.prototype.concat.apply([], this)\r\n }\r\n\r\n toSet () {\r\n return new Set(this)\r\n }\n\n toString () {\r\n return this.join(' ')\r\n }\r\n\r\n // Flattens the array if needed\r\n valueOf () {\r\n const ret = []\r\n ret.push(...this)\r\n return ret\r\n }\r\n\r\n}\r\n","import { numberAndUnit } from '../modules/core/regex.js'\r\n\r\n// Module for unit conversions\r\nexport default class SVGNumber {\r\n // Initialize\r\n constructor (...args) {\r\n this.init(...args)\r\n }\r\n\r\n convert (unit) {\r\n return new SVGNumber(this.value, unit)\r\n }\r\n\r\n // Divide number\r\n divide (number) {\r\n number = new SVGNumber(number)\r\n return new SVGNumber(this / number, this.unit || number.unit)\r\n }\r\n\r\n init (value, unit) {\r\n unit = Array.isArray(value) ? value[1] : unit\r\n value = Array.isArray(value) ? value[0] : value\r\n\r\n // initialize defaults\r\n this.value = 0\r\n this.unit = unit || ''\r\n\r\n // parse value\r\n if (typeof value === 'number') {\r\n // ensure a valid numeric value\r\n this.value = isNaN(value) ? 0 : !isFinite(value) ? (value < 0 ? -3.4e+38 : +3.4e+38) : value\r\n } else if (typeof value === 'string') {\r\n unit = value.match(numberAndUnit)\r\n\r\n if (unit) {\r\n // make value numeric\r\n this.value = parseFloat(unit[1])\r\n\r\n // normalize\r\n if (unit[5] === '%') {\r\n this.value /= 100\r\n } else if (unit[5] === 's') {\r\n this.value *= 1000\r\n }\r\n\r\n // store unit\r\n this.unit = unit[5]\r\n }\r\n } else {\r\n if (value instanceof SVGNumber) {\r\n this.value = value.valueOf()\r\n this.unit = value.unit\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n // Subtract number\r\n minus (number) {\r\n number = new SVGNumber(number)\r\n return new SVGNumber(this - number, this.unit || number.unit)\r\n }\r\n\r\n // Add number\r\n plus (number) {\r\n number = new SVGNumber(number)\r\n return new SVGNumber(this + number, this.unit || number.unit)\r\n }\r\n\r\n // Multiply number\r\n times (number) {\r\n number = new SVGNumber(number)\r\n return new SVGNumber(this * number, this.unit || number.unit)\r\n }\r\n\r\n toArray () {\r\n return [ this.value, this.unit ]\r\n }\r\n\r\n toJSON () {\r\n return this.toString()\r\n }\r\n\r\n toString () {\r\n return (this.unit === '%'\n ? ~~(this.value * 1e8) / 1e6\r\n : this.unit === 's'\n ? this.value / 1e3\r\n : this.value\r\n ) + this.unit\r\n }\r\n\r\n valueOf () {\r\n return this.value\r\n }\r\n\r\n}\r\n","import { attrs as defaults } from './defaults.js'\r\nimport { isNumber } from './regex.js'\r\nimport Color from '../../types/Color.js'\r\nimport SVGArray from '../../types/SVGArray.js'\r\nimport SVGNumber from '../../types/SVGNumber.js'\r\n\r\nconst hooks = []\r\nexport function registerAttrHook (fn) {\r\n hooks.push(fn)\r\n}\r\n\r\n// Set svg element attribute\r\nexport default function attr (attr, val, ns) {\r\n // act as full getter\r\n if (attr == null) {\r\n // get an object of attributes\r\n attr = {}\r\n val = this.node.attributes\r\n\r\n for (const node of val) {\r\n attr[node.nodeName] = isNumber.test(node.nodeValue)\r\n ? parseFloat(node.nodeValue)\r\n : node.nodeValue\r\n }\r\n\r\n return attr\r\n } else if (attr instanceof Array) {\r\n // loop through array and get all values\r\n return attr.reduce((last, curr) => {\r\n last[curr] = this.attr(curr)\r\n return last\r\n }, {})\r\n } else if (typeof attr === 'object' && attr.constructor === Object) {\r\n // apply every attribute individually if an object is passed\r\n for (val in attr) this.attr(val, attr[val])\r\n } else if (val === null) {\r\n // remove value\r\n this.node.removeAttribute(attr)\r\n } else if (val == null) {\r\n // act as a getter if the first and only argument is not an object\r\n val = this.node.getAttribute(attr)\r\n return val == null\n ? defaults[attr]\r\n : isNumber.test(val)\n ? parseFloat(val)\r\n : val\r\n } else {\r\n // Loop through hooks and execute them to convert value\r\n val = hooks.reduce((_val, hook) => {\r\n return hook(attr, _val, this)\r\n }, val)\r\n\r\n // ensure correct numeric values (also accepts NaN and Infinity)\r\n if (typeof val === 'number') {\r\n val = new SVGNumber(val)\r\n } else if (Color.isColor(val)) {\r\n // ensure full hex color\r\n val = new Color(val)\r\n } else if (val.constructor === Array) {\r\n // Check for plain arrays and parse array values\r\n val = new SVGArray(val)\r\n }\r\n\r\n // if the passed attribute is leading...\r\n if (attr === 'leading') {\r\n // ... call the leading method instead\r\n if (this.leading) {\r\n this.leading(val)\r\n }\r\n } else {\r\n // set given attribute on node\r\n typeof ns === 'string'\n ? this.node.setAttributeNS(ns, attr, val.toString())\r\n : this.node.setAttribute(attr, val.toString())\r\n }\r\n\r\n // rebuild if required\r\n if (this.rebuild && (attr === 'font-size' || attr === 'x')) {\r\n this.rebuild()\r\n }\r\n }\r\n\r\n return this\r\n}\r\n","import {\r\n adopt,\r\n assignNewId,\r\n eid,\r\n extend,\r\n makeInstance,\r\n create,\r\n register\r\n} from '../utils/adopter.js'\r\nimport { find, findOne } from '../modules/core/selector.js'\r\nimport { globals } from '../utils/window.js'\r\nimport { map } from '../utils/utils.js'\r\nimport { svg, html } from '../modules/core/namespaces.js'\r\nimport EventTarget from '../types/EventTarget.js'\r\nimport List from '../types/List.js'\r\nimport attr from '../modules/core/attr.js'\r\n\r\nexport default class Dom extends EventTarget {\r\n constructor (node, attrs) {\r\n super()\r\n this.node = node\r\n this.type = node.nodeName\r\n\r\n if (attrs && node !== attrs) {\r\n this.attr(attrs)\r\n }\r\n }\r\n\r\n // Add given element at a position\r\n add (element, i) {\r\n element = makeInstance(element)\r\n\r\n // If non-root svg nodes are added we have to remove their namespaces\r\n if (element.removeNamespace && this.node instanceof globals.window.SVGElement) {\r\n element.removeNamespace()\r\n }\r\n\r\n if (i == null) {\r\n this.node.appendChild(element.node)\r\n } else if (element.node !== this.node.childNodes[i]) {\r\n this.node.insertBefore(element.node, this.node.childNodes[i])\r\n }\r\n\r\n return this\r\n }\r\n\r\n // Add element to given container and return self\r\n addTo (parent, i) {\r\n return makeInstance(parent).put(this, i)\r\n }\r\n\r\n // Returns all child elements\r\n children () {\r\n return new List(map(this.node.children, function (node) {\r\n return adopt(node)\r\n }))\r\n }\r\n\r\n // Remove all elements in this container\r\n clear () {\r\n // remove children\r\n while (this.node.hasChildNodes()) {\r\n this.node.removeChild(this.node.lastChild)\r\n }\r\n\r\n return this\r\n }\r\n\r\n // Clone element\r\n clone (deep = true) {\r\n // write dom data to the dom so the clone can pickup the data\r\n this.writeDataToDom()\r\n\r\n // clone element and assign new id\r\n return new this.constructor(assignNewId(this.node.cloneNode(deep)))\r\n }\r\n\r\n // Iterates over all children and invokes a given block\r\n each (block, deep) {\r\n const children = this.children()\r\n let i, il\r\n\r\n for (i = 0, il = children.length; i < il; i++) {\r\n block.apply(children[i], [ i, children ])\r\n\r\n if (deep) {\r\n children[i].each(block, deep)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n element (nodeName, attrs) {\r\n return this.put(new Dom(create(nodeName), attrs))\r\n }\r\n\r\n // Get first child\r\n first () {\r\n return adopt(this.node.firstChild)\r\n }\r\n\r\n // Get a element at the given index\r\n get (i) {\r\n return adopt(this.node.childNodes[i])\r\n }\r\n\r\n getEventHolder () {\r\n return this.node\r\n }\r\n\r\n getEventTarget () {\r\n return this.node\r\n }\r\n\r\n // Checks if the given element is a child\r\n has (element) {\r\n return this.index(element) >= 0\r\n }\r\n\r\n html (htmlOrFn, outerHTML) {\r\n return this.xml(htmlOrFn, outerHTML, html)\r\n }\r\n\r\n // Get / set id\r\n id (id) {\r\n // generate new id if no id set\r\n if (typeof id === 'undefined' && !this.node.id) {\r\n this.node.id = eid(this.type)\r\n }\r\n\r\n // don't set directly with this.node.id to make `null` work correctly\r\n return this.attr('id', id)\r\n }\r\n\r\n // Gets index of given element\r\n index (element) {\r\n return [].slice.call(this.node.childNodes).indexOf(element.node)\r\n }\r\n\r\n // Get the last child\r\n last () {\r\n return adopt(this.node.lastChild)\r\n }\r\n\r\n // matches the element vs a css selector\r\n matches (selector) {\r\n const el = this.node\r\n const matcher = el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector || null\r\n return matcher && matcher.call(el, selector)\r\n }\r\n\r\n // Returns the parent element instance\r\n parent (type) {\r\n let parent = this\r\n\r\n // check for parent\r\n if (!parent.node.parentNode) return null\r\n\r\n // get parent element\r\n parent = adopt(parent.node.parentNode)\r\n\r\n if (!type) return parent\r\n\r\n // loop trough ancestors if type is given\r\n do {\r\n if (typeof type === 'string' ? parent.matches(type) : parent instanceof type) return parent\r\n } while ((parent = adopt(parent.node.parentNode)))\r\n\r\n return parent\r\n }\r\n\r\n // Basically does the same as `add()` but returns the added element instead\r\n put (element, i) {\r\n element = makeInstance(element)\r\n this.add(element, i)\r\n return element\r\n }\r\n\r\n // Add element to given container and return container\r\n putIn (parent, i) {\r\n return makeInstance(parent).add(this, i)\r\n }\r\n\r\n // Remove element\r\n remove () {\r\n if (this.parent()) {\r\n this.parent().removeElement(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n // Remove a given child\r\n removeElement (element) {\r\n this.node.removeChild(element.node)\r\n\r\n return this\r\n }\r\n\r\n // Replace this with element\r\n replace (element) {\r\n element = makeInstance(element)\r\n\r\n if (this.node.parentNode) {\r\n this.node.parentNode.replaceChild(element.node, this.node)\r\n }\r\n\r\n return element\r\n }\r\n\r\n round (precision = 2, map = null) {\r\n const factor = 10 ** precision\r\n const attrs = this.attr(map)\r\n\r\n for (const i in attrs) {\r\n if (typeof attrs[i] === 'number') {\r\n attrs[i] = Math.round(attrs[i] * factor) / factor\r\n }\r\n }\r\n\r\n this.attr(attrs)\r\n return this\r\n }\r\n\r\n // Import / Export raw svg\r\n svg (svgOrFn, outerSVG) {\r\n return this.xml(svgOrFn, outerSVG, svg)\r\n }\r\n\r\n // Return id on string conversion\r\n toString () {\r\n return this.id()\r\n }\r\n\r\n words (text) {\r\n // This is faster than removing all children and adding a new one\r\n this.node.textContent = text\r\n return this\r\n }\r\n\r\n wrap (node) {\r\n const parent = this.parent()\r\n\r\n if (!parent) {\r\n return this.addTo(node)\r\n }\r\n\r\n const position = parent.index(this)\r\n return parent.put(node, position).put(this)\r\n }\r\n\r\n // write svgjs data to the dom\r\n writeDataToDom () {\r\n // dump variables recursively\r\n this.each(function () {\r\n this.writeDataToDom()\r\n })\r\n\r\n return this\r\n }\r\n\r\n // Import / Export raw svg\r\n xml (xmlOrFn, outerXML, ns) {\r\n if (typeof xmlOrFn === 'boolean') {\r\n ns = outerXML\r\n outerXML = xmlOrFn\r\n xmlOrFn = null\r\n }\r\n\r\n // act as getter if no svg string is given\r\n if (xmlOrFn == null || typeof xmlOrFn === 'function') {\r\n // The default for exports is, that the outerNode is included\r\n outerXML = outerXML == null ? true : outerXML\r\n\r\n // write svgjs data to the dom\r\n this.writeDataToDom()\r\n let current = this\r\n\r\n // An export modifier was passed\r\n if (xmlOrFn != null) {\r\n current = adopt(current.node.cloneNode(true))\r\n\r\n // If the user wants outerHTML we need to process this node, too\r\n if (outerXML) {\r\n const result = xmlOrFn(current)\r\n current = result || current\r\n\r\n // The user does not want this node? Well, then he gets nothing\r\n if (result === false) return ''\r\n }\r\n\r\n // Deep loop through all children and apply modifier\r\n current.each(function () {\r\n const result = xmlOrFn(this)\r\n const _this = result || this\r\n\r\n // If modifier returns false, discard node\r\n if (result === false) {\r\n this.remove()\r\n\r\n // If modifier returns new node, use it\r\n } else if (result && this !== _this) {\r\n this.replace(_this)\r\n }\r\n }, true)\r\n }\r\n\r\n // Return outer or inner content\r\n return outerXML\r\n ? current.node.outerHTML\r\n : current.node.innerHTML\r\n }\r\n\r\n // Act as setter if we got a string\r\n\r\n // The default for import is, that the current node is not replaced\r\n outerXML = outerXML == null ? false : outerXML\r\n\r\n // Create temporary holder\r\n const well = create('wrapper', ns)\r\n const fragment = globals.document.createDocumentFragment()\r\n\r\n // Dump raw svg\r\n well.innerHTML = xmlOrFn\r\n\r\n // Transplant nodes into the fragment\r\n for (let len = well.children.length; len--;) {\r\n fragment.appendChild(well.firstElementChild)\r\n }\r\n\r\n const parent = this.parent()\r\n\r\n // Add the whole fragment at once\r\n return outerXML\r\n ? this.replace(fragment) && parent\r\n : this.add(fragment)\r\n }\r\n}\r\n\r\nextend(Dom, { attr, find, findOne })\r\nregister(Dom, 'Dom')\r\n","import { bbox, rbox, inside } from '../types/Box.js'\nimport { ctm, screenCTM } from '../types/Matrix.js'\nimport {\n extend,\n getClass,\n makeInstance,\n register,\n root\n} from '../utils/adopter.js'\nimport { globals } from '../utils/window.js'\nimport { point } from '../types/Point.js'\nimport { proportionalSize } from '../utils/utils.js'\nimport { reference } from '../modules/core/regex.js'\nimport Dom from './Dom.js'\nimport List from '../types/List.js'\nimport SVGNumber from '../types/SVGNumber.js'\n\nexport default class Element extends Dom {\n constructor (node, attrs) {\n super(node, attrs)\n\n // initialize data object\n this.dom = {}\n\n // create circular reference\n this.node.instance = this\n\n if (node.hasAttribute('svgjs:data')) {\n // pull svgjs data from the dom (getAttributeNS doesn't work in html5)\n this.setData(JSON.parse(node.getAttribute('svgjs:data')) || {})\n }\n }\n\n // Move element by its center\n center (x, y) {\n return this.cx(x).cy(y)\n }\n\n // Move by center over x-axis\n cx (x) {\n return x == null\n ? this.x() + this.width() / 2\n : this.x(x - this.width() / 2)\n }\n\n // Move by center over y-axis\n cy (y) {\n return y == null\n ? this.y() + this.height() / 2\n : this.y(y - this.height() / 2)\n }\n\n // Get defs\n defs () {\n const root = this.root()\n return root && root.defs()\n }\n\n // Relative move over x and y axes\n dmove (x, y) {\n return this.dx(x).dy(y)\n }\n\n // Relative move over x axis\n dx (x = 0) {\n return this.x(new SVGNumber(x).plus(this.x()))\n }\n\n // Relative move over y axis\n dy (y = 0) {\n return this.y(new SVGNumber(y).plus(this.y()))\n }\n\n getEventHolder () {\n return this\n }\n\n // Set height of element\n height (height) {\n return this.attr('height', height)\n }\n\n // Move element to given x and y values\n move (x, y) {\n return this.x(x).y(y)\n }\n\n // return array of all ancestors of given type up to the root svg\n parents (until = this.root()) {\n const isSelector = typeof until === 'string'\n if (!isSelector) {\n until = makeInstance(until)\n }\n const parents = new List()\n let parent = this\n\n while (\n (parent = parent.parent())\n && parent.node !== globals.document\n && parent.nodeName !== '#document-fragment') {\n\n parents.push(parent)\n\n if (!isSelector && (parent.node === until.node)) {\n break\n }\n if (isSelector && parent.matches(until)) {\n break\n }\n if (parent.node === this.root().node) {\n // We worked our way to the root and didn't match `until`\n return null\n }\n }\n\n return parents\n }\n\n // Get referenced element form attribute value\n reference (attr) {\n attr = this.attr(attr)\n if (!attr) return null\n\n const m = (attr + '').match(reference)\n return m ? makeInstance(m[1]) : null\n }\n\n // Get parent document\n root () {\n const p = this.parent(getClass(root))\n return p && p.root()\n }\n\n // set given data to the elements data property\n setData (o) {\n this.dom = o\n return this\n }\n\n // Set element size to given width and height\n size (width, height) {\n const p = proportionalSize(this, width, height)\n\n return this\n .width(new SVGNumber(p.width))\n .height(new SVGNumber(p.height))\n }\n\n // Set width of element\n width (width) {\n return this.attr('width', width)\n }\n\n // write svgjs data to the dom\n writeDataToDom () {\n // remove previously set data\n this.node.removeAttribute('svgjs:data')\n\n if (Object.keys(this.dom).length) {\n this.node.setAttribute('svgjs:data', JSON.stringify(this.dom)) // see #428\n }\n\n return super.writeDataToDom()\n }\n\n // Move over x-axis\n x (x) {\n return this.attr('x', x)\n }\n\n // Move over y-axis\n y (y) {\n return this.attr('y', y)\n }\n}\n\nextend(Element, {\n bbox, rbox, inside, point, ctm, screenCTM\n})\n\nregister(Element, 'Element')\n","import { registerMethods } from '../../utils/methods.js'\r\nimport Color from '../../types/Color.js'\r\nimport Element from '../../elements/Element.js'\r\nimport Matrix from '../../types/Matrix.js'\r\nimport Point from '../../types/Point.js'\r\nimport SVGNumber from '../../types/SVGNumber.js'\r\n\r\n// Define list of available attributes for stroke and fill\r\nconst sugar = {\r\n stroke: [ 'color', 'width', 'opacity', 'linecap', 'linejoin', 'miterlimit', 'dasharray', 'dashoffset' ],\r\n fill: [ 'color', 'opacity', 'rule' ],\r\n prefix: function (t, a) {\r\n return a === 'color' ? t : t + '-' + a\r\n }\r\n}\r\n\r\n// Add sugar for fill and stroke\r\n;[ 'fill', 'stroke' ].forEach(function (m) {\r\n const extension = {}\r\n let i\r\n\r\n extension[m] = function (o) {\r\n if (typeof o === 'undefined') {\r\n return this.attr(m)\r\n }\r\n if (typeof o === 'string' || o instanceof Color || Color.isRgb(o) || (o instanceof Element)) {\r\n this.attr(m, o)\r\n } else {\r\n // set all attributes from sugar.fill and sugar.stroke list\r\n for (i = sugar[m].length - 1; i >= 0; i--) {\r\n if (o[sugar[m][i]] != null) {\r\n this.attr(sugar.prefix(m, sugar[m][i]), o[sugar[m][i]])\r\n }\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n registerMethods([ 'Element', 'Runner' ], extension)\r\n})\r\n\r\nregisterMethods([ 'Element', 'Runner' ], {\r\n // Let the user set the matrix directly\r\n matrix: function (mat, b, c, d, e, f) {\r\n // Act as a getter\r\n if (mat == null) {\r\n return new Matrix(this)\r\n }\r\n\r\n // Act as a setter, the user can pass a matrix or a set of numbers\r\n return this.attr('transform', new Matrix(mat, b, c, d, e, f))\r\n },\r\n\r\n // Map rotation to transform\r\n rotate: function (angle, cx, cy) {\r\n return this.transform({ rotate: angle, ox: cx, oy: cy }, true)\r\n },\r\n\r\n // Map skew to transform\r\n skew: function (x, y, cx, cy) {\r\n return arguments.length === 1 || arguments.length === 3\r\n ? this.transform({ skew: x, ox: y, oy: cx }, true)\r\n : this.transform({ skew: [ x, y ], ox: cx, oy: cy }, true)\r\n },\r\n\r\n shear: function (lam, cx, cy) {\r\n return this.transform({ shear: lam, ox: cx, oy: cy }, true)\r\n },\r\n\r\n // Map scale to transform\r\n scale: function (x, y, cx, cy) {\r\n return arguments.length === 1 || arguments.length === 3\r\n ? this.transform({ scale: x, ox: y, oy: cx }, true)\r\n : this.transform({ scale: [ x, y ], ox: cx, oy: cy }, true)\r\n },\r\n\r\n // Map translate to transform\r\n translate: function (x, y) {\r\n return this.transform({ translate: [ x, y ] }, true)\r\n },\r\n\r\n // Map relative translations to transform\r\n relative: function (x, y) {\r\n return this.transform({ relative: [ x, y ] }, true)\r\n },\r\n\r\n // Map flip to transform\r\n flip: function (direction = 'both', origin = 'center') {\r\n if ('xybothtrue'.indexOf(direction) === -1) {\r\n origin = direction\r\n direction = 'both'\r\n }\r\n\r\n return this.transform({ flip: direction, origin: origin }, true)\r\n },\r\n\r\n // Opacity\r\n opacity: function (value) {\r\n return this.attr('opacity', value)\r\n }\r\n})\r\n\r\nregisterMethods('radius', {\r\n // Add x and y radius\r\n radius: function (x, y = x) {\r\n const type = (this._element || this).type\r\n return type === 'radialGradient'\r\n ? this.attr('r', new SVGNumber(x))\r\n : this.rx(x).ry(y)\r\n }\r\n})\r\n\r\nregisterMethods('Path', {\r\n // Get path length\r\n length: function () {\r\n return this.node.getTotalLength()\r\n },\r\n // Get point at length\r\n pointAt: function (length) {\r\n return new Point(this.node.getPointAtLength(length))\r\n }\r\n})\r\n\r\nregisterMethods([ 'Element', 'Runner' ], {\r\n // Set font\r\n font: function (a, v) {\r\n if (typeof a === 'object') {\r\n for (v in a) this.font(v, a[v])\r\n return this\r\n }\r\n\r\n return a === 'leading'\r\n ? this.leading(v)\r\n : a === 'anchor'\r\n ? this.attr('text-anchor', v)\r\n : a === 'size' || a === 'family' || a === 'weight' || a === 'stretch' || a === 'variant' || a === 'style'\r\n ? this.attr('font-' + a, v)\r\n : this.attr(a, v)\r\n }\r\n})\r\n\r\n// Add events to elements\r\nconst methods = [ 'click',\r\n 'dblclick',\r\n 'mousedown',\r\n 'mouseup',\r\n 'mouseover',\r\n 'mouseout',\r\n 'mousemove',\r\n 'mouseenter',\r\n 'mouseleave',\r\n 'touchstart',\r\n 'touchmove',\r\n 'touchleave',\r\n 'touchend',\r\n 'touchcancel' ].reduce(function (last, event) {\r\n // add event to Element\r\n const fn = function (f) {\r\n if (f === null) {\r\n this.off(event)\r\n } else {\r\n this.on(event, f)\r\n }\r\n return this\r\n }\r\n\r\n last[event] = fn\r\n return last\r\n}, {})\r\n\r\nregisterMethods('Element', methods)\r\n","import { getOrigin } from '../../utils/utils.js'\r\nimport { delimiter, transforms } from '../core/regex.js'\r\nimport { registerMethods } from '../../utils/methods.js'\r\nimport Matrix from '../../types/Matrix.js'\r\n\r\n// Reset all transformations\r\nexport function untransform () {\r\n return this.attr('transform', null)\r\n}\r\n\r\n// merge the whole transformation chain into one matrix and returns it\r\nexport function matrixify () {\r\n const matrix = (this.attr('transform') || '')\r\n // split transformations\r\n .split(transforms).slice(0, -1).map(function (str) {\r\n // generate key => value pairs\r\n const kv = str.trim().split('(')\r\n return [ kv[0],\r\n kv[1].split(delimiter)\r\n .map(function (str) {\r\n return parseFloat(str)\r\n })\r\n ]\r\n })\r\n .reverse()\r\n // merge every transformation into one matrix\r\n .reduce(function (matrix, transform) {\r\n if (transform[0] === 'matrix') {\r\n return matrix.lmultiply(Matrix.fromArray(transform[1]))\r\n }\r\n return matrix[transform[0]].apply(matrix, transform[1])\r\n }, new Matrix())\r\n\r\n return matrix\r\n}\r\n\r\n// add an element to another parent without changing the visual representation on the screen\r\nexport function toParent (parent, i) {\r\n if (this === parent) return this\r\n const ctm = this.screenCTM()\r\n const pCtm = parent.screenCTM().inverse()\r\n\r\n this.addTo(parent, i).untransform().transform(pCtm.multiply(ctm))\r\n\r\n return this\r\n}\r\n\r\n// same as above with parent equals root-svg\r\nexport function toRoot (i) {\r\n return this.toParent(this.root(), i)\r\n}\r\n\r\n// Add transformations\r\nexport function transform (o, relative) {\r\n // Act as a getter if no object was passed\r\n if (o == null || typeof o === 'string') {\r\n const decomposed = new Matrix(this).decompose()\r\n return o == null ? decomposed : decomposed[o]\r\n }\r\n\r\n if (!Matrix.isMatrixLike(o)) {\r\n // Set the origin according to the defined transform\r\n o = { ...o, origin: getOrigin(o, this) }\r\n }\r\n\r\n // The user can pass a boolean, an Element or an Matrix or nothing\r\n const cleanRelative = relative === true ? this : (relative || false)\r\n const result = new Matrix(cleanRelative).transform(o)\r\n return this.attr('transform', result)\r\n}\r\n\r\nregisterMethods('Element', {\r\n untransform, matrixify, toParent, toRoot, transform\r\n})\r\n","import { register } from '../utils/adopter.js'\r\nimport Element from './Element.js'\r\n\r\nexport default class Container extends Element {\r\n flatten (parent = this, index) {\r\n this.each(function () {\r\n if (this instanceof Container) {\r\n return this.flatten().ungroup()\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n ungroup (parent = this.parent(), index = parent.index(this)) {\r\n // when parent != this, we want append all elements to the end\r\n index = index === -1 ? parent.children().length : index\r\n\r\n this.each(function (i, children) {\r\n // reverse each\r\n return children[children.length - i - 1].toParent(parent, index)\r\n })\r\n\r\n return this.remove()\r\n }\r\n}\r\n\r\nregister(Container, 'Container')\r\n","import { nodeOrNew, register } from '../utils/adopter.js'\r\nimport Container from './Container.js'\r\n\r\nexport default class Defs extends Container {\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('defs', node), attrs)\r\n }\r\n\r\n flatten () {\r\n return this\r\n }\r\n\r\n ungroup () {\r\n return this\r\n }\r\n}\r\n\r\nregister(Defs, 'Defs')\r\n","import { register } from '../utils/adopter.js'\r\nimport Element from './Element.js'\r\n\r\nexport default class Shape extends Element {}\r\n\r\nregister(Shape, 'Shape')\r\n","import SVGNumber from '../../types/SVGNumber.js'\r\n\r\n// Radius x value\r\nexport function rx (rx) {\r\n return this.attr('rx', rx)\r\n}\r\n\r\n// Radius y value\r\nexport function ry (ry) {\r\n return this.attr('ry', ry)\r\n}\r\n\r\n// Move over x-axis\r\nexport function x (x) {\r\n return x == null\r\n ? this.cx() - this.rx()\r\n : this.cx(x + this.rx())\r\n}\r\n\r\n// Move over y-axis\r\nexport function y (y) {\r\n return y == null\r\n ? this.cy() - this.ry()\r\n : this.cy(y + this.ry())\r\n}\r\n\r\n// Move by center over x-axis\r\nexport function cx (x) {\r\n return this.attr('cx', x)\r\n}\r\n\r\n// Move by center over y-axis\r\nexport function cy (y) {\r\n return this.attr('cy', y)\r\n}\r\n\r\n// Set width of element\r\nexport function width (width) {\r\n return width == null\r\n ? this.rx() * 2\r\n : this.rx(new SVGNumber(width).divide(2))\r\n}\r\n\r\n// Set height of element\r\nexport function height (height) {\r\n return height == null\r\n ? this.ry() * 2\r\n : this.ry(new SVGNumber(height).divide(2))\r\n}\r\n","import {\r\n extend,\r\n nodeOrNew,\r\n register,\r\n wrapWithAttrCheck\r\n} from '../utils/adopter.js'\r\nimport { proportionalSize } from '../utils/utils.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport SVGNumber from '../types/SVGNumber.js'\r\nimport Shape from './Shape.js'\r\nimport * as circled from '../modules/core/circled.js'\r\n\r\nexport default class Ellipse extends Shape {\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('ellipse', node), attrs)\r\n }\r\n\r\n size (width, height) {\r\n const p = proportionalSize(this, width, height)\r\n\r\n return this\r\n .rx(new SVGNumber(p.width).divide(2))\r\n .ry(new SVGNumber(p.height).divide(2))\r\n }\r\n}\r\n\r\nextend(Ellipse, circled)\r\n\r\nregisterMethods('Container', {\r\n // Create an ellipse\r\n ellipse: wrapWithAttrCheck(function (width = 0, height = width) {\r\n return this.put(new Ellipse()).size(width, height).move(0, 0)\r\n })\r\n})\r\n\r\nregister(Ellipse, 'Ellipse')\r\n","import Dom from './Dom.js'\nimport { globals } from '../utils/window.js'\nimport { register, create } from '../utils/adopter.js'\n\nclass Fragment extends Dom {\n constructor (node = globals.document.createDocumentFragment()) {\n super(node)\n }\n\n // Import / Export raw xml\n xml (xmlOrFn, outerXML, ns) {\n if (typeof xmlOrFn === 'boolean') {\n ns = outerXML\n outerXML = xmlOrFn\n xmlOrFn = null\n }\n\n // because this is a fragment we have to put all elements into a wrapper first\n // before we can get the innerXML from it\n if (xmlOrFn == null || typeof xmlOrFn === 'function') {\n const wrapper = new Dom(create('wrapper', ns))\n wrapper.add(this.node.cloneNode(true))\n\n return wrapper.xml(false, ns)\n }\n\n // Act as setter if we got a string\n return super.xml(xmlOrFn, false, ns)\n }\n\n}\n\nregister(Fragment, 'Fragment')\n\nexport default Fragment\n","import SVGNumber from '../../types/SVGNumber.js'\r\n\r\nexport function from (x, y) {\r\n return (this._element || this).type === 'radialGradient'\r\n ? this.attr({ fx: new SVGNumber(x), fy: new SVGNumber(y) })\r\n : this.attr({ x1: new SVGNumber(x), y1: new SVGNumber(y) })\r\n}\r\n\r\nexport function to (x, y) {\r\n return (this._element || this).type === 'radialGradient'\r\n ? this.attr({ cx: new SVGNumber(x), cy: new SVGNumber(y) })\r\n : this.attr({ x2: new SVGNumber(x), y2: new SVGNumber(y) })\r\n}\r\n","import {\r\n extend,\r\n nodeOrNew,\r\n register,\r\n wrapWithAttrCheck\r\n} from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport Box from '../types/Box.js'\r\nimport Container from './Container.js'\r\nimport baseFind from '../modules/core/selector.js'\r\nimport * as gradiented from '../modules/core/gradiented.js'\r\n\r\nexport default class Gradient extends Container {\r\n constructor (type, attrs) {\r\n super(\r\n nodeOrNew(type + 'Gradient', typeof type === 'string' ? null : type),\r\n attrs\r\n )\r\n }\r\n\r\n // custom attr to handle transform\r\n attr (a, b, c) {\r\n if (a === 'transform') a = 'gradientTransform'\r\n return super.attr(a, b, c)\r\n }\r\n\r\n bbox () {\r\n return new Box()\r\n }\r\n\r\n targets () {\r\n return baseFind('svg [fill*=\"' + this.id() + '\"]')\r\n }\r\n\r\n // Alias string conversion to fill\r\n toString () {\r\n return this.url()\r\n }\r\n\r\n // Update gradient\r\n update (block) {\r\n // remove all stops\r\n this.clear()\r\n\r\n // invoke passed block\r\n if (typeof block === 'function') {\r\n block.call(this, this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n // Return the fill id\r\n url () {\r\n return 'url(\"#' + this.id() + '\")'\r\n }\r\n}\r\n\r\nextend(Gradient, gradiented)\r\n\r\nregisterMethods({\r\n Container: {\r\n // Create gradient element in defs\r\n gradient (...args) {\r\n return this.defs().gradient(...args)\r\n }\r\n },\r\n // define gradient\r\n Defs: {\r\n gradient: wrapWithAttrCheck(function (type, block) {\r\n return this.put(new Gradient(type)).update(block)\r\n })\r\n }\r\n})\r\n\r\nregister(Gradient, 'Gradient')\r\n","import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport Box from '../types/Box.js'\r\nimport Container from './Container.js'\r\nimport baseFind from '../modules/core/selector.js'\r\n\r\nexport default class Pattern extends Container {\r\n // Initialize node\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('pattern', node), attrs)\r\n }\r\n\r\n // custom attr to handle transform\r\n attr (a, b, c) {\r\n if (a === 'transform') a = 'patternTransform'\r\n return super.attr(a, b, c)\r\n }\r\n\r\n bbox () {\r\n return new Box()\r\n }\r\n\r\n targets () {\r\n return baseFind('svg [fill*=\"' + this.id() + '\"]')\r\n }\r\n\r\n // Alias string conversion to fill\r\n toString () {\r\n return this.url()\r\n }\r\n\r\n // Update pattern by rebuilding\r\n update (block) {\r\n // remove content\r\n this.clear()\r\n\r\n // invoke passed block\r\n if (typeof block === 'function') {\r\n block.call(this, this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n // Return the fill id\r\n url () {\r\n return 'url(\"#' + this.id() + '\")'\r\n }\r\n\r\n}\r\n\r\nregisterMethods({\r\n Container: {\r\n // Create pattern element in defs\r\n pattern (...args) {\r\n return this.defs().pattern(...args)\r\n }\r\n },\r\n Defs: {\r\n pattern: wrapWithAttrCheck(function (width, height, block) {\r\n return this.put(new Pattern()).update(block).attr({\r\n x: 0,\r\n y: 0,\r\n width: width,\r\n height: height,\r\n patternUnits: 'userSpaceOnUse'\r\n })\r\n })\r\n }\r\n})\r\n\r\nregister(Pattern, 'Pattern')\r\n","import { isImage } from '../modules/core/regex.js'\r\nimport { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js'\r\nimport { off, on } from '../modules/core/event.js'\r\nimport { registerAttrHook } from '../modules/core/attr.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport { xlink } from '../modules/core/namespaces.js'\r\nimport Pattern from './Pattern.js'\r\nimport Shape from './Shape.js'\r\nimport { globals } from '../utils/window.js'\r\n\r\nexport default class Image extends Shape {\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('image', node), attrs)\r\n }\r\n\r\n // (re)load image\r\n load (url, callback) {\r\n if (!url) return this\r\n\r\n const img = new globals.window.Image()\r\n\r\n on(img, 'load', function (e) {\r\n const p = this.parent(Pattern)\r\n\r\n // ensure image size\r\n if (this.width() === 0 && this.height() === 0) {\r\n this.size(img.width, img.height)\r\n }\r\n\r\n if (p instanceof Pattern) {\r\n // ensure pattern size if not set\r\n if (p.width() === 0 && p.height() === 0) {\r\n p.size(this.width(), this.height())\r\n }\r\n }\r\n\r\n if (typeof callback === 'function') {\r\n callback.call(this, e)\r\n }\r\n }, this)\r\n\r\n on(img, 'load error', function () {\r\n // dont forget to unbind memory leaking events\r\n off(img)\r\n })\r\n\r\n return this.attr('href', (img.src = url), xlink)\r\n }\r\n}\r\n\r\nregisterAttrHook(function (attr, val, _this) {\r\n // convert image fill and stroke to patterns\r\n if (attr === 'fill' || attr === 'stroke') {\r\n if (isImage.test(val)) {\r\n val = _this.root().defs().image(val)\r\n }\r\n }\r\n\r\n if (val instanceof Image) {\r\n val = _this.root().defs().pattern(0, 0, (pattern) => {\r\n pattern.add(val)\r\n })\r\n }\r\n\r\n return val\r\n})\r\n\r\nregisterMethods({\r\n Container: {\r\n // create image element, load image and set its size\r\n image: wrapWithAttrCheck(function (source, callback) {\r\n return this.put(new Image()).size(0, 0).load(source, callback)\r\n })\r\n }\r\n})\r\n\r\nregister(Image, 'Image')\r\n","import { delimiter } from '../modules/core/regex.js'\r\nimport SVGArray from './SVGArray.js'\r\nimport Box from './Box.js'\r\nimport Matrix from './Matrix.js'\r\n\r\nexport default class PointArray extends SVGArray {\r\n // Get bounding box of points\r\n bbox () {\r\n let maxX = -Infinity\r\n let maxY = -Infinity\r\n let minX = Infinity\r\n let minY = Infinity\r\n this.forEach(function (el) {\r\n maxX = Math.max(el[0], maxX)\r\n maxY = Math.max(el[1], maxY)\r\n minX = Math.min(el[0], minX)\r\n minY = Math.min(el[1], minY)\r\n })\r\n return new Box(minX, minY, maxX - minX, maxY - minY)\r\n }\r\n\r\n // Move point string\r\n move (x, y) {\r\n const box = this.bbox()\r\n\r\n // get relative offset\r\n x -= box.x\r\n y -= box.y\r\n\r\n // move every point\r\n if (!isNaN(x) && !isNaN(y)) {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n this[i] = [ this[i][0] + x, this[i][1] + y ]\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n // Parse point string and flat array\r\n parse (array = [ 0, 0 ]) {\r\n const points = []\r\n\r\n // if it is an array, we flatten it and therefore clone it to 1 depths\r\n if (array instanceof Array) {\r\n array = Array.prototype.concat.apply([], array)\r\n } else { // Else, it is considered as a string\r\n // parse points\r\n array = array.trim().split(delimiter).map(parseFloat)\r\n }\r\n\r\n // validate points - https://svgwg.org/svg2-draft/shapes.html#DataTypePoints\r\n // Odd number of coordinates is an error. In such cases, drop the last odd coordinate.\r\n if (array.length % 2 !== 0) array.pop()\r\n\r\n // wrap points in two-tuples\r\n for (let i = 0, len = array.length; i < len; i = i + 2) {\r\n points.push([ array[i], array[i + 1] ])\r\n }\r\n\r\n return points\r\n }\r\n\r\n // Resize poly string\r\n size (width, height) {\r\n let i\r\n const box = this.bbox()\r\n\r\n // recalculate position of all points according to new size\r\n for (i = this.length - 1; i >= 0; i--) {\r\n if (box.width) this[i][0] = ((this[i][0] - box.x) * width) / box.width + box.x\r\n if (box.height) this[i][1] = ((this[i][1] - box.y) * height) / box.height + box.y\r\n }\r\n\r\n return this\r\n }\r\n\r\n // Convert array to line object\r\n toLine () {\r\n return {\r\n x1: this[0][0],\r\n y1: this[0][1],\r\n x2: this[1][0],\r\n y2: this[1][1]\r\n }\r\n }\r\n\r\n // Convert array to string\r\n toString () {\r\n const array = []\r\n // convert to a poly point string\r\n for (let i = 0, il = this.length; i < il; i++) {\r\n array.push(this[i].join(','))\r\n }\r\n\r\n return array.join(' ')\r\n }\r\n\r\n transform (m) {\r\n return this.clone().transformO(m)\r\n }\r\n\r\n // transform points with matrix (similar to Point.transform)\r\n transformO (m) {\r\n if (!Matrix.isMatrixLike(m)) {\r\n m = new Matrix(m)\r\n }\r\n\r\n for (let i = this.length; i--;) {\r\n // Perform the matrix multiplication\r\n const [ x, y ] = this[i]\r\n this[i][0] = m.a * x + m.c * y + m.e\r\n this[i][1] = m.b * x + m.d * y + m.f\r\n }\r\n\r\n return this\r\n }\r\n\r\n}\r\n","import PointArray from '../../types/PointArray.js'\r\n\r\nexport const MorphArray = PointArray\r\n\r\n// Move by left top corner over x-axis\r\nexport function x (x) {\r\n return x == null ? this.bbox().x : this.move(x, this.bbox().y)\r\n}\r\n\r\n// Move by left top corner over y-axis\r\nexport function y (y) {\r\n return y == null ? this.bbox().y : this.move(this.bbox().x, y)\r\n}\r\n\r\n// Set width of element\r\nexport function width (width) {\r\n const b = this.bbox()\r\n return width == null ? b.width : this.size(width, b.height)\r\n}\r\n\r\n// Set height of element\r\nexport function height (height) {\r\n const b = this.bbox()\r\n return height == null ? b.height : this.size(b.width, height)\r\n}\r\n","import {\r\n extend,\r\n nodeOrNew,\r\n register,\r\n wrapWithAttrCheck\r\n} from '../utils/adopter.js'\r\nimport { proportionalSize } from '../utils/utils.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport PointArray from '../types/PointArray.js'\r\nimport Shape from './Shape.js'\r\nimport * as pointed from '../modules/core/pointed.js'\r\n\r\nexport default class Line extends Shape {\r\n // Initialize node\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('line', node), attrs)\r\n }\r\n\r\n // Get array\r\n array () {\r\n return new PointArray([\r\n [ this.attr('x1'), this.attr('y1') ],\r\n [ this.attr('x2'), this.attr('y2') ]\r\n ])\r\n }\r\n\r\n // Move by left top corner\r\n move (x, y) {\r\n return this.attr(this.array().move(x, y).toLine())\r\n }\r\n\r\n // Overwrite native plot() method\r\n plot (x1, y1, x2, y2) {\r\n if (x1 == null) {\r\n return this.array()\r\n } else if (typeof y1 !== 'undefined') {\r\n x1 = { x1, y1, x2, y2 }\r\n } else {\r\n x1 = new PointArray(x1).toLine()\r\n }\r\n\r\n return this.attr(x1)\r\n }\r\n\r\n // Set element size to given width and height\r\n size (width, height) {\r\n const p = proportionalSize(this, width, height)\r\n return this.attr(this.array().size(p.width, p.height).toLine())\r\n }\r\n}\r\n\r\nextend(Line, pointed)\r\n\r\nregisterMethods({\r\n Container: {\r\n // Create a line element\r\n line: wrapWithAttrCheck(function (...args) {\r\n // make sure plot is called as a setter\r\n // x1 is not necessarily a number, it can also be an array, a string and a PointArray\r\n return Line.prototype.plot.apply(\r\n this.put(new Line())\r\n , args[0] != null ? args : [ 0, 0, 0, 0 ]\r\n )\r\n })\r\n }\r\n})\r\n\r\nregister(Line, 'Line')\r\n","import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport Container from './Container.js'\r\n\r\nexport default class Marker extends Container {\r\n // Initialize node\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('marker', node), attrs)\r\n }\r\n\r\n // Set height of element\n height (height) {\r\n return this.attr('markerHeight', height)\r\n }\n\n orient (orient) {\r\n return this.attr('orient', orient)\r\n }\n\n // Set marker refX and refY\n ref (x, y) {\r\n return this.attr('refX', x).attr('refY', y)\r\n }\n\n // Return the fill id\n toString () {\r\n return 'url(#' + this.id() + ')'\r\n }\n\n // Update marker\n update (block) {\r\n // remove all content\r\n this.clear()\r\n\r\n // invoke passed block\r\n if (typeof block === 'function') {\r\n block.call(this, this)\r\n }\r\n\r\n return this\r\n }\n\n // Set width of element\r\n width (width) {\r\n return this.attr('markerWidth', width)\r\n }\r\n\r\n}\r\n\r\nregisterMethods({\r\n Container: {\r\n marker (...args) {\r\n // Create marker element in defs\r\n return this.defs().marker(...args)\r\n }\r\n },\r\n Defs: {\r\n // Create marker\r\n marker: wrapWithAttrCheck(function (width, height, block) {\r\n // Set default viewbox to match the width and height, set ref to cx and cy and set orient to auto\r\n return this.put(new Marker())\r\n .size(width, height)\r\n .ref(width / 2, height / 2)\r\n .viewbox(0, 0, width, height)\r\n .attr('orient', 'auto')\r\n .update(block)\r\n })\r\n },\r\n marker: {\r\n // Create and attach markers\r\n marker (marker, width, height, block) {\r\n let attr = [ 'marker' ]\r\n\r\n // Build attribute name\r\n if (marker !== 'all') attr.push(marker)\r\n attr = attr.join('-')\r\n\r\n // Set marker attribute\r\n marker = arguments[1] instanceof Marker\r\n ? arguments[1]\r\n : this.defs().marker(width, height, block)\r\n\r\n return this.attr(attr, marker)\r\n }\r\n }\r\n})\r\n\r\nregister(Marker, 'Marker')\r\n","import { timeline } from '../modules/core/defaults.js'\r\nimport { extend } from '../utils/adopter.js'\r\n\r\n/***\r\nBase Class\r\n==========\r\nThe base stepper class that will be\r\n***/\r\n\r\nfunction makeSetterGetter (k, f) {\r\n return function (v) {\r\n if (v == null) return this[k]\r\n this[k] = v\r\n if (f) f.call(this)\r\n return this\r\n }\r\n}\r\n\r\nexport const easing = {\r\n '-': function (pos) {\r\n return pos\r\n },\r\n '<>': function (pos) {\r\n return -Math.cos(pos * Math.PI) / 2 + 0.5\r\n },\r\n '>': function (pos) {\r\n return Math.sin(pos * Math.PI / 2)\r\n },\r\n '<': function (pos) {\r\n return -Math.cos(pos * Math.PI / 2) + 1\r\n },\r\n bezier: function (x1, y1, x2, y2) {\r\n // see https://www.w3.org/TR/css-easing-1/#cubic-bezier-algo\r\n return function (t) {\r\n if (t < 0) {\r\n if (x1 > 0) {\r\n return y1 / x1 * t\r\n } else if (x2 > 0) {\r\n return y2 / x2 * t\r\n } else {\r\n return 0\r\n }\r\n } else if (t > 1) {\r\n if (x2 < 1) {\r\n return (1 - y2) / (1 - x2) * t + (y2 - x2) / (1 - x2)\r\n } else if (x1 < 1) {\r\n return (1 - y1) / (1 - x1) * t + (y1 - x1) / (1 - x1)\r\n } else {\r\n return 1\r\n }\r\n } else {\r\n return 3 * t * (1 - t) ** 2 * y1 + 3 * t ** 2 * (1 - t) * y2 + t ** 3\r\n }\r\n }\r\n },\r\n // see https://www.w3.org/TR/css-easing-1/#step-timing-function-algo\r\n steps: function (steps, stepPosition = 'end') {\r\n // deal with \"jump-\" prefix\r\n stepPosition = stepPosition.split('-').reverse()[0]\r\n\r\n let jumps = steps\r\n if (stepPosition === 'none') {\r\n --jumps\r\n } else if (stepPosition === 'both') {\r\n ++jumps\r\n }\r\n\r\n // The beforeFlag is essentially useless\r\n return (t, beforeFlag = false) => {\r\n // Step is called currentStep in referenced url\r\n let step = Math.floor(t * steps)\r\n const jumping = (t * step) % 1 === 0\r\n\r\n if (stepPosition === 'start' || stepPosition === 'both') {\r\n ++step\r\n }\r\n\r\n if (beforeFlag && jumping) {\r\n --step\r\n }\r\n\r\n if (t >= 0 && step < 0) {\r\n step = 0\r\n }\r\n\r\n if (t <= 1 && step > jumps) {\r\n step = jumps\r\n }\r\n\r\n return step / jumps\r\n }\r\n }\r\n}\r\n\r\nexport class Stepper {\r\n done () {\r\n return false\r\n }\r\n}\r\n\r\n/***\r\nEasing Functions\r\n================\r\n***/\r\n\r\nexport class Ease extends Stepper {\r\n constructor (fn = timeline.ease) {\r\n super()\r\n this.ease = easing[fn] || fn\r\n }\r\n\r\n step (from, to, pos) {\r\n if (typeof from !== 'number') {\r\n return pos < 1 ? from : to\r\n }\r\n return from + (to - from) * this.ease(pos)\r\n }\r\n}\r\n\r\n/***\r\nController Types\r\n================\r\n***/\r\n\r\nexport class Controller extends Stepper {\r\n constructor (fn) {\r\n super()\r\n this.stepper = fn\r\n }\r\n\r\n done (c) {\r\n return c.done\r\n }\n\n step (current, target, dt, c) {\r\n return this.stepper(current, target, dt, c)\r\n }\r\n\r\n}\r\n\r\nfunction recalculate () {\r\n // Apply the default parameters\r\n const duration = (this._duration || 500) / 1000\r\n const overshoot = this._overshoot || 0\r\n\r\n // Calculate the PID natural response\r\n const eps = 1e-10\r\n const pi = Math.PI\r\n const os = Math.log(overshoot / 100 + eps)\r\n const zeta = -os / Math.sqrt(pi * pi + os * os)\r\n const wn = 3.9 / (zeta * duration)\r\n\r\n // Calculate the Spring values\r\n this.d = 2 * zeta * wn\r\n this.k = wn * wn\r\n}\r\n\r\nexport class Spring extends Controller {\r\n constructor (duration = 500, overshoot = 0) {\r\n super()\r\n this.duration(duration)\r\n .overshoot(overshoot)\r\n }\r\n\r\n step (current, target, dt, c) {\r\n if (typeof current === 'string') return current\r\n c.done = dt === Infinity\r\n if (dt === Infinity) return target\r\n if (dt === 0) return current\r\n\r\n if (dt > 100) dt = 16\r\n\r\n dt /= 1000\r\n\r\n // Get the previous velocity\r\n const velocity = c.velocity || 0\r\n\r\n // Apply the control to get the new position and store it\r\n const acceleration = -this.d * velocity - this.k * (current - target)\r\n const newPosition = current\r\n + velocity * dt\r\n + acceleration * dt * dt / 2\r\n\r\n // Store the velocity\r\n c.velocity = velocity + acceleration * dt\r\n\r\n // Figure out if we have converged, and if so, pass the value\r\n c.done = Math.abs(target - newPosition) + Math.abs(velocity) < 0.002\r\n return c.done ? target : newPosition\r\n }\r\n}\r\n\r\nextend(Spring, {\r\n duration: makeSetterGetter('_duration', recalculate),\r\n overshoot: makeSetterGetter('_overshoot', recalculate)\r\n})\r\n\r\nexport class PID extends Controller {\r\n constructor (p = 0.1, i = 0.01, d = 0, windup = 1000) {\r\n super()\r\n this.p(p).i(i).d(d).windup(windup)\r\n }\r\n\r\n step (current, target, dt, c) {\r\n if (typeof current === 'string') return current\r\n c.done = dt === Infinity\r\n\r\n if (dt === Infinity) return target\r\n if (dt === 0) return current\r\n\r\n const p = target - current\r\n let i = (c.integral || 0) + p * dt\r\n const d = (p - (c.error || 0)) / dt\r\n const windup = this._windup\r\n\r\n // antiwindup\r\n if (windup !== false) {\r\n i = Math.max(-windup, Math.min(i, windup))\r\n }\r\n\r\n c.error = p\r\n c.integral = i\r\n\r\n c.done = Math.abs(p) < 0.001\r\n\r\n return c.done ? target : current + (this.P * p + this.I * i + this.D * d)\r\n }\r\n}\r\n\r\nextend(PID, {\r\n windup: makeSetterGetter('_windup'),\r\n p: makeSetterGetter('P'),\r\n i: makeSetterGetter('I'),\r\n d: makeSetterGetter('D')\r\n})\r\n","import { isPathLetter } from '../modules/core/regex.js'\r\nimport Point from '../types/Point.js'\r\n\r\nconst segmentParameters = { M: 2, L: 2, H: 1, V: 1, C: 6, S: 4, Q: 4, T: 2, A: 7, Z: 0 }\r\n\r\nconst pathHandlers = {\r\n M: function (c, p, p0) {\r\n p.x = p0.x = c[0]\r\n p.y = p0.y = c[1]\r\n\r\n return [ 'M', p.x, p.y ]\r\n },\r\n L: function (c, p) {\r\n p.x = c[0]\r\n p.y = c[1]\r\n return [ 'L', c[0], c[1] ]\r\n },\r\n H: function (c, p) {\r\n p.x = c[0]\r\n return [ 'H', c[0] ]\r\n },\r\n V: function (c, p) {\r\n p.y = c[0]\r\n return [ 'V', c[0] ]\r\n },\r\n C: function (c, p) {\r\n p.x = c[4]\r\n p.y = c[5]\r\n return [ 'C', c[0], c[1], c[2], c[3], c[4], c[5] ]\r\n },\r\n S: function (c, p) {\r\n p.x = c[2]\r\n p.y = c[3]\r\n return [ 'S', c[0], c[1], c[2], c[3] ]\r\n },\r\n Q: function (c, p) {\r\n p.x = c[2]\r\n p.y = c[3]\r\n return [ 'Q', c[0], c[1], c[2], c[3] ]\r\n },\r\n T: function (c, p) {\r\n p.x = c[0]\r\n p.y = c[1]\r\n return [ 'T', c[0], c[1] ]\r\n },\r\n Z: function (c, p, p0) {\r\n p.x = p0.x\r\n p.y = p0.y\r\n return [ 'Z' ]\r\n },\r\n A: function (c, p) {\r\n p.x = c[5]\r\n p.y = c[6]\r\n return [ 'A', c[0], c[1], c[2], c[3], c[4], c[5], c[6] ]\r\n }\r\n}\r\n\r\nconst mlhvqtcsaz = 'mlhvqtcsaz'.split('')\r\n\r\nfor (let i = 0, il = mlhvqtcsaz.length; i < il; ++i) {\r\n pathHandlers[mlhvqtcsaz[i]] = (function (i) {\r\n return function (c, p, p0) {\r\n if (i === 'H') c[0] = c[0] + p.x\r\n else if (i === 'V') c[0] = c[0] + p.y\r\n else if (i === 'A') {\r\n c[5] = c[5] + p.x\r\n c[6] = c[6] + p.y\r\n } else {\r\n for (let j = 0, jl = c.length; j < jl; ++j) {\r\n c[j] = c[j] + (j % 2 ? p.y : p.x)\r\n }\r\n }\r\n\r\n return pathHandlers[i](c, p, p0)\r\n }\r\n })(mlhvqtcsaz[i].toUpperCase())\r\n}\r\n\r\nfunction makeAbsolut (parser) {\r\n const command = parser.segment[0]\r\n return pathHandlers[command](parser.segment.slice(1), parser.p, parser.p0)\r\n}\r\n\r\nfunction segmentComplete (parser) {\r\n return parser.segment.length && parser.segment.length - 1 === segmentParameters[parser.segment[0].toUpperCase()]\r\n}\r\n\r\nfunction startNewSegment (parser, token) {\r\n parser.inNumber && finalizeNumber(parser, false)\r\n const pathLetter = isPathLetter.test(token)\r\n\r\n if (pathLetter) {\r\n parser.segment = [ token ]\r\n } else {\r\n const lastCommand = parser.lastCommand\r\n const small = lastCommand.toLowerCase()\r\n const isSmall = lastCommand === small\r\n parser.segment = [ small === 'm' ? (isSmall ? 'l' : 'L') : lastCommand ]\r\n }\r\n\r\n parser.inSegment = true\r\n parser.lastCommand = parser.segment[0]\r\n\r\n return pathLetter\r\n}\r\n\r\nfunction finalizeNumber (parser, inNumber) {\r\n if (!parser.inNumber) throw new Error('Parser Error')\r\n parser.number && parser.segment.push(parseFloat(parser.number))\r\n parser.inNumber = inNumber\r\n parser.number = ''\r\n parser.pointSeen = false\r\n parser.hasExponent = false\r\n\r\n if (segmentComplete(parser)) {\r\n finalizeSegment(parser)\r\n }\r\n}\r\n\r\nfunction finalizeSegment (parser) {\r\n parser.inSegment = false\r\n if (parser.absolute) {\r\n parser.segment = makeAbsolut(parser)\r\n }\r\n parser.segments.push(parser.segment)\r\n}\r\n\r\nfunction isArcFlag (parser) {\r\n if (!parser.segment.length) return false\r\n const isArc = parser.segment[0].toUpperCase() === 'A'\r\n const length = parser.segment.length\r\n\r\n return isArc && (length === 4 || length === 5)\r\n}\r\n\r\nfunction isExponential (parser) {\r\n return parser.lastToken.toUpperCase() === 'E'\r\n}\r\n\r\nexport function pathParser (d, toAbsolute = true) {\r\n\r\n let index = 0\r\n let token = ''\r\n const parser = {\r\n segment: [],\r\n inNumber: false,\r\n number: '',\r\n lastToken: '',\r\n inSegment: false,\r\n segments: [],\r\n pointSeen: false,\r\n hasExponent: false,\r\n absolute: toAbsolute,\r\n p0: new Point(),\r\n p: new Point()\r\n }\r\n\r\n while ((parser.lastToken = token, token = d.charAt(index++))) {\r\n if (!parser.inSegment) {\r\n if (startNewSegment(parser, token)) {\r\n continue\r\n }\r\n }\r\n\r\n if (token === '.') {\r\n if (parser.pointSeen || parser.hasExponent) {\r\n finalizeNumber(parser, false)\r\n --index\r\n continue\r\n }\r\n parser.inNumber = true\r\n parser.pointSeen = true\r\n parser.number += token\r\n continue\r\n }\r\n\r\n if (!isNaN(parseInt(token))) {\r\n\r\n if (parser.number === '0' || isArcFlag(parser)) {\r\n parser.inNumber = true\r\n parser.number = token\r\n finalizeNumber(parser, true)\r\n continue\r\n }\r\n\r\n parser.inNumber = true\r\n parser.number += token\r\n continue\r\n }\r\n\r\n if (token === ' ' || token === ',') {\r\n if (parser.inNumber) {\r\n finalizeNumber(parser, false)\r\n }\r\n continue\r\n }\r\n\r\n if (token === '-') {\r\n if (parser.inNumber && !isExponential(parser)) {\r\n finalizeNumber(parser, false)\r\n --index\r\n continue\r\n }\r\n parser.number += token\r\n parser.inNumber = true\r\n continue\r\n }\r\n\r\n if (token.toUpperCase() === 'E') {\r\n parser.number += token\r\n parser.hasExponent = true\r\n continue\r\n }\r\n\r\n if (isPathLetter.test(token)) {\r\n if (parser.inNumber) {\r\n finalizeNumber(parser, false)\r\n } else if (!segmentComplete(parser)) {\r\n throw new Error('parser Error')\r\n } else {\r\n finalizeSegment(parser)\r\n }\r\n --index\r\n }\r\n }\r\n\r\n if (parser.inNumber) {\r\n finalizeNumber(parser, false)\r\n }\r\n\r\n if (parser.inSegment && segmentComplete(parser)) {\r\n finalizeSegment(parser)\r\n }\r\n\r\n return parser.segments\r\n\r\n}\r\n","import SVGArray from './SVGArray.js'\r\nimport parser from '../modules/core/parser.js'\r\nimport Box from './Box.js'\r\nimport { pathParser } from '../utils/pathParser.js'\r\n\r\nfunction arrayToString (a) {\r\n let s = ''\r\n for (let i = 0, il = a.length; i < il; i++) {\r\n s += a[i][0]\r\n\r\n if (a[i][1] != null) {\r\n s += a[i][1]\r\n\r\n if (a[i][2] != null) {\r\n s += ' '\r\n s += a[i][2]\r\n\r\n if (a[i][3] != null) {\r\n s += ' '\r\n s += a[i][3]\r\n s += ' '\r\n s += a[i][4]\r\n\r\n if (a[i][5] != null) {\r\n s += ' '\r\n s += a[i][5]\r\n s += ' '\r\n s += a[i][6]\r\n\r\n if (a[i][7] != null) {\r\n s += ' '\r\n s += a[i][7]\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return s + ' '\r\n}\r\n\r\nexport default class PathArray extends SVGArray {\r\n // Get bounding box of path\r\n bbox () {\r\n parser().path.setAttribute('d', this.toString())\r\n return new Box(parser.nodes.path.getBBox())\r\n }\r\n\r\n // Move path string\r\n move (x, y) {\r\n // get bounding box of current situation\r\n const box = this.bbox()\r\n\r\n // get relative offset\r\n x -= box.x\r\n y -= box.y\r\n\r\n if (!isNaN(x) && !isNaN(y)) {\r\n // move every point\r\n for (let l, i = this.length - 1; i >= 0; i--) {\r\n l = this[i][0]\r\n\r\n if (l === 'M' || l === 'L' || l === 'T') {\r\n this[i][1] += x\r\n this[i][2] += y\r\n } else if (l === 'H') {\r\n this[i][1] += x\r\n } else if (l === 'V') {\r\n this[i][1] += y\r\n } else if (l === 'C' || l === 'S' || l === 'Q') {\r\n this[i][1] += x\r\n this[i][2] += y\r\n this[i][3] += x\r\n this[i][4] += y\r\n\r\n if (l === 'C') {\r\n this[i][5] += x\r\n this[i][6] += y\r\n }\r\n } else if (l === 'A') {\r\n this[i][6] += x\r\n this[i][7] += y\r\n }\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n // Absolutize and parse path to array\r\n parse (d = 'M0 0') {\r\n if (Array.isArray(d)) {\r\n d = Array.prototype.concat.apply([], d).toString()\r\n }\r\n\r\n return pathParser(d)\r\n }\r\n\r\n // Resize path string\r\n size (width, height) {\r\n // get bounding box of current situation\r\n const box = this.bbox()\r\n let i, l\r\n\r\n // If the box width or height is 0 then we ignore\r\n // transformations on the respective axis\r\n box.width = box.width === 0 ? 1 : box.width\r\n box.height = box.height === 0 ? 1 : box.height\r\n\r\n // recalculate position of all points according to new size\r\n for (i = this.length - 1; i >= 0; i--) {\r\n l = this[i][0]\r\n\r\n if (l === 'M' || l === 'L' || l === 'T') {\r\n this[i][1] = ((this[i][1] - box.x) * width) / box.width + box.x\r\n this[i][2] = ((this[i][2] - box.y) * height) / box.height + box.y\r\n } else if (l === 'H') {\r\n this[i][1] = ((this[i][1] - box.x) * width) / box.width + box.x\r\n } else if (l === 'V') {\r\n this[i][1] = ((this[i][1] - box.y) * height) / box.height + box.y\r\n } else if (l === 'C' || l === 'S' || l === 'Q') {\r\n this[i][1] = ((this[i][1] - box.x) * width) / box.width + box.x\r\n this[i][2] = ((this[i][2] - box.y) * height) / box.height + box.y\r\n this[i][3] = ((this[i][3] - box.x) * width) / box.width + box.x\r\n this[i][4] = ((this[i][4] - box.y) * height) / box.height + box.y\r\n\r\n if (l === 'C') {\r\n this[i][5] = ((this[i][5] - box.x) * width) / box.width + box.x\r\n this[i][6] = ((this[i][6] - box.y) * height) / box.height + box.y\r\n }\r\n } else if (l === 'A') {\r\n // resize radii\r\n this[i][1] = (this[i][1] * width) / box.width\r\n this[i][2] = (this[i][2] * height) / box.height\r\n\r\n // move position values\r\n this[i][6] = ((this[i][6] - box.x) * width) / box.width + box.x\r\n this[i][7] = ((this[i][7] - box.y) * height) / box.height + box.y\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n // Convert array to string\r\n toString () {\r\n return arrayToString(this)\r\n }\r\n\r\n}\r\n","import { Ease } from './Controller.js'\nimport {\n delimiter,\n numberAndUnit,\n isPathLetter\n} from '../modules/core/regex.js'\nimport { extend } from '../utils/adopter.js'\nimport Color from '../types/Color.js'\nimport PathArray from '../types/PathArray.js'\nimport SVGArray from '../types/SVGArray.js'\nimport SVGNumber from '../types/SVGNumber.js'\n\nconst getClassForType = (value) => {\n const type = typeof value\n\n if (type === 'number') {\n return SVGNumber\n } else if (type === 'string') {\n if (Color.isColor(value)) {\n return Color\n } else if (delimiter.test(value)) {\n return isPathLetter.test(value)\n ? PathArray\n : SVGArray\n } else if (numberAndUnit.test(value)) {\n return SVGNumber\n } else {\n return NonMorphable\n }\n } else if (morphableTypes.indexOf(value.constructor) > -1) {\n return value.constructor\n } else if (Array.isArray(value)) {\n return SVGArray\n } else if (type === 'object') {\n return ObjectBag\n } else {\n return NonMorphable\n }\n}\n\nexport default class Morphable {\n constructor (stepper) {\n this._stepper = stepper || new Ease('-')\n\n this._from = null\n this._to = null\n this._type = null\n this._context = null\n this._morphObj = null\n }\n\n at (pos) {\n return this._morphObj.morph(this._from, this._to, pos, this._stepper, this._context)\n\n }\n\n done () {\n const complete = this._context\n .map(this._stepper.done)\n .reduce(function (last, curr) {\n return last && curr\n }, true)\n return complete\n }\n\n from (val) {\n if (val == null) {\n return this._from\n }\n\n this._from = this._set(val)\n return this\n }\n\n stepper (stepper) {\n if (stepper == null) return this._stepper\n this._stepper = stepper\n return this\n }\n\n to (val) {\n if (val == null) {\n return this._to\n }\n\n this._to = this._set(val)\n return this\n }\n\n type (type) {\n // getter\n if (type == null) {\n return this._type\n }\n\n // setter\n this._type = type\n return this\n }\n\n _set (value) {\n if (!this._type) {\n this.type(getClassForType(value))\n }\n\n let result = (new this._type(value))\n if (this._type === Color) {\n result = this._to\n ? result[this._to[4]]()\n : this._from\n ? result[this._from[4]]()\n : result\n }\n\n if (this._type === ObjectBag) {\n result = this._to\n ? result.align(this._to)\n : this._from\n ? result.align(this._from)\n : result\n }\n\n result = result.toConsumable()\n\n this._morphObj = this._morphObj || new this._type()\n this._context = this._context\n || Array.apply(null, Array(result.length))\n .map(Object)\n .map(function (o) {\n o.done = true\n return o\n })\n return result\n }\n\n}\n\nexport class NonMorphable {\n constructor (...args) {\n this.init(...args)\n }\n\n init (val) {\n val = Array.isArray(val) ? val[0] : val\n this.value = val\n return this\n }\n\n toArray () {\n return [ this.value ]\n }\n\n valueOf () {\n return this.value\n }\n\n}\n\nexport class TransformBag {\n constructor (...args) {\n this.init(...args)\n }\n\n init (obj) {\n if (Array.isArray(obj)) {\n obj = {\n scaleX: obj[0],\n scaleY: obj[1],\n shear: obj[2],\n rotate: obj[3],\n translateX: obj[4],\n translateY: obj[5],\n originX: obj[6],\n originY: obj[7]\n }\n }\n\n Object.assign(this, TransformBag.defaults, obj)\n return this\n }\n\n toArray () {\n const v = this\n\n return [\n v.scaleX,\n v.scaleY,\n v.shear,\n v.rotate,\n v.translateX,\n v.translateY,\n v.originX,\n v.originY\n ]\n }\n}\n\nTransformBag.defaults = {\n scaleX: 1,\n scaleY: 1,\n shear: 0,\n rotate: 0,\n translateX: 0,\n translateY: 0,\n originX: 0,\n originY: 0\n}\n\nconst sortByKey = (a, b) => {\n return (a[0] < b[0] ? -1 : (a[0] > b[0] ? 1 : 0))\n}\n\nexport class ObjectBag {\n constructor (...args) {\n this.init(...args)\n }\n\n align (other) {\n const values = this.values\n for (let i = 0, il = values.length; i < il; ++i) {\n\n // If the type is the same we only need to check if the color is in the correct format\n if (values[i + 1] === other[i + 1]) {\n if (values[i + 1] === Color && other[i + 7] !== values[i + 7]) {\n const space = other[i + 7]\n const color = new Color(this.values.splice(i + 3, 5))[space]().toArray()\n this.values.splice(i + 3, 0, ...color)\n }\n\n i += values[i + 2] + 2\n continue\n }\n\n if (!other[i + 1]) {\n return this\n }\n\n // The types differ, so we overwrite the new type with the old one\n // And initialize it with the types default (e.g. black for color or 0 for number)\n const defaultObject = new (other[i + 1])().toArray()\n\n // Than we fix the values array\n const toDelete = (values[i + 2]) + 3\n\n values.splice(i, toDelete, other[i], other[i + 1], other[i + 2], ...defaultObject)\n\n i += values[i + 2] + 2\n }\n return this\n }\n\n init (objOrArr) {\n this.values = []\n\n if (Array.isArray(objOrArr)) {\n this.values = objOrArr.slice()\n return\n }\n\n objOrArr = objOrArr || {}\n const entries = []\n\n for (const i in objOrArr) {\n const Type = getClassForType(objOrArr[i])\n const val = new Type(objOrArr[i]).toArray()\n entries.push([ i, Type, val.length, ...val ])\n }\n\n entries.sort(sortByKey)\n\n this.values = entries.reduce((last, curr) => last.concat(curr), [])\n return this\n }\n\n toArray () {\n return this.values\n }\n\n valueOf () {\n const obj = {}\n const arr = this.values\n\n // for (var i = 0, len = arr.length; i < len; i += 2) {\n while (arr.length) {\n const key = arr.shift()\n const Type = arr.shift()\n const num = arr.shift()\n const values = arr.splice(0, num)\n obj[key] = new Type(values)// .valueOf()\n }\n\n return obj\n }\n\n}\n\nconst morphableTypes = [\n NonMorphable,\n TransformBag,\n ObjectBag\n]\n\nexport function registerMorphableType (type = []) {\n morphableTypes.push(...[].concat(type))\n}\n\nexport function makeMorphable () {\n extend(morphableTypes, {\n to (val) {\n return new Morphable()\n .type(this.constructor)\n .from(this.toArray())// this.valueOf())\n .to(val)\n },\n fromArray (arr) {\n this.init(arr)\n return this\n },\n toConsumable () {\n return this.toArray()\n },\n morph (from, to, pos, stepper, context) {\n const mapper = function (i, index) {\n return stepper.step(i, to[index], pos, context[index], context)\n }\n\n return this.fromArray(from.map(mapper))\n }\n })\n}\n","import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js'\r\nimport { proportionalSize } from '../utils/utils.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport PathArray from '../types/PathArray.js'\r\nimport Shape from './Shape.js'\r\n\r\nexport default class Path extends Shape {\r\n // Initialize node\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('path', node), attrs)\r\n }\r\n\r\n // Get array\r\n array () {\r\n return this._array || (this._array = new PathArray(this.attr('d')))\r\n }\r\n\r\n // Clear array cache\r\n clear () {\r\n delete this._array\r\n return this\r\n }\r\n\r\n // Set height of element\r\n height (height) {\r\n return height == null ? this.bbox().height : this.size(this.bbox().width, height)\r\n }\r\n\r\n // Move by left top corner\r\n move (x, y) {\r\n return this.attr('d', this.array().move(x, y))\r\n }\r\n\r\n // Plot new path\r\n plot (d) {\r\n return (d == null)\n ? this.array()\r\n : this.clear().attr('d', typeof d === 'string' ? d : (this._array = new PathArray(d)))\r\n }\r\n\r\n // Set element size to given width and height\r\n size (width, height) {\r\n const p = proportionalSize(this, width, height)\r\n return this.attr('d', this.array().size(p.width, p.height))\r\n }\r\n\r\n // Set width of element\r\n width (width) {\r\n return width == null ? this.bbox().width : this.size(width, this.bbox().height)\r\n }\r\n\r\n // Move by left top corner over x-axis\r\n x (x) {\r\n return x == null ? this.bbox().x : this.move(x, this.bbox().y)\r\n }\r\n\r\n // Move by left top corner over y-axis\r\n y (y) {\r\n return y == null ? this.bbox().y : this.move(this.bbox().x, y)\r\n }\r\n\r\n}\r\n\r\n// Define morphable array\r\nPath.prototype.MorphArray = PathArray\r\n\r\n// Add parent method\r\nregisterMethods({\r\n Container: {\r\n // Create a wrapped path element\r\n path: wrapWithAttrCheck(function (d) {\r\n // make sure plot is called as a setter\r\n return this.put(new Path()).plot(d || new PathArray())\r\n })\r\n }\r\n})\r\n\r\nregister(Path, 'Path')\r\n","import { proportionalSize } from '../../utils/utils.js'\r\nimport PointArray from '../../types/PointArray.js'\r\n\r\n// Get array\r\nexport function array () {\r\n return this._array || (this._array = new PointArray(this.attr('points')))\r\n}\r\n\r\n// Clear array cache\r\nexport function clear () {\r\n delete this._array\r\n return this\r\n}\r\n\r\n// Move by left top corner\r\nexport function move (x, y) {\r\n return this.attr('points', this.array().move(x, y))\r\n}\r\n\r\n// Plot new path\r\nexport function plot (p) {\r\n return (p == null)\n ? this.array()\r\n : this.clear().attr('points', typeof p === 'string'\n ? p\r\n : (this._array = new PointArray(p)))\r\n}\r\n\r\n// Set element size to given width and height\r\nexport function size (width, height) {\r\n const p = proportionalSize(this, width, height)\r\n return this.attr('points', this.array().size(p.width, p.height))\r\n}\r\n","import {\r\n extend,\r\n nodeOrNew,\r\n register,\r\n wrapWithAttrCheck\r\n} from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport PointArray from '../types/PointArray.js'\r\nimport Shape from './Shape.js'\r\nimport * as pointed from '../modules/core/pointed.js'\r\nimport * as poly from '../modules/core/poly.js'\r\n\r\nexport default class Polygon extends Shape {\r\n // Initialize node\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('polygon', node), attrs)\r\n }\r\n}\r\n\r\nregisterMethods({\r\n Container: {\r\n // Create a wrapped polygon element\r\n polygon: wrapWithAttrCheck(function (p) {\r\n // make sure plot is called as a setter\r\n return this.put(new Polygon()).plot(p || new PointArray())\r\n })\r\n }\r\n})\r\n\r\nextend(Polygon, pointed)\r\nextend(Polygon, poly)\r\nregister(Polygon, 'Polygon')\r\n","import {\r\n extend,\r\n nodeOrNew,\r\n register,\r\n wrapWithAttrCheck\r\n} from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport PointArray from '../types/PointArray.js'\r\nimport Shape from './Shape.js'\r\nimport * as pointed from '../modules/core/pointed.js'\r\nimport * as poly from '../modules/core/poly.js'\r\n\r\nexport default class Polyline extends Shape {\r\n // Initialize node\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('polyline', node), attrs)\r\n }\r\n}\r\n\r\nregisterMethods({\r\n Container: {\r\n // Create a wrapped polygon element\r\n polyline: wrapWithAttrCheck(function (p) {\r\n // make sure plot is called as a setter\r\n return this.put(new Polyline()).plot(p || new PointArray())\r\n })\r\n }\r\n})\r\n\r\nextend(Polyline, pointed)\r\nextend(Polyline, poly)\r\nregister(Polyline, 'Polyline')\r\n","import {\r\n extend,\r\n nodeOrNew,\r\n register,\r\n wrapWithAttrCheck\r\n} from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport { rx, ry } from '../modules/core/circled.js'\r\nimport Shape from './Shape.js'\r\n\r\nexport default class Rect extends Shape {\r\n // Initialize node\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('rect', node), attrs)\r\n }\r\n}\r\n\r\nextend(Rect, { rx, ry })\r\n\r\nregisterMethods({\r\n Container: {\r\n // Create a rect element\r\n rect: wrapWithAttrCheck(function (width, height) {\r\n return this.put(new Rect()).size(width, height)\r\n })\r\n }\r\n})\r\n\r\nregister(Rect, 'Rect')\r\n","export default class Queue {\r\n constructor () {\r\n this._first = null\r\n this._last = null\r\n }\r\n\r\n // Shows us the first item in the list\n first () {\r\n return this._first && this._first.value\r\n }\n\n // Shows us the last item in the list\n last () {\r\n return this._last && this._last.value\r\n }\n\n push (value) {\r\n // An item stores an id and the provided value\r\n const item = typeof value.next !== 'undefined' ? value : { value: value, next: null, prev: null }\r\n\r\n // Deal with the queue being empty or populated\r\n if (this._last) {\r\n item.prev = this._last\r\n this._last.next = item\r\n this._last = item\r\n } else {\r\n this._last = item\r\n this._first = item\r\n }\r\n\r\n // Return the current item\r\n return item\r\n }\r\n\n // Removes the item that was returned from the push\n remove (item) {\r\n // Relink the previous item\r\n if (item.prev) item.prev.next = item.next\r\n if (item.next) item.next.prev = item.prev\r\n if (item === this._last) this._last = item.prev\r\n if (item === this._first) this._first = item.next\r\n\r\n // Invalidate item\r\n item.prev = null\r\n item.next = null\r\n }\n\n shift () {\r\n // Check if we have a value\r\n const remove = this._first\r\n if (!remove) return null\r\n\r\n // If we do, remove it and relink things\r\n this._first = remove.next\r\n if (this._first) this._first.prev = null\r\n this._last = this._first ? this._last : null\r\n return remove.value\r\n }\r\n\r\n}\r\n","import { globals } from '../utils/window.js'\r\nimport Queue from './Queue.js'\r\n\r\nconst Animator = {\r\n nextDraw: null,\r\n frames: new Queue(),\r\n timeouts: new Queue(),\r\n immediates: new Queue(),\r\n timer: () => globals.window.performance || globals.window.Date,\r\n transforms: [],\r\n\r\n frame (fn) {\r\n // Store the node\r\n const node = Animator.frames.push({ run: fn })\r\n\r\n // Request an animation frame if we don't have one\r\n if (Animator.nextDraw === null) {\r\n Animator.nextDraw = globals.window.requestAnimationFrame(Animator._draw)\r\n }\r\n\r\n // Return the node so we can remove it easily\r\n return node\r\n },\r\n\r\n timeout (fn, delay) {\r\n delay = delay || 0\r\n\r\n // Work out when the event should fire\r\n const time = Animator.timer().now() + delay\r\n\r\n // Add the timeout to the end of the queue\r\n const node = Animator.timeouts.push({ run: fn, time: time })\r\n\r\n // Request another animation frame if we need one\r\n if (Animator.nextDraw === null) {\r\n Animator.nextDraw = globals.window.requestAnimationFrame(Animator._draw)\r\n }\r\n\r\n return node\r\n },\r\n\r\n immediate (fn) {\r\n // Add the immediate fn to the end of the queue\r\n const node = Animator.immediates.push(fn)\r\n // Request another animation frame if we need one\r\n if (Animator.nextDraw === null) {\r\n Animator.nextDraw = globals.window.requestAnimationFrame(Animator._draw)\r\n }\r\n\r\n return node\r\n },\r\n\r\n cancelFrame (node) {\r\n node != null && Animator.frames.remove(node)\r\n },\r\n\r\n clearTimeout (node) {\r\n node != null && Animator.timeouts.remove(node)\r\n },\r\n\r\n cancelImmediate (node) {\r\n node != null && Animator.immediates.remove(node)\r\n },\r\n\r\n _draw (now) {\r\n // Run all the timeouts we can run, if they are not ready yet, add them\r\n // to the end of the queue immediately! (bad timeouts!!! [sarcasm])\r\n let nextTimeout = null\r\n const lastTimeout = Animator.timeouts.last()\r\n while ((nextTimeout = Animator.timeouts.shift())) {\r\n // Run the timeout if its time, or push it to the end\r\n if (now >= nextTimeout.time) {\r\n nextTimeout.run()\r\n } else {\r\n Animator.timeouts.push(nextTimeout)\r\n }\r\n\r\n // If we hit the last item, we should stop shifting out more items\r\n if (nextTimeout === lastTimeout) break\r\n }\r\n\r\n // Run all of the animation frames\r\n let nextFrame = null\r\n const lastFrame = Animator.frames.last()\r\n while ((nextFrame !== lastFrame) && (nextFrame = Animator.frames.shift())) {\r\n nextFrame.run(now)\r\n }\r\n\r\n let nextImmediate = null\r\n while ((nextImmediate = Animator.immediates.shift())) {\r\n nextImmediate()\r\n }\r\n\r\n // If we have remaining timeouts or frames, draw until we don't anymore\r\n Animator.nextDraw = Animator.timeouts.first() || Animator.frames.first()\r\n ? globals.window.requestAnimationFrame(Animator._draw)\r\n : null\r\n }\r\n}\r\n\r\nexport default Animator\r\n","import { globals } from '../utils/window.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport Animator from './Animator.js'\r\nimport EventTarget from '../types/EventTarget.js'\r\n\r\nconst makeSchedule = function (runnerInfo) {\r\n const start = runnerInfo.start\r\n const duration = runnerInfo.runner.duration()\r\n const end = start + duration\r\n return { start: start, duration: duration, end: end, runner: runnerInfo.runner }\r\n}\r\n\r\nconst defaultSource = function () {\r\n const w = globals.window\r\n return (w.performance || w.Date).now()\r\n}\r\n\r\nexport default class Timeline extends EventTarget {\r\n // Construct a new timeline on the given element\r\n constructor (timeSource = defaultSource) {\r\n super()\r\n\r\n this._timeSource = timeSource\r\n\r\n // Store the timing variables\r\n this._startTime = 0\r\n this._speed = 1.0\r\n\r\n // Determines how long a runner is hold in memory. Can be a dt or true/false\r\n this._persist = 0\r\n\r\n // Keep track of the running animations and their starting parameters\r\n this._nextFrame = null\r\n this._paused = true\r\n this._runners = []\r\n this._runnerIds = []\r\n this._lastRunnerId = -1\r\n this._time = 0\r\n this._lastSourceTime = 0\r\n this._lastStepTime = 0\r\n\r\n // Make sure that step is always called in class context\r\n this._step = this._stepFn.bind(this, false)\r\n this._stepImmediate = this._stepFn.bind(this, true)\r\n }\r\n\r\n active () {\r\n return !!this._nextFrame\r\n }\r\n\r\n finish () {\r\n // Go to end and pause\r\n this.time(this.getEndTimeOfTimeline() + 1)\r\n return this.pause()\r\n }\r\n\r\n // Calculates the end of the timeline\r\n getEndTime () {\r\n const lastRunnerInfo = this.getLastRunnerInfo()\r\n const lastDuration = lastRunnerInfo ? lastRunnerInfo.runner.duration() : 0\r\n const lastStartTime = lastRunnerInfo ? lastRunnerInfo.start : this._time\r\n return lastStartTime + lastDuration\r\n }\r\n\r\n getEndTimeOfTimeline () {\r\n const endTimes = this._runners.map((i) => i.start + i.runner.duration())\r\n return Math.max(0, ...endTimes)\r\n }\r\n\r\n getLastRunnerInfo () {\r\n return this.getRunnerInfoById(this._lastRunnerId)\r\n }\r\n\r\n getRunnerInfoById (id) {\r\n return this._runners[this._runnerIds.indexOf(id)] || null\r\n }\r\n\r\n pause () {\r\n this._paused = true\r\n return this._continue()\r\n }\r\n\r\n persist (dtOrForever) {\r\n if (dtOrForever == null) return this._persist\r\n this._persist = dtOrForever\r\n return this\r\n }\r\n\r\n play () {\r\n // Now make sure we are not paused and continue the animation\r\n this._paused = false\r\n return this.updateTime()._continue()\r\n }\r\n\r\n reverse (yes) {\r\n const currentSpeed = this.speed()\r\n if (yes == null) return this.speed(-currentSpeed)\r\n\r\n const positive = Math.abs(currentSpeed)\r\n return this.speed(yes ? -positive : positive)\r\n }\r\n\r\n // schedules a runner on the timeline\r\n schedule (runner, delay, when) {\r\n if (runner == null) {\r\n return this._runners.map(makeSchedule)\r\n }\r\n\r\n // The start time for the next animation can either be given explicitly,\r\n // derived from the current timeline time or it can be relative to the\r\n // last start time to chain animations directly\r\n\r\n let absoluteStartTime = 0\r\n const endTime = this.getEndTime()\r\n delay = delay || 0\r\n\r\n // Work out when to start the animation\r\n if (when == null || when === 'last' || when === 'after') {\r\n // Take the last time and increment\r\n absoluteStartTime = endTime\r\n } else if (when === 'absolute' || when === 'start') {\r\n absoluteStartTime = delay\r\n delay = 0\r\n } else if (when === 'now') {\r\n absoluteStartTime = this._time\r\n } else if (when === 'relative') {\r\n const runnerInfo = this.getRunnerInfoById(runner.id)\r\n if (runnerInfo) {\r\n absoluteStartTime = runnerInfo.start + delay\r\n delay = 0\r\n }\r\n } else if (when === 'with-last') {\r\n const lastRunnerInfo = this.getLastRunnerInfo()\r\n const lastStartTime = lastRunnerInfo ? lastRunnerInfo.start : this._time\r\n absoluteStartTime = lastStartTime\r\n } else {\r\n throw new Error('Invalid value for the \"when\" parameter')\r\n }\r\n\r\n // Manage runner\r\n runner.unschedule()\r\n runner.timeline(this)\r\n\r\n const persist = runner.persist()\r\n const runnerInfo = {\r\n persist: persist === null ? this._persist : persist,\r\n start: absoluteStartTime + delay,\r\n runner\r\n }\r\n\r\n this._lastRunnerId = runner.id\r\n\r\n this._runners.push(runnerInfo)\r\n this._runners.sort((a, b) => a.start - b.start)\r\n this._runnerIds = this._runners.map(info => info.runner.id)\r\n\r\n this.updateTime()._continue()\r\n return this\r\n }\r\n\r\n seek (dt) {\r\n return this.time(this._time + dt)\r\n }\r\n\r\n source (fn) {\r\n if (fn == null) return this._timeSource\r\n this._timeSource = fn\r\n return this\r\n }\r\n\r\n speed (speed) {\r\n if (speed == null) return this._speed\r\n this._speed = speed\r\n return this\r\n }\r\n\r\n stop () {\r\n // Go to start and pause\r\n this.time(0)\r\n return this.pause()\r\n }\r\n\r\n time (time) {\r\n if (time == null) return this._time\r\n this._time = time\r\n return this._continue(true)\r\n }\r\n\r\n // Remove the runner from this timeline\r\n unschedule (runner) {\r\n const index = this._runnerIds.indexOf(runner.id)\r\n if (index < 0) return this\r\n\r\n this._runners.splice(index, 1)\r\n this._runnerIds.splice(index, 1)\r\n\r\n runner.timeline(null)\r\n return this\r\n }\r\n\r\n // Makes sure, that after pausing the time doesn't jump\r\n updateTime () {\r\n if (!this.active()) {\r\n this._lastSourceTime = this._timeSource()\r\n }\r\n return this\r\n }\r\n\r\n // Checks if we are running and continues the animation\r\n _continue (immediateStep = false) {\r\n Animator.cancelFrame(this._nextFrame)\r\n this._nextFrame = null\r\n\r\n if (immediateStep) return this._stepImmediate()\r\n if (this._paused) return this\r\n\r\n this._nextFrame = Animator.frame(this._step)\r\n return this\r\n }\r\n\r\n _stepFn (immediateStep = false) {\r\n // Get the time delta from the last time and update the time\r\n const time = this._timeSource()\r\n let dtSource = time - this._lastSourceTime\r\n\r\n if (immediateStep) dtSource = 0\r\n\r\n const dtTime = this._speed * dtSource + (this._time - this._lastStepTime)\r\n this._lastSourceTime = time\r\n\r\n // Only update the time if we use the timeSource.\r\n // Otherwise use the current time\r\n if (!immediateStep) {\r\n // Update the time\r\n this._time += dtTime\r\n this._time = this._time < 0 ? 0 : this._time\r\n }\r\n this._lastStepTime = this._time\r\n this.fire('time', this._time)\r\n\r\n // This is for the case that the timeline was seeked so that the time\r\n // is now before the startTime of the runner. Thats why we need to set\r\n // the runner to position 0\r\n\r\n // FIXME:\r\n // However, reseting in insertion order leads to bugs. Considering the case,\r\n // where 2 runners change the same attribute but in different times,\r\n // reseting both of them will lead to the case where the later defined\r\n // runner always wins the reset even if the other runner started earlier\r\n // and therefore should win the attribute battle\r\n // this can be solved by reseting them backwards\r\n for (let k = this._runners.length; k--;) {\r\n // Get and run the current runner and ignore it if its inactive\r\n const runnerInfo = this._runners[k]\r\n const runner = runnerInfo.runner\r\n\r\n // Make sure that we give the actual difference\r\n // between runner start time and now\r\n const dtToStart = this._time - runnerInfo.start\r\n\r\n // Dont run runner if not started yet\r\n // and try to reset it\r\n if (dtToStart <= 0) {\r\n runner.reset()\r\n }\r\n }\r\n\r\n // Run all of the runners directly\r\n let runnersLeft = false\r\n for (let i = 0, len = this._runners.length; i < len; i++) {\r\n // Get and run the current runner and ignore it if its inactive\r\n const runnerInfo = this._runners[i]\r\n const runner = runnerInfo.runner\r\n let dt = dtTime\r\n\r\n // Make sure that we give the actual difference\r\n // between runner start time and now\r\n const dtToStart = this._time - runnerInfo.start\r\n\r\n // Dont run runner if not started yet\r\n if (dtToStart <= 0) {\r\n runnersLeft = true\r\n continue\r\n } else if (dtToStart < dt) {\r\n // Adjust dt to make sure that animation is on point\r\n dt = dtToStart\r\n }\r\n\r\n if (!runner.active()) continue\r\n\r\n // If this runner is still going, signal that we need another animation\r\n // frame, otherwise, remove the completed runner\r\n const finished = runner.step(dt).done\r\n if (!finished) {\r\n runnersLeft = true\r\n // continue\r\n } else if (runnerInfo.persist !== true) {\r\n // runner is finished. And runner might get removed\r\n const endTime = runner.duration() - runner.time() + this._time\r\n\r\n if (endTime + runnerInfo.persist < this._time) {\r\n // Delete runner and correct index\r\n runner.unschedule()\r\n --i\r\n --len\r\n }\r\n }\r\n }\r\n\r\n // Basically: we continue when there are runners right from us in time\r\n // when -->, and when runners are left from us when <--\r\n if ((runnersLeft && !(this._speed < 0 && this._time === 0)) || (this._runnerIds.length && this._speed < 0 && this._time > 0)) {\r\n this._continue()\r\n } else {\r\n this.pause()\r\n this.fire('finished')\r\n }\r\n\r\n return this\r\n }\r\n\r\n}\r\n\r\nregisterMethods({\r\n Element: {\r\n timeline: function (timeline) {\r\n if (timeline == null) {\r\n this._timeline = (this._timeline || new Timeline())\r\n return this._timeline\r\n } else {\r\n this._timeline = timeline\r\n return this\r\n }\r\n }\r\n }\r\n})\r\n","import { Controller, Ease, Stepper } from './Controller.js'\r\nimport { extend, register } from '../utils/adopter.js'\r\nimport { from, to } from '../modules/core/gradiented.js'\r\nimport { getOrigin } from '../utils/utils.js'\r\nimport { noop, timeline } from '../modules/core/defaults.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport { rx, ry } from '../modules/core/circled.js'\r\nimport Animator from './Animator.js'\r\nimport Box from '../types/Box.js'\r\nimport EventTarget from '../types/EventTarget.js'\r\nimport Matrix from '../types/Matrix.js'\r\nimport Morphable, { TransformBag, ObjectBag } from './Morphable.js'\r\nimport Point from '../types/Point.js'\r\nimport SVGNumber from '../types/SVGNumber.js'\r\nimport Timeline from './Timeline.js'\r\n\r\nexport default class Runner extends EventTarget {\r\n constructor (options) {\r\n super()\r\n\r\n // Store a unique id on the runner, so that we can identify it later\r\n this.id = Runner.id++\r\n\r\n // Ensure a default value\r\n options = options == null\r\n ? timeline.duration\r\n : options\r\n\r\n // Ensure that we get a controller\r\n options = typeof options === 'function'\r\n ? new Controller(options)\r\n : options\r\n\r\n // Declare all of the variables\r\n this._element = null\r\n this._timeline = null\r\n this.done = false\r\n this._queue = []\r\n\r\n // Work out the stepper and the duration\r\n this._duration = typeof options === 'number' && options\r\n this._isDeclarative = options instanceof Controller\r\n this._stepper = this._isDeclarative ? options : new Ease()\r\n\r\n // We copy the current values from the timeline because they can change\r\n this._history = {}\r\n\r\n // Store the state of the runner\r\n this.enabled = true\r\n this._time = 0\r\n this._lastTime = 0\r\n\r\n // At creation, the runner is in reseted state\r\n this._reseted = true\r\n\r\n // Save transforms applied to this runner\r\n this.transforms = new Matrix()\r\n this.transformId = 1\r\n\r\n // Looping variables\r\n this._haveReversed = false\r\n this._reverse = false\r\n this._loopsDone = 0\r\n this._swing = false\r\n this._wait = 0\r\n this._times = 1\r\n\r\n this._frameId = null\r\n\r\n // Stores how long a runner is stored after beeing done\r\n this._persist = this._isDeclarative ? true : null\r\n }\r\n\r\n static sanitise (duration, delay, when) {\r\n // Initialise the default parameters\r\n let times = 1\r\n let swing = false\r\n let wait = 0\r\n duration = duration || timeline.duration\r\n delay = delay || timeline.delay\r\n when = when || 'last'\r\n\r\n // If we have an object, unpack the values\r\n if (typeof duration === 'object' && !(duration instanceof Stepper)) {\r\n delay = duration.delay || delay\r\n when = duration.when || when\r\n swing = duration.swing || swing\r\n times = duration.times || times\r\n wait = duration.wait || wait\r\n duration = duration.duration || timeline.duration\r\n }\r\n\r\n return {\r\n duration: duration,\r\n delay: delay,\r\n swing: swing,\r\n times: times,\r\n wait: wait,\r\n when: when\r\n }\r\n }\r\n\r\n active (enabled) {\r\n if (enabled == null) return this.enabled\r\n this.enabled = enabled\r\n return this\r\n }\r\n\r\n /*\r\n Private Methods\r\n ===============\r\n Methods that shouldn't be used externally\r\n */\r\n addTransform (transform, index) {\r\n this.transforms.lmultiplyO(transform)\r\n return this\r\n }\r\n\r\n after (fn) {\r\n return this.on('finished', fn)\r\n }\r\n\r\n animate (duration, delay, when) {\r\n const o = Runner.sanitise(duration, delay, when)\r\n const runner = new Runner(o.duration)\r\n if (this._timeline) runner.timeline(this._timeline)\r\n if (this._element) runner.element(this._element)\r\n return runner.loop(o).schedule(o.delay, o.when)\r\n }\r\n\r\n clearTransform () {\r\n this.transforms = new Matrix()\r\n return this\r\n }\r\n\r\n // TODO: Keep track of all transformations so that deletion is faster\r\n clearTransformsFromQueue () {\r\n if (!this.done || !this._timeline || !this._timeline._runnerIds.includes(this.id)) {\r\n this._queue = this._queue.filter((item) => {\r\n return !item.isTransform\r\n })\r\n }\r\n }\r\n\r\n delay (delay) {\r\n return this.animate(0, delay)\r\n }\r\n\r\n duration () {\r\n return this._times * (this._wait + this._duration) - this._wait\r\n }\r\n\r\n during (fn) {\r\n return this.queue(null, fn)\r\n }\r\n\r\n ease (fn) {\r\n this._stepper = new Ease(fn)\r\n return this\r\n }\r\n /*\r\n Runner Definitions\r\n ==================\r\n These methods help us define the runtime behaviour of the Runner or they\r\n help us make new runners from the current runner\r\n */\r\n\r\n element (element) {\r\n if (element == null) return this._element\r\n this._element = element\r\n element._prepareRunner()\r\n return this\r\n }\r\n\r\n finish () {\r\n return this.step(Infinity)\r\n }\r\n\r\n loop (times, swing, wait) {\r\n // Deal with the user passing in an object\r\n if (typeof times === 'object') {\r\n swing = times.swing\r\n wait = times.wait\r\n times = times.times\r\n }\r\n\r\n // Sanitise the values and store them\r\n this._times = times || Infinity\r\n this._swing = swing || false\r\n this._wait = wait || 0\r\n\r\n // Allow true to be passed\r\n if (this._times === true) { this._times = Infinity }\r\n\r\n return this\r\n }\r\n\r\n loops (p) {\r\n const loopDuration = this._duration + this._wait\r\n if (p == null) {\r\n const loopsDone = Math.floor(this._time / loopDuration)\r\n const relativeTime = (this._time - loopsDone * loopDuration)\r\n const position = relativeTime / this._duration\r\n return Math.min(loopsDone + position, this._times)\r\n }\r\n const whole = Math.floor(p)\r\n const partial = p % 1\r\n const time = loopDuration * whole + this._duration * partial\r\n return this.time(time)\r\n }\r\n\r\n persist (dtOrForever) {\r\n if (dtOrForever == null) return this._persist\r\n this._persist = dtOrForever\r\n return this\r\n }\r\n\r\n position (p) {\r\n // Get all of the variables we need\r\n const x = this._time\r\n const d = this._duration\r\n const w = this._wait\r\n const t = this._times\r\n const s = this._swing\r\n const r = this._reverse\r\n let position\r\n\r\n if (p == null) {\r\n /*\r\n This function converts a time to a position in the range [0, 1]\r\n The full explanation can be found in this desmos demonstration\r\n https://www.desmos.com/calculator/u4fbavgche\r\n The logic is slightly simplified here because we can use booleans\r\n */\r\n\r\n // Figure out the value without thinking about the start or end time\r\n const f = function (x) {\r\n const swinging = s * Math.floor(x % (2 * (w + d)) / (w + d))\r\n const backwards = (swinging && !r) || (!swinging && r)\r\n const uncliped = Math.pow(-1, backwards) * (x % (w + d)) / d + backwards\r\n const clipped = Math.max(Math.min(uncliped, 1), 0)\r\n return clipped\r\n }\r\n\r\n // Figure out the value by incorporating the start time\r\n const endTime = t * (w + d) - w\r\n position = x <= 0\r\n ? Math.round(f(1e-5))\r\n : x < endTime\r\n ? f(x)\r\n : Math.round(f(endTime - 1e-5))\r\n return position\r\n }\r\n\r\n // Work out the loops done and add the position to the loops done\r\n const loopsDone = Math.floor(this.loops())\r\n const swingForward = s && (loopsDone % 2 === 0)\r\n const forwards = (swingForward && !r) || (r && swingForward)\r\n position = loopsDone + (forwards ? p : 1 - p)\r\n return this.loops(position)\r\n }\r\n\r\n progress (p) {\r\n if (p == null) {\r\n return Math.min(1, this._time / this.duration())\r\n }\r\n return this.time(p * this.duration())\r\n }\r\n\r\n /*\r\n Basic Functionality\r\n ===================\r\n These methods allow us to attach basic functions to the runner directly\r\n */\r\n queue (initFn, runFn, retargetFn, isTransform) {\r\n this._queue.push({\r\n initialiser: initFn || noop,\r\n runner: runFn || noop,\r\n retarget: retargetFn,\r\n isTransform: isTransform,\r\n initialised: false,\r\n finished: false\r\n })\r\n const timeline = this.timeline()\r\n timeline && this.timeline()._continue()\r\n return this\r\n }\r\n\r\n reset () {\r\n if (this._reseted) return this\r\n this.time(0)\r\n this._reseted = true\r\n return this\r\n }\r\n\r\n reverse (reverse) {\r\n this._reverse = reverse == null ? !this._reverse : reverse\r\n return this\r\n }\r\n\r\n schedule (timeline, delay, when) {\r\n // The user doesn't need to pass a timeline if we already have one\r\n if (!(timeline instanceof Timeline)) {\r\n when = delay\r\n delay = timeline\r\n timeline = this.timeline()\r\n }\r\n\r\n // If there is no timeline, yell at the user...\r\n if (!timeline) {\r\n throw Error('Runner cannot be scheduled without timeline')\r\n }\r\n\r\n // Schedule the runner on the timeline provided\r\n timeline.schedule(this, delay, when)\r\n return this\r\n }\r\n\r\n step (dt) {\r\n // If we are inactive, this stepper just gets skipped\r\n if (!this.enabled) return this\r\n\r\n // Update the time and get the new position\r\n dt = dt == null ? 16 : dt\r\n this._time += dt\r\n const position = this.position()\r\n\r\n // Figure out if we need to run the stepper in this frame\r\n const running = this._lastPosition !== position && this._time >= 0\r\n this._lastPosition = position\r\n\r\n // Figure out if we just started\r\n const duration = this.duration()\r\n const justStarted = this._lastTime <= 0 && this._time > 0\r\n const justFinished = this._lastTime < duration && this._time >= duration\r\n\r\n this._lastTime = this._time\r\n if (justStarted) {\r\n this.fire('start', this)\r\n }\r\n\r\n // Work out if the runner is finished set the done flag here so animations\r\n // know, that they are running in the last step (this is good for\r\n // transformations which can be merged)\r\n const declarative = this._isDeclarative\r\n this.done = !declarative && !justFinished && this._time >= duration\r\n\r\n // Runner is running. So its not in reseted state anymore\r\n this._reseted = false\r\n\r\n let converged = false\r\n // Call initialise and the run function\r\n if (running || declarative) {\r\n this._initialise(running)\r\n\r\n // clear the transforms on this runner so they dont get added again and again\r\n this.transforms = new Matrix()\r\n converged = this._run(declarative ? dt : position)\r\n\r\n this.fire('step', this)\r\n }\r\n // correct the done flag here\r\n // declaritive animations itself know when they converged\r\n this.done = this.done || (converged && declarative)\r\n if (justFinished) {\r\n this.fire('finished', this)\r\n }\r\n return this\r\n }\r\n\r\n /*\r\n Runner animation methods\r\n ========================\r\n Control how the animation plays\r\n */\r\n time (time) {\r\n if (time == null) {\r\n return this._time\r\n }\r\n const dt = time - this._time\r\n this.step(dt)\r\n return this\r\n }\r\n\r\n timeline (timeline) {\r\n // check explicitly for undefined so we can set the timeline to null\r\n if (typeof timeline === 'undefined') return this._timeline\r\n this._timeline = timeline\r\n return this\r\n }\r\n\r\n unschedule () {\r\n const timeline = this.timeline()\r\n timeline && timeline.unschedule(this)\r\n return this\r\n }\r\n\r\n // Run each initialise function in the runner if required\r\n _initialise (running) {\r\n // If we aren't running, we shouldn't initialise when not declarative\r\n if (!running && !this._isDeclarative) return\r\n\r\n // Loop through all of the initialisers\r\n for (let i = 0, len = this._queue.length; i < len; ++i) {\r\n // Get the current initialiser\r\n const current = this._queue[i]\r\n\r\n // Determine whether we need to initialise\r\n const needsIt = this._isDeclarative || (!current.initialised && running)\r\n running = !current.finished\r\n\r\n // Call the initialiser if we need to\r\n if (needsIt && running) {\r\n current.initialiser.call(this)\r\n current.initialised = true\r\n }\r\n }\r\n }\r\n\r\n // Save a morpher to the morpher list so that we can retarget it later\r\n _rememberMorpher (method, morpher) {\r\n this._history[method] = {\r\n morpher: morpher,\r\n caller: this._queue[this._queue.length - 1]\r\n }\r\n\r\n // We have to resume the timeline in case a controller\r\n // is already done without being ever run\r\n // This can happen when e.g. this is done:\r\n // anim = el.animate(new SVG.Spring)\r\n // and later\r\n // anim.move(...)\r\n if (this._isDeclarative) {\r\n const timeline = this.timeline()\r\n timeline && timeline.play()\r\n }\r\n }\r\n\r\n // Try to set the target for a morpher if the morpher exists, otherwise\r\n // Run each run function for the position or dt given\r\n _run (positionOrDt) {\r\n // Run all of the _queue directly\r\n let allfinished = true\r\n for (let i = 0, len = this._queue.length; i < len; ++i) {\r\n // Get the current function to run\r\n const current = this._queue[i]\r\n\r\n // Run the function if its not finished, we keep track of the finished\r\n // flag for the sake of declarative _queue\r\n const converged = current.runner.call(this, positionOrDt)\r\n current.finished = current.finished || (converged === true)\r\n allfinished = allfinished && current.finished\r\n }\r\n\r\n // We report when all of the constructors are finished\r\n return allfinished\r\n }\r\n\r\n // do nothing and return false\r\n _tryRetarget (method, target, extra) {\r\n if (this._history[method]) {\r\n // if the last method wasnt even initialised, throw it away\r\n if (!this._history[method].caller.initialised) {\r\n const index = this._queue.indexOf(this._history[method].caller)\r\n this._queue.splice(index, 1)\r\n return false\r\n }\r\n\r\n // for the case of transformations, we use the special retarget function\r\n // which has access to the outer scope\r\n if (this._history[method].caller.retarget) {\r\n this._history[method].caller.retarget.call(this, target, extra)\r\n // for everything else a simple morpher change is sufficient\r\n } else {\r\n this._history[method].morpher.to(target)\r\n }\r\n\r\n this._history[method].caller.finished = false\r\n const timeline = this.timeline()\r\n timeline && timeline.play()\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n}\r\n\r\nRunner.id = 0\r\n\r\nexport class FakeRunner {\r\n constructor (transforms = new Matrix(), id = -1, done = true) {\r\n this.transforms = transforms\r\n this.id = id\r\n this.done = done\r\n }\r\n\r\n clearTransformsFromQueue () { }\r\n}\r\n\r\nextend([ Runner, FakeRunner ], {\r\n mergeWith (runner) {\r\n return new FakeRunner(\r\n runner.transforms.lmultiply(this.transforms),\r\n runner.id\r\n )\r\n }\r\n})\r\n\r\n// FakeRunner.emptyRunner = new FakeRunner()\r\n\r\nconst lmultiply = (last, curr) => last.lmultiplyO(curr)\r\nconst getRunnerTransform = (runner) => runner.transforms\r\n\r\nfunction mergeTransforms () {\r\n // Find the matrix to apply to the element and apply it\r\n const runners = this._transformationRunners.runners\r\n const netTransform = runners\r\n .map(getRunnerTransform)\r\n .reduce(lmultiply, new Matrix())\r\n\r\n this.transform(netTransform)\r\n\r\n this._transformationRunners.merge()\r\n\r\n if (this._transformationRunners.length() === 1) {\r\n this._frameId = null\r\n }\r\n}\r\n\r\nexport class RunnerArray {\r\n constructor () {\r\n this.runners = []\r\n this.ids = []\r\n }\r\n\r\n add (runner) {\r\n if (this.runners.includes(runner)) return\r\n const id = runner.id + 1\r\n\r\n this.runners.push(runner)\r\n this.ids.push(id)\r\n\r\n return this\r\n }\r\n\r\n clearBefore (id) {\r\n const deleteCnt = this.ids.indexOf(id + 1) || 1\r\n this.ids.splice(0, deleteCnt, 0)\r\n this.runners.splice(0, deleteCnt, new FakeRunner())\r\n .forEach((r) => r.clearTransformsFromQueue())\r\n return this\r\n }\r\n\r\n edit (id, newRunner) {\r\n const index = this.ids.indexOf(id + 1)\r\n this.ids.splice(index, 1, id + 1)\r\n this.runners.splice(index, 1, newRunner)\r\n return this\r\n }\r\n\r\n getByID (id) {\r\n return this.runners[this.ids.indexOf(id + 1)]\r\n }\r\n\r\n length () {\r\n return this.ids.length\r\n }\r\n\r\n merge () {\r\n let lastRunner = null\r\n for (let i = 0; i < this.runners.length; ++i) {\r\n const runner = this.runners[i]\r\n\r\n const condition = lastRunner\r\n && runner.done && lastRunner.done\r\n // don't merge runner when persisted on timeline\r\n && (!runner._timeline || !runner._timeline._runnerIds.includes(runner.id))\r\n && (!lastRunner._timeline || !lastRunner._timeline._runnerIds.includes(lastRunner.id))\r\n\r\n if (condition) {\r\n // the +1 happens in the function\r\n this.remove(runner.id)\r\n const newRunner = runner.mergeWith(lastRunner)\r\n this.edit(lastRunner.id, newRunner)\r\n lastRunner = newRunner\r\n --i\r\n } else {\r\n lastRunner = runner\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n remove (id) {\r\n const index = this.ids.indexOf(id + 1)\r\n this.ids.splice(index, 1)\r\n this.runners.splice(index, 1)\r\n return this\r\n }\r\n\r\n}\r\n\r\nregisterMethods({\r\n Element: {\r\n animate (duration, delay, when) {\r\n const o = Runner.sanitise(duration, delay, when)\r\n const timeline = this.timeline()\r\n return new Runner(o.duration)\r\n .loop(o)\r\n .element(this)\r\n .timeline(timeline.play())\r\n .schedule(o.delay, o.when)\r\n },\r\n\r\n delay (by, when) {\r\n return this.animate(0, by, when)\r\n },\r\n\r\n // this function searches for all runners on the element and deletes the ones\r\n // which run before the current one. This is because absolute transformations\r\n // overwfrite anything anyway so there is no need to waste time computing\r\n // other runners\r\n _clearTransformRunnersBefore (currentRunner) {\r\n this._transformationRunners.clearBefore(currentRunner.id)\r\n },\r\n\r\n _currentTransform (current) {\r\n return this._transformationRunners.runners\r\n // we need the equal sign here to make sure, that also transformations\r\n // on the same runner which execute before the current transformation are\r\n // taken into account\r\n .filter((runner) => runner.id <= current.id)\r\n .map(getRunnerTransform)\r\n .reduce(lmultiply, new Matrix())\r\n },\r\n\r\n _addRunner (runner) {\r\n this._transformationRunners.add(runner)\r\n\r\n // Make sure that the runner merge is executed at the very end of\r\n // all Animator functions. Thats why we use immediate here to execute\r\n // the merge right after all frames are run\r\n Animator.cancelImmediate(this._frameId)\r\n this._frameId = Animator.immediate(mergeTransforms.bind(this))\r\n },\r\n\r\n _prepareRunner () {\r\n if (this._frameId == null) {\r\n this._transformationRunners = new RunnerArray()\r\n .add(new FakeRunner(new Matrix(this)))\r\n }\r\n }\r\n }\r\n})\r\n\r\n// Will output the elements from array A that are not in the array B\r\nconst difference = (a, b) => a.filter(x => !b.includes(x))\r\n\r\nextend(Runner, {\r\n attr (a, v) {\r\n return this.styleAttr('attr', a, v)\r\n },\r\n\r\n // Add animatable styles\r\n css (s, v) {\r\n return this.styleAttr('css', s, v)\r\n },\r\n\r\n styleAttr (type, nameOrAttrs, val) {\r\n if (typeof nameOrAttrs === 'string') {\r\n return this.styleAttr(type, { [nameOrAttrs]: val })\r\n }\r\n\r\n let attrs = nameOrAttrs\r\n if (this._tryRetarget(type, attrs)) return this\r\n\r\n let morpher = new Morphable(this._stepper).to(attrs)\r\n let keys = Object.keys(attrs)\r\n\r\n this.queue(function () {\r\n morpher = morpher.from(this.element()[type](keys))\r\n }, function (pos) {\r\n this.element()[type](morpher.at(pos).valueOf())\r\n return morpher.done()\r\n }, function (newToAttrs) {\r\n\r\n // Check if any new keys were added\r\n const newKeys = Object.keys(newToAttrs)\r\n const differences = difference(newKeys, keys)\r\n\r\n // If their are new keys, initialize them and add them to morpher\r\n if (differences.length) {\r\n // Get the values\r\n const addedFromAttrs = this.element()[type](differences)\r\n\r\n // Get the already initialized values\r\n const oldFromAttrs = new ObjectBag(morpher.from()).valueOf()\r\n\r\n // Merge old and new\r\n Object.assign(oldFromAttrs, addedFromAttrs)\r\n morpher.from(oldFromAttrs)\r\n }\r\n\r\n // Get the object from the morpher\r\n const oldToAttrs = new ObjectBag(morpher.to()).valueOf()\r\n\r\n // Merge in new attributes\r\n Object.assign(oldToAttrs, newToAttrs)\r\n\r\n // Change morpher target\r\n morpher.to(oldToAttrs)\r\n\r\n // Make sure that we save the work we did so we don't need it to do again\r\n keys = newKeys\r\n attrs = newToAttrs\r\n })\r\n\r\n this._rememberMorpher(type, morpher)\r\n return this\r\n },\r\n\r\n zoom (level, point) {\r\n if (this._tryRetarget('zoom', level, point)) return this\r\n\r\n let morpher = new Morphable(this._stepper).to(new SVGNumber(level))\r\n\r\n this.queue(function () {\r\n morpher = morpher.from(this.element().zoom())\r\n }, function (pos) {\r\n this.element().zoom(morpher.at(pos), point)\r\n return morpher.done()\r\n }, function (newLevel, newPoint) {\r\n point = newPoint\r\n morpher.to(newLevel)\r\n })\r\n\r\n this._rememberMorpher('zoom', morpher)\r\n return this\r\n },\r\n\r\n /**\r\n ** absolute transformations\r\n **/\r\n\r\n //\r\n // M v -----|-----(D M v = F v)------|-----> T v\r\n //\r\n // 1. define the final state (T) and decompose it (once)\r\n // t = [tx, ty, the, lam, sy, sx]\r\n // 2. on every frame: pull the current state of all previous transforms\r\n // (M - m can change)\r\n // and then write this as m = [tx0, ty0, the0, lam0, sy0, sx0]\r\n // 3. Find the interpolated matrix F(pos) = m + pos * (t - m)\r\n // - Note F(0) = M\r\n // - Note F(1) = T\r\n // 4. Now you get the delta matrix as a result: D = F * inv(M)\r\n\r\n transform (transforms, relative, affine) {\r\n // If we have a declarative function, we should retarget it if possible\r\n relative = transforms.relative || relative\r\n if (this._isDeclarative && !relative && this._tryRetarget('transform', transforms)) {\r\n return this\r\n }\r\n\r\n // Parse the parameters\r\n const isMatrix = Matrix.isMatrixLike(transforms)\r\n affine = transforms.affine != null\r\n ? transforms.affine\r\n : (affine != null ? affine : !isMatrix)\r\n\r\n // Create a morepher and set its type\r\n const morpher = new Morphable(this._stepper)\r\n .type(affine ? TransformBag : Matrix)\r\n\r\n let origin\r\n let element\r\n let current\r\n let currentAngle\r\n let startTransform\r\n\r\n function setup () {\r\n // make sure element and origin is defined\r\n element = element || this.element()\r\n origin = origin || getOrigin(transforms, element)\r\n\r\n startTransform = new Matrix(relative ? undefined : element)\r\n\r\n // add the runner to the element so it can merge transformations\r\n element._addRunner(this)\r\n\r\n // Deactivate all transforms that have run so far if we are absolute\r\n if (!relative) {\r\n element._clearTransformRunnersBefore(this)\r\n }\r\n }\r\n\r\n function run (pos) {\r\n // clear all other transforms before this in case something is saved\r\n // on this runner. We are absolute. We dont need these!\r\n if (!relative) this.clearTransform()\r\n\r\n const { x, y } = new Point(origin).transform(element._currentTransform(this))\r\n\r\n let target = new Matrix({ ...transforms, origin: [ x, y ] })\r\n let start = this._isDeclarative && current\r\n ? current\r\n : startTransform\r\n\r\n if (affine) {\r\n target = target.decompose(x, y)\r\n start = start.decompose(x, y)\r\n\r\n // Get the current and target angle as it was set\r\n const rTarget = target.rotate\r\n const rCurrent = start.rotate\r\n\r\n // Figure out the shortest path to rotate directly\r\n const possibilities = [ rTarget - 360, rTarget, rTarget + 360 ]\r\n const distances = possibilities.map(a => Math.abs(a - rCurrent))\r\n const shortest = Math.min(...distances)\r\n const index = distances.indexOf(shortest)\r\n target.rotate = possibilities[index]\r\n }\r\n\r\n if (relative) {\r\n // we have to be careful here not to overwrite the rotation\r\n // with the rotate method of Matrix\r\n if (!isMatrix) {\r\n target.rotate = transforms.rotate || 0\r\n }\r\n if (this._isDeclarative && currentAngle) {\r\n start.rotate = currentAngle\r\n }\r\n }\r\n\r\n morpher.from(start)\r\n morpher.to(target)\r\n\r\n const affineParameters = morpher.at(pos)\r\n currentAngle = affineParameters.rotate\r\n current = new Matrix(affineParameters)\r\n\r\n this.addTransform(current)\r\n element._addRunner(this)\r\n return morpher.done()\r\n }\r\n\r\n function retarget (newTransforms) {\r\n // only get a new origin if it changed since the last call\r\n if (\r\n (newTransforms.origin || 'center').toString()\r\n !== (transforms.origin || 'center').toString()\r\n ) {\r\n origin = getOrigin(newTransforms, element)\r\n }\r\n\r\n // overwrite the old transformations with the new ones\r\n transforms = { ...newTransforms, origin }\r\n }\r\n\r\n this.queue(setup, run, retarget, true)\r\n this._isDeclarative && this._rememberMorpher('transform', morpher)\r\n return this\r\n },\r\n\r\n // Animatable x-axis\r\n x (x, relative) {\r\n return this._queueNumber('x', x)\r\n },\r\n\r\n // Animatable y-axis\r\n y (y) {\r\n return this._queueNumber('y', y)\r\n },\r\n\r\n dx (x = 0) {\r\n return this._queueNumberDelta('x', x)\r\n },\r\n\r\n dy (y = 0) {\r\n return this._queueNumberDelta('y', y)\r\n },\r\n\r\n dmove (x, y) {\r\n return this.dx(x).dy(y)\r\n },\r\n\r\n _queueNumberDelta (method, to) {\r\n to = new SVGNumber(to)\r\n\r\n // Try to change the target if we have this method already registerd\r\n if (this._tryRetarget(method, to)) return this\r\n\r\n // Make a morpher and queue the animation\r\n const morpher = new Morphable(this._stepper).to(to)\r\n let from = null\r\n this.queue(function () {\r\n from = this.element()[method]()\r\n morpher.from(from)\r\n morpher.to(from + to)\r\n }, function (pos) {\r\n this.element()[method](morpher.at(pos))\r\n return morpher.done()\r\n }, function (newTo) {\r\n morpher.to(from + new SVGNumber(newTo))\r\n })\r\n\r\n // Register the morpher so that if it is changed again, we can retarget it\r\n this._rememberMorpher(method, morpher)\r\n return this\r\n },\r\n\r\n _queueObject (method, to) {\r\n // Try to change the target if we have this method already registerd\r\n if (this._tryRetarget(method, to)) return this\r\n\r\n // Make a morpher and queue the animation\r\n const morpher = new Morphable(this._stepper).to(to)\r\n this.queue(function () {\r\n morpher.from(this.element()[method]())\r\n }, function (pos) {\r\n this.element()[method](morpher.at(pos))\r\n return morpher.done()\r\n })\r\n\r\n // Register the morpher so that if it is changed again, we can retarget it\r\n this._rememberMorpher(method, morpher)\r\n return this\r\n },\r\n\r\n _queueNumber (method, value) {\r\n return this._queueObject(method, new SVGNumber(value))\r\n },\r\n\r\n // Animatable center x-axis\r\n cx (x) {\r\n return this._queueNumber('cx', x)\r\n },\r\n\r\n // Animatable center y-axis\r\n cy (y) {\r\n return this._queueNumber('cy', y)\r\n },\r\n\r\n // Add animatable move\r\n move (x, y) {\r\n return this.x(x).y(y)\r\n },\r\n\r\n // Add animatable center\r\n center (x, y) {\r\n return this.cx(x).cy(y)\r\n },\r\n\r\n // Add animatable size\r\n size (width, height) {\r\n // animate bbox based size for all other elements\r\n let box\r\n\r\n if (!width || !height) {\r\n box = this._element.bbox()\r\n }\r\n\r\n if (!width) {\r\n width = box.width / box.height * height\r\n }\r\n\r\n if (!height) {\r\n height = box.height / box.width * width\r\n }\r\n\r\n return this\r\n .width(width)\r\n .height(height)\r\n },\r\n\r\n // Add animatable width\r\n width (width) {\r\n return this._queueNumber('width', width)\r\n },\r\n\r\n // Add animatable height\r\n height (height) {\r\n return this._queueNumber('height', height)\r\n },\r\n\r\n // Add animatable plot\r\n plot (a, b, c, d) {\r\n // Lines can be plotted with 4 arguments\r\n if (arguments.length === 4) {\r\n return this.plot([ a, b, c, d ])\r\n }\r\n\r\n if (this._tryRetarget('plot', a)) return this\r\n\r\n const morpher = new Morphable(this._stepper)\r\n .type(this._element.MorphArray).to(a)\r\n\r\n this.queue(function () {\r\n morpher.from(this._element.array())\r\n }, function (pos) {\r\n this._element.plot(morpher.at(pos))\r\n return morpher.done()\r\n })\r\n\r\n this._rememberMorpher('plot', morpher)\r\n return this\r\n },\r\n\r\n // Add leading method\r\n leading (value) {\r\n return this._queueNumber('leading', value)\r\n },\r\n\r\n // Add animatable viewbox\r\n viewbox (x, y, width, height) {\r\n return this._queueObject('viewbox', new Box(x, y, width, height))\r\n },\r\n\r\n update (o) {\r\n if (typeof o !== 'object') {\r\n return this.update({\r\n offset: arguments[0],\r\n color: arguments[1],\r\n opacity: arguments[2]\r\n })\r\n }\r\n\r\n if (o.opacity != null) this.attr('stop-opacity', o.opacity)\r\n if (o.color != null) this.attr('stop-color', o.color)\r\n if (o.offset != null) this.attr('offset', o.offset)\r\n\r\n return this\r\n }\r\n})\r\n\r\nextend(Runner, { rx, ry, from, to })\r\nregister(Runner, 'Runner')\r\n","import {\r\n adopt,\r\n nodeOrNew,\r\n register,\r\n wrapWithAttrCheck\r\n} from '../utils/adopter.js'\r\nimport { svg, svgjs, xlink, xmlns } from '../modules/core/namespaces.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport Container from './Container.js'\r\nimport Defs from './Defs.js'\r\nimport { globals } from '../utils/window.js'\r\n\r\nexport default class Svg extends Container {\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('svg', node), attrs)\r\n this.namespace()\r\n }\r\n\r\n // Creates and returns defs element\r\n defs () {\r\n if (!this.isRoot()) return this.root().defs()\r\n\r\n return adopt(this.node.querySelector('defs'))\r\n || this.put(new Defs())\r\n }\r\n\r\n isRoot () {\r\n return !this.node.parentNode\r\n || (!(this.node.parentNode instanceof globals.window.SVGElement) && this.node.parentNode.nodeName !== '#document-fragment')\r\n }\r\n\r\n // Add namespaces\r\n namespace () {\r\n if (!this.isRoot()) return this.root().namespace()\r\n return this\r\n .attr({ xmlns: svg, version: '1.1' })\r\n .attr('xmlns:xlink', xlink, xmlns)\r\n .attr('xmlns:svgjs', svgjs, xmlns)\r\n }\r\n\r\n removeNamespace () {\r\n return this.attr({ xmlns: null, version: null })\r\n .attr('xmlns:xlink', null, xmlns)\r\n .attr('xmlns:svgjs', null, xmlns)\r\n }\r\n\r\n // Check if this is a root svg\r\n // If not, call root() from this element\r\n root () {\r\n if (this.isRoot()) return this\r\n return super.root()\r\n }\r\n\r\n}\r\n\r\nregisterMethods({\r\n Container: {\r\n // Create nested svg document\r\n nested: wrapWithAttrCheck(function () {\r\n return this.put(new Svg())\r\n })\r\n }\r\n})\r\n\r\nregister(Svg, 'Svg', true)\r\n","import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport Container from './Container.js'\r\n\r\nexport default class Symbol extends Container {\r\n // Initialize node\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('symbol', node), attrs)\r\n }\r\n}\r\n\r\nregisterMethods({\r\n Container: {\r\n symbol: wrapWithAttrCheck(function () {\r\n return this.put(new Symbol())\r\n })\r\n }\r\n})\r\n\r\nregister(Symbol, 'Symbol')\r\n","import { globals } from '../../utils/window.js'\r\n\r\n// Create plain text node\r\nexport function plain (text) {\r\n // clear if build mode is disabled\r\n if (this._build === false) {\r\n this.clear()\r\n }\r\n\r\n // create text node\r\n this.node.appendChild(globals.document.createTextNode(text))\r\n\r\n return this\r\n}\r\n\r\n// Get length of text element\r\nexport function length () {\r\n return this.node.getComputedTextLength()\r\n}\r\n\r\n// Move over x-axis\r\n// Text is moved by its bounding box\r\n// text-anchor does NOT matter\r\nexport function x (x, box = this.bbox()) {\r\n if (x == null) {\r\n return box.x\r\n }\r\n\r\n return this.attr('x', this.attr('x') + x - box.x)\r\n}\r\n\r\n// Move over y-axis\r\nexport function y (y, box = this.bbox()) {\r\n if (y == null) {\r\n return box.y\r\n }\r\n\r\n return this.attr('y', this.attr('y') + y - box.y)\r\n}\r\n\r\nexport function move (x, y, box = this.bbox()) {\r\n return this.x(x, box).y(y, box)\r\n}\r\n\r\n// Move center over x-axis\r\nexport function cx (x, box = this.bbox()) {\r\n if (x == null) {\r\n return box.cx\r\n }\r\n\r\n return this.attr('x', this.attr('x') + x - box.cx)\r\n}\r\n\r\n// Move center over y-axis\r\nexport function cy (y, box = this.bbox()) {\r\n if (y == null) {\r\n return box.cy\r\n }\r\n\r\n return this.attr('y', this.attr('y') + y - box.cy)\r\n}\r\n\r\nexport function center (x, y, box = this.bbox()) {\r\n return this.cx(x, box).cy(y, box)\r\n}\r\n\r\nexport function ax (x) {\r\n return this.attr('x', x)\r\n}\r\n\r\nexport function ay (y) {\r\n return this.attr('y', y)\r\n}\r\n\r\nexport function amove (x, y) {\r\n return this.ax(x).ay(y)\r\n}\r\n\r\n// Enable / disable build mode\r\nexport function build (build) {\r\n this._build = !!build\r\n return this\r\n}\r\n","import {\r\n adopt,\r\n extend,\r\n nodeOrNew,\r\n register,\r\n wrapWithAttrCheck\r\n} from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport SVGNumber from '../types/SVGNumber.js'\r\nimport Shape from './Shape.js'\r\nimport { globals } from '../utils/window.js'\r\nimport * as textable from '../modules/core/textable.js'\r\n\r\nexport default class Text extends Shape {\r\n // Initialize node\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('text', node), attrs)\r\n\r\n this.dom.leading = new SVGNumber(1.3) // store leading value for rebuilding\r\n this._rebuild = true // enable automatic updating of dy values\r\n this._build = false // disable build mode for adding multiple lines\r\n }\r\n\r\n // Set / get leading\n leading (value) {\r\n // act as getter\r\n if (value == null) {\r\n return this.dom.leading\r\n }\r\n\r\n // act as setter\r\n this.dom.leading = new SVGNumber(value)\r\n\r\n return this.rebuild()\r\n }\n\n // Rebuild appearance type\n rebuild (rebuild) {\r\n // store new rebuild flag if given\r\n if (typeof rebuild === 'boolean') {\r\n this._rebuild = rebuild\r\n }\r\n\r\n // define position of all lines\r\n if (this._rebuild) {\r\n const self = this\r\n let blankLineOffset = 0\r\n const leading = this.dom.leading\r\n\r\n this.each(function (i) {\r\n const fontSize = globals.window.getComputedStyle(this.node)\r\n .getPropertyValue('font-size')\r\n\r\n const dy = leading * new SVGNumber(fontSize)\r\n\r\n if (this.dom.newLined) {\r\n this.attr('x', self.attr('x'))\r\n\r\n if (this.text() === '\\n') {\r\n blankLineOffset += dy\r\n } else {\r\n this.attr('dy', i ? dy + blankLineOffset : 0)\r\n blankLineOffset = 0\r\n }\r\n }\r\n })\r\n\r\n this.fire('rebuild')\r\n }\r\n\r\n return this\r\n }\n\n // overwrite method from parent to set data properly\n setData (o) {\r\n this.dom = o\r\n this.dom.leading = new SVGNumber(o.leading || 1.3)\r\n return this\r\n }\n\n // Set the text content\r\n text (text) {\r\n // act as getter\r\n if (text === undefined) {\r\n const children = this.node.childNodes\r\n let firstLine = 0\r\n text = ''\r\n\r\n for (let i = 0, len = children.length; i < len; ++i) {\r\n // skip textPaths - they are no lines\r\n if (children[i].nodeName === 'textPath') {\r\n if (i === 0) firstLine = 1\r\n continue\r\n }\r\n\r\n // add newline if its not the first child and newLined is set to true\r\n if (i !== firstLine && children[i].nodeType !== 3 && adopt(children[i]).dom.newLined === true) {\r\n text += '\\n'\r\n }\r\n\r\n // add content of this node\r\n text += children[i].textContent\r\n }\r\n\r\n return text\r\n }\r\n\r\n // remove existing content\r\n this.clear().build(true)\r\n\r\n if (typeof text === 'function') {\r\n // call block\r\n text.call(this, this)\r\n } else {\r\n // store text and make sure text is not blank\r\n text = (text + '').split('\\n')\r\n\r\n // build new lines\r\n for (let j = 0, jl = text.length; j < jl; j++) {\r\n this.newLine(text[j])\r\n }\r\n }\r\n\r\n // disable build mode and rebuild lines\r\n return this.build(false).rebuild()\r\n }\r\n\r\n}\r\n\r\nextend(Text, textable)\r\n\r\nregisterMethods({\r\n Container: {\r\n // Create text element\r\n text: wrapWithAttrCheck(function (text = '') {\r\n return this.put(new Text()).text(text)\r\n }),\r\n\r\n // Create plain text element\r\n plain: wrapWithAttrCheck(function (text = '') {\r\n return this.put(new Text()).plain(text)\r\n })\r\n }\r\n})\r\n\r\nregister(Text, 'Text')\r\n","import {\r\n extend,\r\n nodeOrNew,\r\n register,\r\n wrapWithAttrCheck\r\n} from '../utils/adopter.js'\r\nimport { globals } from '../utils/window.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport SVGNumber from '../types/SVGNumber.js'\r\nimport Shape from './Shape.js'\r\nimport Text from './Text.js'\r\nimport * as textable from '../modules/core/textable.js'\r\n\r\nexport default class Tspan extends Shape {\r\n // Initialize node\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('tspan', node), attrs)\r\n this._build = false // disable build mode for adding multiple lines\r\n }\r\n\r\n // Shortcut dx\n dx (dx) {\r\n return this.attr('dx', dx)\r\n }\n\n // Shortcut dy\n dy (dy) {\r\n return this.attr('dy', dy)\r\n }\n\n // Create new line\n newLine () {\r\n // mark new line\r\n this.dom.newLined = true\r\n\r\n // fetch parent\r\n const text = this.parent()\r\n\r\n // early return in case we are not in a text element\r\n if (!(text instanceof Text)) {\r\n return this\r\n }\r\n\r\n const i = text.index(this)\r\n\r\n const fontSize = globals.window.getComputedStyle(this.node)\r\n .getPropertyValue('font-size')\r\n const dy = text.dom.leading * new SVGNumber(fontSize)\r\n\r\n // apply new position\r\n return this.dy(i ? dy : 0).attr('x', text.x())\r\n }\n\n // Set text content\r\n text (text) {\r\n if (text == null) return this.node.textContent + (this.dom.newLined ? '\\n' : '')\r\n\r\n if (typeof text === 'function') {\r\n this.clear().build(true)\r\n text.call(this, this)\r\n this.build(false)\r\n } else {\r\n this.plain(text)\r\n }\r\n\r\n return this\r\n }\r\n\r\n}\r\n\r\nextend(Tspan, textable)\r\n\r\nregisterMethods({\r\n Tspan: {\r\n tspan: wrapWithAttrCheck(function (text = '') {\r\n const tspan = new Tspan()\r\n\r\n // clear if build mode is disabled\r\n if (!this._build) {\r\n this.clear()\r\n }\r\n\r\n // add new tspan\r\n return this.put(tspan).text(text)\r\n })\r\n },\r\n Text: {\r\n newLine: function (text = '') {\r\n return this.tspan(text).newLine()\r\n }\r\n }\r\n})\r\n\r\nregister(Tspan, 'Tspan')\r\n","import { cx, cy, height, width, x, y } from '../modules/core/circled.js'\r\nimport {\r\n extend,\r\n nodeOrNew,\r\n register,\r\n wrapWithAttrCheck\r\n} from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport SVGNumber from '../types/SVGNumber.js'\r\nimport Shape from './Shape.js'\r\n\r\nexport default class Circle extends Shape {\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('circle', node), attrs)\r\n }\r\n\r\n radius (r) {\r\n return this.attr('r', r)\r\n }\r\n\r\n // Radius x value\r\n rx (rx) {\r\n return this.attr('r', rx)\r\n }\r\n\r\n // Alias radius x value\r\n ry (ry) {\r\n return this.rx(ry)\r\n }\r\n\r\n size (size) {\r\n return this.radius(new SVGNumber(size).divide(2))\r\n }\r\n}\r\n\r\nextend(Circle, { x, y, cx, cy, width, height })\r\n\r\nregisterMethods({\r\n Container: {\r\n // Create circle element\r\n circle: wrapWithAttrCheck(function (size = 0) {\r\n return this.put(new Circle())\r\n .size(size)\r\n .move(0, 0)\r\n })\r\n }\r\n})\r\n\r\nregister(Circle, 'Circle')\r\n","import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport Container from './Container.js'\r\nimport baseFind from '../modules/core/selector.js'\r\n\r\nexport default class ClipPath extends Container {\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('clipPath', node), attrs)\r\n }\r\n\r\n // Unclip all clipped elements and remove itself\r\n remove () {\r\n // unclip all targets\r\n this.targets().forEach(function (el) {\r\n el.unclip()\r\n })\r\n\r\n // remove clipPath from parent\r\n return super.remove()\r\n }\r\n\r\n targets () {\r\n return baseFind('svg [clip-path*=\"' + this.id() + '\"]')\r\n }\r\n}\r\n\r\nregisterMethods({\r\n Container: {\r\n // Create clipping element\r\n clip: wrapWithAttrCheck(function () {\r\n return this.defs().put(new ClipPath())\r\n })\r\n },\r\n Element: {\r\n // Distribute clipPath to svg element\r\n clipper () {\r\n return this.reference('clip-path')\r\n },\r\n\r\n clipWith (element) {\r\n // use given clip or create a new one\r\n const clipper = element instanceof ClipPath\r\n ? element\r\n : this.parent().clip().add(element)\r\n\r\n // apply mask\r\n return this.attr('clip-path', 'url(\"#' + clipper.id() + '\")')\r\n },\r\n\r\n // Unclip element\r\n unclip () {\r\n return this.attr('clip-path', null)\r\n }\r\n }\r\n})\r\n\r\nregister(ClipPath, 'ClipPath')\r\n","import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport Element from './Element.js'\r\n\r\nexport default class ForeignObject extends Element {\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('foreignObject', node), attrs)\r\n }\r\n}\r\n\r\nregisterMethods({\r\n Container: {\r\n foreignObject: wrapWithAttrCheck(function (width, height) {\r\n return this.put(new ForeignObject()).size(width, height)\r\n })\r\n }\r\n})\r\n\r\nregister(ForeignObject, 'ForeignObject')\r\n","import Matrix from '../../types/Matrix.js'\nimport Point from '../../types/Point.js'\nimport { proportionalSize } from '../../utils/utils.js'\n\nexport function dmove (dx, dy) {\n this.children().forEach((child, i) => {\n\n let bbox\n\n // We have to wrap this for elements that dont have a bbox\n // e.g. title and other descriptive elements\n try {\n // Get the childs bbox\n bbox = child.bbox()\n } catch (e) {\n return\n }\n\n // Get childs matrix\n const m = new Matrix(child)\n // Translate childs matrix by amount and\n // transform it back into parents space\n const matrix = m.translate(dx, dy).transform(m.inverse())\n // Calculate new x and y from old box\n const p = new Point(bbox.x, bbox.y).transform(matrix)\n // Move element\n child.move(p.x, p.y)\n })\n\n return this\n}\n\nexport function dx (dx) {\n return this.dmove(dx, 0)\n}\n\nexport function dy (dy) {\n return this.dmove(0, dy)\n}\n\nexport function height (height, box = this.bbox()) {\n if (height == null) return box.height\n return this.size(box.width, height, box)\n}\n\nexport function move (x = 0, y = 0, box = this.bbox()) {\n const dx = x - box.x\n const dy = y - box.y\n\n return this.dmove(dx, dy)\n}\n\nexport function size (width, height, box = this.bbox()) {\n const p = proportionalSize(this, width, height, box)\n const scaleX = p.width / box.width\n const scaleY = p.height / box.height\n\n this.children().forEach((child, i) => {\n const o = new Point(box).transform(new Matrix(child).inverse())\n child.scale(scaleX, scaleY, o.x, o.y)\n })\n\n return this\n}\n\nexport function width (width, box = this.bbox()) {\n if (width == null) return box.width\n return this.size(width, box.height, box)\n}\n\nexport function x (x, box = this.bbox()) {\n if (x == null) return box.x\n return this.move(x, box.y, box)\n}\n\nexport function y (y, box = this.bbox()) {\n if (y == null) return box.y\n return this.move(box.x, y, box)\n}\n","import { nodeOrNew, register, wrapWithAttrCheck, extend } from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport Container from './Container.js'\r\nimport * as containerGeometry from '../modules/core/containerGeometry.js'\r\n\r\nexport default class G extends Container {\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('g', node), attrs)\r\n }\r\n}\r\n\r\nextend(G, containerGeometry)\r\n\r\nregisterMethods({\r\n Container: {\r\n // Create a group element\r\n group: wrapWithAttrCheck(function () {\r\n return this.put(new G())\r\n })\r\n }\r\n})\r\n\r\nregister(G, 'G')\r\n","import { nodeOrNew, register, wrapWithAttrCheck, extend } from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport { xlink } from '../modules/core/namespaces.js'\r\nimport Container from './Container.js'\r\nimport * as containerGeometry from '../modules/core/containerGeometry.js'\r\n\r\nexport default class A extends Container {\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('a', node), attrs)\r\n }\r\n\r\n // Link target attribute\r\n target (target) {\r\n return this.attr('target', target)\r\n }\r\n\r\n // Link url\r\n to (url) {\r\n return this.attr('href', url, xlink)\r\n }\r\n\r\n}\r\n\r\nextend(A, containerGeometry)\r\n\r\nregisterMethods({\r\n Container: {\r\n // Create a hyperlink element\r\n link: wrapWithAttrCheck(function (url) {\r\n return this.put(new A()).to(url)\r\n })\r\n },\r\n Element: {\r\n unlink () {\r\n const link = this.linker()\r\n\r\n if (!link) return this\r\n\r\n const parent = link.parent()\r\n\r\n if (!parent) {\r\n return this.remove()\r\n }\r\n\r\n const index = parent.index(link)\r\n parent.add(this, index)\r\n\r\n link.remove()\r\n return this\r\n },\r\n linkTo (url) {\r\n // reuse old link if possible\r\n let link = this.linker()\r\n\r\n if (!link) {\r\n link = new A()\r\n this.wrap(link)\r\n }\r\n\r\n if (typeof url === 'function') {\r\n url.call(link, link)\r\n } else {\r\n link.to(url)\r\n }\r\n\r\n return this\r\n },\r\n linker () {\r\n const link = this.parent()\r\n if (link && link.node.nodeName.toLowerCase() === 'a') {\r\n return link\r\n }\r\n\r\n return null\r\n }\r\n }\r\n})\r\n\r\nregister(A, 'A')\r\n","import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport Container from './Container.js'\r\nimport baseFind from '../modules/core/selector.js'\r\n\r\nexport default class Mask extends Container {\r\n // Initialize node\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('mask', node), attrs)\r\n }\r\n\r\n // Unmask all masked elements and remove itself\r\n remove () {\r\n // unmask all targets\r\n this.targets().forEach(function (el) {\r\n el.unmask()\r\n })\r\n\r\n // remove mask from parent\r\n return super.remove()\r\n }\r\n\r\n targets () {\r\n return baseFind('svg [mask*=\"' + this.id() + '\"]')\r\n }\r\n}\r\n\r\nregisterMethods({\r\n Container: {\r\n mask: wrapWithAttrCheck(function () {\r\n return this.defs().put(new Mask())\r\n })\r\n },\r\n Element: {\r\n // Distribute mask to svg element\r\n masker () {\r\n return this.reference('mask')\r\n },\r\n\r\n maskWith (element) {\r\n // use given mask or create a new one\r\n const masker = element instanceof Mask\r\n ? element\r\n : this.parent().mask().add(element)\r\n\r\n // apply mask\r\n return this.attr('mask', 'url(\"#' + masker.id() + '\")')\r\n },\r\n\r\n // Unmask element\r\n unmask () {\r\n return this.attr('mask', null)\r\n }\r\n }\r\n})\r\n\r\nregister(Mask, 'Mask')\r\n","import { nodeOrNew, register } from '../utils/adopter.js'\r\nimport Element from './Element.js'\r\nimport SVGNumber from '../types/SVGNumber.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\n\r\nexport default class Stop extends Element {\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('stop', node), attrs)\r\n }\r\n\r\n // add color stops\r\n update (o) {\r\n if (typeof o === 'number' || o instanceof SVGNumber) {\r\n o = {\r\n offset: arguments[0],\r\n color: arguments[1],\r\n opacity: arguments[2]\r\n }\r\n }\r\n\r\n // set attributes\r\n if (o.opacity != null) this.attr('stop-opacity', o.opacity)\r\n if (o.color != null) this.attr('stop-color', o.color)\r\n if (o.offset != null) this.attr('offset', new SVGNumber(o.offset))\r\n\r\n return this\r\n }\r\n}\r\n\r\nregisterMethods({\r\n Gradient: {\r\n // Add a color stop\r\n stop: function (offset, color, opacity) {\r\n return this.put(new Stop()).update(offset, color, opacity)\r\n }\r\n }\r\n})\r\n\r\nregister(Stop, 'Stop')\r\n","import { nodeOrNew, register } from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport { unCamelCase } from '../utils/utils.js'\r\nimport Element from './Element.js'\r\n\r\nfunction cssRule (selector, rule) {\r\n if (!selector) return ''\r\n if (!rule) return selector\r\n\r\n let ret = selector + '{'\r\n\r\n for (const i in rule) {\r\n ret += unCamelCase(i) + ':' + rule[i] + ';'\r\n }\r\n\r\n ret += '}'\r\n\r\n return ret\r\n}\r\n\r\nexport default class Style extends Element {\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('style', node), attrs)\r\n }\r\n\r\n addText (w = '') {\r\n this.node.textContent += w\r\n return this\r\n }\r\n\r\n font (name, src, params = {}) {\r\n return this.rule('@font-face', {\r\n fontFamily: name,\r\n src: src,\r\n ...params\r\n })\r\n }\r\n\r\n rule (selector, obj) {\r\n return this.addText(cssRule(selector, obj))\r\n }\r\n}\r\n\r\nregisterMethods('Dom', {\r\n style (selector, obj) {\r\n return this.put(new Style()).rule(selector, obj)\r\n },\r\n fontface (name, src, params) {\r\n return this.put(new Style()).font(name, src, params)\r\n }\r\n})\r\n\r\nregister(Style, 'Style')\r\n","import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport { xlink } from '../modules/core/namespaces.js'\r\nimport Path from './Path.js'\r\nimport PathArray from '../types/PathArray.js'\r\nimport Text from './Text.js'\r\nimport baseFind from '../modules/core/selector.js'\r\n\r\nexport default class TextPath extends Text {\r\n // Initialize node\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('textPath', node), attrs)\r\n }\r\n\r\n // return the array of the path track element\r\n array () {\r\n const track = this.track()\r\n\r\n return track ? track.array() : null\r\n }\r\n\r\n // Plot path if any\r\n plot (d) {\r\n const track = this.track()\r\n let pathArray = null\r\n\r\n if (track) {\r\n pathArray = track.plot(d)\r\n }\r\n\r\n return (d == null) ? pathArray : this\r\n }\r\n\r\n // Get the path element\r\n track () {\r\n return this.reference('href')\r\n }\r\n}\r\n\r\nregisterMethods({\r\n Container: {\r\n textPath: wrapWithAttrCheck(function (text, path) {\r\n // Convert text to instance if needed\r\n if (!(text instanceof Text)) {\r\n text = this.text(text)\r\n }\r\n\r\n return text.path(path)\r\n })\r\n },\r\n Text: {\r\n // Create path for text to run on\r\n path: wrapWithAttrCheck(function (track, importNodes = true) {\r\n const textPath = new TextPath()\r\n\r\n // if track is a path, reuse it\r\n if (!(track instanceof Path)) {\r\n // create path element\r\n track = this.defs().path(track)\r\n }\r\n\r\n // link textPath to path and add content\r\n textPath.attr('href', '#' + track, xlink)\r\n\r\n // Transplant all nodes from text to textPath\r\n let node\r\n if (importNodes) {\r\n while ((node = this.node.firstChild)) {\r\n textPath.node.appendChild(node)\r\n }\r\n }\r\n\r\n // add textPath element as child node and return textPath\r\n return this.put(textPath)\r\n }),\r\n\r\n // Get the textPath children\r\n textPath () {\r\n return this.findOne('textPath')\r\n }\r\n },\r\n Path: {\r\n // creates a textPath from this path\r\n text: wrapWithAttrCheck(function (text) {\r\n // Convert text to instance if needed\r\n if (!(text instanceof Text)) {\r\n text = new Text().addTo(this.parent()).text(text)\r\n }\r\n\r\n // Create textPath from text and path and return\r\n return text.path(this)\r\n }),\r\n\r\n targets () {\r\n return baseFind('svg textPath').filter((node) => {\r\n return (node.attr('href') || '').includes(this.id())\r\n })\r\n\r\n // Does not work in IE11. Use when IE support is dropped\r\n // return baseFind('svg textPath[*|href*=\"' + this.id() + '\"]')\r\n }\r\n }\r\n})\r\n\r\nTextPath.prototype.MorphArray = PathArray\r\nregister(TextPath, 'TextPath')\r\n","import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js'\r\nimport { registerMethods } from '../utils/methods.js'\r\nimport { xlink } from '../modules/core/namespaces.js'\r\nimport Shape from './Shape.js'\r\n\r\nexport default class Use extends Shape {\r\n constructor (node, attrs = node) {\r\n super(nodeOrNew('use', node), attrs)\r\n }\r\n\r\n // Use element as a reference\r\n use (element, file) {\r\n // Set lined element\r\n return this.attr('href', (file || '') + '#' + element, xlink)\r\n }\r\n}\r\n\r\nregisterMethods({\r\n Container: {\r\n // Create a use element\r\n use: wrapWithAttrCheck(function (element, file) {\r\n return this.put(new Use()).use(element, file)\r\n })\r\n }\r\n})\r\n\r\nregister(Use, 'Use')\r\n","/* Optional Modules */\r\nimport './modules/optional/arrange.js'\r\nimport './modules/optional/class.js'\r\nimport './modules/optional/css.js'\r\nimport './modules/optional/data.js'\r\nimport './modules/optional/memory.js'\r\nimport './modules/optional/sugar.js'\r\nimport './modules/optional/transform.js'\r\n\r\nimport { extend, makeInstance } from './utils/adopter.js'\r\nimport { getMethodNames, getMethodsFor } from './utils/methods.js'\r\nimport Box from './types/Box.js'\r\nimport Color from './types/Color.js'\r\nimport Container from './elements/Container.js'\r\nimport Defs from './elements/Defs.js'\r\nimport Dom from './elements/Dom.js'\r\nimport Element from './elements/Element.js'\r\nimport Ellipse from './elements/Ellipse.js'\r\nimport EventTarget from './types/EventTarget.js'\r\nimport Fragment from './elements/Fragment.js'\r\nimport Gradient from './elements/Gradient.js'\r\nimport Image from './elements/Image.js'\r\nimport Line from './elements/Line.js'\r\nimport List from './types/List.js'\r\nimport Marker from './elements/Marker.js'\r\nimport Matrix from './types/Matrix.js'\r\nimport Morphable, {\r\n NonMorphable,\r\n ObjectBag,\r\n TransformBag,\r\n makeMorphable,\r\n registerMorphableType\r\n} from './animation/Morphable.js'\r\nimport Path from './elements/Path.js'\r\nimport PathArray from './types/PathArray.js'\r\nimport Pattern from './elements/Pattern.js'\r\nimport PointArray from './types/PointArray.js'\r\nimport Point from './types/Point.js'\r\nimport Polygon from './elements/Polygon.js'\r\nimport Polyline from './elements/Polyline.js'\r\nimport Rect from './elements/Rect.js'\r\nimport Runner from './animation/Runner.js'\r\nimport SVGArray from './types/SVGArray.js'\r\nimport SVGNumber from './types/SVGNumber.js'\r\nimport Shape from './elements/Shape.js'\r\nimport Svg from './elements/Svg.js'\r\nimport Symbol from './elements/Symbol.js'\r\nimport Text from './elements/Text.js'\r\nimport Tspan from './elements/Tspan.js'\r\nimport * as defaults from './modules/core/defaults.js'\r\nimport * as utils from './utils/utils.js'\r\nimport * as namespaces from './modules/core/namespaces.js'\r\nimport * as regex from './modules/core/regex.js'\r\n\r\nexport {\r\n Morphable,\r\n registerMorphableType,\r\n makeMorphable,\r\n TransformBag,\r\n ObjectBag,\r\n NonMorphable\r\n}\r\n\r\nexport { defaults, utils, namespaces, regex }\r\nexport const SVG = makeInstance\r\nexport { default as parser } from './modules/core/parser.js'\r\nexport { default as find } from './modules/core/selector.js'\r\nexport * from './modules/core/event.js'\r\nexport * from './utils/adopter.js'\r\nexport {\r\n getWindow,\r\n registerWindow,\r\n restoreWindow,\r\n saveWindow,\r\n withWindow\r\n} from './utils/window.js'\r\n\r\n/* Animation Modules */\r\nexport { default as Animator } from './animation/Animator.js'\r\nexport { Controller, Ease, PID, Spring, easing } from './animation/Controller.js'\r\nexport { default as Queue } from './animation/Queue.js'\r\nexport { default as Runner } from './animation/Runner.js'\r\nexport { default as Timeline } from './animation/Timeline.js'\r\n\r\n/* Types */\r\nexport { default as Array } from './types/SVGArray.js'\r\nexport { default as Box } from './types/Box.js'\r\nexport { default as Color } from './types/Color.js'\r\nexport { default as EventTarget } from './types/EventTarget.js'\r\nexport { default as Matrix } from './types/Matrix.js'\r\nexport { default as Number } from './types/SVGNumber.js'\r\nexport { default as PathArray } from './types/PathArray.js'\r\nexport { default as Point } from './types/Point.js'\r\nexport { default as PointArray } from './types/PointArray.js'\r\nexport { default as List } from './types/List.js'\r\n\r\n/* Elements */\r\nexport { default as Circle } from './elements/Circle.js'\r\nexport { default as ClipPath } from './elements/ClipPath.js'\r\nexport { default as Container } from './elements/Container.js'\r\nexport { default as Defs } from './elements/Defs.js'\r\nexport { default as Dom } from './elements/Dom.js'\r\nexport { default as Element } from './elements/Element.js'\r\nexport { default as Ellipse } from './elements/Ellipse.js'\r\nexport { default as ForeignObject } from './elements/ForeignObject.js'\r\nexport { default as Fragment } from './elements/Fragment.js'\r\nexport { default as Gradient } from './elements/Gradient.js'\r\nexport { default as G } from './elements/G.js'\r\nexport { default as A } from './elements/A.js'\r\nexport { default as Image } from './elements/Image.js'\r\nexport { default as Line } from './elements/Line.js'\r\nexport { default as Marker } from './elements/Marker.js'\r\nexport { default as Mask } from './elements/Mask.js'\r\nexport { default as Path } from './elements/Path.js'\r\nexport { default as Pattern } from './elements/Pattern.js'\r\nexport { default as Polygon } from './elements/Polygon.js'\r\nexport { default as Polyline } from './elements/Polyline.js'\r\nexport { default as Rect } from './elements/Rect.js'\r\nexport { default as Shape } from './elements/Shape.js'\r\nexport { default as Stop } from './elements/Stop.js'\r\nexport { default as Style } from './elements/Style.js'\r\nexport { default as Svg } from './elements/Svg.js'\r\nexport { default as Symbol } from './elements/Symbol.js'\r\nexport { default as Text } from './elements/Text.js'\r\nexport { default as TextPath } from './elements/TextPath.js'\r\nexport { default as Tspan } from './elements/Tspan.js'\r\nexport { default as Use } from './elements/Use.js'\r\n\r\nextend([\r\n Svg,\r\n Symbol,\r\n Image,\r\n Pattern,\r\n Marker\r\n], getMethodsFor('viewbox'))\r\n\r\nextend([\r\n Line,\r\n Polyline,\r\n Polygon,\r\n Path\r\n], getMethodsFor('marker'))\r\n\r\nextend(Text, getMethodsFor('Text'))\r\nextend(Path, getMethodsFor('Path'))\r\n\r\nextend(Defs, getMethodsFor('Defs'))\r\n\r\nextend([\r\n Text,\r\n Tspan\r\n], getMethodsFor('Tspan'))\r\n\r\nextend([\r\n Rect,\r\n Ellipse,\r\n Gradient,\r\n Runner\r\n], getMethodsFor('radius'))\r\n\r\nextend(EventTarget, getMethodsFor('EventTarget'))\r\nextend(Dom, getMethodsFor('Dom'))\r\nextend(Element, getMethodsFor('Element'))\r\nextend(Shape, getMethodsFor('Shape'))\r\nextend([ Container, Fragment ], getMethodsFor('Container'))\r\nextend(Gradient, getMethodsFor('Gradient'))\r\n\r\nextend(Runner, getMethodsFor('Runner'))\r\n\r\nList.extend(getMethodNames())\r\n\r\nregisterMorphableType([\r\n SVGNumber,\r\n Color,\r\n Box,\r\n Matrix,\r\n SVGArray,\r\n PointArray,\r\n PathArray,\r\n Point\r\n])\r\n\r\nmakeMorphable()\r\n","import * as svgMembers from './main.js'\r\nimport { makeInstance } from './utils/adopter.js'\r\n\r\n// The main wrapping element\r\nexport default function SVG (element, isHTML) {\r\n return makeInstance(element, isHTML)\r\n}\r\n\r\nObject.assign(SVG, svgMembers)\r\n"],"names":["methods","names","registerMethods","name","m","Array","isArray","_name","addMethodNames","Object","getOwnPropertyNames","assign","getMethodsFor","_names","push","map","array","block","i","il","length","result","filter","radians","d","Math","PI","camelCase","s","toLowerCase","replace","g","toUpperCase","unCamelCase","capitalize","charAt","slice","proportionalSize","element","width","height","box","bbox","getOrigin","o","origin","ox","originX","oy","originY","x","y","condX","condY","includes","r","svg","html","xmlns","xlink","svgjs","globals","window","document","registerWindow","win","doc","save","saveWindow","restoreWindow","Base","elements","root","create","ns","createElementNS","makeInstance","isHTML","adopter","querySelector","wrapper","createElement","innerHTML","firstChild","removeChild","nodeOrNew","node","ownerDocument","defaultView","Node","adopt","instance","nodeName","Fragment","className","register","asRoot","prototype","getClass","did","eid","assignNewId","children","id","extend","modules","key","wrapWithAttrCheck","fn","args","constructor","apply","this","attr","siblings","parent","position","index","next","prev","forward","add","remove","backward","front","back","before","after","insertBefore","insertAfter","numberAndUnit","hex","rgb","reference","transforms","whitespace","isHex","isRgb","isBlank","isNumber","isImage","delimiter","isPathLetter","componentHex","component","integer","round","max","min","toString","is","object","space","hueToRgb","p","q","t","classes","trim","split","hasClass","indexOf","addClass","join","removeClass","c","toggleClass","css","style","val","ret","arguments","cssText","el","forEach","cased","test","show","hide","visible","data","a","v","attributes","JSON","parse","e","stringify","remember","k","memory","forget","_memory","Color","inputs","init","color","b","mode","u","random","sin","pi","l","h","grey","Error","cmyk","_a","_b","_c","hsl","isGrey","delta","_d","values","params","z","getParameters","noWhitespace","exec","parseInt","hexParse","substring","sixDigitHex","components","lab","xyz","lch","sqrt","atan2","dToR","cos","yL","xL","zL","ct","mx","nm","rU","gU","bU","pow","bd","toArray","toHex","_clamped","toRgb","rV","gV","bV","r255","g255","b255","rL","gL","bL","xU","yU","zU","Point","clone","base","source","transform","transformO","Matrix","isMatrixLike","f","closeEnough","threshold","abs","flipBoth","flip","flipX","flipY","skewX","skew","isFinite","skewY","scaleX","scale","scaleY","shear","theta","rotate","around","px","positionX","NaN","py","positionY","translate","tx","translateX","ty","translateY","relative","rx","relativeX","ry","relativeY","cx","cy","matrix","aroundO","dx","dy","translateO","lmultiplyO","decompose","determinant","ccw","sx","thetaRad","st","lam","sy","equals","other","comp","axis","flipO","scaleO","fromArray","Element","matrixify","parseFloat","call","inverse","inverseO","det","na","nb","nc","nd","ne","nf","lmultiply","matrixMultiply","multiply","multiplyO","rotateO","shearO","lx","skewO","tan","ly","formatTransforms","transformer","valueOf","parser","nodes","size","path","parentNode","body","documentElement","addTo","isNulledBox","Box","addOffset","pageXOffset","pageYOffset","left","top","w","x2","y2","isNulled","merge","xMin","Infinity","xMax","yMin","yMax","getBox","getBBoxFn","retry","contains","viewbox","zoom","level","point","clientWidth","clientHeight","zoomX","zoomY","zoomAmount","Number","MAX_SAFE_INTEGER","List","arr","each","fnOrMethodName","concat","reserved","baseFind","query","querySelectorAll","reduce","obj","attrs","listenerId","windowEvents","getEvents","n","getEventHolder","events","getEventTarget","clearEvents","on","listener","binding","options","bind","bag","_svgjsListenerId","event","ev","addEventListener","off","namespace","removeEventListener","dispatch","Event","CustomEvent","detail","cancelable","dispatchEvent","EventTarget","type","j","defaultPrevented","fire","noop","timeline","duration","ease","delay","fill","stroke","opacity","offset","SVGArray","toSet","Set","SVGNumber","convert","unit","value","divide","number","isNaN","match","minus","plus","times","toJSON","hooks","Dom","removeNamespace","SVGElement","appendChild","childNodes","put","clear","hasChildNodes","lastChild","deep","writeDataToDom","cloneNode","first","get","has","htmlOrFn","outerHTML","xml","last","matches","selector","matcher","matchesSelector","msMatchesSelector","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","putIn","removeElement","replaceChild","precision","factor","svgOrFn","outerSVG","words","text","textContent","wrap","xmlOrFn","outerXML","current","_this","well","fragment","createDocumentFragment","len","firstElementChild","nodeValue","curr","removeAttribute","getAttribute","defaults","_val","hook","isColor","leading","setAttributeNS","setAttribute","rebuild","find","findOne","dom","hasAttribute","setData","center","defs","dmove","move","parents","until","isSelector","keys","super","getBBox","rbox","getBoundingClientRect","screenCTM","inside","ctm","getCTM","isRoot","rect","getScreenCTM","sugar","prefix","extension","mat","angle","direction","radius","_element","getTotalLength","pointAt","getPointAtLength","font","untransform","str","kv","reverse","toParent","pCtm","toRoot","decomposed","Container","flatten","ungroup","Defs","Shape","Ellipse","circled","ellipse","from","fx","fy","x1","y1","to","Gradient","targets","url","update","gradiented","gradient","Pattern","pattern","patternUnits","Image","load","callback","img","src","image","PointArray","maxX","maxY","minX","minY","points","pop","toLine","Line","plot","pointed","line","Marker","orient","ref","makeSetterGetter","marker","easing","pos","bezier","steps","stepPosition","jumps","beforeFlag","step","floor","jumping","Stepper","done","Ease","Controller","stepper","target","dt","recalculate","_duration","overshoot","_overshoot","os","log","zeta","wn","Spring","velocity","acceleration","newPosition","PID","windup","integral","error","_windup","P","I","D","segmentParameters","M","L","H","V","C","S","Q","T","A","Z","pathHandlers","p0","mlhvqtcsaz","jl","segmentComplete","segment","startNewSegment","token","inNumber","finalizeNumber","pathLetter","lastCommand","small","isSmall","inSegment","pointSeen","hasExponent","finalizeSegment","absolute","command","makeAbsolut","segments","isArcFlag","isArc","isExponential","lastToken","PathArray","toAbsolute","pathParser","arrayToString","getClassForType","NonMorphable","morphableTypes","ObjectBag","Morphable","_stepper","_from","_to","_type","_context","_morphObj","at","morph","_set","align","toConsumable","TransformBag","sortByKey","splice","defaultObject","toDelete","objOrArr","entries","Type","sort","shift","num","registerMorphableType","makeMorphable","context","Path","_array","MorphArray","Polygon","polygon","poly","Polyline","polyline","Rect","Queue","_first","_last","item","Animator","nextDraw","frames","timeouts","immediates","timer","performance","Date","frame","run","requestAnimationFrame","_draw","timeout","time","now","immediate","cancelFrame","clearTimeout","cancelImmediate","nextTimeout","lastTimeout","nextFrame","lastFrame","nextImmediate","makeSchedule","runnerInfo","start","runner","end","defaultSource","Timeline","timeSource","_timeSource","_startTime","_speed","_persist","_nextFrame","_paused","_runners","_runnerIds","_lastRunnerId","_time","_lastSourceTime","_lastStepTime","_step","_stepFn","_stepImmediate","active","finish","getEndTimeOfTimeline","pause","getEndTime","lastRunnerInfo","getLastRunnerInfo","lastDuration","endTimes","getRunnerInfoById","_continue","persist","dtOrForever","play","updateTime","yes","currentSpeed","speed","positive","schedule","when","absoluteStartTime","endTime","unschedule","info","seek","stop","immediateStep","dtSource","dtTime","reset","runnersLeft","dtToStart","_timeline","Runner","_queue","_isDeclarative","_history","enabled","_lastTime","_reseted","transformId","_haveReversed","_reverse","_loopsDone","_swing","_wait","_times","_frameId","swing","wait","addTransform","animate","sanitise","loop","clearTransform","clearTransformsFromQueue","isTransform","during","queue","_prepareRunner","loops","loopDuration","loopsDone","partial","swinging","backwards","uncliped","swingForward","progress","initFn","runFn","retargetFn","initialiser","retarget","initialised","finished","running","_lastPosition","justStarted","justFinished","declarative","converged","_initialise","_run","needsIt","_rememberMorpher","method","morpher","caller","positionOrDt","allfinished","_tryRetarget","extra","FakeRunner","mergeWith","getRunnerTransform","mergeTransforms","netTransform","_transformationRunners","runners","RunnerArray","ids","clearBefore","deleteCnt","edit","newRunner","getByID","lastRunner","by","_clearTransformRunnersBefore","currentRunner","_currentTransform","_addRunner","styleAttr","nameOrAttrs","newToAttrs","newKeys","differences","addedFromAttrs","oldFromAttrs","oldToAttrs","newLevel","newPoint","affine","isMatrix","currentAngle","startTransform","undefined","rTarget","rCurrent","possibilities","distances","shortest","affineParameters","newTransforms","_queueNumber","_queueNumberDelta","newTo","_queueObject","Svg","version","nested","Symbol","symbol","_build","createTextNode","getComputedTextLength","ax","ay","build","Text","_rebuild","self","blankLineOffset","fontSize","getComputedStyle","getPropertyValue","newLined","firstLine","nodeType","newLine","textable","plain","Tspan","tspan","Circle","circle","ClipPath","unclip","clip","clipper","clipWith","ForeignObject","foreignObject","child","G","containerGeometry","group","link","unlink","linker","linkTo","Mask","unmask","mask","masker","maskWith","Stop","Style","addText","rule","fontFamily","cssRule","fontface","TextPath","track","pathArray","textPath","importNodes","Use","use","file","SVG","mock","svgMembers"],"mappings":"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"}