{"version":3,"file":"diazo.mjs","sources":["../../../projects/diazo/src/lib/node/node.component.ts","../../../projects/diazo/src/lib/node/node.component.html","../../../projects/diazo/src/lib/node-host/node-host.component.ts","../../../projects/diazo/src/lib/slot/slot.component.ts","../../../projects/diazo/src/lib/slot/slot.component.html","../../../projects/diazo/src/lib/dynamic-node/dynamic-node.component.ts","../../../projects/diazo/src/lib/dynamic-node/dynamic-node.component.html","../../../projects/diazo/src/lib/graph/graph.component.ts","../../../projects/diazo/src/lib/graph/graph.component.html","../../../projects/diazo/src/lib/node-source-button/node-source-button.component.ts","../../../projects/diazo/src/lib/node-source-button/node-source-button.component.html","../../../projects/diazo/src/lib/property-editor-host/property-editor-host.component.ts","../../../projects/diazo/src/lib/trust-html.pipe.ts","../../../projects/diazo/src/lib/editor/editor.component.ts","../../../projects/diazo/src/lib/editor/editor.component.html","../../../projects/diazo/src/lib/diazo.module.ts","../../../projects/diazo/src/public-api.ts","../../../projects/diazo/src/diazo.ts"],"sourcesContent":["import { Component, ElementRef, Input, \r\n    HostListener, HostBinding, ViewChild } from \"@angular/core\";\r\nimport { DiazoContext, DiazoNodeContext, Position } from '@diazo/model';\r\nimport { MatMenuTrigger } from '@angular/material/menu';\r\n\r\n/**\r\n * @category Component\r\n */\r\n@Component({\r\n    selector: 'dz-node',\r\n    templateUrl: './node.component.html',\r\n    styleUrls: ['./node.component.scss'],\r\n    providers: [DiazoNodeContext]\r\n})\r\nexport class NodeComponent {\r\n    constructor(\r\n        private context : DiazoContext,\r\n        private nodeContext : DiazoNodeContext,\r\n        private elementRef : ElementRef<HTMLElement>,\r\n    ) {\r\n        nodeContext.graph = context;\r\n\r\n        // my subscriptions\r\n\r\n        nodeContext.positionChanged.subscribe(pos => this.updatePosition());\r\n\r\n        this.nodeContext.getSize = () => {\r\n            let el = this.elementRef.nativeElement;\r\n            return { \r\n                width: el.getBoundingClientRect().width / context.zoom,\r\n                height: el.getBoundingClientRect().height / context.zoom\r\n            };\r\n        }\r\n\r\n    }\r\n\r\n    @Input()\r\n    get ownState() {\r\n        return this.nodeContext.ownState;\r\n    }\r\n\r\n    set ownState(value) {\r\n        this.nodeContext.ownState = value;\r\n    }\r\n    \r\n    // @Input()\r\n    // get state() : DiazoNode {\r\n    //     return this.nodeContext.state;\r\n    // }\r\n\r\n    // set state(value) {\r\n    //     this.nodeContext.state = value;\r\n    // }\r\n\r\n    get state() {\r\n        return this.nodeContext.state;\r\n    }\r\n\r\n    @HostBinding('class.slim')\r\n    get isSlim() {\r\n        if (!this.state)\r\n            return false;\r\n\r\n        return this.state.profile === 'slim';\r\n    }\r\n\r\n    @HostBinding('class.active')\r\n    get isActive() {\r\n        if (!this.state)\r\n            return false;\r\n\r\n        return this.state.active;\r\n    }\r\n\r\n    @HostBinding('class.wide')\r\n    get isWide() {\r\n        if (!this.state)\r\n            return false;\r\n\r\n        return this.state.profile === 'wide';\r\n    }\r\n\r\n    @HostBinding('class.selected')\r\n    get isSelected() {\r\n        return this.nodeContext.selected;\r\n    }\r\n\r\n    @HostBinding('class.compact')\r\n    get isCompact() {\r\n        if (!this.state)\r\n            return false;\r\n\r\n        return this.state.style === 'compact';\r\n    }\r\n\r\n    @HostBinding('class.inline')\r\n    get isInline() {\r\n        if (!this.state)\r\n            return false;\r\n\r\n        return this.state.style === 'inline';\r\n    }\r\n\r\n    @HostBinding('class.reroute')\r\n    get isReroute() {\r\n        if (!this.state)\r\n            return false;\r\n\r\n        return this.state.style === 'reroute';\r\n    }\r\n\r\n    @Input() \r\n    get id() {\r\n        return this.nodeContext.id;\r\n    }\r\n\r\n    set id(value) {\r\n        this.nodeContext.id = value;\r\n    }\r\n\r\n    ngAfterViewInit() {\r\n        this.updatePosition();\r\n    }\r\n    \r\n    ngOnInit() {\r\n        this.context.registerNode(this.nodeContext);\r\n    }\r\n\r\n    ngOnDestroy() {\r\n        this.context.deregisterNode(this.nodeContext);\r\n    }\r\n\r\n    @HostListener('mousemove', ['$event'])\r\n    onMouseMove(event : MouseEvent) {\r\n        this.mousePosition = { top: event.offsetY, left: event.offsetX };\r\n    }\r\n\r\n    get readonly() {\r\n        return this.context.readonly || this.nodeContext.readonly;\r\n    }\r\n\r\n    @ViewChild('graphMenuTrigger', { read: MatMenuTrigger })\r\n    graphMenuTrigger : MatMenuTrigger;\r\n    \r\n    mousePosition : Position = { top: 0, left: 0 };\r\n\r\n    @HostListener('contextmenu')\r\n    onContextMenu() {\r\n\r\n        this.graphMenuTrigger.openMenu();\r\n\r\n        return false;\r\n    }\r\n    \r\n    @HostListener('click', ['$event'])\r\n    onClick(event : MouseEvent) {\r\n        if (event.button === 2) {\r\n            event.stopPropagation();\r\n            event.preventDefault();\r\n            return;\r\n        }\r\n    }\r\n\r\n    isElementInSlot(element : HTMLElement): boolean {\r\n        let el = element;\r\n        while (el) {\r\n            if (el.tagName.toLowerCase() === 'dz-slot')\r\n                return true;\r\n            el = el.parentElement;\r\n        }\r\n\r\n        return false;\r\n    }\r\n\r\n    @HostListener('mousedown', ['$event'])\r\n    async startMoving(startEvent : MouseEvent) {\r\n        if (startEvent.button === 2) {\r\n            // panning\r\n            // TODO: deduplicate (also present in diazo.component.ts)\r\n\r\n            let startLeft = this.context.panX;\r\n            let startTop = this.context.panY;\r\n\r\n            let release = () => {\r\n                document.removeEventListener('mouseup', release);\r\n                document.removeEventListener('mousemove', move);\r\n            };\r\n\r\n            let move = (event : MouseEvent) => {\r\n                this.context.setPan(\r\n                    startLeft + (event.clientX - startEvent.clientX),\r\n                    startTop + (event.clientY - startEvent.clientY)\r\n                );\r\n            };\r\n\r\n            document.addEventListener('mouseup', release);\r\n            document.addEventListener('mousemove', move);\r\n\r\n            startEvent.stopPropagation();\r\n            startEvent.preventDefault();\r\n\r\n        } else if (startEvent.button === 0) {\r\n            \r\n            let touchedElement = <HTMLElement>startEvent.target;\r\n            \r\n            if (this.isElementInSlot(touchedElement))\r\n                return;\r\n\r\n            if (startEvent.ctrlKey) {\r\n                if (!this.context.isNodeSelected(this.nodeContext))\r\n                    this.context.addToSelection(this.nodeContext);\r\n                else\r\n                    this.context.removeFromSelection(this.nodeContext);\r\n            } else {\r\n                if (!this.context.isNodeSelected(this.nodeContext))\r\n                    this.context.selectNode(this.nodeContext);\r\n            }\r\n\r\n            let el = this.elementRef.nativeElement;\r\n            let startLeft = el.offsetLeft;\r\n            let startTop = el.offsetTop;\r\n\r\n            if (this.context.locked || this.nodeContext.locked)\r\n                return;\r\n            \r\n            let movedSelection = (this.context.selectedNodes || []).slice();\r\n\r\n            if (movedSelection.length === 0) {\r\n                console.warn(`startMoving(): Empty selection! This is probably a bug.`);\r\n                return;\r\n            }\r\n\r\n            let release = () => {\r\n                document.removeEventListener('mouseup', release);\r\n                document.removeEventListener('mousemove', move);\r\n\r\n                this.context.commit('Move', graph => {\r\n                    for (let node of movedSelection) {\r\n                        let graphNode = graph.nodes.find(x => x.id === node.id);\r\n                        graphNode.x += (this.state.positionDeltaX || 0);\r\n                        graphNode.y += (this.state.positionDeltaY || 0);\r\n                        graphNode.positionDeltaX = 0;\r\n                        graphNode.positionDeltaY = 0;\r\n                        \r\n                        graphNode.x = Math.round(graphNode.x / this.context.gridSizeX) * this.context.gridSizeX;\r\n                        graphNode.y = Math.round(graphNode.y / this.context.gridSizeY) * this.context.gridSizeY;\r\n\r\n                        //node.commitDeltaPosition();\r\n                    }\r\n                });\r\n                \r\n            };\r\n\r\n            let move = (event : MouseEvent) => {\r\n            \r\n                let dx = event.clientX - startEvent.clientX;\r\n                let dy = event.clientY - startEvent.clientY;\r\n\r\n                for (let node of movedSelection) {\r\n                    node.changeDeltaPosition(dx / this.context.zoom, dy / this.context.zoom);\r\n                    // node.setPositionOnGrid(\r\n                    //     node.x + dx / this.context.zoom,\r\n                    //     node.y + dy / this.context.zoom\r\n                    // );\r\n                }\r\n\r\n                // this.setPosition(\r\n                //     startLeft + (event.clientX - startEvent.clientX) / this.context.zoom,\r\n                //     startTop + (event.clientY - startEvent.clientY) / this.context.zoom\r\n                // );\r\n            };\r\n\r\n            document.addEventListener('mouseup', release);\r\n            document.addEventListener('mousemove', move);\r\n        }\r\n    }\r\n\r\n    setPosition(x : number, y : number) {\r\n        this.nodeContext.setPositionOnGrid(x, y);\r\n    }\r\n\r\n    updatePosition() {\r\n\r\n        if (!this.nodeContext.state)\r\n            return;\r\n        \r\n        let el = this.elementRef.nativeElement;\r\n        el.style.left = `${this.nodeContext.effectivePositionX}px`;\r\n        el.style.top = `${this.nodeContext.effectivePositionY}px`;\r\n    }\r\n}","<mat-menu #graphMenu=\"matMenu\">\r\n        <button mat-menu-item>\r\n            <mat-icon>file_copy</mat-icon>\r\n            Copy\r\n        </button>\r\n        <button mat-menu-item [disabled]=\"readonly\">\r\n            <mat-icon>control_point</mat-icon>\r\n            Duplicate\r\n        </button>\r\n        \r\n    <mat-divider></mat-divider>\r\n\r\n    <button mat-menu-item [disabled]=\"readonly\">\r\n        <mat-icon>delete</mat-icon>\r\n        Remove\r\n    </button>\r\n</mat-menu>\r\n\r\n<button \r\n    class=\"graph-menu-trigger\"\r\n    #graphMenuTrigger\r\n    [style.visibility]=\"'hidden'\" \r\n    [style.width]=\"'1px'\"\r\n    [style.height]=\"'1px'\"\r\n    [style.pointer-events]=\"'none'\"\r\n    [style.position]=\"'absolute'\"\r\n    [style.left]=\"mousePosition?.left+'px'\"\r\n    [style.top]=\"mousePosition?.top+'px'\"\r\n    mat-button [matMenuTriggerFor]=\"graphMenu\"\r\n    >Menu</button>\r\n    \r\n<div class=\"titlebar\">\r\n    <ng-content select=\"label\"></ng-content>\r\n</div>\r\n<div class=\"component-container\">\r\n    <ng-content select=\".component\"></ng-content>\r\n</div>\r\n<div class=\"body\">\r\n    <ng-content select=\"main\"></ng-content>\r\n</div>","import { Input, ViewContainerRef, \r\n    Injector, Output, Component, \r\n    inject,\r\n    Type} from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n/**\r\n * @category Component\r\n */\r\n@Component({\r\n    selector: 'dz-node-host',\r\n    template: '',\r\n    styles: ['']\r\n})\r\nexport class NodeHostComponent {\r\n    private injector = inject(Injector);\r\n    private viewContainer = inject(ViewContainerRef);\r\n\r\n    private _component : Type<any>;\r\n    @Input()\r\n    get component() : Type<any> {\r\n        return this._component;\r\n    }\r\n\r\n    @Output()\r\n    instanceChanged = new Subject<any>();\r\n\r\n    instance : any;\r\n\r\n    set component(value: Type<any>) {\r\n        if (value === this._component)\r\n            return;\r\n\r\n        this._component = value;\r\n        this.viewContainer.clear();\r\n\r\n        if (!value)\r\n            return;\r\n\r\n        this.instance = this.viewContainer.createComponent(value, { injector: this.injector });\r\n        this.instanceChanged.next(this.instance);\r\n    }\r\n\r\n    ngOnDestroy() {\r\n        this.viewContainer.clear();\r\n    }\r\n}","import { Component, Input, HostBinding, ElementRef, ViewChild, \r\n    HostListener } from '@angular/core';\r\nimport { DiazoNodeContext, DiazoSlotContext, \r\n    DiazoContext } from '@diazo/model';\r\nimport { SubSink } from 'subsink';\r\n\r\n/**\r\n * @category Component\r\n */\r\n@Component({\r\n    selector: 'dz-slot',\r\n    templateUrl: './slot.component.html',\r\n    styleUrls: ['./slot.component.scss'],\r\n    providers: [ DiazoSlotContext ]\r\n})\r\nexport class SlotComponent {\r\n    constructor(\r\n        private graphContext : DiazoContext,\r\n        private nodeContext : DiazoNodeContext,\r\n        private context : DiazoSlotContext,\r\n        private element : ElementRef<HTMLElement>\r\n    ) {\r\n        this.context.type = 'input';\r\n        this.context.node = nodeContext;\r\n        this.context.getClientPosition = () => {\r\n            let endpointEl = this.endpointRef.nativeElement;\r\n            let pos = endpointEl.getBoundingClientRect();\r\n\r\n            return { \r\n                top: pos.top    + endpointEl.offsetWidth / 2 + 1, \r\n                left: pos.left  + endpointEl.offsetHeight / 2\r\n            };\r\n        };\r\n    }\r\n\r\n    @ViewChild('endpoint')\r\n    endpointRef : ElementRef<HTMLElement>;\r\n\r\n    valueTypeLabel : string;\r\n\r\n    @Input() label : string;\r\n    @Input() invalid = false;\r\n\r\n    @HostBinding('attr.title')\r\n    get tooltip() {\r\n        return `${this.label} (${this.valueTypeLabel || 'ANY'})`;\r\n    }\r\n\r\n    @Input()\r\n    get id() {\r\n        return this.context.id;\r\n    }\r\n\r\n    set id(value) {\r\n        this.context.id = value;\r\n    }\r\n\r\n    @Input()\r\n    get type() {\r\n        return this.context.type;\r\n    }\r\n\r\n    set type(value) {\r\n        this.context.type = value;\r\n    }\r\n\r\n    @Input()\r\n    get value() {\r\n        return this.context.value;\r\n    }\r\n\r\n    @Input()\r\n    @HostBinding('class.hidden')\r\n    hidden : boolean = false;\r\n\r\n    @HostBinding('class.arrow')\r\n    get isArrowShaped() {\r\n        return this.slotShape === 'arrow';\r\n    }\r\n\r\n    @HostBinding('class.square')\r\n    get isSquareShaped() {\r\n        return this.slotShape === 'square';\r\n    }\r\n\r\n    get slotShape() {\r\n        if (this.context.valueType) {\r\n            if (this.context.valueType.getSlotShapeByContext)\r\n                return this.context.valueType.getSlotShapeByContext(this.context);\r\n            if (this.context.valueType.slotShape)\r\n                return this.context.valueType.slotShape;\r\n        }\r\n        return 'circle';\r\n    }\r\n\r\n    color : string;\r\n\r\n    set value(value) {\r\n        this.context.value = value;\r\n        this.context.valueType = null;\r\n\r\n        if (value) {\r\n            this.context.valueType = this.graphContext.getValueTypeById(value.type);\r\n        }\r\n    }\r\n\r\n    @HostBinding('class.output')\r\n    get isOutput() {\r\n        return this.type === 'output';\r\n    }\r\n\r\n    @HostBinding('class.input')\r\n    get isInput() {\r\n        return this.type === 'input';\r\n    }\r\n    \r\n\r\n    @HostBinding('class.attached')\r\n    get isAttached() {\r\n        return this.context.edges.length > 0;\r\n    }\r\n\r\n    private subsink = new SubSink();\r\n\r\n    ngOnInit() {\r\n        this.nodeContext.registerSlot(this.context);\r\n\r\n        this.updateValueType();\r\n        \r\n        this.subsink.add(\r\n            this.graphContext.valueTypesChanged.subscribe(() => {\r\n                this.value = this.context.value;\r\n\r\n                this.updateValueType();\r\n            })\r\n        );\r\n    }\r\n\r\n    updateValueType() {\r\n        this.valueTypeLabel = null;\r\n        this.color = 'white';\r\n\r\n        if (this.invalid) {\r\n            this.color = 'red';\r\n            return;\r\n        }\r\n\r\n        if (this.context.valueType) {\r\n            if (this.context.valueType.getColorByContext)\r\n                this.color = this.context.valueType.getColorByContext(this.context);\r\n            else if (this.context.valueType.color)\r\n                this.color = this.context.valueType.color;\r\n\r\n            if (this.context.valueType.getNameByContext)\r\n                this.valueTypeLabel = this.context.valueType.getNameByContext(this.context);\r\n            else\r\n                this.valueTypeLabel = this.context.valueType.name;\r\n        }\r\n    }\r\n    ngOnDestroy() {\r\n        this.nodeContext.deregisterSlot(this.context);\r\n        this.subsink.unsubscribe();\r\n    }\r\n\r\n    @HostListener('mousedown', ['$event'])\r\n    startEdge(event : MouseEvent) {\r\n        if (!this.nodeContext.readonly)\r\n            this.nodeContext.startEdge(this.context, event);\r\n    }\r\n\r\n    @HostBinding('class.drafted')\r\n    get isPartOfDraftedEdge() {\r\n        if (!this.graphContext.draftEdge)\r\n            return false;\r\n\r\n        if (this.graphContext.draftEdge.fromNodeId === this.nodeContext.id && this.graphContext.draftEdge.fromSlotId === this.id)\r\n            return true;\r\n\r\n        if (this.graphContext.draftEdge.toNodeId === this.nodeContext.id && this.graphContext.draftEdge.toSlotId === this.id)\r\n            return true;\r\n\r\n        return false;\r\n    }\r\n\r\n    @HostListener('mouseenter', ['$event'])\r\n    onMouseEnter(event : MouseEvent) {\r\n        let drafted = this.graphContext.draftEdge;\r\n\r\n        if (drafted && drafted.fromNodeId !== this.nodeContext.id) {\r\n            // _we_ could be the connection for this\r\n            this.graphContext.draftEdgeSnap(this.context);\r\n        }\r\n    }\r\n\r\n    @HostListener('mouseleave', ['$event'])\r\n    onMouseLeave(event : MouseEvent) {\r\n        if (this.graphContext.draftEdge)\r\n            this.graphContext.draftEdgeUnsnap(this.context);\r\n    }\r\n}","\r\n<i #endpoint [style.color]=\"color\"></i>\r\n<div class=\"label\" [class.invalid]=\"invalid\">\r\n    <ng-content></ng-content>\r\n</div>","import { Component, Input, HostBinding } from '@angular/core';\r\nimport { Accessor, DiazoNode } from '@diazo/model';\r\n\r\n/**\r\n * Provides a <dz-node> which supports custom \r\n * @category Component\r\n */\r\n@Component({\r\n    selector: 'dz-dynamic-node',\r\n    templateUrl: './dynamic-node.component.html',\r\n    styleUrls: ['./dynamic-node.component.scss']\r\n})\r\nexport class DynamicNodeComponent {\r\n    constructor() {\r\n        let accessor = new Accessor();\r\n        this.M = new Proxy({}, {\r\n            get: (target, key, receiver) => {\r\n                if (typeof key === 'symbol')\r\n                    return (this.instance || this.node)[key];\r\n\r\n                return accessor.get([ this.instance || this.node ], '$.' + key.toString());\r\n            }, set: (target, key, value, receiver) => {\r\n                if (typeof key === 'symbol')\r\n                    return (this.instance || this.node)[key] = value;\r\n\r\n                return accessor.set([ this.instance || this.node ], '$.' + key.toString(), value);\r\n            }\r\n        });\r\n    }\r\n\r\n    @HostBinding('attr.data-nodeId')\r\n    get nodeId() { return this.node?.id; }\r\n\r\n    @Input()\r\n    drafted : boolean;\r\n    \r\n    @Input()\r\n    node : DiazoNode;\r\n\r\n    @Input()\r\n    component : any;\r\n\r\n    M : any;\r\n    instance : any;\r\n}","<dz-node [id]=\"node?.id\" [ownState]=\"drafted ? node : null\">\r\n    <label *ngIf=\"node.style !== 'inline'\">\r\n        {{M?.label}}\r\n    </label>\r\n    <div class=\"component\">\r\n        <dz-node-host \r\n            *ngIf=\"component\"\r\n            [component]=\"component\" \r\n            (instanceChanged)=\"instance = $event\"\r\n            ></dz-node-host>\r\n    </div>\r\n\r\n    <main>\r\n        <div class=\"inputs\">\r\n            <ng-container *ngFor=\"let slot of (instance?.slots || node?.slots || [])\">\r\n                <dz-slot \r\n                    *ngIf=\"slot.type === 'input'\"\r\n                    [id]=\"slot.id\" \r\n                    [type]=\"slot.type\"\r\n                    [label]=\"slot.label\"\r\n                    [invalid]=\"slot.invalid\"\r\n                    [hidden]=\"slot.hidden || slot.disabled\"\r\n                    [value]=\"slot.value\"\r\n                    >{{slot.label}}</dz-slot>\r\n            </ng-container>\r\n        </div>\r\n\r\n        <label *ngIf=\"node.style === 'inline'\">\r\n            {{M?.label}}\r\n        </label>\r\n        \r\n        <div class=\"outputs\">\r\n            <ng-container *ngFor=\"let slot of (instance?.slots || node?.slots || [])\">\r\n                <dz-slot \r\n                    *ngIf=\"slot.type !== 'input'\"\r\n                    [id]=\"slot.id\" \r\n                    [type]=\"slot.type\"\r\n                    [label]=\"slot.label\"\r\n                    [hidden]=\"slot.hidden || slot.disabled\"\r\n                    [value]=\"slot.value\"\r\n                    >{{slot.label}}</dz-slot>\r\n            </ng-container>\r\n        </div>\r\n    </main>\r\n</dz-node>","import { Component, HostListener, ViewChild, ElementRef, \r\n    Input, Output, inject, NgZone } from \"@angular/core\";\r\nimport { BehaviorSubject, ReplaySubject, Subject } from 'rxjs';\r\nimport * as uuid from 'uuid';\r\nimport { CdkDrag } from '@angular/cdk/drag-drop';\r\nimport { DiazoGraph, DiazoNode, DiazoEdge } from '@diazo/model';\r\nimport { Position, pointOnLine, \r\n    DiazoContext, WildcardType } from '@diazo/model';\r\n\r\n/**\r\n * @category Component\r\n */\r\n@Component({\r\n    selector: 'dz-container',\r\n    templateUrl: './graph.component.html',\r\n    styleUrls: ['./graph.component.scss'],\r\n    providers: [ DiazoContext ]\r\n})\r\nexport class GraphComponent {\r\n    private context = inject(DiazoContext);\r\n    private elementRef = inject(ElementRef) as ElementRef<HTMLElement>;\r\n    private ngZone = inject(NgZone);\r\n\r\n    constructor() {\r\n        this.context.registerValueType(WildcardType);\r\n    }\r\n    \r\n    ngOnInit() {\r\n        if (!this.context)\r\n            throw new Error(`Error: No context available on this graph (BUG)`);\r\n\r\n        this.contextChanged.next(this.context);\r\n        this.context.panChanged.subscribe(pos => this.updatePan());\r\n        this.context.zoomChanged.subscribe(zoom => this.updateZoom());\r\n        this.context.graphChanged.subscribe(graph => this.graphChanged.next(graph));\r\n        this.elementRef.nativeElement.setAttribute('tabindex', '-1');\r\n        this.context.edgeCancelled.subscribe(edge => {\r\n            if (!edge.fromNodeId || !edge.toNodeId)\r\n                this.showNodeMenu();\r\n            \r\n            this.context.bufferedEdge = edge;\r\n        });\r\n    }\r\n\r\n    ngAfterViewInit() {\r\n        this.installMouseHandlers();\r\n        this.startRendering();\r\n    }\r\n\r\n    ngOnDestroy() {\r\n\r\n    }\r\n\r\n    private canvasContext : CanvasRenderingContext2D;\r\n    private canvas : HTMLCanvasElement;\r\n    private lastFrameTime : number;\r\n    private otherEdgeOpacity = 1;\r\n    private pulseCycle = 0;\r\n    private panTouch : Touch = null;\r\n    private zoomTouch : Touch = null;\r\n    private startPan : Position = null;\r\n    private startZoom : number;\r\n    private startPanZoom : number;\r\n    private touchActive = false;\r\n    private onTouchStartListener;\r\n    private onTouchMoveListener;\r\n    private onTouchEndListener;\r\n\r\n    private eligibleForContextMenu = false;\r\n\r\n    menuPosition : any = { y: 0, x: 0 };\r\n\r\n    @ViewChild('menuContents')\r\n    menuContents : ElementRef<HTMLElement>;\r\n    \r\n    @ViewChild('nodeMenu', { read: CdkDrag })\r\n    nodeMenu : CdkDrag;\r\n\r\n    @ViewChild('nodeMenu')\r\n    nodeMenuEl : ElementRef<HTMLElement>;\r\n\r\n    @Output()\r\n    graphChanged = new ReplaySubject<DiazoGraph>(1);\r\n    \r\n    @Output()\r\n    nodeMenuPositionChanged = new BehaviorSubject<Position>({ top: 0, left: 0 });\r\n\r\n    @ViewChild('plate')\r\n    plateRef : ElementRef<HTMLElement>;\r\n    \r\n    @Input()\r\n    get nodeTypeMap() {\r\n        return this.context.nodeTypeMap;\r\n    }\r\n\r\n    get zoom() {\r\n        return this.context.zoom;\r\n    }\r\n\r\n    set nodeTypeMap(map) {\r\n        this.context.nodeTypeMap = map;\r\n    }\r\n    \r\n    @Input()\r\n    get graph() {\r\n        return this.context.graph;\r\n    }\r\n\r\n    set graph(value) {\r\n        this.context.graph = value;\r\n    }\r\n\r\n    @ViewChild('canvas')\r\n    canvasRef : ElementRef<HTMLCanvasElement>;\r\n\r\n    @Output()\r\n    contextChanged = new BehaviorSubject(null);\r\n\r\n    installMouseHandlers() {\r\n        let element = this.elementRef.nativeElement;\r\n        this.ngZone.runOutsideAngular(() => {\r\n            element.addEventListener('mouseenter', () => this.context.mouseInside = true);\r\n            element.addEventListener('mouseleave', () => this.context.mouseInside = false);\r\n            element.addEventListener('mousemove', event => {\r\n                this.mousePosition = this.screenToLocal({ top: event.clientY, left: event.clientX });\r\n        \r\n                if (this.context.draftNode) {\r\n                    this.ngZone.run(() => {\r\n                        this.nodeMenuVisible = false;\r\n                        let state = this.context.getNodeByState(this.context.draftNode);\r\n                        if (state) {\r\n                            state.setPosition(\r\n                                (this.mousePosition.left - this.context.panX) / this.context.zoom , \r\n                                (this.mousePosition.top - this.context.panY) / this.context.zoom\r\n                            );\r\n                        }\r\n                    });\r\n                }\r\n\r\n            });\r\n        });\r\n    }\r\n\r\n    mousePosition : Position = { top: 0, left: 0 };\r\n\r\n    private updateZoom() {\r\n        if (!this.plateRef)\r\n            return;\r\n        \r\n        //this.updatePanAndZoom();\r\n        this.plateRef.nativeElement.style.transform = `scale(${this.context.zoom})`;\r\n        this.updateVisibleNodes();\r\n    }\r\n\r\n    private updatePanAndZoom() {\r\n        this.plateRef.nativeElement.style.transform = `scale(${this.context.zoom}) translate(${this.context.panX}px, ${this.context.panY}px)`;\r\n        this.updateVisibleNodes();\r\n    }\r\n\r\n    enableNodeOcclusion = true;\r\n    \r\n    get hasLargeAmountOfNodes() {\r\n        return this.graph.nodes.length > 450;\r\n    }\r\n\r\n    private updateVisibleNodes() {\r\n        if (!this.enableNodeOcclusion)\r\n            return;\r\n\r\n        let host = this.elementRef.nativeElement;\r\n        let hostRect = host.getBoundingClientRect();\r\n        let nodes = host.getElementsByTagName('dz-dynamic-node');\r\n\r\n        let visibleX = -this.context.panX / this.context.zoom;\r\n        let visibleY = -this.context.panY / this.context.zoom;\r\n        let visibleHeight = hostRect.height / this.context.zoom;\r\n        let visibleWidth = hostRect.width / this.context.zoom;\r\n\r\n        for (let i = 0, max = nodes.length; i < max; ++i) {\r\n            let nodeEl = nodes.item(i) as HTMLElement;\r\n            let occluded = false;\r\n\r\n            if (this.hasLargeAmountOfNodes) {\r\n                let actualNodeEl = nodeEl.querySelector('dz-node') as HTMLElement;\r\n                let nodeId = nodeEl.dataset.nodeid;\r\n                if (!nodeId) {\r\n                    continue;\r\n                }\r\n\r\n                let node = this.graph.nodes.find(x => x.id === nodeId);\r\n                if (!node) {\r\n                    continue;\r\n                }\r\n\r\n                let nodeX = node.x;\r\n                let nodeY = node.y;\r\n                let nodeWidth = 0;\r\n                let nodeHeight = 0;\r\n                if (nodeEl.dataset.occluded) {\r\n                    nodeWidth = Number(nodeEl.dataset.width);\r\n                    nodeHeight = Number(nodeEl.dataset.height);\r\n                } else {\r\n                    let nodeRect = actualNodeEl.getBoundingClientRect();\r\n                    nodeWidth = nodeRect.width / this.context.zoom;\r\n                    nodeHeight = nodeRect.height / this.context.zoom;\r\n                }\r\n\r\n                occluded = nodeX + nodeWidth < visibleX \r\n                    || nodeX > visibleX + visibleWidth\r\n                    || nodeY + nodeHeight < visibleY\r\n                    || nodeY > visibleY + visibleHeight\r\n                ;\r\n\r\n                if (nodeEl.dataset.width !== String(nodeWidth))\r\n                    nodeEl.dataset.width = String(nodeWidth);\r\n                if (nodeEl.dataset.height !== String(nodeHeight))\r\n                    nodeEl.dataset.height = String(nodeHeight);\r\n                \r\n                // nodeEl.dataset.x = String(node.x);\r\n                // nodeEl.dataset.y = String(node.y);\r\n            }\r\n\r\n            if (nodeEl.dataset.occluded === undefined || (nodeEl.dataset.occluded === 'true') !== occluded) {\r\n                nodeEl.dataset.occluded = String(occluded);\r\n                nodeEl.style.display = occluded ? 'none' : '';\r\n            }\r\n        }\r\n    }\r\n\r\n    private updatePan() {\r\n        if (!this.plateRef)\r\n            return;\r\n        \r\n        //this.updatePanAndZoom();\r\n        let el = this.plateRef.nativeElement;\r\n        el.style.left = `${this.context.panX}px`;\r\n        el.style.top = `${this.context.panY}px`;\r\n        this.updateVisibleNodes();\r\n    }\r\n\r\n    private screenToLocal(position : Position): Position {\r\n        let canvas = this.canvasRef.nativeElement;\r\n        let pos = canvas.getBoundingClientRect();\r\n\r\n        return { \r\n            top: position.top - pos.top,\r\n            left: position.left - pos.left\r\n        };\r\n    }\r\n\r\n    private getPositionOfSlot(nodeId : string, slotId : string): Position {\r\n        if (!this.context) {\r\n            return;\r\n        }\r\n\r\n        let node = this.context.getNodeById(nodeId);\r\n\r\n        if (!node)\r\n            return;\r\n\r\n        let slot = node.getSlotById(slotId);\r\n        \r\n        if (!slot)\r\n            return;\r\n\r\n        return this.screenToLocal(\r\n            slot.getClientPosition()\r\n        );\r\n    }\r\n\r\n    get draftNode() {\r\n        return this.context.draftNode;\r\n    }\r\n\r\n    nodeMenuVisible = false;\r\n\r\n    @Input()\r\n    get readonly() {\r\n        return this.context.readonly;\r\n    }\r\n\r\n    set readonly(value) {\r\n        this.context.readonly = value;\r\n    }\r\n\r\n    @Input()\r\n    get locked() {\r\n        return this.context.locked;\r\n    }\r\n\r\n    set locked(value) {\r\n        this.context.locked = value;\r\n    }\r\n\r\n    @Output()\r\n    saveRequested = new Subject<void>();\r\n\r\n    @Input()\r\n    active : boolean = undefined;\r\n\r\n    private startRendering() {    \r\n        this.canvas = this.canvasRef.nativeElement; \r\n        this.canvasContext = this.canvas.getContext('2d');\r\n        this.lastFrameTime = Date.now();\r\n        \r\n        this.ngZone.runOutsideAngular(() => {\r\n            let drawFrame = () => (this.drawFrame(), requestAnimationFrame(drawFrame));\r\n            drawFrame();\r\n        });\r\n    }\r\n\r\n    private drawFrame() {\r\n        let canvas = this.canvas;\r\n        let context = this.canvasContext;\r\n        let now = Date.now();\r\n        let deltaTime = (now - this.lastFrameTime) / 1000.0;\r\n        this.lastFrameTime = now;\r\n        \r\n        this.pulseCycle += deltaTime * 55;\r\n        this.pulseCycle = this.pulseCycle % 1000;\r\n\r\n        canvas.width = canvas.clientWidth;\r\n        canvas.height = canvas.clientHeight;\r\n\r\n        context.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n\r\n        let edgeUnderCursor = this.context.edgeUnderCursor;\r\n        let otherEdgeOpacityTarget = edgeUnderCursor ? 0.1 : 1;\r\n        this.otherEdgeOpacity += (otherEdgeOpacityTarget - this.otherEdgeOpacity) * 2 * deltaTime;\r\n\r\n        this.context.edgeUnderCursor = null;\r\n\r\n        for (let edge of this.context.edges) {\r\n            let startPos = this.getPositionOfSlot(edge.fromNodeId, edge.fromSlotId);\r\n            let endPos = this.getPositionOfSlot(edge.toNodeId, edge.toSlotId);\r\n            let lineWidth = 2;\r\n\r\n            if (!startPos || !endPos)\r\n                continue;\r\n\r\n            context.strokeStyle = `white`;\r\n            context.lineCap = 'round';\r\n            context.globalAlpha = this.otherEdgeOpacity;\r\n\r\n            // set the edge color based on the value type\r\n            let sourceSlot = this.context.getSlotByIds(edge.fromNodeId, edge.fromSlotId);\r\n\r\n            let color = 'white';\r\n\r\n            if (sourceSlot && sourceSlot.valueType) {\r\n                color = sourceSlot.valueType.color;\r\n                \r\n\r\n                if (sourceSlot.valueType.lineWidth)\r\n                    lineWidth = sourceSlot.valueType.lineWidth;\r\n\r\n                if (sourceSlot.valueType.getColorByContext) {\r\n                    color = sourceSlot.valueType.getColorByContext(sourceSlot);\r\n                }\r\n            }\r\n\r\n            if (!edge.valid)\r\n                color = 'red';\r\n            \r\n            context.lineWidth = lineWidth;\r\n            context.strokeStyle = color;\r\n\r\n            if (this.context.edgeUnderCursor === null) {\r\n                if (pointOnLine(this.mousePosition, startPos, endPos)) {\r\n                    context.globalAlpha = 1;\r\n                    context.lineWidth = 4;\r\n                    this.context.edgeUnderCursor = edge;\r\n                }\r\n            }\r\n\r\n            if (this.context.edgesAreEqual(this.context.edgeBeingReplaced, edge)) {\r\n                context.lineWidth = 3;\r\n                context.setLineDash([10,5]);\r\n                context.strokeStyle = 'maroon';\r\n            }\r\n\r\n            context.setLineDash([]);\r\n            this.drawEdge(context, startPos, endPos);\r\n\r\n            if (edge.active || this.active === true) {\r\n                context.setLineDash([2, 30]);\r\n                context.lineDashOffset = -this.pulseCycle;\r\n                context.lineWidth = 12;\r\n\r\n                this.drawEdge(context, startPos, endPos);\r\n            }\r\n\r\n            context.globalAlpha = 1;\r\n        }\r\n\r\n        if (this.context.draftEdge) {\r\n            let edge = this.context.draftEdge;\r\n            let startPos = this.mousePosition;\r\n            let endPos = this.mousePosition;\r\n\r\n            if (edge.fromSlotId)\r\n                startPos = this.getPositionOfSlot(edge.fromNodeId, edge.fromSlotId);\r\n\r\n            if (edge.toSlotId)\r\n                endPos = this.getPositionOfSlot(edge.toNodeId, edge.toSlotId);\r\n\r\n            context.setLineDash([10,5])\r\n            context.strokeStyle = \"white\";\r\n            \r\n            let sourceSlot = this.context.getSlotByIds(edge.fromNodeId, edge.fromSlotId);\r\n\r\n            \r\n            let color = 'white';\r\n            let width = 3;\r\n\r\n            if (sourceSlot && sourceSlot.valueType) {\r\n                color = sourceSlot.valueType.color;\r\n\r\n                if (sourceSlot.valueType.lineWidth)\r\n                    width = sourceSlot.valueType.lineWidth;\r\n\r\n                if (sourceSlot.valueType.getColorByContext) {\r\n                    color = sourceSlot.valueType.getColorByContext(sourceSlot);\r\n                }\r\n            }\r\n\r\n            if (!edge.valid)\r\n                color = 'red';\r\n            \r\n            context.strokeStyle = color;\r\n\r\n            context.globalAlpha = 0.5;\r\n            context.lineCap = 'round';\r\n            context.lineWidth = width;\r\n    \r\n            this.drawEdge(context, startPos, endPos);\r\n            context.globalAlpha = 1;\r\n        }\r\n\r\n        if (this.context.selectionBoxStart) {\r\n            let selectBox = this.context.selectionBoxStart;\r\n\r\n            context.setLineDash([10,10]);\r\n            context.strokeStyle = \"#ff7100\";\r\n            context.lineWidth = 5;\r\n            context.strokeRect(\r\n                selectBox.left, \r\n                selectBox.top, \r\n                this.mousePosition.left - selectBox.left,\r\n                this.mousePosition.top - selectBox.top\r\n            );\r\n        }\r\n    }\r\n\r\n    private drawEdge(context : CanvasRenderingContext2D, startPos : Position, endPos : Position) {\r\n        \r\n        if (!startPos || !endPos)\r\n            return;\r\n\r\n        context.beginPath();\r\n        context.moveTo(startPos.left, startPos.top);\r\n\r\n        context.bezierCurveTo(\r\n            startPos.left + (endPos.left - startPos.left) * 0.5, \r\n            startPos.top, \r\n            \r\n            endPos.left - (endPos.left - startPos.left) * 0.5, \r\n            endPos.top, \r\n            \r\n            endPos.left, \r\n            endPos.top\r\n        );\r\n        context.stroke();\r\n    }\r\n\r\n    @HostListener('keydown', ['$event'])\r\n    onKeyDown(event : KeyboardEvent) {\r\n        let targetEl = <HTMLElement>event.target;\r\n        if (targetEl.nodeName === 'INPUT') {\r\n            return;\r\n        }\r\n\r\n        if (event.key === 'Delete') {\r\n            if (!this.context.readonly)\r\n                this.context.removeSelectedNodes();\r\n        } else if (event.key === 'Escape') {\r\n            \r\n            this.nodeMenuVisible = false;\r\n            this.context.draftEdge = null;\r\n            this.context.draftNode = null;\r\n\r\n        } else if (event.key === ' ') {\r\n            this.showNodeMenu();\r\n        } else if (event.key === 'z' && event.ctrlKey) {\r\n            // undo\r\n            if (!this.context.readonly)\r\n                this.context.undo();\r\n        } else if (event.key === 'Z' && event.ctrlKey) {\r\n            // redo\r\n            if (!this.context.readonly)\r\n                this.context.redo();\r\n        } else if (event.key === 'a' && event.ctrlKey) {\r\n            this.context.selectAll();\r\n            event.stopPropagation();\r\n            event.preventDefault();\r\n        } else if (event.key === 'c' && event.ctrlKey) {\r\n            this.context.copy();\r\n        } else if (event.key === 's' && event.ctrlKey) {\r\n            this.saveRequested.next();\r\n            event.preventDefault();\r\n        } else if (event.key === 'v' && event.ctrlKey) {\r\n            if (!this.context.readonly)\r\n                this.context.paste(this.context.screenToGraph(this.mousePosition));\r\n        }\r\n    }\r\n\r\n    isElementInNodeMenu(element : HTMLElement): boolean {\r\n        let el = element;\r\n        while (el) {\r\n            if (el.classList.contains('node-menu'))\r\n                return true;\r\n            el = el.parentElement;\r\n        }\r\n\r\n        return false;\r\n    }\r\n\r\n    @HostListener('wheel', ['$event'])\r\n    onMouseWheel(event : WheelEvent) {\r\n        \r\n        if (this.isElementInNodeMenu(<any>event.target)) {\r\n            return;\r\n        }\r\n        \r\n        event.stopPropagation();\r\n        event.preventDefault();\r\n\r\n        let oldZoom = this.context.zoom;\r\n        let zoom = this.context.zoom + -0.1 * (event.deltaY / 146.0);\r\n        zoom = this.context.clampZoom(zoom);\r\n\r\n        let changeFactor = zoom - oldZoom;\r\n        \r\n        if (this.mousePosition) {\r\n            let panX = this.context.panX;\r\n            let panY = this.context.panY;\r\n            \r\n            panX -= (this.mousePosition.left - panX)*changeFactor / oldZoom;\r\n            panY -= (this.mousePosition.top - panY)*changeFactor / oldZoom;\r\n\r\n            this.context.setPan(panX, panY);\r\n        }\r\n\r\n        this.context.setZoom(zoom);\r\n    }\r\n\r\n    onContextMenu() {\r\n        this.showNodeMenu();\r\n        return false;\r\n    }\r\n\r\n    updateNodeMenuHeight() {\r\n        \r\n        let el = this.nodeMenuEl.nativeElement;\r\n        let container = el.parentElement;\r\n\r\n        let height = container.offsetHeight;\r\n        let rect = el.getBoundingClientRect();\r\n        let containerRect = container.getBoundingClientRect();\r\n        \r\n        let pane : HTMLElement = el.querySelector('.scroll-pane');\r\n        let pr = pane.getBoundingClientRect()\r\n        let prY = pr.y - rect.y;\r\n\r\n        pane.style.maxHeight = `${containerRect.y + containerRect.height - rect.y - prY - 40}px`;\r\n        \r\n        this.nodeMenuPositionChanged.next({ \r\n            top: rect.y - containerRect.y, \r\n            left: rect.x - containerRect.x, \r\n        });\r\n    }\r\n\r\n    hideNodeMenu() {\r\n        this.nodeMenuVisible = false;\r\n    }\r\n\r\n    showNodeMenu() {\r\n        if (this.context.readonly)\r\n            return;\r\n        \r\n        this.context.bufferedEdge = null;\r\n        setTimeout(() => {        \r\n            if (!this.eligibleForContextMenu)\r\n                return;\r\n\r\n            this.nodeMenuVisible = true;\r\n\r\n            this.menuPosition = { \r\n                y: (this.mousePosition.top), \r\n                x: (this.mousePosition.left)\r\n            };\r\n\r\n            this.nodeMenuPositionChanged.next({ top: this.menuPosition.y, left: this.menuPosition.x });\r\n\r\n            setTimeout(() => {\r\n                this.updateNodeMenuHeight();\r\n\r\n                let searchBox : HTMLInputElement = this.menuContents.nativeElement.querySelector('.search-box');\r\n                if (searchBox) {\r\n                    searchBox.focus();\r\n                    searchBox.select();\r\n                }\r\n            });\r\n        });\r\n    }\r\n    \r\n    onDoubleClick(event : MouseEvent) {\r\n        if (this.context.edgeUnderCursor) {\r\n\r\n            if (this.context.readonly)\r\n                return;\r\n\r\n            let pos = this.context.screenToGraph(this.mousePosition);\r\n            let splitEdge = this.context.edgeUnderCursor;\r\n\r\n            this.context.commit('Add reroute node', graph => {\r\n                \r\n                // create reroute node\r\n                let node : DiazoNode = {\r\n                    id: uuid.v4(),\r\n                    data: {\r\n                        type: 'passthrough',\r\n                        unit: 'reroute'\r\n                    },\r\n                    style: 'reroute',\r\n                    x: pos.left - 10,\r\n                    y: pos.top - 10,\r\n                    slots: [\r\n                        { id: 'passthrough', type: 'passthrough', label: '', value: WildcardType.named('a') }\r\n                    ]\r\n                };\r\n    \r\n                graph.nodes.push(node);\r\n\r\n                let preEdge : DiazoEdge = {\r\n                    fromNodeId: splitEdge.fromNodeId,\r\n                    fromSlotId: splitEdge.fromSlotId,\r\n                    toNodeId: node.id,\r\n                    toSlotId: 'passthrough',\r\n                    valid: splitEdge.valid\r\n                };\r\n    \r\n                let postEdge : DiazoEdge = {\r\n                    fromNodeId: node.id,\r\n                    fromSlotId: 'passthrough',\r\n                    toNodeId: splitEdge.toNodeId,\r\n                    toSlotId: splitEdge.toSlotId,\r\n                    valid: splitEdge.valid\r\n                };\r\n    \r\n                let index = graph.edges.findIndex(x => this.context.edgesAreEqual(x, splitEdge));\r\n    \r\n                if (index >= 0)\r\n                    graph.edges.splice(index, 1);\r\n    \r\n                graph.edges.push(preEdge, postEdge);\r\n            });\r\n\r\n\r\n        }\r\n    }\r\n\r\n    onClick(event : MouseEvent) {\r\n        this.nodeMenuVisible = false;\r\n\r\n        if (event.button === 0 && event.altKey) {\r\n            if (this.context.edgeUnderCursor) {\r\n\r\n                if (!this.context.readonly)\r\n                    this.context.removeEdge(this.context.edgeUnderCursor);\r\n            }\r\n        }\r\n    }\r\n\r\n    onTouchStart(event : TouchEvent) {\r\n        if (!this.touchActive) {\r\n            this.touchActive = true;\r\n            document.addEventListener('touchstart', this.onTouchStartListener = event => this.onNewTouch(event));\r\n            document.addEventListener('touchmove', this.onTouchMoveListener = event => this.onTouchMove(event));\r\n            document.addEventListener('touchend', this.onTouchEndListener = event => this.onTouchEnd(event));\r\n            this.onNewTouch(event);\r\n        }\r\n    }\r\n\r\n    onNewTouch(event : TouchEvent) {\r\n        let touch = event.changedTouches[0];\r\n\r\n        if (this.panTouch && this.panTouch.identifier === touch.identifier)\r\n            return;\r\n        if (this.zoomTouch && this.zoomTouch.identifier === touch.identifier)\r\n            return;\r\n        \r\n        if (!this.panTouch) {\r\n            this.startPan = { top: this.context.panY, left: this.context.panX };\r\n            this.startPanZoom = this.context.zoom;\r\n            this.panTouch = touch;\r\n        } else if (!this.zoomTouch) {\r\n            this.startZoom = this.context.zoom;\r\n            this.zoomTouch = touch;\r\n        }\r\n\r\n        event.preventDefault();\r\n    }\r\n\r\n    onTouchMove(event : TouchEvent) {\r\n        let newPanTouch = Array.from(event.touches).find(x => x.identifier === this.panTouch.identifier);\r\n        if (this.panTouch && !this.zoomTouch) {\r\n\r\n            if (newPanTouch) {\r\n                let pos : Position = { \r\n                    left: newPanTouch.clientX - this.panTouch.clientX, \r\n                    top: newPanTouch.clientY - this.panTouch.clientY \r\n                };\r\n                this.context.setPan(this.startPan.left + pos.left, this.startPan.top + pos.top);\r\n            }\r\n        }\r\n        \r\n        if (this.zoomTouch && this.panTouch) {\r\n            let newZoomTouch = Array.from(event.touches).find(x => x.identifier === this.zoomTouch.identifier);\r\n            if (newZoomTouch) {\r\n\r\n                let originalDistance = Math.sqrt(\r\n                    (this.panTouch.clientX - this.zoomTouch.clientX)**2 \r\n                    + (this.panTouch.clientY - this.zoomTouch.clientY)**2\r\n                );\r\n\r\n                let newDistance = Math.sqrt(\r\n                    (newPanTouch.clientX - newZoomTouch.clientX)**2 \r\n                    + (newPanTouch.clientY - newZoomTouch.clientY)**2\r\n                );\r\n\r\n\r\n                let travel = newDistance / originalDistance;\r\n                let oldZoom = this.context.zoom;\r\n                let newZoom = this.startZoom * travel;\r\n                let changeFactor = newZoom - oldZoom;\r\n                \r\n                let zoomOrigin = {\r\n                    left: (newPanTouch.clientX + newZoomTouch.clientX) / 2,\r\n                        top: (newPanTouch.clientY + newZoomTouch.clientY) / 2\r\n                };\r\n                let zoomOriginLocal = this.screenToLocal(zoomOrigin);\r\n\r\n                let oZoomOrigin = this.zoomOrigin || zoomOrigin;\r\n                this.zoomOrigin = zoomOrigin;\r\n                \r\n                let oZoomOriginLocal = this.screenToLocal(oZoomOrigin);\r\n\r\n                let panX = this.startPan.left * this.startPanZoom / newZoom;\r\n                let panY = this.startPan.top * this.startPanZoom / newZoom;\r\n\r\n                // OLD\r\n                panX = this.context.panX;\r\n                panY = this.context.panY;\r\n\r\n                panX -= (zoomOriginLocal.left - panX)*changeFactor / oldZoom;\r\n                panY -= (zoomOriginLocal.top - panY)*changeFactor / oldZoom;\r\n    \r\n                panX += (zoomOrigin.left - oZoomOrigin.left) * newZoom;\r\n                panY += (zoomOrigin.top - oZoomOrigin.top) * newZoom;\r\n\r\n                this.context.setPan(panX, panY);\r\n                this.context.setZoom(newZoom);\r\n            }\r\n        }\r\n\r\n        event.stopPropagation();\r\n        event.preventDefault();\r\n    }\r\n\r\n    zoomOrigin : Position;\r\n\r\n    onTouchEnd(event : TouchEvent) {\r\n        \r\n        let touch = event.changedTouches[0];\r\n        \r\n        if (this.panTouch && !this.zoomTouch) {\r\n            let threshold = 10;\r\n            if (Math.abs(this.panTouch.clientX - touch.clientX) < threshold && Math.abs(this.panTouch.clientY - touch.clientY) < threshold) {\r\n                this.context.unselectAll();\r\n            }\r\n        }\r\n\r\n        if (this.zoomTouch && this.zoomTouch.identifier === touch.identifier) {\r\n            this.zoomTouch = null;\r\n        }\r\n        \r\n        if (this.panTouch && this.panTouch.identifier === touch.identifier) {\r\n            this.panTouch = this.zoomTouch ? Array.from(event.touches).find(x => x.identifier === this.zoomTouch.identifier) : null;\r\n            this.zoomTouch = null;\r\n            this.startPan = { top: this.context.panY, left: this.context.panX };\r\n        }\r\n\r\n        if (event.touches.length === 0) {\r\n            this.touchActive = false;\r\n            document.removeEventListener('touchstart', this.onTouchStartListener);\r\n            document.removeEventListener('touchmove', this.onTouchMoveListener);\r\n            document.removeEventListener('touchend', this.onTouchEndListener);\r\n        }\r\n    }\r\n    \r\n    componentForNode(node : DiazoNode) {\r\n        if (!node || !node.type || !this.context.nodeTypeMap)\r\n            return null;\r\n        \r\n        let klass = this.context.nodeTypeMap[node.type];\r\n        if (!klass)\r\n            throw new Error(`Cannot find node component for type '${node.type}'`);\r\n\r\n        return klass;\r\n    }\r\n\r\n    onMouseDown(startEvent : MouseEvent) {\r\n        if (startEvent.button === 0) {\r\n            // start selection\r\n            this.context.startSelectionAt(this.mousePosition, startEvent.ctrlKey);\r\n            \r\n            let move = () => {\r\n                let graphPoint = this.context.screenToGraph(this.mousePosition);\r\n                this.context.setSelectionBoxEnd(this.mousePosition);\r\n            };\r\n            \r\n            let release = () => {\r\n                document.removeEventListener('mouseup', release, { capture: true });\r\n                document.removeEventListener('mousemove', move, { capture: true });\r\n                this.context.commitSelectionBox();\r\n            };\r\n            \r\n            \r\n            document.addEventListener('mouseup', release, { capture: true });\r\n            document.addEventListener('mousemove', move, { capture: true });\r\n            \r\n        } else if (startEvent.button === 2) {\r\n            let startLeft = this.context.panX;\r\n            let startTop = this.context.panY;\r\n            \r\n            this.eligibleForContextMenu = true;\r\n\r\n            let release = () => {\r\n                document.removeEventListener('mouseup', release, { capture: true });\r\n                document.removeEventListener('mousemove', move, { capture: true });\r\n            };\r\n\r\n            let move = (event : MouseEvent) => {\r\n                if (Math.abs(event.clientX - startEvent.clientX) > 5 \r\n                    || Math.abs(event.clientY - startEvent.clientY) > 5) {\r\n                        this.eligibleForContextMenu = false;\r\n                        this.nodeMenuVisible = false;\r\n                    }\r\n\r\n                this.context.setPan(\r\n                    startLeft + (event.clientX - startEvent.clientX),\r\n                    startTop + (event.clientY - startEvent.clientY)\r\n                );\r\n            };\r\n\r\n            document.addEventListener('mouseup', release, { capture: true });\r\n            \r\n            this.ngZone.runOutsideAngular(() => {\r\n                document.addEventListener('mousemove', move, { capture: true });\r\n            });\r\n        }   \r\n    }\r\n    \r\n    nodeIdentity(index : number, node : DiazoNode) {\r\n        return node.id;\r\n    }\r\n}","<div #plate class=\"plate\">\r\n    <ng-content></ng-content>\r\n\r\n    <ng-container *ngFor=\"let node of (graph?.nodes || []); trackBy nodeIdentity\">\r\n        <dz-dynamic-node \r\n            [node]=\"node\"\r\n            [component]=\"componentForNode(node)\"\r\n            ></dz-dynamic-node>\r\n    </ng-container>\r\n\r\n    <ng-container *ngIf=\"draftNode\">\r\n        <dz-dynamic-node \r\n            [node]=\"draftNode\"\r\n            [drafted]=\"true\" \r\n            [component]=\"componentForNode(draftNode)\"\r\n            ></dz-dynamic-node>\r\n    </ng-container>\r\n</div>\r\n\r\n<div #nodeMenu\r\n    class=\"node-menu\" \r\n    [class.visible]=\"nodeMenuVisible\"\r\n    [cdkDragFreeDragPosition]=\"menuPosition\"\r\n    cdkDrag\r\n    (cdkDragMoved)=\"updateNodeMenuHeight()\"\r\n    >\r\n\r\n    <div class=\"underlay\" cdkDragHandle></div>\r\n    <div class=\"main\" #menuContents>\r\n        <ng-content select=\".node-menu\"></ng-content>\r\n    </div>\r\n</div>\r\n\r\n<div #underlay \r\n    class=\"underlay\" \r\n    (click)=\"onClick($event)\" \r\n    (dblclick)=\"onDoubleClick($event)\" \r\n    (mousedown)=\"onMouseDown($event)\" \r\n    (touchstart)=\"onTouchStart($event)\"\r\n    (contextmenu)=\"onContextMenu()\">\r\n</div>\r\n\r\n<canvas #canvas class=\"overlay\"></canvas>","import { Component, HostListener, Input, Output } from \"@angular/core\";\r\nimport * as uuid from 'uuid';\r\nimport { Subject } from 'rxjs';\r\nimport { DiazoContext, Position, DiazoNode } from '@diazo/model';\r\n\r\n/**\r\n * @category Component\r\n */\r\n@Component({\r\n    selector: 'dz-node-source-button',\r\n    templateUrl: './node-source-button.component.html',\r\n    styleUrls: ['./node-source-button.component.scss']\r\n})\r\nexport class NodeSourceButtonComponent {\r\n\r\n    @Input()\r\n    context : DiazoContext;\r\n\r\n    @Input()\r\n    template : DiazoNode;\r\n\r\n    @Input()\r\n    position : Position;\r\n\r\n    @Output()\r\n    inserted = new Subject<void>();\r\n    \r\n    @HostListener('mousedown', ['$event']) \r\n    onMouseDown(event : MouseEvent) {\r\n        if (!this.context) {\r\n            console.warn(`dz-node-source-button: No context connected, cannot instantiate node`);\r\n            return;\r\n        }\r\n        \r\n        if (!this.template) {\r\n            console.warn(`dz-node-source-button: No template specified, cannot instantiate node`);\r\n            return;\r\n        }\r\n\r\n        let node = Object.assign(\r\n            {}, \r\n            this.template,\r\n            <Partial<DiazoNode>>{ \r\n                id: uuid.v4(),\r\n                x: (this.position || {}).left || 0,\r\n                y: (this.position || {}).top || 0\r\n            }\r\n        );\r\n        node.slots.forEach(slot => slot.default = true);\r\n        this.context.draftNode = node;\r\n        this.context.draftEdge = null;\r\n\r\n        if (this.context.bufferedEdge) {\r\n            let edge = this.context.bufferedEdge;\r\n\r\n            if (!edge.toNodeId) {\r\n                edge.toNodeId = this.context.draftNode.id;\r\n                edge.toSlotId = this.context.draftNode.slots.filter(x => x.type === 'input')[0].id;\r\n            } else {\r\n                edge.fromNodeId = this.context.draftNode.id;\r\n                edge.fromSlotId = this.context.draftNode.slots.filter(x => x.type === 'output')[0].id;\r\n            }\r\n            \r\n            this.context.draftEdge = edge;\r\n        }\r\n\r\n        let release = () => {\r\n            document.removeEventListener('mouseup', release);\r\n            \r\n            this.context.releaseDraftNode();\r\n            this.inserted.next();\r\n        };\r\n\r\n        document.addEventListener('mouseup', release);\r\n    }\r\n}","<div class=\"icon-container\">\r\n    <mat-icon>{{template?.catalog?.icon ?? template?.icon ?? 'home'}}</mat-icon>\r\n</div>\r\n<div class=\"label\">\r\n    <div>\r\n        <ng-content></ng-content>\r\n    </div>\r\n    <span class=\"preview\" *ngIf=\"template?.alpha || template?.beta\">\r\n        <ng-container *ngIf=\"template?.alpha\">\r\n            Alpha\r\n        </ng-container>\r\n        <ng-container *ngIf=\"template?.beta\">\r\n            Beta\r\n        </ng-container>\r\n    </span>\r\n</div>","import { Component, Input, \r\n    Injector, ViewContainerRef, ComponentRef,\r\n    StaticProvider,\r\n    inject} from '@angular/core';\r\nimport { DiazoPropertyContext, DiazoContext, DiazoProperty, \r\n    DiazoNode } from '@diazo/model';\r\n\r\n/**\r\n * @category Component\r\n */\r\n@Component({\r\n    selector: 'dz-property-editor-host',\r\n    template: ``,\r\n    styles: [``]\r\n})\r\nexport class PropertyEditorHostComponent {\r\n    private injector = inject(Injector);\r\n    private viewContainer = inject(ViewContainerRef);\r\n\r\n    private _componentType : any;\r\n    private _componentRef : ComponentRef<any>;\r\n\r\n    @Input()\r\n    get componentType() {\r\n        return this._componentType;\r\n    }\r\n\r\n    set componentType(value) {\r\n        this._componentType = value;\r\n        setTimeout(() => this.initialize());\r\n    }\r\n\r\n    private _propertyContext = new DiazoPropertyContext();\r\n\r\n    @Input()\r\n    get graphContext() : DiazoContext {\r\n        return this._propertyContext.graphContext;\r\n    }\r\n\r\n    set graphContext(value) {\r\n        this._propertyContext.graphContext = value;\r\n    }\r\n\r\n    @Input()\r\n    get property(): DiazoProperty {\r\n        return this._propertyContext.property;\r\n    }\r\n\r\n    set property(value) {\r\n        this._propertyContext.property = value;\r\n    }\r\n\r\n    @Input()\r\n    get selectedNodes(): DiazoNode[] {\r\n        return this._propertyContext.selectedNodes;\r\n    }\r\n\r\n    set selectedNodes(value) { \r\n        this._propertyContext.selectedNodes = value;\r\n    }\r\n\r\n    @Input()\r\n    providers : StaticProvider[] = [];\r\n\r\n    private initialize() {\r\n        // Destroy any previously loaded component\r\n        if (this._componentRef) {\r\n            this._componentRef.destroy();\r\n            this._componentRef = null;\r\n        }\r\n\r\n        this._componentRef = this.viewContainer.createComponent(this.componentType, { \r\n            injector: Injector.create({\r\n                providers: (this.providers || []).concat([\r\n                    { provide: DiazoPropertyContext, useValue: this._propertyContext }\r\n                ]),\r\n                parent: this.injector\r\n            })\r\n        });\r\n    }\r\n}","import { Pipe } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n/**\r\n * @internal\r\n * @hidden\r\n */\r\n@Pipe({\r\n    name: 'trustHtml'\r\n})\r\nexport class TrustHtmlPipe {\r\n    constructor(\r\n        private sanitizer : DomSanitizer\r\n    ) {\r\n\r\n    }\r\n    \r\n    transform(value) {\r\n        return this.sanitizer.bypassSecurityTrustHtml(value);\r\n    }\r\n}","import { Component, Input, Output, Provider, \r\n    ViewChild, ElementRef } from \"@angular/core\";\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Subject } from 'rxjs';\r\nimport { DiazoContext, DiazoNodeContext, DiazoValueType, \r\n    Accessor, MULTIPLE_VALUES, Position } from '@diazo/model';\r\nimport { moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { GraphComponent } from '../graph/graph.component';\r\nimport * as uuid from 'uuid';\r\nimport { DiazoGraph, DiazoNodeSet, DiazoNode, DiazoPropertySet, \r\n    DiazoPropertyOptionGroup, DiazoCustomPropertyType, \r\n    DiazoProperty } from '@diazo/model';\r\n\r\n/**\r\n * Provides a full-featured Diazo editor, including a searchable \r\n * New Node list and a powerful property sheet implementation.\r\n * \r\n * ```html\r\n * <dz-editor [graph]=\"myGraph\" [availableNodes]=\"myDefinedNodes\"></dz-editor>\r\n * ```\r\n * \r\n * Here,\r\n * - `[graph]` is the graph that should be rendered. Any changes made by the user will \r\n *   be applied to the bound object.\r\n * - `[availableNodes]` is an array of {@linkcode DiazoNode} objects made available\r\n *   to the user in the New Node menu\r\n * \r\n * See More\r\n * - {@linkcode DiazoGraph} - Represents a graph, composed of its nodes and edges\r\n * - {@linkcode DiazoValueType} - Edges are \"values\", and their types are represented by \"value types\"\r\n * - {@linkcode DiazoContext} - Most useful instrumentation of the Diazo editor is done \r\n *   via the Context layer\r\n * \r\n * @category Entrypoint\r\n */\r\n@Component({\r\n    selector: 'dz-editor',\r\n    templateUrl: './editor.component.html',\r\n    styleUrls: ['./editor.component.scss']\r\n})\r\nexport class EditorComponent {\r\n    /**\r\n     * @hidden\r\n     */\r\n    constructor(\r\n        private matSnackBar : MatSnackBar,\r\n        private elementRef : ElementRef<HTMLElement>\r\n    ) {\r\n        \r\n        this.propertyManipulator = new Proxy({}, {\r\n            set: (target, key, value) => {\r\n\r\n                this.graphContext.commit('Edit properties', (graph, revert) => {\r\n                    let nodes = this.selectedNodes\r\n                        .map(x => graph.nodes.find(y => y.id === x.id))\r\n                    ;\r\n\r\n                    let changed = this.accessor.set(\r\n                        nodes, \r\n                        <string>key, \r\n                        value\r\n                    );\r\n\r\n                    if (!changed) {\r\n                        revert(true);\r\n                        return;\r\n                    }\r\n\r\n                    for (let node of nodes)\r\n                        this.graphContext.onNodeUpdated(node);\r\n\r\n                    console.dir(\r\n                        this.selectedNodes\r\n                            .map(x => graph.nodes.find(y => y.id === x.id))\r\n                    );\r\n                });\r\n\r\n                return true;\r\n            },\r\n\r\n            get: (target, key) => {\r\n                return this.accessor.get(this.selectedNodes, key.toString());\r\n            }\r\n        })\r\n    }\r\n\r\n    /**\r\n     * @hidden\r\n     */\r\n    ngOnInit() {\r\n        this.windowResizeHandler = () => {\r\n            this._showPropertiesByDefault = (window.innerWidth > 500);\r\n        };\r\n\r\n        window.addEventListener('resize', this.windowResizeHandler);\r\n    }\r\n\r\n    /**\r\n     * @hidden\r\n     */\r\n    ngOnDestroy() {\r\n        window.removeEventListener('resize', this.windowResizeHandler);\r\n    }\r\n\r\n    private windowResizeHandler;\r\n    private _propertySearch = '';\r\n    private _nodeSearch = '';\r\n    private _showProperties : boolean = undefined;\r\n    private _showPropertiesByDefault = true;\r\n    private _graph : DiazoGraph = {\r\n        nodes: [],\r\n        edges: []\r\n    };\r\n    private _availableNodes : DiazoNodeSet[] = [];\r\n    private accessor = new Accessor();\r\n    private labelCache = new WeakMap<DiazoNode, string>();\r\n\r\n    nodeMenuPosition: Position;\r\n    newNodePosition: Position;\r\n\r\n    /**\r\n     * A proxy object which is capable of getting or setting property \r\n     * values across the nodes that are currently selected in the editor.\r\n     * The keys of this object are interpreted as either JSONPath (when the \r\n     * key starts with '$') or Diazo's custom object path format (otherwise).\r\n     */\r\n    propertyManipulator : any;\r\n    \r\n    /**\r\n     * Stores the current graph context object. This represents the state \r\n     * logic for the graph being edited within the Diazo editor\r\n     */\r\n    graphContext : DiazoContext;\r\n\r\n    /**\r\n     * Get the currently selected node context (the first one\r\n     * if multiple nodes are currently selected)\r\n     */\r\n    selectedNodeContext : DiazoNodeContext;\r\n\r\n    /**\r\n     * Get the currently selected node-contexts\r\n     */\r\n    selectedNodeContexts : DiazoNodeContext[] = [];\r\n\r\n    /**\r\n     * Provides the PropertySets which are currently visible \r\n     * subject to the search query entered by the user.\r\n     */\r\n    selectedPropertySets : DiazoPropertySet[] = [];\r\n\r\n    /**\r\n     * Provides the NodeSets which are currently visible \r\n     * in the New Node menu, subject to the search query \r\n     * entered by the user.\r\n     */\r\n    matchingNodeSets : DiazoNodeSet[];\r\n\r\n    /**\r\n     * Provides the Nodes which are currently visible \r\n     * in the New Node menu, subject to the search query \r\n     * entered by the user. This is a flattening of the nodes\r\n     * found in `matchingNodeSets`.\r\n     */\r\n    matchingNodes : DiazoNode[];\r\n\r\n    /**\r\n     * When true, the Node Menu is in keyboard mode, and certain\r\n     * keystrokes (up/down/enter) can be used to select and insert\r\n     * a node visible in the menu, This works in concert with \r\n     * `matchingNodes`.\r\n     */\r\n    nodeMenuKeyboardMode = false;\r\n\r\n    /**\r\n     * The index of a node in the New Node menu that the user has \r\n     * selected via Keyboard Mode.\r\n     */\r\n    selectedMatchingNodeIndex = 0;\r\n\r\n    /**\r\n     * The text the user has entered into the Property Sheet's \r\n     * Search box.\r\n     */\r\n    get propertySearch() {\r\n        return this._propertySearch;\r\n    }\r\n\r\n    set propertySearch(value) {\r\n        this._propertySearch = value;\r\n        setTimeout(() => this.updateSelectedPropertySets());\r\n    }\r\n\r\n    /**\r\n     * The text the user has entered into the Node Menu's\r\n     * Search box.\r\n     */\r\n    get nodeSearch() {\r\n        return this._nodeSearch;\r\n    }\r\n\r\n    set nodeSearch(value) {\r\n        this._nodeSearch = value;\r\n        setTimeout(() => this.updateSelectedNodeSets());\r\n    }\r\n\r\n    /**\r\n     * True when the user has made the Properties sidebar visible.\r\n     * False when the user has hidden it. This also has special behavior\r\n     * if the user has not yet shown/hidden the sidebar -- if the \r\n     * screen size is small enough to be considered \"mobile\", then this\r\n     * will return false. Otherwise it will be true.\r\n     */\r\n    get showProperties() {\r\n        if (this._showProperties === undefined)\r\n            return this._showPropertiesByDefault;\r\n        return this._showProperties;\r\n    }\r\n\r\n    set showProperties(value) {\r\n        this._showProperties = value;\r\n    }\r\n\r\n    /**\r\n     * Options used for Monaco when editing JSON.\r\n     */\r\n    jsonMonacoOptions = {\r\n        theme: 'vs-dark', \r\n        language: 'json',\r\n        automaticLayout: true\r\n    };\r\n\r\n    /**\r\n     * Options used for Monaco when editing Markdown.\r\n     */\r\n    markdownMonacoOptions = {\r\n        theme: 'vs-dark', \r\n        language: 'markdown',\r\n        automaticLayout: true\r\n    };\r\n\r\n    /**\r\n     * Options used for Monaco when editing TypeScript.\r\n     */\r\n    tsMonacoOptions = {\r\n        theme: 'vs-dark', \r\n        language: 'typescript',\r\n        automaticLayout: true\r\n    };\r\n\r\n    /**\r\n     * Fired when the DiazoContext has been acquired from the underlying\r\n     * Diazo component. DiazoContext represents the operating state \r\n     * (model) of the Diazo editor.\r\n     */\r\n    @Output()\r\n    contextChanged = new Subject<DiazoContext>();\r\n\r\n    /**\r\n     * Fired when the graph has been changed by the user. More technically\r\n     * this is fired when a change transaction is \"committed\" to the Diazo\r\n     * Context. These change transactions underpin Diazo's support for Undo/Redo.\r\n     */\r\n    @Output() \r\n    graphChanged = new Subject<DiazoGraph>();\r\n\r\n    /**\r\n     * If true, the Diazo editor will be placed in Read Only mode. The user \r\n     * can still move nodes around, but new nodes cannot be created, existing nodes\r\n     * cannot be removed, and edges cannot be changed.\r\n     */\r\n    @Input()\r\n    readonly = false;\r\n\r\n    /**\r\n     * If true, the Diazo editor will allow no changes to the graph whatsoever.\r\n     * When this is true, `readonly` is also considered to be true. The difference\r\n     * between `locked` and `readonly` is mainly that the nodes cannot be moved around\r\n     * by the user.\r\n     */\r\n    @Input()\r\n    locked = false;\r\n\r\n    /**\r\n     * Allows the consumer to pass in a set of dependency injection providers \r\n     * which will be used whenever a custom property editor or custom node is \r\n     * created. Use this to pass in services needed by your custom controls.\r\n     */\r\n    @Input()\r\n    providers : Provider[] = [];\r\n\r\n    /**\r\n     * Provides access to the underlying <dz-container> component which \r\n     * implements the Diazo renderer.\r\n     */\r\n    @ViewChild('container')\r\n    container : GraphComponent;\r\n\r\n    /**\r\n     * Specify an array of PropertySets which will be shown for all nodes that\r\n     * exist in the graph. These PropertySets will be shown after the ones defined\r\n     * on the node itself.\r\n     */\r\n    @Input()\r\n    universalPropertySets : DiazoPropertySet[] = [];\r\n\r\n    /**\r\n     * When true, the edges of the graph will be rendered with a flow animation.\r\n     * Use this to indicate that the graph is currently \"running\".\r\n     */\r\n    @Input()\r\n    active : boolean = undefined;\r\n\r\n    /**\r\n     * Allows the consumer to pass in the set of nodes that will be available \r\n     * for the user to add to the graph via the New Node menu (right click).\r\n     */\r\n    @Input()\r\n    get availableNodes() {\r\n        return this._availableNodes;\r\n    }\r\n    set availableNodes(value) {\r\n        this._availableNodes = value;\r\n        this.updateSelectedNodeSets();\r\n        if (this._graph)\r\n            this.inflateGraph(this._graph);\r\n\r\n        this.nodeRegistry.clear();\r\n        \r\n        value\r\n            .map(x => x.nodes)\r\n            .flat()\r\n            .filter(x => x.behavior?.id)\r\n            .forEach(node => this.nodeRegistry.set(node.behavior?.id, node))\r\n        ;\r\n    }\r\n\r\n    private nodeRegistry = new Map<string, DiazoNode>();\r\n\r\n    /**\r\n     * Allows the consumer to specify dynamic option sources for use with \r\n     * properties of type \"select\". Since properties are static declarations,\r\n     * it is generally not possible to dynamically populate the options of a \r\n     * \"select\" property. The \"optionSources\" system provides a good way to \r\n     * do this. To use it, define a property such as {type: \"select\", optionSource: \"mySource\"}\r\n     * and specify \"optionSources\" as { mySource: { option1: \"Option 1\", option2: \"Option 2\"}}.\r\n     * The Diazo editor will automatically populate these options into the select\r\n     * box in the Properties panel.\r\n     */\r\n    @Input()\r\n    optionSources : Record<string, Record<string, DiazoPropertyOptionGroup[]>>;\r\n    \r\n    /**\r\n     * Specify a set of custom components that will be used to render specific types of \r\n     * nodes. The key of this map should match the \"$.type\" property of a node you wish\r\n     * to use a custom component with. The value is the Angular component class.\r\n     * \r\n     * The custom component can inject the `DiazoNodeContext` instance in order \r\n     * to interact with the node state.\r\n     */\r\n    @Input()\r\n    nodeTypeMap : Record<string, any>;\r\n\r\n    /**\r\n     * Specify a set of custom components that will be used to render specific types of\r\n     * properties. Each custom property type specifies a \"namespace\" and an \"id\". \r\n     * You use this custom type in the `properties` declaration on a node (or via \r\n     * universalPropertySets) by specifying `property.type = \"namespace:id\"` \r\n     * (for example).\r\n     */\r\n    @Input()\r\n    customPropertyTypes : DiazoCustomPropertyType[] = [];\r\n\r\n    /**\r\n     * Specify a set of \"value types\" which are used to declare the types of \r\n     * edges that can be created within the graph. The value type system \r\n     * supports compatibility by class heirarchy by default, and custom value\r\n     * type classes can even redefine the notion of compatibility however they want.\r\n     * Compatibility here refers to whether a slot with one \"value\" is allowed to be \r\n     * connected to a slot with another \"value\".\r\n     * \r\n     * Value types also define the color and appearance of the edge when rendered\r\n     * within Diazo.\r\n     */\r\n    @Input()\r\n    valueTypes : { new() : DiazoValueType; }[] = [];\r\n\r\n    /**\r\n     * Specify the Diazo object that this editor should work with.\r\n     * The object is passed by reference here, and the object will be \r\n     * modified by the Diazo editor *in place*. Note that you can \r\n     * also receive immutable snapshots of the graph via the \r\n     * `graphChanged` event.\r\n     */\r\n    @Input()\r\n    get graph() {\r\n        return this._graph;\r\n    }\r\n\r\n    set graph(value) {\r\n        this._graph = value;\r\n        if (this._graph)\r\n            this.inflateGraph(this._graph);\r\n    }\r\n\r\n    /**\r\n     * Bind to this event to receive Save events from the user\r\n     * (Diazo Editor does not do anything special with a Save \r\n     * request by default, that is up to the consumer). This fires\r\n     * when the user presses Ctrl+S / Cmd+S.\r\n     */\r\n    @Output()\r\n    saveRequested = new Subject<void>();\r\n\r\n    /**\r\n     * This is true if the selection of nodes is considered \"readonly\".\r\n     * The selection is considered readonly if any selected node is \r\n     * marked as \"readonly\".\r\n     */\r\n    get selectionReadOnly() {\r\n        if (this.readonly)\r\n            return true;\r\n\r\n        let readonly = false;\r\n\r\n        for (let node of this.selectedNodes) {\r\n            if (!node) {\r\n                console.warn(`selectedNodes contains null entry!`);\r\n            }\r\n            if (node.readonly) {\r\n                readonly = true;\r\n                break;\r\n            }\r\n        }\r\n\r\n        return readonly;\r\n    }\r\n\r\n    /**\r\n     * Provides (for convenience) the \"MULTIPLE_VALUES\" special token\r\n     * value. This is used to represent that among the nodes selected \r\n     * within the editor, the values of a specific property differ between\r\n     * them. In the editor, this will show up as \"Multiple values\" in the \r\n     * property sheet, which typically prevents you from editing the property.\r\n     * @hidden\r\n     */\r\n    get MULTIPLE_VALUES() {\r\n        return MULTIPLE_VALUES;\r\n    }\r\n\r\n    /**\r\n     * Get the currently selected DiazoNode (the first one if there are multiple\r\n     * nodes selected)\r\n     */\r\n    get selectedNode() {\r\n        return this.selectedNodeContext.state;\r\n    }\r\n\r\n    /**\r\n     * Get the currently selected DiazoNodes.\r\n     */\r\n    get selectedNodes() {\r\n        return this.selectedNodeContexts.map(x => x.state).filter(x => x);\r\n    }\r\n\r\n    /**\r\n     * Specify where a new node should be inserted. This is used \r\n     * by the New Node menu to determine where a node should be \r\n     * placed when it is not dragged into the view.\r\n     * @hidden\r\n     */\r\n    setNewNodePosition(position : Position) {\r\n        if (!this.graphContext)\r\n            return;\r\n        \r\n        this.nodeMenuPosition = position;\r\n        this.newNodePosition = {\r\n            left: (position.left - this.graphContext.panX) / this.graphContext.zoom - 20,\r\n            top: (position.top - this.graphContext.panY) / this.graphContext.zoom - 20\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Hide the node menu if it is currently visible.\r\n     */\r\n    hideNodeMenu() {\r\n        if (this.container)\r\n            this.container.hideNodeMenu();\r\n    }\r\n\r\n    /**\r\n     * Show the node menu if it is not currently visible.\r\n     */\r\n    showNodeMenu() {\r\n        if (this.container)\r\n            this.container.showNodeMenu();\r\n    }\r\n\r\n    /**\r\n     * Insert the node that is currently selected in the New Node menu.\r\n     * This is used by the Keyboard Mode of the node menu to insert the \r\n     * node upon pressing \"Enter\".\r\n     * @hidden\r\n     */\r\n    insertSelectedNode() {\r\n        let template = this.matchingNodes[this.selectedMatchingNodeIndex];\r\n\r\n        let node = Object.assign(\r\n            {}, \r\n            template,\r\n            <Partial<DiazoNode>>{ \r\n                id: uuid.v4(),\r\n                x: (this.newNodePosition || {}).left || 0,\r\n                y: (this.newNodePosition || {}).top || 0\r\n            }\r\n        );\r\n\r\n        node.slots.forEach(slot => slot.default = true);\r\n\r\n        this.graphContext.draftNode = node;\r\n        this.graphContext.draftEdge = null;\r\n        \r\n        if (this.graphContext.bufferedEdge) {\r\n            let edge = this.graphContext.bufferedEdge;\r\n\r\n            if (!edge.toNodeId) {\r\n                edge.toNodeId = this.graphContext.draftNode.id;\r\n                edge.toSlotId = this.graphContext.draftNode.slots.filter(x => x.type === 'input')[0].id;\r\n            } else {\r\n                edge.fromNodeId = this.graphContext.draftNode.id;\r\n                edge.fromSlotId = this.graphContext.draftNode.slots.filter(x => x.type === 'output')[0].id;\r\n            }\r\n            \r\n            this.graphContext.draftEdge = edge;\r\n        }\r\n\r\n        this.graphContext.releaseDraftNode();\r\n        this.hideNodeMenu();\r\n    }\r\n\r\n    /**\r\n     * Return true if the given Property Type is a custom type.\r\n     * This is determined by looking up the type using the `customPropertyTypes`\r\n     * field.\r\n     * @hidden\r\n     */\r\n    isCustomPropertyType(type : string) {\r\n        return !!this.getCustomPropertyType(type);\r\n    }\r\n\r\n    /**\r\n     * Get a custom property type from the `customPropertyTypes` field.\r\n     * The passed string should be in the form \"namespace:id\"\r\n     * @hidden\r\n     */\r\n    getCustomPropertyType(type : string) {\r\n        return this.customPropertyTypes.find(x => type === `${x.namespace}:${x.id}`);\r\n    }\r\n\r\n    /**\r\n     * @hidden\r\n     */\r\n    numericRange(min, max, step = 1) {\r\n        let array = [];\r\n\r\n        for (let i = min; i < max; i += step)\r\n            array.push(i);\r\n\r\n        return array;\r\n    }\r\n\r\n    /**\r\n     * @hidden\r\n     */\r\n    onGraphChanged(graph : DiazoGraph) {\r\n        this.graphChanged.next(graph);\r\n    }\r\n    \r\n    /**\r\n     * Locate the given dynamic option source with the given name from `optionSources`.\r\n     * Used to support dynamic options sources for \"select\" properties.\r\n     * @hidden\r\n     */\r\n    getOptionsFromSource(sourceDescriptor : string): DiazoPropertyOptionGroup[] {\r\n        let set = sourceDescriptor;\r\n        let key = 'default';\r\n\r\n        let match = sourceDescriptor.match(/^([^\\[\\]]+)\\[([^\\[\\]]+)\\]$/);\r\n        if (match) {\r\n            let propIndex = match[2];\r\n\r\n            set = match[1];\r\n            key = this.propertyManipulator[propIndex];\r\n        }\r\n\r\n        return this.optionSources[set][key];\r\n    }\r\n\r\n    /**\r\n     * Returns true if the given property would have any enabled options within\r\n     * the standard property menu (shown to the right of the property view).\r\n     * If false, the editor will hide the menu entirely.\r\n     * @hidden\r\n     */\r\n    propertyNeedsMenu(prop : DiazoProperty) {\r\n        return prop.allowAnnotation !== false || prop.slottable;\r\n    }\r\n\r\n    /**\r\n     * Annotate all nodes in the given graph with the properties specified \r\n     * within the `availableNodes` setting. It is typical for consumers of \r\n     * Diazo to strip the `properties` part of all nodes in a graph for \r\n     * space efficiency, because for some domains the amount of properties \r\n     * on a node can be substantial. Furthermore, the properties specified \r\n     * within `availableNodes` may have changed since the graph object was \r\n     * originally created. This inflation process automatically \r\n     * re-adds the necessary property definitions onto the graph nodes \r\n     * ensuring that the available properties are always up to date with\r\n     * those defined by your application.\r\n     * @hidden\r\n     */\r\n    inflateGraph(graph : DiazoGraph) {\r\n        for (let node of graph.nodes) {\r\n            if (node.data && node.data.unit === 'reroute')\r\n                continue;\r\n            \r\n            let templateNode = this.findTemplateNode(node);\r\n            if (templateNode) {\r\n                node.properties = templateNode.properties;\r\n            } else {\r\n                // if (node.properties) {\r\n                //     console.warn(`Node already has docs, but could not refresh them:`);\r\n                //     console.dir(node);\r\n                // } else if (this.availableNodes.length > 0) {\r\n                //     //debugger;\r\n                //     console.warn(`Could not locate documentation for graph node:`);\r\n                //     console.dir(node);\r\n                // }\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Find a node within `availableNodes` which matches the given node.\r\n     * This is used to implement graph inflation (see `inflateGraph`) whereby \r\n     * we update the `properties` section of all nodes in the graph.\r\n     * @hidden\r\n     */\r\n    findTemplateNode(node : DiazoNode) {\r\n        if (!node.behavior?.id)\r\n            return null;\r\n\r\n        return this.nodeRegistry.get(node.behavior.id);\r\n    }\r\n\r\n    /**\r\n     * Determine the label to use for the given node.\r\n     * @hidden\r\n     */\r\n    labelForNode(node : DiazoNode) {\r\n        if (this.labelCache.has(node))\r\n            return this.labelCache.get(node);\r\n        \r\n        // We do this to enable 'defaults' to work within the catalog view.\r\n        // It is not the same as doing `node.label`\r\n        \r\n        let label = this.accessor.get([ node ], '$.catalog.label') \r\n            ?? this.accessor.get([ node ], '$.label');\r\n        this.labelCache.set(node, label);\r\n\r\n        return label;\r\n    }\r\n\r\n    /**\r\n     * Get the index of the given node within the `matchingNodes` array.\r\n     * This is used to annotate the DOM nodes found within the Node Menu\r\n     * in support of its keyboard selection mode.\r\n     * @hidden\r\n     */\r\n    getIndexOfMatchingNode(node : DiazoNode) {\r\n        return this.matchingNodes.indexOf(node);\r\n    }\r\n\r\n    /**\r\n     * Special handling for keyboard input when the user is focused on the Search\r\n     * box in the New Node menu.\r\n     * @hidden\r\n     */\r\n    onNodeMenuSearchKeyDown(event : KeyboardEvent) {\r\n        if (event.key === 'ArrowDown') {\r\n            this.selectedMatchingNodeIndex += 1;\r\n        } else if (event.key === 'ArrowUp') {\r\n            this.selectedMatchingNodeIndex -= 1;\r\n        }\r\n\r\n        if (this.selectedMatchingNodeIndex < 0)\r\n            this.selectedMatchingNodeIndex = 0;\r\n\r\n        if (this.selectedMatchingNodeIndex >= this.matchingNodes.length) {\r\n            this.selectedMatchingNodeIndex = this.matchingNodes.length - 1;\r\n        }\r\n\r\n        let el = this.elementRef.nativeElement;\r\n        let button = el.querySelector(`[data-matched-node-index=\"${this.selectedMatchingNodeIndex}\"]`);\r\n\r\n        if (button)\r\n            button.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n    }\r\n\r\n    /**\r\n     * Update the set of visible node sets based on the search query entered \r\n     * into the New Node menu's Search box by the user (`nodeSearch`).\r\n     * @hidden\r\n     */\r\n    updateSelectedNodeSets() {\r\n        let sets = this.availableNodes.slice();\r\n        sets = sets.map(x => Object.assign({}, x));\r\n\r\n        sets.forEach(set => set.nodes = set.nodes.filter(x => JSON.stringify(x).toLowerCase().includes(this.nodeSearch)));\r\n        sets = sets.filter(set => set.nodes.length > 0);\r\n\r\n        this.matchingNodeSets = sets;\r\n        this.matchingNodes = [].concat(...sets.map(x => x.nodes));\r\n    }\r\n\r\n    /**\r\n     * Update the set of visible property sets based on the search query\r\n     * entered into the Properties sidebar Search box by the user (`propertySearch`)\r\n     * @hidden\r\n     */\r\n    updateSelectedPropertySets() {\r\n        let sets = [];\r\n        \r\n        if (this.selectedNodes.length === 1) {\r\n            // TODO: introduce this for multi-selection\r\n\r\n            if (this.selectedNode.properties) {\r\n                sets.push(...this.selectedNode.properties);\r\n            }\r\n        }\r\n\r\n        sets.push(...this.universalPropertySets.slice());\r\n\r\n        // ----------\r\n        \r\n        sets = sets.map(x => Object.assign({}, x));\r\n\r\n        sets.forEach(set => set.properties = set.properties.filter(x => (x.label || '').toLowerCase().includes(this.propertySearch)));\r\n        sets = sets.filter(set => set.properties.length > 0);\r\n\r\n        this.selectedPropertySets = sets;\r\n    }\r\n\r\n    /**\r\n     * trackBy v.path\r\n     * @hidden\r\n     */\r\n    path(v) {\r\n        return v.path;\r\n    }\r\n\r\n    /**\r\n     * trackBy v.id\r\n     * @hidden\r\n     */\r\n    identity(v) {\r\n        return v.id;\r\n    }\r\n\r\n    /**\r\n     * trackBy v.value\r\n     * @hidden\r\n     */\r\n    value(v) {\r\n        return v.value;\r\n    }\r\n\r\n    /**\r\n     * Bound to <dz-container>'s `contextChanged` event\r\n     * @hidden\r\n     */\r\n    acquireGraphContext(context : DiazoContext) {\r\n        if (!context)\r\n            return;\r\n        \r\n        setTimeout(() => {\r\n            this.graphContext = context;\r\n            this.contextChanged.next(context);\r\n\r\n            for (let type of this.valueTypes) {\r\n                context.registerValueType(type);\r\n            }\r\n\r\n            // reload the graph once now that value types are registered\r\n            this.graph = this.graph;\r\n    \r\n    \r\n            this.graphContext.selectionChanged.subscribe(nodes => {\r\n                setTimeout(() => {\r\n                    this.selectedNodeContexts = nodes.filter(x => x.state.style !== 'reroute');\r\n                    this.selectedNodeContext = this.selectedNodeContexts[0];\r\n                    this.updateSelectedPropertySets();\r\n                    this.updateSelectedNodeSets();\r\n                });\r\n            });\r\n\r\n            this.graphContext.notificationMessage.subscribe(notif => {\r\n                this.matSnackBar.open(notif.message, undefined, {\r\n                    duration: 1000,\r\n                    politeness: \"polite\"\r\n                });\r\n            });\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Used with cdkDrag to implement reorderable slots within the Properties sidebar.\r\n     * @hidden\r\n     */\r\n    reorderSlots(event) {\r\n        moveItemInArray(this.selectedNodes[0].slots, event.previousIndex, event.currentIndex);\r\n    }\r\n\r\n    /**\r\n     * Returns true if the given property has been converted into a \r\n     * Property Slot.\r\n     * @hidden\r\n     */\r\n    isPropSlotted(prop : DiazoProperty) {\r\n        return this.selectedNodes.some(node => node.slots.some(x => x.id === `property:${prop.path}` && !x.disabled))\r\n    }\r\n    \r\n    /**\r\n     * Removes property slots related to the given property from the \r\n     * nodes that are currently selected.\r\n     * @hidden\r\n     */\r\n    removePropertySlot(property : DiazoProperty) {\r\n        let nodeIds = this.selectedNodes.map(x => x.id);\r\n\r\n        this.graphContext.commit('Remove property slot', (graph, revert) => {\r\n\r\n            let nodes = nodeIds.map(id => graph.nodes.find(x => x.id === id));\r\n            this.accessor.set(nodes, property.path, '∅');\r\n\r\n            for (let node of nodes) {\r\n                if (node.slots) {\r\n                    let slotId = `property:${property.path}`;\r\n                    let slot = node.slots.find(x => x.id === slotId);\r\n\r\n                    if (slot?.default) {\r\n                        slot.disabled = true;\r\n                    } else {\r\n                        node.slots = node.slots.filter(x => x.id !== slotId);\r\n                    }\r\n\r\n                    graph.edges = graph.edges.filter(x => !(x.toNodeId === node.id && x.toSlotId === slotId));\r\n                }\r\n            }\r\n\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Creates new property slots related to the given property on all selected\r\n     * nodes.\r\n     * @hidden\r\n     */\r\n    createPropertySlot(property : DiazoProperty) {\r\n        let nodeIds = this.selectedNodes.map(x => x.id);\r\n\r\n        this.graphContext.commit('Create property slot', (graph, revert) => {\r\n            let nodes = nodeIds.map(id => graph.nodes.find(x => x.id === id));\r\n            this.accessor.set(nodes, property.path, { $edge: `property:${property.path}` });\r\n\r\n            for (let node of nodes) {\r\n                if (!node.slots)\r\n                    node.slots = [];\r\n\r\n                let existingSlot = node.slots.find(x => x.id === `property:${property.path}`);\r\n\r\n                if (existingSlot) {\r\n                    existingSlot.disabled = false;\r\n                } else {\r\n                    node.slots.push({\r\n                        id: `property:${property.path}`,\r\n                        label: property.label,\r\n                        value: property.slotValue,\r\n                        type: 'input',\r\n                        dynamic: true,\r\n                        hidden: false\r\n                    })\r\n                }\r\n            }\r\n        });\r\n    }\r\n}","<mat-menu #propertyMenu=\"matMenu\">\r\n    <ng-template matMenuContent let-prop=\"prop\">\r\n\r\n        <button *ngIf=\"isPropSlotted(prop)\" mat-menu-item (click)=\"removePropertySlot(prop)\">\r\n            <mat-icon>close</mat-icon>\r\n            Remove Slot\r\n        </button>\r\n        <button *ngIf=\"!isPropSlotted(prop)\" mat-menu-item [disabled]=\"!prop.slottable\" (click)=\"createPropertySlot(prop)\">\r\n            <mat-icon>add</mat-icon>\r\n            Create Slot\r\n        </button>\r\n        <button [disabled]=\"prop.allowAnnotation === false\" mat-menu-item>\r\n            <mat-icon>edit</mat-icon>\r\n            Edit Notes\r\n        </button>\r\n    </ng-template>\r\n</mat-menu>\r\n\r\n<div class=\"graph-view\">\r\n    <dz-container \r\n        #container\r\n        [readonly]=\"readonly\" \r\n        [locked]=\"locked\"\r\n        [active]=\"active\"\r\n        (contextChanged)=\"acquireGraphContext($event)\" \r\n        (nodeMenuPositionChanged)=\"setNewNodePosition($event)\"\r\n        [graph]=\"graph\"\r\n        [nodeTypeMap]=\"nodeTypeMap\"\r\n        (graphChanged)=\"onGraphChanged($event)\"\r\n        (saveRequested)=\"saveRequested.next()\"\r\n        >\r\n        <div class=\"node-menu\">\r\n            <form (submit)=\"insertSelectedNode()\">\r\n                <mat-form-field class=\"property-search-bar\">\r\n                    <mat-label>Search</mat-label>\r\n                    <input class=\"search-box\" type=\"text\" \r\n                        matInput \r\n                        name=\"search\"\r\n                        autocomplete=\"off\"\r\n                        (focus)=\"nodeMenuKeyboardMode = true\"\r\n                        (blur)=\"nodeMenuKeyboardMode = false\"\r\n                        (keydown)=\"onNodeMenuSearchKeyDown($event)\"\r\n                        [(ngModel)]=\"nodeSearch\" \r\n                        />\r\n                </mat-form-field>\r\n            </form>\r\n\r\n            <div class=\"scroll-pane\">\r\n                <mat-accordion [multi]=\"nodeSearch != ''\">\r\n                    <mat-expansion-panel \r\n                        [expanded]=\"nodeSearch != ''\" \r\n                        *ngFor=\"let set of matchingNodeSets\"\r\n                        >\r\n                        <mat-expansion-panel-header>\r\n                            {{set.label}}\r\n                        </mat-expansion-panel-header>\r\n        \r\n                        <div class=\"node-container\">\r\n                            <dz-node-source-button \r\n                                *ngFor=\"let node of set.nodes\"\r\n                                [class.highlighted]=\"nodeMenuKeyboardMode && getIndexOfMatchingNode(node) === selectedMatchingNodeIndex\"\r\n                                [position]=\"newNodePosition\"\r\n                                [context]=\"graphContext\" \r\n                                (mouseenter)=\"selectedMatchingNodeIndex = getIndexOfMatchingNode(node)\"\r\n                                (inserted)=\"hideNodeMenu()\"\r\n                                [attr.data-matched-node-index]=\"getIndexOfMatchingNode(node)\"\r\n                                [template]=\"node\">{{labelForNode(node)}}</dz-node-source-button>\r\n                        </div>\r\n                    </mat-expansion-panel>\r\n                </mat-accordion>\r\n            </div>\r\n        </div>\r\n    </dz-container>\r\n    <aside class=\"properties\" [class.visible]=\"showProperties\">\r\n\r\n        <div class=\"toolbar\">\r\n            <ng-container *ngIf=\"showProperties\">\r\n                <label>\r\n                    <span #customEmptySidebarLabel>\r\n                        <ng-container *ngIf=\"selectedNodes.length === 0\">\r\n                            <ng-content select=\".empty-sidebar-label\"></ng-content>\r\n                        </ng-container>\r\n                    </span>\r\n                    <ng-container *ngIf=\"selectedNodes.length > 0 || customEmptySidebarLabel?.childElementCount === 0\">\r\n                        Properties\r\n                    </ng-container>\r\n                </label>\r\n                <div class=\"spacer\"></div>\r\n            </ng-container>\r\n\r\n            <button mat-icon-button (click)=\"showProperties = !showProperties\">\r\n                <mat-icon *ngIf=\"showProperties\">close</mat-icon>\r\n                <mat-icon *ngIf=\"!showProperties\">menu</mat-icon>\r\n            </button>\r\n            \r\n        </div>\r\n\r\n        <ng-container *ngIf=\"showProperties\">\r\n            <ng-container *ngIf=\"selectedNodes.length === 0\">\r\n                <div #customEmptySidebar><ng-content select=\".empty-sidebar\"></ng-content></div>\r\n                <div class=\"nothing-selected\" *ngIf=\"customEmptySidebar.childElementCount === 0\">\r\n                    <em>Select a node to view its properties.</em>\r\n                </div>\r\n            </ng-container>\r\n\r\n            <ng-container *ngIf=\"selectedNodes.length > 0\">\r\n                <mat-form-field class=\"property-search-bar\">\r\n                    <mat-label>Search</mat-label>\r\n                    <input type=\"text\" matInput [(ngModel)]=\"propertySearch\" />\r\n                </mat-form-field>\r\n\r\n                <mat-accordion [multi]=\"true\">\r\n                    <ng-container *ngFor=\"let propSet of selectedPropertySets; trackBy identity\">\r\n\r\n                        <mat-expansion-panel [expanded]=\"true\">\r\n                            <mat-expansion-panel-header>\r\n                                <mat-panel-title>\r\n                                    {{propSet.label}}\r\n                                </mat-panel-title>\r\n                                <mat-panel-description>\r\n                                    {{propSet.description}}\r\n                                </mat-panel-description>\r\n                            </mat-expansion-panel-header>\r\n                            <div class=\"property-list v-flex\">\r\n                                <div class=\"property-list-item\" *ngFor=\"let prop of propSet.properties; trackBy path;\">\r\n\r\n                                    <div class=\"property-container\" *ngIf=\"isPropSlotted(prop)\">\r\n                                        <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n                                            <mat-label>{{prop.label}}</mat-label>\r\n                                            <input matInput readonly style=\"font-style: italic;\" type=\"text\" value=\"(Set in graph)\" />\r\n                                        </mat-form-field>\r\n                                    </div>\r\n                                    <div class=\"property-container\" *ngIf=\"!isPropSlotted(prop)\">\r\n\r\n                                        <ng-container *ngIf=\"prop.type === 'position'\">\r\n                                            <div class=\"field-pair\">\r\n                                                <mat-form-field appearance=\"outline\" [floatLabel]=\"propertyManipulator['x?'] === MULTIPLE_VALUES ? 'auto' : 'always'\">\r\n                                                    <mat-label>\r\n                                                        X\r\n                                                        <ng-container *ngIf=\"propertyManipulator['x?'] === MULTIPLE_VALUES\">\r\n                                                            (Multiple Values)\r\n                                                        </ng-container>\r\n                                                    </mat-label>\r\n                                                    <input matInput type=\"number\" [(ngModel)]=\"propertyManipulator.x\" />\r\n                                                </mat-form-field>\r\n                                                <mat-form-field appearance=\"outline\" [floatLabel]=\"propertyManipulator['y?'] === MULTIPLE_VALUES ? 'auto' : 'always'\">\r\n                                                    <mat-label>\r\n                                                        Y\r\n                                                        <ng-container *ngIf=\"propertyManipulator['y?'] === MULTIPLE_VALUES\">\r\n                                                            (Multiple Values)\r\n                                                        </ng-container>\r\n                                                    </mat-label>\r\n                                                    <input matInput type=\"number\" [(ngModel)]=\"propertyManipulator.y\" />\r\n                                                </mat-form-field>\r\n                                                \r\n                                            </div>\r\n                                        </ng-container>\r\n                                        <ng-container *ngIf=\"prop.type !== 'position'\">\r\n                                            <ng-container *ngIf=\"prop.type === 'bitmask'\">\r\n                                                <div class=\"property\">\r\n                                                    <label>{{prop.label}}</label>\r\n                                                </div>\r\n                                                <div class=\"bitmask\">\r\n                                                    <mat-checkbox \r\n                                                        *ngFor=\"let label of prop.bitmask.labels; index as i\"\r\n                                                        [(ngModel)]=\"propertyManipulator[prop.path + '&' + i]\">{{label}}</mat-checkbox>\r\n                                                </div>\r\n                                            </ng-container>\r\n                                            <ng-container *ngIf=\"prop.type === 'text'\">\r\n                                                <mat-form-field appearance=\"outline\" [floatLabel]=\"propertyManipulator[prop.path + '?'] === MULTIPLE_VALUES ? 'auto' : 'always'\">\r\n                                                    <mat-label>\r\n                                                        {{prop.label}}\r\n                                                        <ng-container *ngIf=\"propertyManipulator[prop.path + '?'] === MULTIPLE_VALUES\">\r\n                                                            (Multiple Values)\r\n                                                        </ng-container>\r\n                                                    </mat-label>\r\n                                                    <input type=\"text\" [readonly]=\"selectionReadOnly || prop.readonly\" matInput [(ngModel)]=\"propertyManipulator[prop.path]\" />\r\n                                                    \r\n                                                </mat-form-field>\r\n                                            </ng-container>\r\n                                            <ng-container *ngIf=\"prop.type === 'json'\">\r\n                                                <div class=\"property\">\r\n                                                    <label>{{prop.label}}</label>\r\n                                                </div>\r\n                                                <ngx-monaco-editor \r\n                                                    [options]=\"jsonMonacoOptions\"\r\n                                                    [(ngModel)]=\"propertyManipulator[prop.path]\"></ngx-monaco-editor>\r\n                                            </ng-container>\r\n                                            <ng-container *ngIf=\"prop.type === 'markdown'\">\r\n                                                <div class=\"property\">\r\n                                                    <label>{{prop.label}}</label>\r\n                                                </div>\r\n                                                <ngx-monaco-editor \r\n                                                    [options]=\"markdownMonacoOptions\"\r\n                                                    [(ngModel)]=\"propertyManipulator[prop.path]\"></ngx-monaco-editor>\r\n                                            </ng-container>\r\n                                            <ng-container *ngIf=\"prop.type === 'typescript'\">\r\n                                                <div class=\"property\">\r\n                                                    <label>{{prop.label}}</label>\r\n                                                </div>\r\n                                                <ngx-monaco-editor \r\n                                                    [options]=\"tsMonacoOptions\"\r\n                                                    [(ngModel)]=\"propertyManipulator[prop.path]\"></ngx-monaco-editor>\r\n                                            </ng-container>\r\n                                            <ng-container *ngIf=\"prop.type === 'textarea'\">\r\n                                                <mat-form-field appearance=\"outline\" [floatLabel]=\"propertyManipulator[prop.path + '?'] === MULTIPLE_VALUES ? 'auto' : 'always'\">\r\n                                                    <mat-label>\r\n                                                        {{prop.label}}\r\n                                                        <ng-container *ngIf=\"propertyManipulator[prop.path + '?'] === MULTIPLE_VALUES\">\r\n                                                            (Multiple Values)\r\n                                                        </ng-container>\r\n                                                    </mat-label>\r\n                                                    <textarea style=\"min-height: 7em; font-family: monospace;\" [readonly]=\"selectionReadOnly || prop.readonly\" matInput [(ngModel)]=\"propertyManipulator[prop.path]\"></textarea>\r\n                                                </mat-form-field>\r\n                                            </ng-container>\r\n                                            <ng-container *ngIf=\"prop.type === 'number'\">\r\n                                                <mat-form-field appearance=\"outline\" [floatLabel]=\"propertyManipulator[prop.path + '?'] === MULTIPLE_VALUES ? 'auto' : 'always'\">\r\n                                                    <mat-label>\r\n                                                        {{prop.label}}\r\n                                                        <ng-container *ngIf=\"propertyManipulator[prop.path + '?'] === MULTIPLE_VALUES\">\r\n                                                            (Multiple Values)\r\n                                                        </ng-container>\r\n                                                    </mat-label>\r\n                                                    <input type=\"number\" [readonly]=\"selectionReadOnly || prop.readonly\" matInput [(ngModel)]=\"propertyManipulator[prop.path]\" />\r\n                                                    \r\n                                                </mat-form-field>\r\n                                            </ng-container>\r\n                                            <ng-container *ngIf=\"prop.type === 'inline-matrix'\">\r\n                                                <div class=\"inline-matrix\" [attr.data-width]=\"prop.inlineMatrix.width\">\r\n\r\n                                                    <ng-container *ngFor=\"let i of numericRange(0, prop.inlineMatrix.width*prop.inlineMatrix.height)\">\r\n                                                        <input type=\"number\" />\r\n                                                    </ng-container>\r\n                                                </div>\r\n                                            </ng-container>\r\n                                            <ng-container *ngIf=\"prop.type === 'matrix'\">\r\n                                                <div class=\"property\">\r\n                                                    <label>{{prop.label}}</label>\r\n                                                </div>\r\n                                                <div class=\"matrix\" [attr.data-width]=\"prop.matrix.width\">\r\n                                                    <mat-form-field appearance=\"outline\" [floatLabel]=\"propertyManipulator['x?'] === MULTIPLE_VALUES ? 'auto' : 'always'\" *ngFor=\"let cell of prop.matrix.cells\">\r\n                                                        <mat-label>\r\n                                                            {{cell.label}}\r\n                                                            <ng-container *ngIf=\"propertyManipulator['?'] === MULTIPLE_VALUES\">\r\n                                                                (Multiple Values)\r\n                                                            </ng-container>\r\n                                                        </mat-label>\r\n                                                        <input matInput type=\"number\" [(ngModel)]=\"propertyManipulator[cell.path]\" />\r\n                                                    </mat-form-field>\r\n                                                </div>\r\n                                            </ng-container>\r\n                                            <ng-container *ngIf=\"prop.type === 'select'\">\r\n                                                <mat-form-field appearance=\"outline\" [floatLabel]=\"propertyManipulator[prop.path + '?'] === MULTIPLE_VALUES ? 'auto' : 'always'\">\r\n                                                    <mat-label>\r\n                                                        {{prop.label}}\r\n                                                        <ng-container *ngIf=\"propertyManipulator[prop.path + '?'] === MULTIPLE_VALUES\">\r\n                                                            (Multiple Values)\r\n                                                        </ng-container>\r\n                                                    </mat-label>\r\n                                                    <mat-select [disabled]=\"selectionReadOnly || prop.readonly\" [(value)]=\"propertyManipulator[prop.path]\">\r\n                                                        <ng-container *ngIf=\"prop.optionSource\">\r\n                                                            <ng-container *ngFor=\"let group of getOptionsFromSource(prop.optionSource); trackBy value;\">\r\n                                                                <ng-container *ngIf=\"group.options.length == 1\">\r\n                                                                    <mat-option [value]=\"group.options[0].value\">{{group.label}}</mat-option>    \r\n                                                                </ng-container>\r\n                                                                <ng-container *ngIf=\"group.options.length > 1\">\r\n                                                                    <mat-optgroup [label]=\"group.label\">\r\n                                                                        <mat-option \r\n                                                                            *ngFor=\"let option of group.options\"\r\n                                                                            [value]=\"option.value\"\r\n                                                                            >{{option.label}}</mat-option>    \r\n                                                                    </mat-optgroup>\r\n                                                                </ng-container>\r\n                                                            </ng-container>\r\n\r\n                                                            \r\n                                                        </ng-container>\r\n                                                        <ng-container *ngIf=\"!prop.optionSource\">\r\n                                                            <mat-option \r\n                                                                [value]=\"option.value\" \r\n                                                                *ngFor=\"let option of prop.options; trackBy value;\"\r\n                                                                >{{option.label}}</mat-option>\r\n                                                        </ng-container>\r\n                                                    </mat-select>\r\n                                                </mat-form-field>\r\n                                            </ng-container>\r\n                                            <ng-container *ngIf=\"prop.type === 'flags'\">\r\n                                                <mat-form-field appearance=\"outline\" [floatLabel]=\"propertyManipulator[prop.path + '?'] === MULTIPLE_VALUES ? 'auto' : 'always'\">\r\n                                                    <mat-label>\r\n                                                        {{prop.label}}\r\n                                                        <ng-container *ngIf=\"propertyManipulator[prop.path + '?'] === MULTIPLE_VALUES\">\r\n                                                            (Multiple Values)\r\n                                                        </ng-container>\r\n                                                    </mat-label>\r\n                                                    <mat-select [disabled]=\"selectionReadOnly || prop.readonly\" [(value)]=\"propertyManipulator[prop.path]\" multiple>\r\n                                                        <mat-option [value]=\"option.value\" *ngFor=\"let option of prop.options; trackBy value;\">{{option.label}}</mat-option>\r\n                                                    </mat-select>\r\n                                                </mat-form-field>\r\n                                            </ng-container>\r\n                                            <ng-container *ngIf=\"prop.type === 'boolean'\">\r\n                                                <mat-checkbox [(ngModel)]=\"propertyManipulator[prop.path]\" [disabled]=\"selectionReadOnly || prop.readonly\">\r\n                                                    {{prop.label}}\r\n                                                    <ng-container *ngIf=\"propertyManipulator[prop.path + '?'] === MULTIPLE_VALUES\">\r\n                                                        (Multiple Values)\r\n                                                    </ng-container>\r\n                                                </mat-checkbox>\r\n                                            </ng-container>\r\n                                            <ng-container *ngIf=\"isCustomPropertyType(prop.type)\">\r\n                                                <dz-property-editor-host\r\n                                                    [graphContext]=\"graphContext\"\r\n                                                    [providers]=\"providers\"\r\n                                                    [selectedNodes]=\"selectedNodes\" \r\n                                                    [property]=\"prop\" \r\n                                                    [componentType]=\"getCustomPropertyType(prop.type).component\">\r\n                                                    </dz-property-editor-host>\r\n                                            </ng-container>\r\n                                        </ng-container>\r\n                                        \r\n                                        <div \r\n                                            class=\"hint\" \r\n                                            *ngIf=\"prop.description\" \r\n                                            [innerHTML]=\"prop.description | trustHtml\"\r\n                                            ></div>\r\n                                    </div>\r\n\r\n                                    <div class=\"property-controls\">\r\n                                        <button mat-icon-button \r\n                                            *ngIf=\"propertyNeedsMenu(prop)\"\r\n                                            [matMenuTriggerFor]=\"propertyMenu\" \r\n                                            [matMenuTriggerData]=\"{prop: prop}\"\r\n                                            >\r\n                                            <mat-icon>more_vert</mat-icon>\r\n                                        </button>\r\n                                    </div>\r\n                                </div>\r\n                            </div>\r\n                        </mat-expansion-panel>\r\n                    </ng-container>\r\n                \r\n                    <mat-expansion-panel *ngIf=\"selectedNodes.length > 0\">\r\n                        <mat-expansion-panel-header>\r\n                            <mat-panel-title>\r\n                                Slots\r\n                            </mat-panel-title>\r\n                        </mat-expansion-panel-header>\r\n\r\n                        <ng-container *ngIf=\"selectedNodes.length > 1\">\r\n                            <em>Slot editing not available for multiple nodes</em>\r\n                        </ng-container>\r\n                        <ng-container *ngIf=\"selectedNodes.length === 1\">\r\n\r\n                            <div class=\"slot-list\" cdkDropList (cdkDropListDropped)=\"reorderSlots($event)\">\r\n                                <div class=\"slot-list-item\" *ngFor=\"let slot of selectedNodes[0].slots\" cdkDrag>\r\n                                    <button mat-icon-button cdkDragHandle>\r\n                                        <mat-icon>menu</mat-icon>\r\n                                    </button>\r\n                                    <mat-slide-toggle [checked]=\"!slot.hidden\" (change)=\"slot.hidden = !$event.checked\"></mat-slide-toggle>\r\n                                    <div>\r\n                                        {{slot.label}}\r\n                                    </div>\r\n                                </div>\r\n                            </div>\r\n                            <pre>{{selectedNodes[0].slots | json}}</pre>\r\n                        </ng-container>\r\n                    </mat-expansion-panel>\r\n\r\n                    <mat-expansion-panel>\r\n                        <mat-expansion-panel-header>\r\n                            <mat-panel-title>\r\n                                JSON\r\n                            </mat-panel-title>\r\n                            <mat-panel-description>\r\n                                All properties\r\n                            </mat-panel-description>\r\n                        </mat-expansion-panel-header>\r\n\r\n                        <pre>{{(selectedNodes.length > 1 ? selectedNodes : selectedNodes[0]) | json}}</pre>\r\n                    </mat-expansion-panel>\r\n                </mat-accordion>\r\n            </ng-container>\r\n        </ng-container>\r\n    </aside>\r\n</div>","import { NgModule } from \"@angular/core\";\r\nimport { GraphComponent } from './graph/graph.component';\r\nimport { DynamicNodeComponent } from './dynamic-node/dynamic-node.component';\r\nimport { NodeHostComponent } from './node-host/node-host.component';\r\nimport { SlotComponent } from './slot/slot.component';\r\nimport { NodeComponent } from './node/node.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { EditorComponent } from './editor/editor.component';\r\nimport { NodeSourceButtonComponent } from './node-source-button/node-source-button.component';\r\nimport { TrustHtmlPipe } from './trust-html.pipe';\r\nimport { PropertyEditorHostComponent } from './property-editor-host/property-editor-host.component';\r\nimport { MonacoEditorModule } from '@astronautlabs/monaco';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\n\r\n/**\r\n * @hidden\r\n */\r\nconst DECLARATIONS = [\r\n    GraphComponent,\r\n    DynamicNodeComponent,\r\n    NodeComponent,\r\n    NodeHostComponent,\r\n    SlotComponent,\r\n    EditorComponent,\r\n    NodeSourceButtonComponent,\r\n    PropertyEditorHostComponent,\r\n    TrustHtmlPipe\r\n];\r\n\r\n/**\r\n * @category Module\r\n */\r\n@NgModule({\r\n    declarations: DECLARATIONS,\r\n    exports: DECLARATIONS,\r\n    imports: [\r\n        CommonModule,\r\n        MatIconModule,\r\n        MatButtonModule,\r\n        MatFormFieldModule,\r\n        MatInputModule,\r\n        DragDropModule,\r\n        FormsModule,\r\n        MatSelectModule,\r\n        MatTabsModule,\r\n        MatRadioModule,\r\n        MatCheckboxModule,\r\n        MatDividerModule,\r\n        MatDialogModule,\r\n        MatProgressSpinnerModule,\r\n        MatExpansionModule,\r\n        MatSnackBarModule,\r\n        MatMenuModule,\r\n        MatSlideToggleModule,\r\n        MonacoEditorModule\r\n    ]\r\n})\r\nexport class DiazoModule {\r\n\r\n}","/*\n * Public API Surface of diazo\n */\n\nexport * from '@diazo/model';\nexport * from './lib';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i5","i1","i2.NodeComponent","i3.NodeHostComponent","i4.SlotComponent","i2","i3.DynamicNodeComponent","i3","i4","i16.GraphComponent","i17.NodeSourceButtonComponent","i18.PropertyEditorHostComponent","i19.TrustHtmlPipe"],"mappings":"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"}