{ "version": 3, "sources": ["mixins.ts", "esveegee.ts", "colors.ts", "complex.ts", "shaper.ts", "checkers.ts", "diagram.ts", "timeline.ts", "testsvg.ts"], "sourcesContent": ["// TODO to mixins.ts (import from javascript fails, module loader?)\n// TODO do not or do inherit properties (it currently does)\n// TODO do not overwrite methods in base class (so text.size() must not be overwritten by Strokable.size())\nexport const applyMixins = (derivedConstructor: any, baseConstructors: any[]) => {\n for (const baseConstructor of baseConstructors) {\n const properties = Object.getOwnPropertyNames(baseConstructor.prototype)\n for (const name of properties) {\n const value = Object.getOwnPropertyDescriptor(baseConstructor.prototype, name)\n Object.defineProperty(derivedConstructor.prototype, name, value!)\n // console.log({ baseConstructor, name, value })\n }\n }\n}\n", "// TODO have a look at rxjs v5 (chainable operators) or v6 (pipeable operators)\n// (could give some hint at how to do a builder-like pattern)\n\n// TODO units (px, rem) etc (set svg default? per primitive? mix'n'match?)\n\nimport { SVGRenderer } from './render'\n\n// TODO deprecated class based in favor of functional interface\n\n\n// TODO split in DOM (createElement, setAttribute) and Primitive object shizzle (pos, getPos, drag)\n// TODO support all svg (2.0? mention version in docs) elements on https://developer.mozilla.org/en-US/docs/Web/SVG/Element\n// TODO support all attributes on https://developer.mozilla.org/nl/docs/Web/SVG/Attribute\n// TODO make interactive using https://www.petercollingridge.co.uk/tools/interactivesvgjs/ and\n// https://www.petercollingridge.co.uk/blog/3d-svg/rotating-3d-svg-cube/\n// and https://www.petercollingridge.co.uk/blog/3d-svg/3d-animation-svg/\n// and https://github.com/petercollingridge/InteractiveSVG.js/blob/master/interactiveSVG.js\n// and https://www.petercollingridge.co.uk/tutorials/svg/interactive/\n\n// TODO get inspiration from snapsvg, raphael svg, gsap svg (and mention credits!)\n\n// TODO esveegee.ts, miter.ts, path.ts\n\n// TODO what if other units? rem, px etc? .units(SVG.Rem)?\n\n// TODO something from macbook -> i dunno... can't remember (some draw thingie? Patchwork? Hatches? patterns?) )\n\n// TODO with no fill for the childs, group is not draggable! is this a common bugs for non-filled elements?\n// show light or outline as visual indicator?\n// TODO document: individual elements can be draggable as well (now go make your paint program!)\n\n// TODO note that svg signification digits are 2-3 at best,s so don't blow up your 10x10 to full screen :-)\n\n// TODO how to access elements adjust their properties? some query language?\n\nimport { applyMixins } from './mixins.js'\n\nimport { drag } from './draggable.js'\n// import { size } from './sizeable.js'\n\n\nexport const elementer = (svg: SVGElement) => ({\n circle: (radius: number) => circle(svg, radius),\n // TODO overload with line(length) which can be positioned with x and y\n line: (x1: number, y1: number, x2: number, y2: number) => line(svg, x1, y1, x2, y2), // can be sized with length(10) or bounds(100, 200)\n rect: (width: number, height: number) => rect(svg, width, height),\n text: (s: string) => text(svg, s),\n __element: svg // TODO DOC use at own risk!\n // TODO cache (profile first!) (how, elements have different properties and the draw methods need a reference to an element)\n})\n\n\n\n// TODO combine sizer and positioner (and painter? what can be painted, can be sized? is already an exception though) into dimensioner\nconst positionerXY = (svg: SVGElement, element: SVGElement) => ({\n position: (x: number, y: number) => positionXY(svg, element, x, y)\n})\nconst positionerX1Y1 = (svg: SVGElement, element: SVGElement) => ({\n position: (x1: number, y1: number) => positionX1Y1(svg, element, x1, y1)\n})\n\nconst positionXY = (svg: SVGElement, element: SVGElement, x: number, y: number) => {\n // TODO svg elements have different methods of positing (line has x1, y1, x2, y2), g (and others) have transform, rect has x and y\n // needs some form of polymorphism\n setAttributes(element, { x, y })\n return { ...elementer(svg), ...painter(svg, element), ...converter(svg) } // TODO function union / function sum type possible?\n}\n\nconst positionX1Y1 = (svg: SVGElement, element: SVGElement, x1: number, y1: number) => {\n // TODO svg elements have different methods of positing (line has x1, y1, x2, y2), g has transform, rect has x and y\n // needs some form of polymorphism\n setAttributes(element, { x1, y1 })\n return { ...elementer(svg), ...painter(svg, element), ...converter(svg) } // TODO function union / function sum type possible?\n}\n\n\n// composition experiment fluent API\n\n// maybe solve the PositionXY / PositionTransform / PositionX1Y1 with a strategy set by the line(), circle(), rect() primitives?\n// or always use transform=\"translate(x, y)\" for consistency?\n\nconst NS = 'http://www.w3.org/2000/svg'\n\nexport const SVG2 = (width = 300, height = 150, document: Document = window.document) => {\n const svg = document!.createElementNS(NS, 'svg')\n document.body.append(svg)\n return all(svg)\n}\n\nconst circle = (svg: SVGElement, radius: number) => {\n const element = document!.createElementNS(NS, 'circle')\n element.setAttribute('r', radius.toString())\n svg.append(element)\n\n return {\n ...elementer(svg),\n ...painter(svg, element),\n ...positionerXY(svg, element),\n ...positionerX1Y1(svg, element),\n ...sizer(svg, element),\n ...converter(svg),\n }\n}\n\n\nconst line = (svg: SVGElement, x1: number, y1: number, x2: number, y2: number) => {\n const element = document!.createElementNS(NS, 'line')\n setAttributes(element, { x1, y1, x2, y2 })\n svg.append(element)\n return { ...elementer(svg), ...painter(svg, element), ...converter(svg) }\n}\n\nconst rect = (svg: SVGElement, width: number, height: number) => {\n const element = document!.createElementNS(NS, 'rect')\n svg.append(element)\n setAttributes(element, { height, width })\n return { ...elementer(svg), ...positionerXY(svg, element) }\n}\n\nconst text = (svg: SVGElement, s: string) => {\n const element = document!.createElementNS(NS, 'text')\n svg.append(element)\n return { ...(elementer(svg)), ...(painter(svg, element)), ...(texter(svg, element)) }\n}\n\n// TODO idea? derive from base which has toString() => outputs the svg XML\n\n// TODO attributes = map or object?\nconst setAttributes = (element: Element, attributes: object) => {\n for (const [name, value] of Object.entries(attributes)) {\n element.setAttribute(name, value)\n }\n}\n\ninterface Positionable {\n position(svg: SVGElement, element: SVGElement, x: number, y: number): void\n}\n\nconst sizer = (svg: SVGElement, element: SVGElement) => ({\n size: (width: number, height: number) => size(svg, element, width, height)\n})\n\nconst size = (svg: SVGElement, element: SVGElement, width: number, height: number) => {\n element.setAttribute('width', width.toString())\n element.setAttribute('height', height.toString())\n return { ...(elementer(svg)), ...(painter(svg, element)) }\n}\n\nconst converter = (svg: SVGElement) => ({\n toSVG: () => toSVG(svg)\n})\n\nconst toSVG = (svg: SVGElement) => {\n return svg.outerHTML\n}\n\n// const dragger = {}\n\nconst painter = (svg: SVGElement, element: SVGElement) => ({\n fill: (color: string) => fill(svg, element, color),\n stroke: (color: string) => stroke(svg, element, color)\n})\n\nconst texter = (svg: SVGElement, element: SVGElement) => ({\n align: (alignment: string) => align(svg, element, alignment) // TODO follow SVG attribute names, don't make up ourselves\n // vertical align\n})\n\nconst all = (svg: SVGElement) => ({\n ...elementer(svg),\n ...painter(svg, svg),\n ...texter(svg, svg),\n ...positionerXY(svg, svg),\n ...sizer(svg, svg),\n})\n\n// no worky (not needed as well possible)\nconst stringer = {\n toString: () => `toString()`\n}\n\nconst align = (svg: SVGElement, element: SVGElement, alignment: string) => {\n element.setAttribute('base-asdalskaslfs', alignment)\n return { ...(elementer(svg)), ...(painter(svg, element)), ...(texter(svg, element)) }\n}\n\nconst fill = (svg: SVGElement, element: SVGElement, color: string) => {\n element.setAttribute('fill', color)\n return { ...elementer(svg), ...painter(svg, element) } // TODO this should cached! performance loss: spread\n}\n\nconst stroke = (svg: SVGElement, element: SVGElement, color: string) => {\n element.setAttribute('stroke', color)\n // TODO which positioner (XY or X1Y1) to return? it depends on the element being drawn\n // strokeXY, strokeX1Y1 :-(\n console.log(element.tagName)\n return { ...elementer(svg), ...painter(svg, element), ...converter(svg), ...positionerXY(svg, element), ...positionerX1Y1(svg, element) }\n}\n\n// const figure1 = SVG().rect(10, 20).line(10, 10, 150, 200).stroke('red').circle(10).fill('blue')\n// const figure2 = SVG().text('sjaak').align('left') // you can call align on text(), but not on line()\n\n// const s1 = SVG().align('left') // alignment use for whole svg\n\n// const circleElement = SVG(300, 300).circle(10)\n\n\n// console.log(s1.toString()) // output xml (doesn't call toString() :-())\n// svg(100, 200)\n\n\n\ninterface IPositionable {\n position(x: number, y: number): void\n getPosition(): { x: number, y: number }\n}\n\ninterface ISizeable {\n size(width: number, height: number): void\n}\n\nconst elements = new Map()\n\nexport abstract class Primitive implements IPositionable {\n\n // TODO deprecate in favor of SVGRenderer.createEle\n protected static createElement(qualifiedName: string, owner: Document = document): SVGElement {\n // TODO use owner if available\n // TODO can we skip document dependency? can it be avoided (by resolving it up to the root of the container?)\n // (how do node.js projects do this?)\n // const document = this.resolveOwner(this.svg)\n return document!.createElementNS('http://www.w3.org/2000/svg', qualifiedName)\n }\n\n protected static resolveOwner(element: Element) {\n if (element.ownerDocument) {\n return element.ownerDocument\n } else {\n return document\n }\n }\n\n // TODO not in use?\n public constructor(protected parent: Element) {\n elements.set(parent, this)\n }\n\n // TODO expose directly in class SVG so every possible element is suppooted?\n public primitive(tagName: string, attributes: object = {}, namespace: string = ''): Element { // TODO ISimpleMap or Map?\n const element = namespace === '' ?\n this.createElement(tagName) :\n this.createElementNS(namespace, tagName)\n\n for (const [name, value] of Object.entries(attributes)) {\n if (value) {\n element.setAttribute(name, value)\n }\n }\n\n return element\n }\n\n public attribute(name: string, value: string) {\n this.parent.setAttribute(name, value)\n }\n\n public position(x: number, y: number) {\n this.parent.setAttribute('x', x.toString())\n this.parent.setAttribute('y', y.toString())\n return this\n }\n\n public getPosition(): { x: number, y: number } {\n return {\n x: Number(this.parent.getAttribute('x')),\n y: Number(this.parent.getAttribute('y'))\n }\n }\n\n public remove() {\n // TODO buggy group().circle().remove().rect() removes everything in the group\n elements.delete(this.parent)\n this.parent.remove()\n return this\n }\n\n public title(s: string) {\n SVG.createElement('title')\n this.parent.append(s)\n return this\n }\n\n // Group implements FillableParent // sets fill for childs (groups itself cannot have fill)\n\n // Group returns itself\n // Other primitives return their parent (because new primitives are drawn adjacent to them)\n public group(x: number = 0, y: number = 0) {\n const group = SVG.createElement('g')\n group.setAttribute('transform', `translate(${x}, ${y})`)\n\n this.add(group)\n\n return new Group(group)\n }\n\n public groupEnd() {\n // TODO close group (return parent Element?)\n }\n\n public circle(x: number, y: number, radius: number) {\n const circle = this.primitive('circle', { cx: x, cy: y, r: radius })\n\n this.add(circle)\n\n return new Circle(circle)\n }\n\n public line(x1: number, y1: number, x2: number, y2: number) {\n const line = this.primitive('line', { x1, y1, x2, y2 })\n\n this.add(line)\n\n return new Line(line)\n }\n\n // TODO data structure, not 'd'\n public path(d: string) {\n const path = this.primitive('path', { d })\n\n this.add(path)\n\n return new Path(path)\n }\n\n // TODO support other formats as well (array of coordinates {x, y}, string? )\n public polygon(...numbers: number[]) {\n const polygon = this.primitive('polygon', { points: numbers.join(' ') })\n\n this.add(polygon)\n\n return new Polygon(polygon)\n }\n\n public polyline(...numbers: number[]) {\n const polyline = this.primitive('polyline', { points: numbers.join(' ') })\n\n this.add(polyline)\n\n return new Polyline(polyline)\n }\n\n public rect(x: number, y: number, width: number, height: number) {\n const rect = this.primitive('rect', { x, y, width, height })\n\n this.add(rect)\n\n return new Rect(rect)\n }\n\n public text(caption: string, x: number, y: number) {\n // sensible text colors\n // TODO bug: color set to null, must get color from root SVG\n const color = this.parent.getAttribute('stroke')\n\n const text = this.primitive('text', { x, y })\n text.textContent = caption\n text.setAttribute('fill', color!)\n text.setAttribute('stroke', 'none')\n\n this.add(text)\n\n return new Text(text)\n }\n\n // FIXME audio, canvas, iframe, video no worky (something namespace related)\n // see http://xn--dahlstrm-t4a.net/svg/audio/html5-audio-in-svg.svg for a static example that works\n public audio(src: string) {\n const audio = this.primitive('html:audio', { src, controls: true }, 'html')\n this.add(audio)\n return new Audio(audio)\n }\n\n public canvas() {\n const canvas = this.primitive('html:canvas', {}, 'html')\n this.add(canvas)\n return new Canvas(canvas)\n }\n\n public iframe(src: string) {\n const iframe = this.primitive('html:iframe', {}, 'html')\n this.add(iframe)\n return new IFrame(iframe)\n }\n\n public video(src: string) {\n const video = this.primitive('video', { src, controls: true, height: 200 }, 'http://www.w3.org/1999/xhtml')\n this.add(video)\n return new Video(video)\n }\n\n public html(s: string, x: number, y: number, width: number = 200, height: number = 150) {\n const html = this.primitive('foreignObject', { x, y, width, height })\n html.innerHTML = s\n this.add(html)\n\n return new HTML(html)\n }\n\n // helpers\n public grid(xSpacing: number = 16, ySpacing: number = 16, xOffset: number = 0, yOffset: number = 0) {\n // TODO use pattern (so sizing doesn't affect the grid)\n const group = this.group() // .stroke('lightgray')\n for (let i = 0; i < 20; i++) {\n group.line(0, i * ySpacing + yOffset, 300, i * ySpacing + yOffset)\n group.line(i * xSpacing + xOffset, 0, i * xSpacing + xOffset, 300)\n }\n\n return new Grid(group.parent)\n }\n\n // TODO merge createElement and createElementNS (return types differ!)\n protected createElement(qualifiedName: string, owner: Document = document): SVGElement {\n // TODO use owner if available\n // TODO can we skip document dependency? can it be avoided (by resolving it up to the root of the container?)\n // (how do node.js projects do this?)\n // const document = this.resolveOwner(this.svg)\n return document!.createElementNS('http://www.w3.org/2000/svg', qualifiedName)\n }\n\n protected createElementNS(namespace: string, qualifiedName: string, owner: Document = document): Element {\n return document!.createElementNS(namespace, qualifiedName)\n }\n\n protected add(element: Element) {\n // TODO instance of Container or Containable?\n if (this.parent.tagName === 'svg' || this.parent.tagName === 'g') {\n this.parent.appendChild(element)\n } else {\n this.parent.insertAdjacentElement('afterend', element)\n }\n // return element\n }\n}\n\nexport enum SVGColors {\n None = 'none',\n Transparent = 'transparent'\n}\n\n// TODO combine Fillable and Strokable? they exist always together (Paintable? Stylable?)\nclass Fillable extends Primitive {\n public fill(color: Color = SVGColors.None) {\n this.parent.setAttribute('fill', color)\n return this\n }\n\n public class(name: string) {\n this.parent.setAttribute('class', name)\n return this\n }\n\n public focusable(enable: boolean = true) {\n if (enable) {\n this.parent.setAttribute('tabindex', '0')\n } else {\n this.parent.removeAttribute('tabindex')\n }\n return this\n }\n}\n\nclass Strokable extends Primitive {\n public stroke(color: Color = SVGColors.None) {\n this.parent.setAttribute('stroke', color)\n return this\n }\n\n public class(name: string) {\n this.parent.setAttribute('class', name)\n return this\n }\n\n // TODO width have some values like 'vector-resize'bla' for harlines\n // TODO call it size() but see applyMixins for diamond problem\n public width(size: number | string) {\n this.parent.setAttribute('stroke-width', size.toString())\n return this\n }\n}\n\nclass Filter extends Primitive {\n public blend(x: number | string, y: number | string, width: number | string, height: number | string) {\n const filterUnits = 'objectBoundingBox'\n const primitiveUnits = '\"userSpaceOnUse'\n const blend = this.primitive('feBlend', { x, y, width, height, filterUnits, primitiveUnits })\n\n this.add(blend) // TODO add to defs (or apply filters after drawing primitive? cannot reuse)\n\n return new Filter(blend)\n }\n}\n\nclass Filterable extends Primitive {\n public use() {\n return this\n }\n}\n\nexport const enum Cap {\n Butt = 'butt',\n Round = 'round',\n Square = 'square'\n}\n\nclass Cappable extends Primitive {\n public cap(type: Cap) {\n this.parent.setAttribute('stroke-linecap', type.toString())\n }\n}\n\nexport enum Join {\n Arcs = 'arcs',\n Bevel = 'bevel',\n Miter = 'miter',\n MiterClip = 'miter-clip',\n Round = 'round'\n}\n\n// TODO only on , , , , , , , , and \nclass Miterable extends Primitive {\n\n public miterlimit(n: number) {\n this.parent.setAttribute('stroke-miterlimit', n.toString())\n }\n\n public join(type: Join) {\n this.parent.setAttribute('stroke-linejoin', type.toString())\n }\n}\n\nexport enum Direction {\n NorthSouth = 'ns-resize',\n EastWest = 'ew-resize'\n}\n\n// TODO class Sizable (to resize elements using the mouse/touch)\n// TODO Handable (sizeable, draggeabe, nameable)\n\n// TODO draggable implies that all nodes are draggable as well?\n// line().draggable() -> you can drag as a whole + drag nodes\n// rect().draggable() -> you can drag as a whole + drag nodes\n// maybe introducte .editable()?\n\n\nclass Draggable extends Primitive {\n\n // TODO draggable: mouseleave -> do not move element, but keep capture (feels more intuitive maybe,\n // see how in inkscape, gimp etc do it)\n\n // TODO draggable().cursor(Cursor.EastWest) or draggable(Drag.HORIZONTAL)\n\n // TODO east-west only cursor: ew-resize draggable(Direction.EastWest)\n\n public draggable(enable: boolean = true) {\n // TODO dataset instead...\n if (enable) {\n this.parent.classList.add('draggable')\n } else {\n this.parent.classList.remove('draggable')\n }\n\n return this\n }\n\n public connectable(enable: boolean = true) {\n // TODO dataset instead...\n if (enable) {\n this.parent.classList.add('connectable')\n } else {\n this.parent.classList.remove('connectable')\n }\n\n return this\n }\n\n public sizeable(enable: boolean = true) {\n // TODO dataset instead...\n if (enable) {\n this.parent.classList.add('sizeable')\n } else {\n this.parent.classList.remove('sizeable')\n }\n\n return this\n }\n\n public id(id: string) {\n // TODO doc: please use sensible id's (so prevent using things that can\n // be interpreted as valid SVG/XSS, az09 should be fine)\n this.parent.setAttribute('id', id)\n }\n}\n\n// TODO replace with defs(arrows(), ...)\nexport enum Marker { None, Start, End } // TODO how to use? line().markers().start().end()?\n\nexport type Color = string\n\nexport interface ISimpleMap { [key: string]: string }\n\n// TODO separate Graph and SVG?\n// the name refers to Graphic and Graph\nclass Graph {\n\n // type Coordinates = (x1: number, y1: number, x2: number, y2: number)\n\n // TODO separate createElement and creating of objects\n // public line(Coordinates | { Coordinate }) {\n // return {\n // tagName: 'line',\n // element: new Line(0, 0, 0, 0),\n\n // // these can be set as attributes directly, params could be a member of Line\n // params: { x1, y1, x2, y2 }\n // }\n\n}\n\n/*\n\n // TODO like path(penDown().penUp().move(0, 0).line(10, 20).cubicBezier(12, 15).quadBezier(15, 20).arc(...).close()\n\n TODO autodetect quad or cubic bezier\n\n q = relative\n Q = absolute\n\n bezier({})\n\n C x1 y1, x2 y2, x y (two control points)\n Q x1 y1, x y (one control point)\n\n (there is also S command, interesting!)\n\n*/\n\n// TODO attributes stroke-width, font, fill-opacity, stroke-opacity, opacity etc\n\n// TODO how to deal with coorddinages? you really should draw on 25.5 for example if you want 1px line (not 25)\n// or document this? research. Or is it sane to do?\n\n// TODO sane defaults (e.g. pattern UseOnSpace and set widdt/height or you won't see anything)\n\n// TODO patterns, gradients, images as fill and stroke\n\n/*\n\n getters could be useful as well? not very consistent\n\n image.rect(x, y, width, height).scale(2, 2)\n\n image.rect(x, y, {\n width: 200,\n height: 100,\n fill: 'red'\n })\n\n image.rect(x, y).style({ border: '1px solid red' }) // TODO CSP?!\n\n paper.js interessant? canvas, maar leuke API\n\n*/\n\n// TODO Draggable/pannable as well (i think this calls for a root element\n// that is not exported and can have things like draggable)\n\nexport class SVG extends Primitive implements ISizeable {\n\n public static on(element: SVGElement | Element | string) {\n const root = SVG.createSVG(element)\n const svg = new SVG(root)\n\n if (!element) {\n throw new Error(`cannot bind to ${element}`)\n }\n\n root.setAttribute('version', '1.1') // FIXME 2.0?\n\n // FIXME problaby not the cleanest way to set a namespace\n root.setAttribute('xmlns:html', 'http://www.w3.org/1999/xhtml')\n\n // TODO this.size(width, height) // listen to size of original element (svg, element or string)\n root.setAttribute('fill', 'none')\n root.setAttribute('stroke', 'black')\n\n // TODO svg.appendChild(arrowDefs())\n\n return svg\n }\n\n // element can be a DOMElement, a SVGElement ( or primitive) or a CSS selector\n protected static createSVG(element: SVGElement | Element | string) {\n // TODO resolveElement()\n if (element instanceof SVGElement) {\n return element\n } else {\n const svg = SVG.createElement('svg')\n if (element instanceof Element) {\n element.prepend(svg)\n } else if (typeof element === 'string') {\n const container = document.querySelector(element)!\n container.prepend(svg)\n }\n return svg\n }\n }\n\n // TODO expose this for advanced users?\n protected static setAttributes(element: Element, attributes: object) {\n for (const [name, value] of Object.entries(attributes)) {\n element.setAttribute(name, value)\n }\n }\n\n\n private svg: Element // TODO SVGElement? (from parent?)\n // TODO class Dragger?\n private selected: Primitive | undefined = undefined\n private offset: { x: number, y: number } = { x: 0, y: 0 }\n\n // TODO constructor without being dependent on the DOM\n // TODO parent is not a good name, it is about the accompanying SVG element\n constructor(protected parent: SVGElement) {\n super(parent)\n\n this.svg = parent\n\n // TODO not that if you implement this from https://www.petercollingridge.co.uk/tutorials/svg/interactive/dragging/\n // there is a undefined bug somewhere (which is solved here -> notify peter)\n parent.addEventListener('mousedown', this.startDrag)\n parent.addEventListener('mousemove', this.drag)\n parent.addEventListener('mouseup', this.endDrag)\n parent.addEventListener('mouseleave', this.endDrag)\n\n // TODO touch events\n // parent.addEventListener('touchstart', this.startDrag)\n // parent.addEventListener('touchmove', this.drag)\n // parent.addEventListener('touchend', this.endDrag)\n // parent.addEventListener('touchleave', this.endDrag)\n // parent.addEventListener('touchcancel', this.endDrag)\n }\n\n public pattern(o: object) {\n // TODO add some pattern definition to for later use\n return this\n }\n\n // public get size() {\n // return { width: -9000, height: -9000 }\n // }\n\n // public size(): { width: number, height: number }\n // TODO complete viewPort (x,y origin + dimensions)\n // TODO overload public size(dimensions: { width: number = 0, height: number = 0 }): any\n public size(width: number = 0, height: number = 0): any {\n this.parent.setAttribute('width', width.toString())\n this.parent.setAttribute('height', height.toString())\n this.parent.setAttribute('viewBox', `0 0 ${width} ${height}`) // not needed if 0 0 width height is same as svg (or for responsive?)\n\n // TODO find out ratio preserving\n this.parent.setAttribute('preserveAspectRatio', 'xMinYMin meet')\n\n // TODO fix type crap\n if (width && height) {\n return this\n // } else {\n // return { width: 1, height: 2 }\n } else {\n return this\n }\n }\n\n // TODO correct type\n public viewBox(xorigin: number, yorigin: number, width: number, height: number): any\n public viewBox(width: number, height: number): any {\n // TODO setAttributes(this.parent)\n }\n\n // TODO mixin\n public stroke(color: Color = SVGColors.None) {\n this.parent.setAttribute('stroke', color)\n return this\n }\n\n protected resolveElement(element: SVGElement | Element | string) {\n // TODO resolve element to SVGElement\n }\n\n private startDrag(event: MouseEvent) {\n // TODO cursor = 'grabbing'\n const target = event.target\n if (target.classList.contains('draggable')) {\n event.preventDefault()\n\n this.selected = elements.get(target)\n\n // TODO to getMousePosition (like in drag.html)\n const svg = target.ownerSVGElement\n const ctm = svg.getScreenCTM()\n\n this.offset = {\n x: (event.clientX - ctm!.e) / ctm!.a,\n y: (event.clientY - ctm!.f) / ctm!.d\n }\n\n const position = this.selected?.getPosition()\n this.offset.x -= position!.x\n this.offset.y -= position!.y\n }\n }\n\n // TODO see http://www.petercollingridge.co.uk/tutorials/svg/interactive/dragging/\n\n // TODO draggable on svg document, bubble down (like in relations.js) -> only one draggable object needed\n // TODO how to drag groups (add thin-line rect? use one element to drag everything in the gruop?)\n\n // TODO bug: if you try to grab the edge of an element and move away from the element,\n // the element gets lost and fails with 'esveegee.ts:586 Uncaught TypeError: Cannot read property 'getScreenCTM' of null\n // at SVGSVGElement.drag (esveegee.ts:586)'\n\n private drag(event: MouseEvent) {\n // TODO bug: if another element is in the way, event.target changes to that one and the dragging stops\n const target = event.target\n if (this.selected) {\n event.preventDefault()\n\n const svg = target.ownerSVGElement\n const ctm = svg.getScreenCTM() // FIXME null when element is 'lost'\n\n // (a*x + e, d*y + f)\n const x = (event.clientX - ctm!.e) / ctm!.a\n const y = (event.clientY - ctm!.f) / ctm!.d\n\n this.selected.position(x - this.offset.x, y - this.offset.y)\n }\n }\n\n private endDrag(event: MouseEvent) {\n if (this.selected) {\n event.preventDefault()\n this.selected = undefined\n }\n }\n\n // TODO support external images (x:href bla) \n // TODO support (external) svg patterns\n // TODO responsive\n\n private filterDefs(id: string) {\n // TODO const filter = SVG.createELement('filter')\n\n }\n\n\n // TODO deliver some default hatches (striped, rotated)\n private arrowDefs() {\n // create\n const defs = SVG.createElement('defs')\n const marker = SVG.createElement('marker')\n\n const [arrow] = [SVG.createElement('path')]\n\n // configure\n marker.setAttribute('id', 'arrow')\n marker.setAttribute('markerWidth', '25')\n marker.setAttribute('markerHeight', '25')\n marker.setAttribute('refX', '15')\n marker.setAttribute('refY', '6')\n marker.setAttribute('orient', 'auto')\n marker.setAttribute('markerUnits', 'strokeWidth')\n\n // triangle 9x6 (will showup as strokeWidth * 9 &* 7)\n arrow.setAttribute('d', 'M0 0 L0 12 L18 6 z')\n arrow.setAttribute('fill', 'black')\n arrow.setAttribute('stroke', 'none')\n\n // connect\n defs.appendChild(marker)\n marker.appendChild(arrow)\n\n return defs\n }\n}\n\n// TODO note that const circle = 'document.cre'ateElementNS(null, 'circle') is\n// valid if you are in a SVG already (no need to specify namespace; createElement() does not work though)\n\n\nclass Circle extends Primitive {\n\n // TODO real tooltips (what's the use on touch devices? maybe tap)\n\n public position(x: number, y: number) {\n const r = Number(this.parent.getAttribute('r'))\n this.parent.setAttribute('cx', x.toString())\n this.parent.setAttribute('cy', y.toString())\n // this.parent.setAttribute('cx', (x + r / 2).toString())\n // this.parent.setAttribute('cy', (y + r / 2).toString())\n return this\n }\n\n public getPosition(): { x: number, y: number } {\n return {\n x: Number(this.parent.getAttribute('cx')),\n y: Number(this.parent.getAttribute('cy'))\n }\n }\n}\n\nclass Line extends Primitive {\n public position(x: number, y: number) {\n this.parent.setAttribute('x1', x.toString())\n this.parent.setAttribute('y1', y.toString())\n // TODO calc new line end\n // this.parent.setAttribute('x2', x.toString())\n // this.parent.setAttribute('y2', y.toString())\n return this\n }\n}\n\nclass Path extends Primitive {\n\n private isAbsolute = false\n\n // TODO act on it (z or Z)\n public absolute() {\n this.isAbsolute = true\n return this\n }\n\n public relative() {\n this.isAbsolute = false\n return this\n }\n\n public bezier(x: number, y: number) {\n this.parent.setAttribute('d', '${x}, ${y}')\n return this\n }\n\n public control(x1: number, y1: number, x2: number, y2: number): Path // cubic\n public control(x: number, y: number) { // quadratic\n const d = this.parent.getAttribute('d') // TODO cubic/quad\n this.parent.setAttribute('d', `${d} ${x} ${y}`)\n return this\n }\n\n public smooth(x1: number, y1: number, x2: number, y2: number): Path // cubic\n public smooth(x: number, y: number) { // quadratic\n const d = this.parent.getAttribute('d') // TODO cubic/quad\n this.parent.setAttribute('d', `${d} ${x} ${y}`)\n return this\n }\n\n}\n\nclass Polygon extends Primitive { }\n\nclass Polyline extends Primitive { }\n\nclass Media extends Primitive { }\n\nclass Audio extends Media { }\nclass Canvas extends Media { }\nclass IFrame extends Media { }\nclass Video extends Media { }\n\nclass Group extends Primitive {\n public position(x: number, y: number) {\n this.parent.setAttribute('transform', `translate(${x} ${y})`)\n return this\n }\n}\n\nclass Rect extends Primitive implements ISizeable {\n public round(radiusX: number, radiusY: number) {\n this.parent.setAttribute('rx', radiusX.toString())\n this.parent.setAttribute('ry', radiusY.toString())\n return this\n }\n\n public size(width: number, height: number) {\n this.parent.setAttribute('width', width.toString())\n this.parent.setAttribute('height', height.toString())\n return this\n }\n}\n\nclass Grid extends Primitive { }\n\nexport enum Align {\n Start = 'start',\n Middle = 'middle',\n End = 'end'\n}\n\nexport enum VerticalAlign {\n Auto = 'auto',\n Baseline = 'baseline',\n BeforeEdge = 'before-edge',\n TextBeforeEdge = 'text-before-edge',\n Middle = 'middle',\n Central = 'central',\n AfterEdge = 'after-edge',\n TextAfterEdge = 'text-after-edge',\n Ideographic = 'ideographic',\n Alphabetic = 'alphabetic',\n Hanging = 'hanging',\n Mathematical = 'mathematical',\n Top = 'top',\n Center = 'center',\n Bottom = 'bottom'\n}\n\nclass Text extends Primitive {\n\n public align(align: Align | string) {\n this.parent.setAttribute('text-anchor', align)\n return this\n }\n\n // TODO use font().size() (so it can be used on and as well to set it once for a lot of elements?)\n public size(size: number | string) {\n if (typeof size === 'string') {\n this.parent.setAttribute('font-size', size)\n } else {\n this.parent.setAttribute('font-size', `${size}px`)\n }\n return this\n }\n\n public verticalAlign(align: VerticalAlign | string) {\n // FIXME Safari doesn't \n this.parent.setAttribute('dominant-baseline', align)\n return this\n }\n\n}\n\nclass HTML extends Primitive { } // TODO not so primitive!\n\n// Draggable\n// ---------\n// line: end points + segment\n\n// svg: geen width/height, well viewBox\n// preserveAspectRatio=\"xMidYMin slice\"\n//\n// kleine icons: wel width/height\n//\n// hairline: vector-effect: non-scaling-stroke;\n\n// two way binding?\n// image.line(10, 0, 10, 200).draggable(true, element => callback).followX()\n\n\n// TODO blog about this fluent api using multiple inheritance (mixins)\n// advantage: text().fill().textAlign() but not rect().fill().textAlign()\n// TODO is multiple inheritance the way to go? or should classes of classes be created?\n// (can you do without classes and create a fluent api? return a labmda?)\n// const line = (x1, y1) => return something that adheres to an interface?\n\n\nconst line2 = () => {\n return drawers\n}\n\nconst move2 = () => {\n return drawers\n}\n\nconst drawers = {\n line2, move2\n}\n\nconst Builder = () => {\n return drawers\n}\n\n\n\n\n// TODO split line in move(x, y), line(x, y) and line (x1, y1, x2, y2)\n\n// interface SVG extends Fillable, Strokable {}\n\n// TODO in ts 4.x this can be simplified https://www.typescriptlang.org/docs/handbook/mixins.html\ninterface Circle extends Fillable, Strokable, Draggable { }\ninterface Group extends Fillable, Strokable, Miterable, Cappable, Draggable { }\ninterface Line extends Fillable, Strokable, Miterable, Cappable, Draggable { }\ninterface Polygon extends Fillable, Strokable, Miterable, Cappable, Draggable { }\ninterface Polyline extends Fillable, Strokable, Miterable, Cappable, Draggable { }\ninterface Rect extends Fillable, Strokable, Miterable, Draggable { }\ninterface Text extends Fillable, Strokable, Miterable, Cappable, Draggable { }\ninterface Group extends Draggable { }\ninterface HTML extends Draggable { }\n\napplyMixins(Circle, [Fillable, Strokable, Draggable])\napplyMixins(Group, [Fillable, Strokable, Cappable, Draggable])\napplyMixins(Line, [Fillable, Strokable, Cappable, Draggable])\napplyMixins(Polygon, [Fillable, Strokable, Miterable, Cappable, Draggable])\napplyMixins(Polyline, [Fillable, Strokable, Miterable, Cappable, Draggable])\napplyMixins(Rect, [Fillable, Strokable, Cappable, Draggable])\napplyMixins(Text, [Fillable, Strokable, Draggable])\napplyMixins(Group, [Draggable])\napplyMixins(HTML, [Draggable])\n", "export const Colors = {\n Uluru: '#CE5127',\n UluruLight: '#E98A70',\n SeaBlue: '#27A2CC',\n SeaBlueLight: '#86CFE4',\n Sand: '#F9F4F2',\n Text: '#4B4B4B'\n}\n", "// import * as SVG from './esveegee' // FIXME esbuild / esm?\nimport { SVG, Cap, Join } from './esveegee'\n\nexport const cap = (s: SVG) => {\n s.line(26, 25, 125, 25).width(16).cap(Cap.Butt)\n s.line(26, 65, 125, 65).width(16).cap(Cap.Round)\n s.line(26, 105, 125, 105).width(16).cap(Cap.Square)\n}\n\nexport const join = (s: SVG) => {\n s.polyline(26, 25, 125, 65).width(16).join(Join.Arcs)\n s.polyline(26, 65, 125, 105).width(16).join(Join.Bevel)\n s.polyline(26, 105, 125, 105).width(16).join(Join.Miter)\n s.polyline(26, 105, 125, 105).width(16).join(Join.MiterClip)\n s.polyline(26, 105, 125, 105).width(16).join(Join.Round)\n}\n\nexport const miterLimit = (s: SVG) => {\n s.polyline(26, 25, 125, 25).width(16).miterlimit(45)\n s.polyline(26, 65, 125, 65).width(16).miterlimit(10)\n}", "import { SVG } from './esveegee.js'\n\nexport const shaper = (s: SVG) => {\n const points = [16, 300, 50, 100, 120, 250, 200, 250, 300, 300 - 16]\n\n for (let i = 0; i < points.length; i += 4) {\n const p1 = s.circle(points[i], points[i + 1], 3).draggable().fill('blue')\n const p2 = s.circle(points[i + 2], points[i + 3], 3).draggable().fill('blue')\n// s.line(p1, p2)\n }\n}\n", "import { SVG } from './esveegee.js'\n\nimport { Colors } from './colors.js'\n\ntype ColorPredicate = (rank: number, file: number) => boolean\n\nconst board = (svg: SVG, characters: string[], colorPredicate: ColorPredicate) => {\n // TODO this is a viewBox (which might be a good idea)\n const [width, height] = [100, 100]\n\n const padding = Math.max(width, height) / 16\n\n const [rows, columns] = [characters[0].length, characters.length]\n const cellSize = { width: ~~(width / (columns + 1)), height: ~~(height / (rows + 1)) }\n\n const board = svg.group(padding, padding)\n const ranks = svg.group(cellSize.width / 4, cellSize.height)\n const files = svg.group(padding + cellSize.width / 2, (rows + 1) * cellSize.height)\n\n const pieces = svg.group(padding + cellSize.width / 2, padding + cellSize.height / 2)\n\n for (const [rank, row] of characters.entries()) {\n for (const [file, character] of row.split('').entries()) {\n\n const [x, y] = [file * cellSize.width, rank * cellSize.height]\n\n // tile\n const fill = (rank ^ file) % 2 ? Colors.SeaBlue : Colors.SeaBlueLight\n board.rect(x, y, cellSize.width, cellSize.height)\n .stroke().fill(fill)\n\n // piece\n if (character !== ' ') {\n pieces.text(character, x, y)\n .fill(colorPredicate(rank, file) ? 'white' : 'black')\n .size(cellSize.height * 3 / 4)\n .align('middle')\n .verticalAlign('middle')\n .draggable()\n }\n }\n\n // ranks\n ranks.text((rows - rank).toString(),\n 0, rank * cellSize.height)\n .fill(Colors.Text)\n .align('middle')\n .verticalAlign('middle')\n\n // files\n files.text(String.fromCharCode(rank + 97), rank * cellSize.width, 0)\n .fill(Colors.Text)\n .align('middle')\n\n }\n}\n\nexport const ataxx = (svg: SVG) => {\n const characters = [\n '\u2B24 \u2B24',\n ' ',\n ' ',\n ' ',\n ' ',\n ' ',\n '\u2B24 \u2B24',\n ]\n\n const piececolorer = (rank: number, file: number) => rank === 0 && file === 0 || rank === 6 && file === 6\n board(svg, characters, piececolorer)\n}\n\nexport const chess = (svg: SVG) => {\n\n // TODO doesn't work, crashes even (without errors in the console), probably because of svg.size() being void\n // const { ...dimensions } = svg.size()\n // console.log(dimensions)\n\n const size = () => ({ width: 1, height: 2 })\n const { ...dimensions } = size()\n\n\n const characters = [\n '\u265C\u265E\u265D\u265B\u265A\u265D\u265E\u265C',\n '\u265F\u265F\u265F\u265F\u265F\u265F\u265F\u265F',\n ' ',\n ' ',\n ' ',\n ' ',\n '\u265F\u265F\u265F\u265F\u265F\u265F\u265F\u265F',\n '\u265C\u265E\u265D\u265B\u265A\u265D\u265E\u265C',\n ]\n\n const piececolorer = (rank: number,) => rank > 3\n board(svg, characters, piececolorer)\n}\n", "import { SVG } from './esveegee.js'\n\nimport { Colors } from './colors.js'\n\nexport const diagram = (s: SVG) => {\n s.size(600, 300)\n\n const nodes = [\n { x: 16, y: 0 },\n { x: 300, y: 90 },\n { x: 16, y: 175 }\n ]\n\n const connections = [\n { from: nodes[0], to: nodes[1] },\n { from: nodes[1], to: nodes[2] }\n ]\n\n // connections first (z!)\n for (const [index, connection] of connections.entries()) {\n const [x, y, x1, y1, x2, y2] = [\n connection.from.x + 75,\n connection.from.y + 60,\n connection.from.x,\n connection.from.y,\n connection.to.x,\n connection.to.y\n ]\n\n s.group(x, y)\n .line(x1, y1, x2, y2)\n .text(`line ${index}`, (x1 + x2) / 2 , (y1 + y2) / 2).fill(Colors.SeaBlue)\n .align('middle').verticalAlign('middle')\n }\n\n // nodes on top\n for (const [index, node] of nodes.entries()) {\n const html = `\n\n \n \n \n \n
table ${index}
ColumnType
Column1Type1
Column2Type2
\n`\n s.html(html, node.x, node.y).draggable()\n }\n}\n", "import { SVG } from './esveegee.js'\n\nimport { Colors } from './colors.js'\n\nexport const timeline = (s: SVG) => {\n const blockSize = { width: 25, height: 25 }\n\n const steps = [\n { start: 0, duration: 3, label: 'task #1' },\n { start: 2, duration: 4, label: 'task #2' },\n { start: 3, duration: 6, label: 'task #3' },\n ]\n\n const current = 3\n\n // bars\n for (const [index, step] of steps.entries()) {\n s.group(16 + step.start * blockSize.width, 16 + index * blockSize.height)\n .draggable()\n .rect(0, 0, step.duration * blockSize.width, blockSize.height)\n .fill(step.duration > current ? Colors.SeaBlue : Colors.SeaBlueLight)\n .stroke()\n .text(step.label, 16, blockSize.height / 2)\n .verticalAlign('middle')\n .fill('white')\n }\n\n // current\n s.line(16 + current * blockSize.width, 0, 16 + current * blockSize.width, (steps.length + 2) * blockSize.height)\n .stroke('#00d400').draggable()\n}\n", "import { SVG, SVG2 } from './esveegee'\n\nimport { Colors } from './colors.js'\n\nimport { cap, join, miterLimit } from './complex.js'\n\nimport { shaper } from './shaper.js'\n\nimport { ataxx, chess } from './checkers.js'\nimport { diagram } from './diagram.js'\nimport { timeline } from './timeline.js'\n\nimport * as Animation from './animation.js'\n\nconst compositionTest = SVG2()\n .rect(10, 20).position(10, 20)\n .line(10, 10, 150, 200).stroke('red')\n .circle(10).fill('blue')\n\nconsole.log(compositionTest)\n\nconst drawers = new Map([\n ['line', (s: SVG) => s.line(10, 10, 90, 50)],\n ['circle', (s: SVG) => s.circle(50, 31.25, 20)],\n ['path', (s: SVG) => s.path('M 5 40 C 20 5, 32 5, 45 40 S 55 55, 80 40')],\n ['polygon', (s: SVG) => s.polygon(16, 56, 36, 40, 36, 60, 60, 16)],\n ['polyline', (s: SVG) => s.polyline(16, 56, 36, 40, 36, 60, 60, 16)],\n ['rect', (s: SVG) => s.rect(16, 16, 50, 30)],\n\n ['group', (s: SVG) => s.group(16, 16).draggable()\n .circle(20, 20, 15).fill(Colors.Uluru).draggable()\n .rect(20, 20, 30, 20).fill(Colors.SeaBlue)],\n\n ['stroke', (s: SVG) => s.rect(16, 16, 50, 30).stroke(Colors.Uluru)],\n ['fill', (s: SVG) => s.rect(16, 16, 50, 30).fill(Colors.Uluru).stroke()],\n ['stroke-width', (s: SVG) => s.line(16, 25, 50, 50).width(5)],\n ['pattern', (s: SVG) => s.pattern(s.line(16, 16, 70, 70)).rect(16, 16, 50, 30).fill('hatch-1')],\n\n ['text', (s: SVG) => s.text('esviegee', 10, 40).size(18).fill().stroke(Colors.Uluru)],\n ['text-stroke', (s: SVG) => s.text('esviegee', 10, 40).size(18).fill().stroke(Colors.Uluru).width(1.5)],\n\n // complex\n ['html', (s: SVG) => s.html('HTML can be used in SVG',\n 0, 0, 80, 80)],\n\n ['draggable', (s: SVG) => s.circle(25 + 16, 35, 25).fill(Colors.SeaBlue).draggable()],\n ['sizeable', (s: SVG) => s.circle(25 + 16, 35, 25).fill(Colors.SeaBlue).sizeable()],\n\n ['grid', (s: SVG) => s.grid(10, 10, 16.5, 16.5)],\n\n ['cap', (s: SVG) => cap(s)],\n ['join', (s: SVG) => join(s)],\n ['miter-limit', (s: SVG) => miterLimit(s)],\n\n ['chess', (s: SVG) => chess(s)],\n ['ataxx', (s: SVG) => ataxx(s)],\n ['shaper1', (s: SVG) => shaper(s)],\n // TODO probably .editor() to create individual nodes that can be dragged\n ['shaper2', (s: SVG) => s.polyline(16, 300, 50, 100, 120, 250, 200, 250, 300, 300 - 16).draggable()],\n\n ['timeline', (s: SVG) => timeline(s)],\n ['diagram', (s: SVG) => diagram(s)],\n\n // media\n ['audio', (s: SVG) => s.audio('audio.ogg')],\n ['canvas', (s: SVG) => s.canvas()],\n ['iframe', (s: SVG) => s.iframe('somehtml.html')],\n ['video', (s: SVG) => s.video('video.mp4')],\n\n // animation\n // TODO ['animation', (s: SVG) => (s as Animatable).animate()]\n])\n\nconst images = document.querySelectorAll('.svg-test')\n\nconst [width, height] = [400, 250]\nconst viewBox = `0 0 ${width / 4} ${height / 4}`\nconsole.log({ viewBox })\n\nfor (const image of images) {\n\n const svg = SVG.on(image).size(width, height).stroke(Colors.Text)\n\n // scale up to emphasize stroke width\n svg.attribute('viewBox', viewBox)\n // const svg = SVG2(500, 500) // TODO functional interface (but a lot of intellisense, more than the object one)\n\n const name = image.dataset.draw\n const drawer = drawers.get(name!)\n\n const figcaption = document.createElement('figcaption')\n figcaption!.innerHTML = '
'\n    figcaption!.querySelector('pre')!.textContent = `${('' + drawer!).replace(/\\(s.*\\) => /, '')}`\n    image.appendChild(figcaption)\n\n    if (drawer) {\n        drawer(svg)\n    } else {\n        console.log(`${name} is not a function`)\n    }\n}\n"],
  "mappings": "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",
  "names": ["width", "height", "document", "circle", "line", "width", "height", "rect", "text", "size", "width", "height", "align", "size", "width", "height", "board", "fill", "size"]
}