{"version":3,"file":"metadev-daga-angular.mjs","names":[],"sources":["../../../../libs/daga-angular/src/lib/collapse-button/collapse-button.component.ts","../../../../libs/daga-angular/src/lib/collapse-button/collapse-button.component.html","../../../../libs/daga-angular/src/lib/services/canvas-provider.service.ts","../../../../libs/daga-angular/src/lib/services/daga-configuration.service.ts","../../../../libs/daga-angular/src/lib/diagram-buttons/diagram-buttons.component.ts","../../../../libs/daga-angular/src/lib/diagram-buttons/diagram-buttons.component.html","../../../../libs/daga-angular/src/lib/errors/errors.component.ts","../../../../libs/daga-angular/src/lib/errors/errors.component.html","../../../../libs/daga-angular/src/lib/palette/palette.component.ts","../../../../libs/daga-angular/src/lib/palette/palette.component.html","../../../../libs/daga-angular/src/lib/property-editor/property-settings/property-settings.component.ts","../../../../libs/daga-angular/src/lib/property-editor/property-settings/property-settings.component.html","../../../../libs/daga-angular/src/lib/property-editor/autocomplete/autocomplete.component.ts","../../../../libs/daga-angular/src/lib/property-editor/autocomplete/autocomplete.component.html","../../../../libs/daga-angular/src/lib/property-editor/option-list-editor/option-list-editor.component.ts","../../../../libs/daga-angular/src/lib/property-editor/option-list-editor/option-list-editor.component.html","../../../../libs/daga-angular/src/lib/property-editor/text-list-editor/text-list-editor.component.ts","../../../../libs/daga-angular/src/lib/property-editor/text-list-editor/text-list-editor.component.html","../../../../libs/daga-angular/src/lib/property-editor/text-map-editor/text-map-editor.component.ts","../../../../libs/daga-angular/src/lib/property-editor/text-map-editor/text-map-editor.component.html","../../../../libs/daga-angular/src/lib/property-editor/object-editor/object-editor.component.ts","../../../../libs/daga-angular/src/lib/property-editor/object-editor/object-editor.component.html","../../../../libs/daga-angular/src/lib/property-editor/property-editor.component.ts","../../../../libs/daga-angular/src/lib/property-editor/property-editor.component.html","../../../../libs/daga-angular/src/lib/diagram/diagram.component.ts","../../../../libs/daga-angular/src/lib/diagram/diagram.component.html","../../../../libs/daga-angular/src/lib/daga.module.ts"],"sourcesContent":["import { AfterViewInit, Component, ElementRef, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { Side } from '@metadev/daga';\nimport * as d3 from 'd3';\n\n/**\n * Button used to collapse components that implement it.\n * @private\n */\n@Component({\n  selector: 'daga-collapse-button',\n  changeDetection: ChangeDetectionStrategy.Eager,\n  templateUrl: './collapse-button.component.html'\n})\nexport class CollapseButtonComponent implements AfterViewInit {\n  @Input()\n  collapsableSelector!: string | ElementRef | HTMLElement;\n  @Input()\n  collapsableAdditionalSelector!: string;\n  @Input()\n  collapsed = false;\n  @Input()\n  disabled = false;\n  @Input()\n  direction = Side.Bottom;\n  @Input()\n  rule = 'visibility';\n  @Input()\n  collapsedValue = 'collapse';\n  @Input()\n  visibleValue = 'visible';\n\n  Side = Side;\n\n  ngAfterViewInit(): void {\n    this.setCollapse();\n  }\n\n  toggleCollapse(): void {\n    if (!this.disabled) {\n      this.collapsed = !this.collapsed;\n      this.setCollapse();\n    }\n  }\n\n  setCollapse(): void {\n    let selection;\n    if (this.collapsableSelector instanceof ElementRef) {\n      selection = d3.select(this.collapsableSelector.nativeElement);\n      if (this.collapsableAdditionalSelector) {\n        selection = selection.select(this.collapsableAdditionalSelector);\n      }\n    } else if (this.collapsableSelector instanceof HTMLElement) {\n      selection = d3.select(this.collapsableSelector);\n      if (this.collapsableAdditionalSelector) {\n        selection = selection.select(this.collapsableAdditionalSelector);\n      }\n    } else {\n      selection = d3.select(this.collapsableSelector);\n      if (this.collapsableAdditionalSelector) {\n        selection = selection.select(this.collapsableAdditionalSelector);\n      }\n    }\n    selection.style(\n      this.rule,\n      this.collapsed ? this.collapsedValue : this.visibleValue\n    );\n  }\n\n  getClass(): string {\n    switch (this.direction) {\n      case Side.Right:\n        if (this.disabled) {\n          return 'daga-horizontal-none';\n        } else if (this.collapsed) {\n          return 'daga-horizontal-right';\n        } else {\n          return 'daga-horizontal-left';\n        }\n      case Side.Bottom:\n        if (this.disabled) {\n          return 'daga-vertical-none';\n        } else if (this.collapsed) {\n          return 'daga-vertical-down';\n        } else {\n          return 'daga-vertical-up';\n        }\n      case Side.Left:\n        if (this.disabled) {\n          return 'daga-horizontal-none';\n        } else if (this.collapsed) {\n          return 'daga-horizontal-left';\n        } else {\n          return 'daga-horizontal-right';\n        }\n      case Side.Top:\n        if (this.disabled) {\n          return 'daga-vertical-none';\n        } else if (this.collapsed) {\n          return 'daga-vertical-up';\n        } else {\n          return 'daga-vertical-down';\n        }\n    }\n  }\n}\n","<button\n  class=\"daga-collapse-button daga-{{ direction }}\"\n  (click)=\"toggleCollapse()\"\n>\n  <div [class]=\"getClass()\"></div>\n</button>\n","import { Injectable } from '@angular/core';\nimport {\n  Canvas,\n  DiagramCanvas,\n  DiagramConfig,\n  DiagramEditor\n} from '@metadev/daga';\nimport { ReplaySubject } from 'rxjs';\n\n/**\n * A provider for the {@link Canvas} associated with a {@link DiagramComponent} context.\n * @public\n */\n@Injectable()\nexport class CanvasProviderService {\n  #canvas!: Canvas;\n\n  #canvasSubject$ = new ReplaySubject<Canvas>();\n\n  /**\n   * Subject used to track when the canvas has been updated.\n   * @public\n   */\n  canvas$ = this.#canvasSubject$.asObservable();\n\n  #viewInitializedSubject$ = new ReplaySubject<Canvas>();\n\n  /**\n   * Subject used to track when the view of the canvas has been updated after updating the canvas.\n   * @public\n   */\n  viewInitialized$ = this.#viewInitializedSubject$.asObservable();\n\n  /**\n   * Initialize the diagram canvas object of this context using the given diagram configuration.\n   * @private\n   * @param parentComponent A diagram editor.\n   * @param config A diagram configuration.\n   */\n  initCanvas(parentComponent: DiagramEditor, config: DiagramConfig) {\n    this.#canvas = new DiagramCanvas(parentComponent, config);\n    this.#canvasSubject$.next(this.#canvas);\n  }\n\n  /**\n   * Attach the canvas of this context to an HTML element to render it there.\n   * @private\n   * @param appendTo An HTML element.\n   */\n  initCanvasView(appendTo: HTMLElement) {\n    this.#canvas.initView(appendTo);\n    this.#viewInitializedSubject$.next(this.#canvas);\n  }\n\n  /**\n   * Get the current canvas of this context.\n   * @public\n   * @returns A canvas.\n   */\n  getCanvas(): Canvas {\n    return this.#canvas;\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { DiagramConfig } from '@metadev/daga';\nimport { ReplaySubject } from 'rxjs';\n\n/**\n * A provider for the {@link DiagramConfig} associated with a {@link DiagramComponent} context.\n * @public\n */\n@Injectable()\nexport class DagaConfigurationService {\n  #config!: DiagramConfig;\n\n  #configSubject$ = new ReplaySubject<DiagramConfig>();\n\n  /**\n   * Subject used to track when the diagram configuration has been updated.\n   * @public\n   */\n  config$ = this.#configSubject$.asObservable();\n\n  /**\n   * Set the diagram configuration of this context.\n   * @private\n   * @param config A diagram configuration.\n   */\n  init(config: DiagramConfig) {\n    this.#config = config;\n    this.#configSubject$.next(config);\n  }\n\n  /**\n   * Get the current diagram configuration of this context.\n   * @public\n   * @returns A diagram configuration.\n   */\n  getConfig(): DiagramConfig {\n    return this.#config;\n  }\n}\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  ViewChild\n} from '@angular/core';\nimport {\n  ApplyLayoutAction,\n  Canvas,\n  Corner,\n  DiagramActions,\n  DiagramButtons,\n  DiagramConfig,\n  getLocationsOfNodes,\n  layouts,\n  Side\n} from '@metadev/daga';\nimport * as d3 from 'd3';\nimport { Subscription } from 'rxjs';\nimport { CanvasProviderService } from '../services/canvas-provider.service';\nimport { DagaConfigurationService } from '../services/daga-configuration.service';\n\n/**\n * Buttons used to trigger diagram functionalities by the user.\n * @private\n */\n@Component({\n  selector: 'daga-diagram-buttons',\n  templateUrl: './diagram-buttons.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DiagramButtonsComponent\n  implements DiagramButtons, OnInit, AfterViewInit, OnDestroy\n{\n  #canvasProvider = inject(CanvasProviderService);\n  #configService = inject(DagaConfigurationService);\n\n  get canvas(): Canvas {\n    return this.#canvasProvider.getCanvas();\n  }\n\n  @ViewChild('collapsableButtons')\n  collapsableButtons!: ElementRef<HTMLDivElement>;\n  @Input()\n  location!: Corner;\n  @Input()\n  direction!: Side;\n  @Input()\n  centerAnimationDuration: number | undefined = undefined;\n  @Input()\n  enableAction = true;\n  @Input()\n  enableFilter = false;\n  @Input()\n  enableLayout = false;\n  @Input()\n  enableSelection = true;\n  @Input()\n  enableZoom = true;\n\n  filterOn = false;\n  collapsed = true;\n  animationOngoing = false;\n  #sizeAttribute!: string;\n  #transformFunction!: string;\n  #transformOrigin!: string;\n  #marginSide!: string;\n  #collapsableButtonsSize!: string;\n\n  #configSubscription?: Subscription;\n\n  DiagramActions = DiagramActions;\n\n  ngOnInit() {\n    this.#configSubscription = this.#configService.config$.subscribe((c) => {\n      this.init(c);\n    });\n  }\n\n  ngAfterViewInit() {\n    this.recalculateSizeOfButtons();\n  }\n\n  ngOnDestroy(): void {\n    this.#configSubscription?.unsubscribe();\n  }\n\n  init(config: DiagramConfig) {\n    this.filterOn = false;\n    this.collapsed = true;\n    this.animationOngoing = false;\n    this.location = config.components?.buttons?.location || Corner.BottomRight;\n    this.direction = config.components?.buttons?.direction || Side.Top;\n    this.centerAnimationDuration =\n      config.components?.buttons?.centerAnimationDuration;\n    this.enableAction = config.components?.buttons?.enableAction !== false;\n    this.enableFilter = config.components?.buttons?.enableFilter === true;\n    this.enableLayout = config.components?.buttons?.enableLayout === true;\n    this.enableSelection =\n      config.components?.buttons?.enableSelection !== false;\n    this.enableZoom = config.components?.buttons?.enableZoom !== false;\n    switch (this.direction) {\n      case Side.Bottom:\n        this.#sizeAttribute = 'height';\n        this.#transformFunction = 'scaleY';\n        this.#transformOrigin = 'top';\n        this.#marginSide = 'bottom';\n        break;\n      case Side.Top:\n        this.#sizeAttribute = 'height';\n        this.#transformFunction = 'scaleY';\n        this.#transformOrigin = 'bottom';\n        this.#marginSide = 'top';\n        break;\n      case Side.Left:\n        this.#sizeAttribute = 'width';\n        this.#transformFunction = 'scaleX';\n        this.#transformOrigin = 'right';\n        this.#marginSide = 'left';\n        break;\n      case Side.Right:\n        this.#sizeAttribute = 'width';\n        this.#transformFunction = 'scaleX';\n        this.#transformOrigin = 'left';\n        this.#marginSide = 'right';\n        break;\n    }\n    this.recalculateSizeOfButtons();\n  }\n\n  recalculateSizeOfButtons() {\n    if (this.collapsableButtons) {\n      const numberOfCollapsableButtons =\n        (this.enableZoom &&\n        this.canvas.canUserPerformAction(DiagramActions.Zoom)\n          ? 1\n          : 0) +\n        (this.enableAction ? 2 : 0) +\n        (this.enableSelection ? 5 : 0) +\n        (this.enableLayout ? 1 : 0) +\n        (this.enableFilter ? 1 : 0);\n      this.#collapsableButtonsSize = `${4 * numberOfCollapsableButtons}rem`;\n      d3.select(this.collapsableButtons.nativeElement)\n        .style(`margin-${this.#marginSide}`, '-1rem')\n        .style(this.#sizeAttribute, '0rem')\n        .style('transform', `${this.#transformFunction}(0)`)\n        .style('transform-origin', this.#transformOrigin);\n    }\n  }\n\n  // Collapse functions\n\n  async toggleCollapse() {\n    if (!this.animationOngoing) {\n      const duration = 500;\n      const collapsableButtons = d3.select(\n        this.collapsableButtons.nativeElement\n      );\n      if (this.collapsed) {\n        this.collapsed = false;\n        collapsableButtons\n          .transition()\n          .duration(duration)\n          .ease(d3.easeLinear)\n          .style(this.#sizeAttribute, this.#collapsableButtonsSize)\n          .style('transform', `${this.#transformFunction}(1)`);\n        setTimeout(() => {\n          this.animationOngoing = false;\n        }, duration);\n      } else {\n        this.collapsed = true;\n        collapsableButtons\n          .transition()\n          .duration(duration)\n          .ease(d3.easeLinear)\n          .style(this.#sizeAttribute, '0rem')\n          .style('transform', `${this.#transformFunction}(0)`);\n        setTimeout(() => {\n          this.animationOngoing = false;\n        }, duration);\n      }\n    }\n  }\n\n  // Button functions\n\n  zoomIn(): void {\n    this.canvas.zoomBy(this.canvas.zoomFactor);\n  }\n\n  zoomOut(): void {\n    this.canvas.zoomBy(1 / this.canvas.zoomFactor);\n  }\n\n  center(): void {\n    this.canvas.center(undefined, 1, this.centerAnimationDuration);\n  }\n\n  layout(): void {\n    if (this.canvas.layoutFormat && this.canvas.layoutFormat in layouts) {\n      const from = getLocationsOfNodes(this.canvas.model);\n      layouts[this.canvas.layoutFormat].apply(this.canvas.model);\n      const to = getLocationsOfNodes(this.canvas.model);\n      const action = new ApplyLayoutAction(this.canvas, from, to);\n      this.canvas.actionStack.add(action);\n    }\n  }\n\n  filter(): void {\n    this.filterOn = !this.filterOn;\n    const priorityThresholds = this.canvas.getPriorityThresholdOptions();\n    if (priorityThresholds && priorityThresholds.length >= 2) {\n      this.canvas.setPriorityThreshold(\n        priorityThresholds[this.filterOn ? 1 : 0]\n      );\n    }\n  }\n\n  undo(): void {\n    this.canvas.actionStack.undo();\n  }\n\n  redo(): void {\n    this.canvas.actionStack.redo();\n  }\n\n  copySelection(): void {\n    this.canvas.userSelection.copyToClipboard();\n  }\n\n  cutSelection(): void {\n    this.canvas.userSelection.cutToClipboard();\n  }\n\n  pasteSelection(): void {\n    this.canvas.userSelection.pasteFromClipboard();\n  }\n\n  deleteSelection(): void {\n    this.canvas.userSelection.removeFromModel();\n  }\n\n  startMultipleSelection(): void {\n    this.canvas.multipleSelectionOn = true;\n  }\n}\n","<div class=\"daga-diagram-buttons daga-{{ location }} daga-{{ direction }}\">\n  @if (enableZoom && canvas.canUserPerformAction(DiagramActions.Zoom)) {\n    <button class=\"daga-zoom-in\" (click)=\"zoomIn()\">\n      <span class=\"daga-tooltip\">Zoom in</span>\n    </button>\n  }\n  @if (enableZoom && canvas.canUserPerformAction(DiagramActions.Zoom)) {\n    <button class=\"daga-zoom-out\" (click)=\"zoomOut()\">\n      <span class=\"daga-tooltip\">Zoom out</span>\n    </button>\n  }\n  <div #collapsableButtons class=\"daga-collapsable-buttons daga-collapsed\">\n    @if (enableZoom && canvas.canUserPerformAction(DiagramActions.Zoom)) {\n      <button class=\"daga-center\" (click)=\"center()\">\n        <span class=\"daga-tooltip\">Fit diagram to screen</span>\n      </button>\n    }\n    @if (enableAction) {\n      <button class=\"daga-undo\" (click)=\"undo()\">\n        <span class=\"daga-tooltip\">Undo</span>\n      </button>\n    }\n    @if (enableAction) {\n      <button class=\"daga-redo\" (click)=\"redo()\">\n        <span class=\"daga-tooltip\">Redo</span>\n      </button>\n    }\n    @if (enableSelection) {\n      <button class=\"daga-copy\" (click)=\"copySelection()\">\n        <span class=\"daga-tooltip\">Copy</span>\n      </button>\n    }\n    @if (enableSelection) {\n      <button class=\"daga-cut\" (click)=\"cutSelection()\">\n        <span class=\"daga-tooltip\">Cut</span>\n      </button>\n    }\n    @if (enableSelection) {\n      <button\n        class=\"daga-multiple-selection\"\n        [class]=\"canvas.multipleSelectionOn ? 'daga-on' : 'daga-off'\"\n        (click)=\"startMultipleSelection()\"\n      >\n        <span class=\"daga-tooltip\">Multiple selection</span>\n      </button>\n    }\n    @if (enableSelection) {\n      <button class=\"daga-paste\" (click)=\"pasteSelection()\">\n        <span class=\"daga-tooltip\">Paste</span>\n      </button>\n    }\n    @if (enableSelection) {\n      <button class=\"daga-delete\" (click)=\"deleteSelection()\">\n        <span class=\"daga-tooltip\">Delete</span>\n      </button>\n    }\n    @if (enableLayout) {\n      <button class=\"daga-layout\" (click)=\"layout()\">\n        <span class=\"daga-tooltip\">Apply layout</span>\n      </button>\n    }\n    @if (enableFilter) {\n      <button\n        class=\"daga-filter\"\n        [class]=\"filterOn ? 'daga-on' : 'daga-off'\"\n        (click)=\"filter()\"\n      >\n        <span class=\"daga-tooltip\">Apply filter</span>\n      </button>\n    }\n  </div>\n  <button class=\"daga-more-options\" (click)=\"toggleCollapse()\">\n    @if (!collapsed) {\n      <span class=\"daga-tooltip\">Less options</span>\n    }\n    @if (collapsed) {\n      <span class=\"daga-tooltip\">More options</span>\n    }\n  </button>\n</div>\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  inject,\n  OnDestroy,\n  ViewChild\n} from '@angular/core';\nimport { Canvas, DiagramError, Side } from '@metadev/daga';\nimport * as d3 from 'd3';\nimport { map, merge, Subscription } from 'rxjs';\nimport { CollapseButtonComponent } from '../collapse-button/collapse-button.component';\nimport { CanvasProviderService } from '../services/canvas-provider.service';\n\n/**\n * Displays the errors detected by a diagram's validators.\n * @private\n * @see DiagramValidator\n */\n@Component({\n  selector: 'daga-errors',\n  templateUrl: './errors.component.html',\n  imports: [CollapseButtonComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ErrorsComponent implements AfterViewInit, OnDestroy {\n  #canvasProvider = inject(CanvasProviderService);\n  #cdf = inject(ChangeDetectorRef);\n\n  get canvas(): Canvas {\n    return this.#canvasProvider.getCanvas();\n  }\n\n  @ViewChild('errors') errorsContainer!: ElementRef<HTMLDivElement>;\n\n  errors: DiagramError[] = [];\n\n  #canvasSubscription?: Subscription;\n  #validationSubscription?: Subscription;\n\n  Side = Side;\n\n  ngAfterViewInit(): void {\n    this.#canvasSubscription = this.#canvasProvider.canvas$.subscribe((c) => {\n      this.#updateCanvas(c);\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.#canvasSubscription?.unsubscribe();\n    this.#validationSubscription?.unsubscribe();\n  }\n\n  selectPanel(): d3.Selection<d3.BaseType, unknown, null, unknown> {\n    return d3\n      .select(this.errorsContainer.nativeElement)\n      .select('.daga-error-panel');\n  }\n\n  #updateCanvas(canvas: Canvas) {\n    this.#validationSubscription?.unsubscribe();\n    this.#validationSubscription = merge(\n      canvas.validatorChange$,\n      canvas.diagramChange$\n    )\n      .pipe(map(() => this.validate()))\n      .subscribe();\n  }\n\n  validate() {\n    this.errors = [];\n    for (const validator of this.canvas.validators) {\n      const newErrors = validator.validate(this.canvas.model);\n      this.errors = [...this.errors, ...newErrors];\n    }\n    // need to force detection changes here for some reason...\n    this.#cdf.detectChanges();\n  }\n\n  showError(error: DiagramError): void {\n    if (\n      error.elementId &&\n      (error.propertyNames === undefined || error.propertyNames.length === 0)\n    ) {\n      const element =\n        this.canvas.model.nodes.get(error.elementId) ||\n        this.canvas.model.connections.get(error.elementId);\n      if (element) {\n        this.canvas.userHighlight.add(element);\n      }\n    } else if (\n      error.elementId &&\n      error.propertyNames !== undefined &&\n      error.propertyNames.length > 0\n    ) {\n      this.canvas.userSelection.openInPropertyEditor(\n        this.canvas.model.nodes.get(error.elementId) ||\n          this.canvas.model.connections.get(error.elementId)\n      );\n      const element =\n        this.canvas.model.nodes.get(error.elementId) ||\n        this.canvas.model.connections.get(error.elementId);\n      if (element) {\n        this.canvas.userHighlight.add(element);\n      }\n      this.canvas.parentComponent?.propertyEditor?.highlightProperty(\n        ...error.propertyNames\n      );\n    } else if (\n      !error.elementId &&\n      error.propertyNames !== undefined &&\n      error.propertyNames.length > 0\n    ) {\n      this.canvas.userSelection.openInPropertyEditor();\n      this.canvas.parentComponent?.propertyEditor?.highlightProperty(\n        ...error.propertyNames\n      );\n    }\n  }\n}\n","<div #errorsContainer class=\"daga-errors\">\n  @if (errors.length === 0) {\n    <div class=\"daga-errors-summary daga-no-errors daga-prevent-user-select\">\n      <span>No errors found</span>\n    </div>\n  }\n  @if (errors.length > 0) {\n    <div class=\"daga-errors-summary daga-with-errors daga-prevent-user-select\">\n      <span>{{ errors.length }} errors found</span>\n      <div class=\"daga-collapse-button-container\">\n        <daga-collapse-button\n          [collapsableSelector]=\"errorsContainer\"\n          [collapsableAdditionalSelector]=\"'.daga-error-panel'\"\n          [direction]=\"Side.Top\"\n          [rule]=\"'display'\"\n          [collapsedValue]=\"'none'\"\n          [visibleValue]=\"'block'\"\n        />\n      </div>\n    </div>\n  }\n  @if (errors.length > 0) {\n    <div class=\"daga-error-panel\">\n      <ol>\n        @for (error of errors; track error; let i = $index) {\n          <li (click)=\"showError(error)\" [innerHTML]=\"error.message\"></li>\n        }\n      </ol>\n    </div>\n  }\n</div>\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  ViewChild\n} from '@angular/core';\nimport {\n  AddNodeAction,\n  Canvas,\n  ClosedShape,\n  ConnectionTemplateConfig,\n  Corner,\n  CursorStyle,\n  DIAGRAM_FIELD_DEFAULTS,\n  DiagramActions,\n  DiagramConfig,\n  DiagramConnectionType,\n  DiagramNodeType,\n  DragEvents,\n  Events,\n  filterByOnlyDescendants,\n  generalClosedPath,\n  getLeftMargin,\n  getTopMargin,\n  NodeTemplateConfig,\n  Palette,\n  PaletteSectionConfig,\n  Point,\n  setCursorStyle,\n  Side\n} from '@metadev/daga';\nimport * as d3 from 'd3';\nimport { Subscription } from 'rxjs';\nimport { CollapseButtonComponent } from '../collapse-button/collapse-button.component';\nimport { CanvasProviderService } from '../services/canvas-provider.service';\nimport { DagaConfigurationService } from '../services/daga-configuration.service';\n\n/**\n * Distance in pixels by which labels must be shifted in order to be centered properly.\n */\nconst LABEL_VERTICAL_SHIFT_PX = 6;\n\n/**\n * Palette that the user can drag and drop nodes from.\n * @private\n * @see DiagramConfig\n * @see DiagramNode\n */\n@Component({\n  selector: 'daga-palette',\n  templateUrl: './palette.component.html',\n  imports: [CollapseButtonComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PaletteComponent\n  implements Palette, OnInit, AfterViewInit, OnDestroy\n{\n  #canvasProvider = inject(CanvasProviderService);\n  #configService = inject(DagaConfigurationService);\n\n  get canvas(): Canvas {\n    return this.#canvasProvider.getCanvas();\n  }\n\n  @ViewChild('panel') panel!: ElementRef<HTMLDivElement>;\n\n  @Input()\n  palettes!: PaletteSectionConfig[];\n  @Input()\n  currentPalette!: PaletteSectionConfig;\n  @Input()\n  currentCategory = '';\n  @Input()\n  collapsed!: boolean;\n  @Input()\n  location!: Corner;\n  @Input()\n  direction!: Side;\n  @Input()\n  width!: string;\n  @Input()\n  length!: string;\n  @Input()\n  gap!: string;\n  @Input()\n  justifyContent!: string;\n\n  #priorityThreshold?: number;\n\n  #canvasSubscription?: Subscription;\n\n  ngOnInit(): void {\n    /*\n    reload using the canvas observable instead of the config one\n    because we're getting the type info from the model, not the configuration\n    */\n    this.#canvasSubscription = this.#canvasProvider.canvas$.subscribe(() => {\n      this.init(this.#configService.getConfig());\n    });\n  }\n\n  ngAfterViewInit(): void {\n    this.refreshPalette();\n    switch (this.direction) {\n      case Side.Bottom:\n      case Side.Top:\n        this.selectPanel()\n          .style('width', this.width)\n          .select('.daga-palette-view')\n          .style('width', this.width)\n          .style('height', this.length)\n          .style('flex-direction', 'row')\n          .style('box-sizing', 'border-box')\n          .style('flex-wrap', 'wrap')\n          .style('justify-content', this.justifyContent)\n          .style('gap', this.gap);\n        break;\n      case Side.Left:\n      case Side.Right:\n        this.selectPanel()\n          .style('height', this.width)\n          .select('.daga-palette-view')\n          .style('height', this.width)\n          .style('width', this.length)\n          .style('flex-direction', 'column')\n          .style('box-sizing', 'border-box')\n          .style('flex-wrap', 'wrap')\n          .style('justify-content', this.justifyContent)\n          .style('gap', this.gap);\n        break;\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.#canvasSubscription?.unsubscribe();\n  }\n\n  init(config: DiagramConfig): void {\n    this.collapsed = config.components?.palette?.open === false;\n    this.location = config.components?.palette?.location || Corner.TopLeft;\n    this.direction = config.components?.palette?.direction || Side.Bottom;\n    this.width = config.components?.palette?.width || '12rem';\n    this.length = config.components?.palette?.length || 'min-content';\n    this.gap = config.components?.palette?.gap || '1rem';\n    this.justifyContent = config.components?.palette?.gap || 'center';\n    this.palettes = config.components?.palette?.sections || [];\n    this.currentPalette = this.palettes[0];\n    this.refreshPalette();\n  }\n\n  refreshPalette(): void {\n    this.switchPalette(this.currentPalette);\n  }\n\n  switchPalette(palette: PaletteSectionConfig): void {\n    this.currentPalette = palette;\n\n    if (this.panel !== undefined) {\n      this.selectPalette().selectAll('*').remove();\n      this.#priorityThreshold = this.canvas.getPriorityThreshold();\n\n      if (palette.categories) {\n        this.#appendCategories(palette.categories);\n      }\n      if (palette.templates) {\n        for (const template of palette.templates) {\n          this.#appendTemplate(template);\n        }\n      }\n    }\n  }\n\n  selectPanel(): d3.Selection<HTMLDivElement, unknown, null, undefined> {\n    return d3.select(this.panel.nativeElement);\n  }\n\n  selectPalette(): d3.Selection<HTMLDivElement, unknown, null, undefined> {\n    return this.selectPanel().select('.daga-palette-view');\n  }\n\n  #appendCategories(categories: {\n    [key: string]: (NodeTemplateConfig | ConnectionTemplateConfig)[];\n  }): void {\n    const thisComponent = this.selectPalette()\n      .append('select')\n      .style('width', '100%')\n      .style('height', '2rem')\n      .style('padding', '0.5rem')\n      .style('border-radius', '0.25rem')\n      .style('background-color', '#f7f8fc')\n      .style('border', `1px solid #e6e6e6`);\n    thisComponent.append('option').attr('value', '').text('(None selected)');\n    for (const categoryKey in categories) {\n      thisComponent\n        .append('option')\n        .attr('value', categoryKey)\n        .text(categoryKey);\n    }\n    thisComponent.on(Events.Change, () => {\n      if (this.currentCategory) {\n        this.selectPalette()\n          .selectAll(`.daga-template-container.daga-in-category`)\n          .remove();\n      }\n\n      const selectedKey = thisComponent.property('value');\n      this.currentCategory = selectedKey;\n      const templatesInCategory = categories[selectedKey] || [];\n      for (const template of templatesInCategory) {\n        this.#appendTemplate(template, 'daga-in-category');\n      }\n    });\n    if (this.currentCategory) {\n      // if we had a category already selected, re-select it\n      thisComponent.property('value', this.currentCategory);\n      thisComponent.dispatch(Events.Change);\n    }\n  }\n\n  #appendTemplate(\n    template: NodeTemplateConfig | ConnectionTemplateConfig,\n    classes?: string\n  ): void {\n    if (template.templateType === 'node') {\n      const nodeType = this.canvas.model.nodes.types.get(template.type);\n      if (nodeType) {\n        this.#appendNodeTemplate(nodeType, template, classes);\n      } else {\n        console.error(`Could not find a node type called '${template.type}'`);\n      }\n    } else if (template.templateType === 'connection') {\n      {\n        const connectionType = this.canvas.model.connections.types.get(\n          template.type\n        );\n        if (connectionType) {\n          this.#appendConnectionTemplate(connectionType, template, classes);\n        } else {\n          console.error(\n            `Could not find a connection type called '${template.type}'`\n          );\n        }\n      }\n    }\n  }\n\n  #appendNodeTemplate(\n    type: DiagramNodeType,\n    templateConfig: NodeTemplateConfig,\n    classes?: string\n  ): void {\n    if (\n      this.#priorityThreshold !== undefined &&\n      type.priority < this.#priorityThreshold\n    ) {\n      return;\n    }\n    const borderThickness =\n      type.defaultLook.lookType === 'shaped-look'\n        ? type.defaultLook.borderThickness || 1\n        : 0;\n    const templateHeight = type.defaultHeight + borderThickness;\n    const templateWidth = type.defaultWidth + borderThickness;\n    const stretchedTemplateHeight = templateConfig.height || templateHeight;\n    const stretchedTemplateWidth = templateConfig.width || templateWidth;\n\n    let thisComponentClone!: d3.Selection<Element, unknown, null, undefined>;\n\n    const thisComponent = this.selectPalette()\n      .append('div')\n      .attr(\n        'class',\n        `daga-template-container ${classes !== undefined ? classes : ''}`\n      )\n      .style('width', `${stretchedTemplateWidth}px`)\n      .style('height', `${stretchedTemplateHeight}px`)\n      .on(Events.MouseEnter, () => {\n        setCursorStyle(CursorStyle.Grab);\n      })\n      .on(Events.MouseLeave, () => {\n        setCursorStyle();\n      })\n      .call(\n        d3\n          .drag<HTMLDivElement, unknown, HTMLElement>()\n          .on(\n            DragEvents.Drag,\n            (event: d3.D3DragEvent<Element, unknown, unknown>) => {\n              if (this.canvas.canUserPerformAction(DiagramActions.AddNode)) {\n                const pointerCoords =\n                  this.canvas.getPointerLocationRelativeToRoot(event);\n                if (\n                  pointerCoords.length < 2 ||\n                  isNaN(pointerCoords[0]) ||\n                  isNaN(pointerCoords[1])\n                ) {\n                  return;\n                }\n                thisComponentClone\n                  .style(\n                    'left',\n                    `${pointerCoords[0] - stretchedTemplateWidth / 2}px`\n                  )\n                  .style(\n                    'top',\n                    `${pointerCoords[1] - stretchedTemplateHeight / 2}px`\n                  );\n              }\n            }\n          )\n          .on(\n            DragEvents.Start,\n            (event: d3.D3DragEvent<Element, unknown, unknown>) => {\n              if (this.canvas.canUserPerformAction(DiagramActions.AddNode)) {\n                setCursorStyle(CursorStyle.Grabbing);\n                const pointerCoords =\n                  this.canvas.getPointerLocationRelativeToRoot(event);\n                if (\n                  pointerCoords.length < 2 ||\n                  isNaN(pointerCoords[0]) ||\n                  isNaN(pointerCoords[1])\n                ) {\n                  return;\n                }\n                const thisComponentNodeCloned = thisComponent\n                  .node()\n                  ?.cloneNode(true);\n                (this.canvas.selectRoot().node() as HTMLDivElement).appendChild(\n                  thisComponentNodeCloned as Node\n                );\n                thisComponentClone = d3.select(\n                  thisComponentNodeCloned as Element\n                );\n                thisComponentClone\n                  .style('position', 'absolute')\n                  .style(\n                    'left',\n                    `${pointerCoords[0] - stretchedTemplateWidth / 2}px`\n                  )\n                  .style(\n                    'top',\n                    `${pointerCoords[1] - stretchedTemplateHeight / 2}px`\n                  )\n                  .style('z-index', 1);\n                // when trying to place a unique node in a diagram that already has a node of that type, set cursor style to not allowed\n                if (\n                  type.isUnique &&\n                  this.canvas.model.nodes.find(\n                    (n) => !n.removed && n.type.id === type.id\n                  ) !== undefined\n                ) {\n                  setCursorStyle(CursorStyle.NotAllowed);\n                }\n              }\n            }\n          )\n          .on(\n            DragEvents.End,\n            (event: d3.D3DragEvent<Element, unknown, unknown>) => {\n              if (this.canvas.canUserPerformAction(DiagramActions.AddNode)) {\n                // take node back to its original position\n                setCursorStyle(CursorStyle.Auto);\n                thisComponentClone?.remove();\n                // try to place node\n                if (\n                  type.isUnique &&\n                  this.canvas.model.nodes.find(\n                    (n) => !n.removed && n.type.id === type.id\n                  ) !== undefined\n                ) {\n                  // cannot place; it's unique and that node is already in the model\n                  return;\n                }\n                const pointerCoordsRelativeToScreen =\n                  this.canvas.getPointerLocationRelativeToScreen(event);\n                if (\n                  pointerCoordsRelativeToScreen.length < 2 ||\n                  isNaN(pointerCoordsRelativeToScreen[0]) ||\n                  isNaN(pointerCoordsRelativeToScreen[1])\n                ) {\n                  // cannot place; position is incorrect\n                  return;\n                }\n\n                const element =\n                  event.sourceEvent.target.ownerDocument.elementFromPoint(\n                    pointerCoordsRelativeToScreen[0],\n                    pointerCoordsRelativeToScreen[1]\n                  );\n                if (!this.canvas.selectCanvasView().node()?.contains(element)) {\n                  // cannot place; node hasn't been dropped on the canvas\n                  return;\n                }\n                const pointerCoords =\n                  this.canvas.getPointerLocationRelativeToCanvas(event);\n                if (\n                  pointerCoords.length < 2 ||\n                  isNaN(pointerCoords[0]) ||\n                  isNaN(pointerCoords[1])\n                ) {\n                  // cannot place; position is incorrect\n                  return;\n                }\n                let newNodeCoords: Point = [\n                  pointerCoords[0] - type.defaultWidth / 2,\n                  pointerCoords[1] - type.defaultHeight / 2\n                ];\n                if (this.canvas.gridConfig.snap) {\n                  newNodeCoords = this.canvas.getClosestGridPoint([\n                    newNodeCoords[0] - type.snapToGridOffset[0],\n                    newNodeCoords[1] - type.snapToGridOffset[1]\n                  ]);\n                  newNodeCoords[0] += type.snapToGridOffset[0];\n                  newNodeCoords[1] += type.snapToGridOffset[1];\n                }\n\n                // check whether we dropped this node on a potential parent\n                const nodesAtLocation =\n                  this.canvas.model.nodes.getAtCoordinates(\n                    pointerCoords[0],\n                    pointerCoords[1]\n                  );\n                // filter by which nodes can have this type as a child\n                const nodesAtLocationWhichCanHaveNodeAsAChild =\n                  nodesAtLocation.filter((n) =>\n                    n.type.childrenTypes.includes(type.id)\n                  );\n                // filter by which nodes don't have descendants in this collection\n                const filteredNodesAtLocation = filterByOnlyDescendants(\n                  nodesAtLocationWhichCanHaveNodeAsAChild\n                );\n                const droppedOn =\n                  filteredNodesAtLocation[filteredNodesAtLocation.length - 1];\n\n                if (!type.canBeParentless && droppedOn === undefined) {\n                  // cannot place; node must have a parent and no suitable parent has been found\n                  return;\n                }\n\n                const ancestor = droppedOn?.getLastAncestor();\n\n                const addNodeAction = new AddNodeAction(\n                  this.canvas,\n                  type,\n                  newNodeCoords,\n                  droppedOn?.id,\n                  ancestor?.id,\n                  ancestor?.getGeometry(),\n                  undefined,\n                  templateConfig.label,\n                  templateConfig.values\n                );\n\n                addNodeAction.do();\n                addNodeAction.toAncestorGeometry = ancestor?.getGeometry();\n\n                this.canvas.actionStack.add(addNodeAction);\n                // reset cursor\n                setCursorStyle();\n              }\n            }\n          )\n      )\n      .append('svg')\n      .attr('class', `palette-node ${type.id}`)\n      .attr('viewBox', `0 0 ${templateWidth} ${templateHeight}`)\n      .attr('preserveAspectRatio', 'none')\n      .style('position', 'relative')\n      .style('left', 0)\n      .style('top', 0)\n      .style('width', `${stretchedTemplateWidth}px`)\n      .style('height', `${stretchedTemplateHeight}px`);\n    const nodeLook = templateConfig.look || type.defaultLook;\n\n    switch (nodeLook.lookType) {\n      case 'shaped-look':\n        thisComponent\n          .append('path')\n          .attr(\n            'd',\n            generalClosedPath(\n              nodeLook.shape || ClosedShape.Rectangle,\n              (nodeLook.borderThickness || 1) / 2,\n              (nodeLook.borderThickness || 1) / 2,\n              type.defaultWidth,\n              type.defaultHeight\n            )\n          )\n          .attr('fill', nodeLook.fillColor || '#FFFFFF')\n          .attr('stroke', nodeLook.borderColor || '#000000')\n          .attr('stroke-width', `${nodeLook.borderThickness}px`);\n        break;\n      case 'image-look':\n        thisComponent\n          .append('image')\n          .attr('x', 0)\n          .attr('y', 0)\n          .attr('width', type.defaultWidth)\n          .attr('height', type.defaultHeight)\n          .attr('href', nodeLook.backgroundImage)\n          .attr('preserveAspectRatio', 'none');\n        break;\n      case 'stretchable-image-look':\n        thisComponent\n          .append('image')\n          .attr('x', 0)\n          .attr('y', 0)\n          .attr('width', nodeLook.leftMargin)\n          .attr('height', nodeLook.topMargin)\n          .attr('href', nodeLook.backgroundImageTopLeft)\n          .attr('preserveAspectRatio', 'none');\n        thisComponent\n          .append('image')\n          .attr('x', nodeLook.leftMargin)\n          .attr('y', 0)\n          .attr(\n            'width',\n            type.defaultWidth - nodeLook.rightMargin - nodeLook.leftMargin\n          )\n          .attr('height', nodeLook.topMargin)\n          .attr('href', nodeLook.backgroundImageTop)\n          .attr('preserveAspectRatio', 'none');\n        thisComponent\n          .append('image')\n          .attr('x', type.defaultWidth - nodeLook.rightMargin)\n          .attr('y', 0)\n          .attr('width', nodeLook.rightMargin)\n          .attr('height', nodeLook.topMargin)\n          .attr('href', nodeLook.backgroundImageTopRight)\n          .attr('preserveAspectRatio', 'none');\n        thisComponent\n          .append('image')\n          .attr('x', 0)\n          .attr('y', nodeLook.topMargin)\n          .attr('width', nodeLook.leftMargin)\n          .attr(\n            'height',\n            type.defaultHeight - nodeLook.bottomMargin - nodeLook.topMargin\n          )\n          .attr('href', nodeLook.backgroundImageLeft)\n          .attr('preserveAspectRatio', 'none');\n        thisComponent\n          .append('image')\n          .attr('x', nodeLook.leftMargin)\n          .attr('y', nodeLook.topMargin)\n          .attr(\n            'width',\n            type.defaultWidth - nodeLook.rightMargin - nodeLook.leftMargin\n          )\n          .attr(\n            'height',\n            type.defaultHeight - nodeLook.bottomMargin - nodeLook.topMargin\n          )\n          .attr('href', nodeLook.backgroundImageCenter)\n          .attr('preserveAspectRatio', 'none');\n        thisComponent\n          .append('image')\n          .attr('x', type.defaultWidth - nodeLook.rightMargin)\n          .attr('y', nodeLook.topMargin)\n          .attr('width', nodeLook.rightMargin)\n          .attr(\n            'height',\n            type.defaultHeight - nodeLook.bottomMargin - nodeLook.topMargin\n          )\n          .attr('href', nodeLook.backgroundImageRight)\n          .attr('preserveAspectRatio', 'none');\n        thisComponent\n          .append('image')\n          .attr('x', 0)\n          .attr('y', type.defaultHeight - nodeLook.bottomMargin)\n          .attr('width', nodeLook.leftMargin)\n          .attr('height', nodeLook.bottomMargin)\n          .attr('href', nodeLook.backgroundImageBottomLeft)\n          .attr('preserveAspectRatio', 'none');\n        thisComponent\n          .append('image')\n          .attr('x', nodeLook.leftMargin)\n          .attr('y', type.defaultHeight - nodeLook.bottomMargin)\n          .attr(\n            'width',\n            type.defaultWidth - nodeLook.rightMargin - nodeLook.leftMargin\n          )\n          .attr('height', nodeLook.bottomMargin)\n          .attr('href', nodeLook.backgroundImageBottom)\n          .attr('preserveAspectRatio', 'none');\n        thisComponent\n          .append('image')\n          .attr('x', type.defaultWidth - nodeLook.rightMargin)\n          .attr('y', type.defaultHeight - nodeLook.bottomMargin)\n          .attr('width', nodeLook.rightMargin)\n          .attr('height', nodeLook.bottomMargin)\n          .attr('href', nodeLook.backgroundImageBottomRight)\n          .attr('preserveAspectRatio', 'none');\n    }\n\n    if (templateConfig.look === undefined) {\n      if (type.decorators) {\n        for (const decoratorConfig of type.decorators) {\n          thisComponent\n            .append('foreignObject')\n            .attr('width', `${decoratorConfig.width}px`)\n            .attr('height', `${decoratorConfig.height}px`)\n            .attr(\n              'transform',\n              `translate(${decoratorConfig.coords[0]},${decoratorConfig.coords[1]})`\n            )\n            .html(decoratorConfig.svg);\n        }\n      }\n\n      if (templateConfig.label) {\n        const labelConfiguration = {\n          ...DIAGRAM_FIELD_DEFAULTS,\n          ...type.label,\n          ...templateConfig.labelLook\n        };\n        labelConfiguration.look = {\n          ...DIAGRAM_FIELD_DEFAULTS.look,\n          ...labelConfiguration.look\n        };\n        thisComponent\n          .append('text')\n          .attr(\n            'transform',\n            `translate(${(getLeftMargin(labelConfiguration) + type.defaultWidth + borderThickness / 2) / 2},${(getTopMargin(labelConfiguration) + type.defaultHeight + borderThickness / 2) / 2})`\n          )\n          .attr('x', 0)\n          .attr('y', 0)\n          .attr('font-size', `${labelConfiguration.look.fontSize}px`)\n          .attr('text-anchor', 'middle')\n          .attr(\n            'font-family',\n            labelConfiguration.look.fontFamily ||\n              DIAGRAM_FIELD_DEFAULTS.look.fontFamily\n          )\n          .attr(\n            'font-weight',\n            labelConfiguration.look.fontWeight ||\n              DIAGRAM_FIELD_DEFAULTS.look.fontWeight\n          )\n          .attr(\n            'fill',\n            labelConfiguration.look.fontColor ||\n              DIAGRAM_FIELD_DEFAULTS.look.fontColor\n          )\n          .attr('stroke', 'none')\n          .style('font-kerning', 'none')\n          .style('user-select', 'none')\n          .text(templateConfig.label);\n      }\n    }\n  }\n\n  #appendConnectionTemplate(\n    type: DiagramConnectionType,\n    templateConfig: ConnectionTemplateConfig,\n    classes?: string\n  ): void {\n    const thisDiv = this.selectPalette()\n      .append('div')\n      .attr(\n        'class',\n        `daga-template-container ${classes !== undefined ? classes : ''}`\n      )\n      .style('position', 'relative')\n      .style('width', `${templateConfig.width}px`)\n      .style('height', `${templateConfig.height}px`)\n      .style('cursor', 'pointer');\n    const thisComponent = thisDiv\n      .append('svg')\n      .attr('class', `palette-button ${type.id}`)\n      .style('position', 'relative')\n      .style('left', 0)\n      .style('top', 0)\n      .style('width', '100%')\n      .style('height', '100%')\n      .on('click', () => {\n        this.canvas.connectionType = type;\n      });\n\n    if (this.canvas.connectionType !== type) {\n      // the connection type of this template is not the currently selected one\n      if (templateConfig.icon !== '') {\n        thisComponent\n          .append('image')\n          .attr('x', 0)\n          .attr('y', 0)\n          .attr('width', templateConfig.width)\n          .attr('height', templateConfig.height)\n          .attr('href', templateConfig.icon);\n      }\n    } else {\n      // the connection type of this template is the currently selected one\n      if (templateConfig.selectedIcon !== '') {\n        thisComponent\n          .append('image')\n          .attr('x', 0)\n          .attr('y', 0)\n          .attr('width', templateConfig.width)\n          .attr('height', templateConfig.height)\n          .attr('href', templateConfig.selectedIcon);\n      } else if (templateConfig.icon !== '') {\n        // if there's no selectedIcon, use the regular icon instead\n        thisComponent\n          .append('image')\n          .attr('x', 0)\n          .attr('y', 0)\n          .attr('width', templateConfig.width)\n          .attr('height', templateConfig.height)\n          .attr('href', templateConfig.icon);\n      }\n    }\n\n    if (templateConfig.label !== undefined) {\n      thisDiv\n        .append('span')\n        .attr(\n          'class',\n          `daga-tooltip ${templateConfig.labelLocation || 'bottom'}`\n        )\n        .text(templateConfig.label);\n    }\n  }\n}\n","<div #panel class=\"daga-panel daga-{{ location }} daga-{{ direction }}\">\n  <daga-collapse-button\n    #collapseButton\n    [collapsed]=\"collapsed\"\n    [direction]=\"direction\"\n    [collapsableSelector]=\"panel\"\n    collapsableAdditionalSelector=\".daga-panel-content\"\n    rule=\"display\"\n    collapsedValue=\"none\"\n    visibleValue=\"block\"\n  />\n  <div\n    class=\"daga-panel-content\"\n    [style.display]=\"collapsed ? 'none' : 'block'\"\n  >\n    @if (palettes.length > 1) {\n      <div class=\"daga-panel-tabs\">\n        @for (palette of palettes; track palette) {\n          <div\n            class=\"daga-panel-tab\"\n            [class]=\"palette === currentPalette ? 'daga-current-tab' : ''\"\n            (click)=\"switchPalette(palette)\"\n          >\n            {{ palette.name }}\n          </div>\n        }\n      </div>\n    }\n    <div class=\"daga-palette-view\"></div>\n  </div>\n</div>\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  inject,\n  Input\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n  Canvas,\n  CursorStyle,\n  DragEvents,\n  Point,\n  Property,\n  Type,\n  ValueSet,\n  isObject,\n  setCursorStyle\n} from '@metadev/daga';\nimport * as d3 from 'd3';\nimport { CanvasProviderService } from '../../services/canvas-provider.service';\nimport { getStyleClassName } from '../property-editor.component';\n\n/**\n * Editor of the settings of a property editor, such as what properties are displayed and hidden and in what order.\n * @private\n * @see PropertyEditor\n * @see ValueSet\n */\n@Component({\n  selector: 'daga-property-settings',\n  templateUrl: './property-settings.component.html',\n  imports: [FormsModule],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PropertySettingsComponent implements AfterViewInit {\n  #element = inject(ElementRef);\n  #cdr = inject(ChangeDetectorRef);\n  #canvasProvider = inject(CanvasProviderService);\n\n  get canvas(): Canvas {\n    return this.#canvasProvider.getCanvas();\n  }\n\n  _valueSet?: ValueSet;\n  @Input()\n  get valueSet(): ValueSet | undefined {\n    return this._valueSet;\n  }\n  set valueSet(valueSet: ValueSet | undefined) {\n    if (this._valueSet !== valueSet) {\n      this._valueSet = valueSet;\n      // force value change detection\n      this.#cdr.detectChanges();\n    }\n  }\n  /** How many property-settings elements are parents of this property-settings element. @private */\n  @Input() depth = 0;\n\n  // Attributes for the template\n  Type = Type;\n  getStyleClassName = getStyleClassName;\n  asString = asString;\n\n  ngAfterViewInit(): void {\n    this.#addListeners();\n  }\n\n  #addListeners() {\n    for (const property of this.valueSet?.displayedProperties || []) {\n      let propertyElementWidth = 0;\n      let propertyElementHeight = 0;\n      let closestDropbarIndex = 0;\n      const propertyElement = d3\n        .select(this.#element.nativeElement)\n        .select<HTMLDivElement>(\n          `.daga-property.${getStyleClassName(property.name)}.daga-depth-${this.depth}`\n        );\n      propertyElement.select<HTMLButtonElement>('button.daga-move-button').call(\n        d3\n          .drag<HTMLButtonElement, unknown, HTMLElement>()\n          .on(\n            DragEvents.Start,\n            (event: d3.D3DragEvent<Element, unknown, unknown>) => {\n              setCursorStyle(CursorStyle.Grabbing);\n              const pointerCoords =\n                this.canvas.getPointerLocationRelativeToScreen(event);\n              if (\n                pointerCoords.length < 2 ||\n                isNaN(pointerCoords[0]) ||\n                isNaN(pointerCoords[1])\n              ) {\n                return;\n              }\n              const boundingRect = propertyElement\n                .node()\n                ?.getBoundingClientRect();\n              propertyElementWidth = boundingRect?.width || 0;\n              propertyElementHeight = boundingRect?.height || 0;\n              propertyElement\n                .style('position', 'fixed')\n                .style(\n                  'left',\n                  `${pointerCoords[0] - propertyElementWidth / 2}px`\n                )\n                .style(\n                  'top',\n                  `${pointerCoords[1] - propertyElementHeight / 2}px`\n                )\n                .style('width', `${propertyElementWidth}px`)\n                .style('height', `${propertyElementHeight}px`)\n                .style('z-index', 1);\n            }\n          )\n          .on(\n            DragEvents.Drag,\n            (event: d3.D3DragEvent<Element, unknown, unknown>) => {\n              setCursorStyle(CursorStyle.Grabbing);\n              const pointerCoords =\n                this.canvas.getPointerLocationRelativeToScreen(event);\n              if (\n                pointerCoords.length < 2 ||\n                isNaN(pointerCoords[0]) ||\n                isNaN(pointerCoords[1])\n              ) {\n                return;\n              }\n              propertyElement\n                .style('position', 'fixed')\n                .style(\n                  'left',\n                  `${pointerCoords[0] - propertyElementWidth / 2}px`\n                )\n                .style(\n                  'top',\n                  `${pointerCoords[1] - propertyElementHeight / 2}px`\n                )\n                .style('width', `${propertyElementWidth}px`)\n                .style('height', `${propertyElementHeight}px`)\n                .style('z-index', 1);\n              d3.select(this.#element.nativeElement)\n                .select(\n                  `.daga-dropbar.daga-index-${closestDropbarIndex}.daga-depth-${this.depth}`\n                )\n                .style('visibility', 'hidden')\n                .style('height', 0);\n              closestDropbarIndex = this.getClosestDropbarIndex(pointerCoords);\n              d3.select(this.#element.nativeElement)\n                .select(\n                  `.daga-dropbar.daga-index-${closestDropbarIndex}.daga-depth-${this.depth}`\n                )\n                .style('visibility', 'visible')\n                .style('height', '0.25rem');\n            }\n          )\n          .on(\n            DragEvents.End,\n            (event: d3.D3DragEvent<Element, unknown, unknown>) => {\n              setCursorStyle(CursorStyle.Auto);\n              propertyElement\n                .style('position', 'relative')\n                .style('left', 0)\n                .style('top', 0)\n                .style('z-index', 0)\n                .style('width', 'unset')\n                .style('height', 'unset');\n              d3.select(this.#element.nativeElement)\n                .select(\n                  `.daga-dropbar.daga-index-${closestDropbarIndex}.daga-depth-${this.depth}`\n                )\n                .style('visibility', 'hidden')\n                .style('height', 0);\n              const pointerCoords =\n                this.canvas.getPointerLocationRelativeToScreen(event);\n              if (\n                pointerCoords.length < 2 ||\n                isNaN(pointerCoords[0]) ||\n                isNaN(pointerCoords[1])\n              ) {\n                return;\n              }\n              closestDropbarIndex = this.getClosestDropbarIndex(pointerCoords);\n              this.valueSet?.displayedProperties?.splice(\n                this.valueSet.displayedProperties.indexOf(property),\n                1\n              );\n              this.valueSet?.displayedProperties?.splice(\n                closestDropbarIndex,\n                0,\n                property\n              );\n              this.#cdr.detectChanges();\n            }\n          )\n      );\n    }\n  }\n\n  getClosestDropbarIndex(pointerCoords: Point): number {\n    const propertyList = this.valueSet?.propertySet.propertyList || [];\n    // note that this is <= and not < as we are counting the index after the last element as well\n    const coordsList: Point[] = [];\n    for (let i = 0; i <= propertyList.length; ++i) {\n      const boundingRect = d3\n        .select(this.#element.nativeElement)\n        .select<HTMLDivElement>(\n          `.daga-dropbar.daga-index-${i}.daga-depth-${this.depth}`\n        )\n        .node()\n        ?.getBoundingClientRect();\n      if (boundingRect) {\n        coordsList.push([\n          boundingRect.x + boundingRect.width / 2,\n          boundingRect.y + boundingRect.height / 2\n        ]);\n      }\n    }\n    if (coordsList.length > 0) {\n      // euclidean distance\n      const distanceToDropbars = coordsList.map(\n        (p) =>\n          ((pointerCoords[0] - p[0]) ** 2 + (pointerCoords[1] - p[1]) ** 2) **\n          0.5\n      );\n      const indexOfClosestDropbar = distanceToDropbars.indexOf(\n        Math.min(...distanceToDropbars)\n      );\n      return indexOfClosestDropbar;\n    }\n    return 0;\n  }\n\n  displayProperty(property: Property | Event | string | undefined) {\n    if (this.valueSet === undefined) {\n      return;\n    }\n    let selectedProperty: Property | undefined;\n    if (property instanceof Property) {\n      selectedProperty = property;\n    } else if (property instanceof Event) {\n      selectedProperty = this.valueSet?.propertySet.getProperty(\n        (property.target as unknown as { value: string })?.value || ''\n      );\n    } else {\n      selectedProperty = this.valueSet?.propertySet.getProperty(property || '');\n    }\n    if (selectedProperty) {\n      this.valueSet.displayProperty(selectedProperty);\n    }\n    this.#cdr.detectChanges();\n    this.#addListeners();\n  }\n\n  hideProperty(property: Property | Event | string | undefined) {\n    if (this.valueSet === undefined) {\n      return;\n    }\n    let selectedProperty: Property | undefined;\n    if (property instanceof Property) {\n      selectedProperty = property;\n    } else if (property instanceof Event) {\n      selectedProperty = this.valueSet?.propertySet.getProperty(\n        (property.target as unknown as { value: string })?.value || ''\n      );\n    } else {\n      selectedProperty = this.valueSet?.propertySet.getProperty(property || '');\n    }\n    if (selectedProperty) {\n      this.valueSet.hideProperty(selectedProperty);\n    }\n    this.#cdr.detectChanges();\n    this.#addListeners();\n  }\n}\n\nexport const asString = (value: unknown): string => {\n  if (Array.isArray(value)) {\n    return value.join(', ');\n  }\n  if (isObject(value)) {\n    return Object.entries(value as object)\n      .map((pair) => pair.map((p) => JSON.stringify(p)).join(': '))\n      .join(', ');\n  }\n  if (value instanceof Date) {\n    return value.toLocaleString();\n  }\n  if (value === undefined || value === null) {\n    return '';\n  }\n  return '' + value;\n};\n","<div\n  class=\"daga-dropbar\"\n  [class]=\"'daga-index-' + 0 + ' daga-depth-' + depth\"\n></div>\n@for (\n  property of valueSet?.displayedProperties || [];\n  track property;\n  let i = $index\n) {\n  <div\n    class=\"daga-property-and-dropbar\"\n    [class]=\"getStyleClassName(property.name) + ' daga-depth-' + depth\"\n  >\n    <div\n      class=\"daga-property\"\n      [class]=\"getStyleClassName(property.name) + ' daga-depth-' + depth\"\n    >\n      <div class=\"daga-property-name\">\n        <span>{{ property.label || property.name }}</span>\n        <div class=\"daga-buttons\">\n          <button class=\"daga-property-button daga-move-button\">\n            <div class=\"daga-icon daga-move-icon\"></div>\n          </button>\n          <button\n            class=\"daga-property-button daga-hide-button\"\n            (click)=\"hideProperty(property.name)\"\n          >\n            <div class=\"daga-icon daga-hide-icon\"></div>\n          </button>\n        </div>\n      </div>\n      @if (property.type !== Type.Object) {\n        <div class=\"daga-property-value\">\n          {{ asString($safeNavigationMigration(valueSet?.getValue(property.name))) }}\n        </div>\n      }\n      @if (property.type === Type.Object) {\n        <div>\n          <daga-property-settings\n            [valueSet]=\"$safeNavigationMigration(valueSet?.getSubValueSet(property.name))\"\n            [depth]=\"depth + 1\"\n          ></daga-property-settings>\n        </div>\n      }\n    </div>\n    <div\n      class=\"daga-dropbar\"\n      [class]=\"'daga-index-' + (i + 1) + ' daga-depth-' + depth\"\n    ></div>\n  </div>\n}\n@if (valueSet && valueSet.hiddenProperties.length > 0) {\n  <div class=\"daga-property\">\n    <p class=\"daga-property-name\">Add property:</p>\n    <select (change)=\"displayProperty($event)\">\n      <option value=\"\">Select a property</option>\n      @for (property of valueSet.hiddenProperties || []; track property) {\n        <option [value]=\"property.name\">\n          {{ property.label || property.name }}\n        </option>\n      }\n    </select>\n  </div>\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  EventEmitter,\n  Input,\n  Output,\n  ViewChild\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Keys, Option, equals } from '@metadev/daga';\nimport { asString } from '../property-settings/property-settings.component';\n\nexport const LOST_FOCUS_TIME_WINDOW_MS = 200;\n\n/**\n * Combobox with autocomplete.\n * @private\n * @see PropertyEditor\n * @see ValueSet\n */\n@Component({\n  selector: 'daga-autocomplete',\n  templateUrl: './autocomplete.component.html',\n  imports: [FormsModule],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AutocompleteComponent {\n  @ViewChild('main', { static: true }) mainElement!: ElementRef;\n\n  #value: unknown;\n  @Input()\n  set value(value: unknown) {\n    if (equals(value, this.#value)) {\n      return;\n    }\n    this.#value = value;\n    this.valueInput = this.getLabelOfValue(value);\n  }\n  get value(): unknown {\n    return this.#value;\n  }\n  @Input() valueInput = '';\n  focusIndex?: number;\n  @Input() options!: Option<unknown>[];\n  currentOptions!: Option<unknown>[];\n  currentLabelStarts!: string[];\n  currentLabelMatches!: string[];\n  currentLabelEnds!: string[];\n\n  @Input() disabled = false;\n  showOptions = false;\n\n  @Output() valueChange = new EventEmitter<unknown>();\n\n  getLabelOfValue(value: unknown): string {\n    for (const option of this.options) {\n      if (equals(option.key, value)) {\n        return option.label;\n      }\n    }\n    return asString(value);\n  }\n\n  onKeyUp(event: KeyboardEvent): void {\n    if (!this.disabled) {\n      switch (event.key) {\n        case Keys.PageDown:\n          if (this.focusIndex === undefined) {\n            this.focusOnOption(0);\n            this.scrollToOption(0);\n          } else {\n            this.focusOnOption(this.focusIndex + 5);\n            this.scrollToOption(this.focusIndex);\n          }\n          event.preventDefault();\n          break;\n        case Keys.ArrowDown:\n          if (this.focusIndex === undefined) {\n            this.focusOnOption(0);\n            this.scrollToOption(0);\n          } else {\n            this.focusOnOption(this.focusIndex + 1);\n            this.scrollToOption(this.focusIndex);\n          }\n          event.preventDefault();\n          break;\n        case Keys.PageUp:\n          if (this.focusIndex === undefined) {\n            this.focusOnOption(this.options.length - 1);\n            this.scrollToOption(this.options.length - 1);\n          } else {\n            this.focusOnOption(this.focusIndex - 5);\n            this.scrollToOption(this.focusIndex);\n          }\n          event.preventDefault();\n          break;\n        case Keys.ArrowUp:\n          if (this.focusIndex === undefined) {\n            this.focusOnOption(this.options.length - 1);\n            this.scrollToOption(this.options.length - 1);\n          } else {\n            this.focusOnOption(this.focusIndex - 1);\n            this.scrollToOption(this.focusIndex);\n          }\n          event.preventDefault();\n          break;\n        case Keys.Escape:\n          this.closeOptions();\n          event.preventDefault();\n          break;\n        case Keys.Enter:\n          this.complete(this.options[this.focusIndex || 0]);\n          event.preventDefault();\n          break;\n        default:\n          this.openOptions();\n      }\n    }\n  }\n\n  openOptions(): void {\n    if (!this.disabled) {\n      const mustContain = normalizeString(this.valueInput.trim());\n      this.currentOptions = [];\n      this.currentLabelStarts = [];\n      this.currentLabelMatches = [];\n      this.currentLabelEnds = [];\n      for (const option of this.options) {\n        const normalizedLabel = normalizeString(option.label);\n        const position = normalizedLabel.indexOf(mustContain);\n        if (position >= 0) {\n          const labelStart = option.label.substring(0, position);\n          const labelMatch = option.label.substring(\n            position,\n            position + mustContain.length\n          );\n          const labelEnd = option.label.substring(\n            position + mustContain.length\n          );\n          this.currentOptions.push(option);\n          this.currentLabelStarts.push(labelStart);\n          this.currentLabelMatches.push(labelMatch);\n          this.currentLabelEnds.push(labelEnd);\n        }\n      }\n      this.showOptions = true;\n    }\n  }\n\n  closeOptions(): void {\n    this.showOptions = false;\n  }\n\n  focusOnOption(index: number | undefined) {\n    if (!this.disabled) {\n      this.focusIndex = index;\n      if (index === undefined) {\n        return;\n      }\n      if (index < 0) {\n        this.focusIndex = 0;\n      }\n      if (index >= this.options.length) {\n        this.focusIndex = this.options.length - 1;\n      }\n    }\n  }\n\n  onLostFocus(): void {\n    setTimeout(() => {\n      this.closeOptions();\n    }, LOST_FOCUS_TIME_WINDOW_MS);\n  }\n\n  scrollToOption(index: number) {\n    const target = this.mainElement.nativeElement.querySelectorAll('li')[index];\n    if (target) {\n      target.scrollIntoView({ block: 'center' });\n    }\n  }\n\n  clearInput(): void {\n    if (!this.disabled) {\n      this.value = undefined;\n      this.valueInput = '';\n      this.showOptions = false;\n      this.focusIndex = undefined;\n    }\n  }\n\n  complete(option: Option<unknown>): void {\n    if (!this.disabled) {\n      this.value = option;\n      this.valueInput = option.label;\n      this.showOptions = false;\n      this.focusIndex = undefined;\n      this.valueChange.emit(option.key);\n    }\n  }\n}\n\nconst normalizeString = (a: string): string =>\n  (a || '')\n    .toLowerCase()\n    .normalize('NFD')\n    .replace(/[\\u0300-\\u036f]/g, '');\n","<div\n  #main\n  class=\"daga-autocomplete\"\n  [class]=\"showOptions ? 'daga-showing-options' : ''\"\n  (blur)=\"closeOptions()\"\n>\n  <div class=\"daga-autocomplete-input\">\n    <input\n      [(ngModel)]=\"valueInput\"\n      [disabled]=\"disabled\"\n      (keyup)=\"onKeyUp($event)\"\n      (focus)=\"openOptions()\"\n      (blur)=\"onLostFocus()\"\n    />\n    @if (valueInput !== '') {\n      <button class=\"daga-clear\" (click)=\"clearInput()\"></button>\n    }\n  </div>\n  <div class=\"daga-autocomplete-options\">\n    <ul class=\"daga-autocomplete-option-list\">\n      @if (currentOptions !== undefined ? currentOptions.length === 0 : true) {\n        <li class=\"daga-autocomplete-option no-options\">(No options)</li>\n      }\n      @for (option of currentOptions; track option; let index = $index) {\n        <li\n          class=\"daga-autocomplete-option\"\n          [class]=\"index === focusIndex ? 'daga-focused' : ''\"\n          (mousemove)=\"focusOnOption(index)\"\n          (click)=\"complete(option)\"\n        >\n          <span>{{ currentLabelStarts[index] }}</span>\n          <span class=\"daga-match\">{{ currentLabelMatches[index] }}</span>\n          <span>{{ currentLabelEnds[index] }}</span>\n        </li>\n      }\n    </ul>\n  </div>\n</div>\n","import {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  inject,\n  Input,\n  Output\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Option } from '@metadev/daga';\nimport { AutocompleteComponent } from '../autocomplete/autocomplete.component';\n\n/**\n * Editor of a property of text list type within a property editor.\n * @private\n * @see Type.TextList\n * @see PropertyEditor\n * @see ValueSet\n */\n@Component({\n  selector: 'daga-option-list-editor',\n  templateUrl: './option-list-editor.component.html',\n  imports: [AutocompleteComponent, FormsModule],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class OptionListEditorComponent {\n  #cdr = inject(ChangeDetectorRef);\n\n  #value: unknown[] = [];\n  @Input()\n  set value(value: unknown[]) {\n    if (value === this.#value) {\n      return;\n    }\n    const initialAndEmpty = value.length === 0 && this.#value.length === 0;\n    this.#value = value;\n    this.labelsOfValue = [];\n    for (const key of this.#value) {\n      this.labelsOfValue.push(this.getLabelOfValue(key));\n    }\n    if (initialAndEmpty) {\n      this.valueChange.emit(this.#value);\n    }\n    this.updateOptionsNotPresentInValue();\n  }\n  get value(): unknown[] {\n    return this.#value;\n  }\n  labelsOfValue: string[] = [];\n\n  @Input() options: Option<unknown>[] = [];\n\n  @Input() valueInput?: unknown = undefined;\n\n  @Input() allowRepeats = true;\n\n  @Input() optionsNotPresentInValue: Option<unknown>[] = [];\n\n  @Input() disabled = false;\n\n  @Output() valueChange = new EventEmitter<unknown[]>();\n\n  getLabelOfValue(value: unknown): string {\n    for (const option of this.options) {\n      if (option.key === value) {\n        return option.label;\n      }\n    }\n    return `${value}`;\n  }\n\n  hasValue(value: unknown): boolean {\n    for (const item of this.#value || []) {\n      if (item === value) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  removeFromValue(index: number): void {\n    if (this.#value.length > index) {\n      this.#value.splice(index, 1);\n      this.labelsOfValue.splice(index, 1);\n      this.valueChange.emit(this.#value);\n      this.updateOptionsNotPresentInValue();\n      this.#cdr.detectChanges();\n    }\n  }\n\n  addToValue(): void {\n    if (\n      this.valueInput !== undefined &&\n      (this.allowRepeats ? true : !this.hasValue(this.valueInput))\n    ) {\n      this.#value.push(this.valueInput);\n      this.labelsOfValue.push(this.getLabelOfValue(this.valueInput));\n      this.valueChange.emit(this.#value);\n      this.clearInput();\n      this.updateOptionsNotPresentInValue();\n      this.#cdr.detectChanges();\n    }\n  }\n\n  clearInput(): void {\n    this.valueInput = '';\n  }\n\n  updateOptionsNotPresentInValue(): void {\n    if (!this.allowRepeats) {\n      const optionsNotPresentInValue = [];\n      for (const option of this.options) {\n        if (!this.hasValue(option.key)) {\n          optionsNotPresentInValue.push(option);\n        }\n      }\n      this.optionsNotPresentInValue = optionsNotPresentInValue;\n    }\n  }\n\n  onKeyUp(event: KeyboardEvent) {\n    if (event.key === 'Enter') {\n      this.addToValue();\n    }\n  }\n}\n","@for (item of value; track item; let index = $index) {\n  <div class=\"daga-value-item-element\">\n    <span class=\"daga-input\">{{ labelsOfValue[index] }}</span>\n    @if (!disabled) {\n      <button class=\"daga-property-button\" (click)=\"removeFromValue(index)\">\n        <div class=\"daga-icon daga-close-icon\"></div>\n      </button>\n    }\n  </div>\n}\n@if (!disabled) {\n  <div class=\"daga-value-item-input\">\n    <div class=\"daga-input daga-relatively-positioned\">\n      <daga-autocomplete\n        [disabled]=\"disabled\"\n        [options]=\"\n          allowRepeats ? options || [] : optionsNotPresentInValue || []\n        \"\n        [(value)]=\"valueInput\"\n      />\n    </div>\n    <button class=\"daga-property-button\" (click)=\"addToValue()\">\n      <div class=\"daga-icon daga-add-icon\"></div>\n    </button>\n  </div>\n}\n","import {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  inject,\n  Input,\n  Output\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\n/**\n * Editor of a property of text list type within a property editor.\n * @private\n * @see Type.TextList\n * @see PropertyEditor\n * @see ValueSet\n */\n@Component({\n  selector: 'daga-text-list-editor',\n  templateUrl: './text-list-editor.component.html',\n  imports: [FormsModule],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TextListEditorComponent {\n  #cdr = inject(ChangeDetectorRef);\n\n  #value: string[] = [];\n  @Input()\n  set value(value: string[]) {\n    if (value === this.#value) {\n      return;\n    }\n    const initialAndEmpty = value.length === 0 && this.#value.length === 0;\n    this.#value = value;\n    if (initialAndEmpty) {\n      this.valueChange.emit(this.#value);\n    }\n  }\n  get value(): string[] {\n    return this.#value;\n  }\n  @Input() valueInput = '';\n\n  @Input() allowRepeats = true;\n\n  @Input() disabled = false;\n\n  @Output() valueChange = new EventEmitter<string[]>();\n\n  getValueFromEvent(event: Event): string {\n    return (event.target as HTMLInputElement).value;\n  }\n\n  hasValue(value: string): boolean {\n    for (const item of this.#value || []) {\n      if (item === value) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  removeFromValue(index: number): void {\n    if (this.#value.length > index) {\n      this.#value.splice(index, 1);\n      this.valueChange.emit(this.#value);\n      this.#cdr.detectChanges();\n    }\n  }\n\n  editFromValue(item: string, index: number): void {\n    item = item.trim();\n    if (this.#value.length > index && item !== '') {\n      this.#value.splice(index, 1, item);\n      this.valueChange.emit(this.#value);\n      this.#cdr.detectChanges();\n    }\n  }\n\n  addToValue(): void {\n    const valueInput = this.valueInput.trim();\n    if (\n      valueInput !== '' &&\n      (this.allowRepeats ? true : !this.hasValue(valueInput))\n    ) {\n      this.#value.push(valueInput);\n      this.valueChange.emit(this.#value);\n      this.clearInput();\n      this.#cdr.detectChanges();\n    }\n  }\n\n  clearInput(): void {\n    this.valueInput = '';\n  }\n\n  onKeyUp(event: KeyboardEvent) {\n    if (event.key === 'Enter') {\n      this.addToValue();\n    }\n  }\n}\n","@for (item of value; track item; let index = $index) {\n  <div class=\"daga-value-item-element\">\n    <input\n      class=\"daga-input\"\n      type=\"text\"\n      [disabled]=\"disabled\"\n      [value]=\"item\"\n      (focusout)=\"editFromValue(getValueFromEvent($event), index)\"\n    />\n    @if (!disabled) {\n      <button class=\"daga-property-button\" (click)=\"removeFromValue(index)\">\n        <div class=\"daga-icon daga-close-icon\"></div>\n      </button>\n    }\n  </div>\n}\n@if (!disabled) {\n  <div class=\"daga-value-item-input\">\n    <div class=\"daga-input daga-relatively-positioned\">\n      <input type=\"text\" (keyup)=\"onKeyUp($event)\" [(ngModel)]=\"valueInput\" />\n      @if (valueInput !== '') {\n        <button class=\"daga-clear\" (click)=\"clearInput()\"></button>\n      }\n    </div>\n    <button class=\"daga-property-button\" (click)=\"addToValue()\">\n      <div class=\"daga-icon daga-add-icon\"></div>\n    </button>\n  </div>\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  inject,\n  Input,\n  Output\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\n/**\n * Editor of a property of text map type within a property editor.\n * @private\n * @see Type.TextMap\n * @see PropertyEditor\n * @see ValueSet\n */\n@Component({\n  selector: 'daga-text-map-editor',\n  templateUrl: './text-map-editor.component.html',\n  imports: [CommonModule, FormsModule],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TextMapEditorComponent {\n  #cdr = inject(ChangeDetectorRef);\n\n  #value: { [name: string]: string } = {};\n\n  @Input()\n  set value(value: { [name: string]: string }) {\n    if (value === this.#value) {\n      return;\n    }\n    const initialAndEmpty =\n      Object.keys(value).length === 0 && Object.keys(this.#value).length === 0;\n    this.#value = value;\n    if (initialAndEmpty) {\n      this.valueChange.emit(this.#value);\n    }\n  }\n  get value(): { [name: string]: string } {\n    return this.#value;\n  }\n  @Input() keyInput = '';\n  @Input() valueInput = '';\n\n  @Input() disabled = false;\n\n  @Output() valueChange = new EventEmitter<{ [name: string]: string }>();\n\n  getValueFromEvent(event: Event): string {\n    return (event.target as HTMLInputElement).value;\n  }\n\n  removeFromValue(key: string): void {\n    delete this.#value[key];\n    this.#cdr.detectChanges();\n  }\n\n  editKey(oldKey: string, newKey: string): void {\n    newKey = newKey.trim();\n    if (oldKey !== newKey && newKey !== '') {\n      this.#value[newKey] = this.#value[oldKey];\n      delete this.#value[oldKey];\n      this.#cdr.detectChanges();\n    }\n  }\n\n  editValue(key: string, value: string): void {\n    value = value.trim();\n    if (value !== '') {\n      this.#value[key] = value;\n      this.#cdr.detectChanges();\n    }\n  }\n\n  addToValue(): void {\n    const keyInput = this.keyInput.trim();\n    const valueInput = this.valueInput.trim();\n    if (keyInput !== '' && valueInput !== '') {\n      this.#value[keyInput] = valueInput;\n      this.valueChange.emit(this.#value);\n      this.clearKeyInput();\n      this.clearValueInput();\n      this.#cdr.detectChanges();\n    }\n  }\n\n  clearKeyInput(): void {\n    this.keyInput = '';\n  }\n\n  clearValueInput(): void {\n    this.valueInput = '';\n  }\n\n  onKeyUp(event: KeyboardEvent) {\n    if (event.key === 'Enter') {\n      this.addToValue();\n    }\n  }\n}\n","@for (item of value | keyvalue; track item) {\n  <div class=\"daga-value-item-element\">\n    <input\n      class=\"daga-input\"\n      type=\"text\"\n      [disabled]=\"disabled\"\n      [value]=\"item.key\"\n      (focusout)=\"editKey(item.key, getValueFromEvent($event))\"\n    />\n    <input\n      class=\"daga-input\"\n      type=\"text\"\n      [disabled]=\"disabled\"\n      [value]=\"item.value\"\n      (focusout)=\"editValue(item.key, getValueFromEvent($event))\"\n    />\n    @if (!disabled) {\n      <button class=\"daga-property-button\" (click)=\"removeFromValue(item.key)\">\n        <div class=\"daga-icon daga-close-icon\"></div>\n      </button>\n    }\n  </div>\n}\n@if (!disabled) {\n  <div class=\"daga-value-item-input\">\n    <div class=\"daga-input daga-relatively-positioned\">\n      <input type=\"text\" (keyup)=\"onKeyUp($event)\" [(ngModel)]=\"keyInput\" />\n      @if (keyInput !== '') {\n        <button class=\"daga-clear\" (click)=\"clearKeyInput()\"></button>\n      }\n    </div>\n    <div class=\"daga-input daga-relatively-positioned\">\n      <input type=\"text\" (keyup)=\"onKeyUp($event)\" [(ngModel)]=\"valueInput\" />\n      @if (valueInput !== '') {\n        <button class=\"daga-clear\" (click)=\"clearValueInput()\"></button>\n      }\n    </div>\n    <button class=\"daga-property-button\" (click)=\"addToValue()\">\n      <div class=\"daga-icon daga-add-icon\"></div>\n    </button>\n  </div>\n}\n","import {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  inject,\n  Input\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n  Canvas,\n  DiagramActions,\n  Property,\n  Type,\n  ValueSet,\n  equals\n} from '@metadev/daga';\nimport { CanvasProviderService } from '../../services/canvas-provider.service';\nimport { AutocompleteComponent } from '../autocomplete/autocomplete.component';\nimport { OptionListEditorComponent } from '../option-list-editor/option-list-editor.component';\nimport { getStyleClassName } from '../property-editor.component';\nimport { TextListEditorComponent } from '../text-list-editor/text-list-editor.component';\nimport { TextMapEditorComponent } from '../text-map-editor/text-map-editor.component';\n\n/**\n * Editor of a value set within a property editor.\n * @private\n * @see PropertyEditor\n * @see ValueSet\n */\n@Component({\n  selector: 'daga-object-editor',\n  templateUrl: './object-editor.component.html',\n  imports: [\n    AutocompleteComponent,\n    FormsModule,\n    OptionListEditorComponent,\n    TextListEditorComponent,\n    TextMapEditorComponent\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ObjectEditorComponent {\n  #cdr = inject(ChangeDetectorRef);\n  #canvasProvider = inject(CanvasProviderService);\n\n  get canvas(): Canvas {\n    return this.#canvasProvider.getCanvas();\n  }\n  get userCanEdit(): boolean {\n    return (\n      this.canvas.canUserPerformAction(DiagramActions.UpdateValues) &&\n      this.valueSet?.rootElement?.['removed'] !== true\n    );\n  }\n\n  _valueSet?: ValueSet;\n  @Input()\n  get valueSet(): ValueSet | undefined {\n    return this._valueSet;\n  }\n  set valueSet(valueSet: ValueSet | undefined) {\n    if (this._valueSet !== valueSet) {\n      this._valueSet = valueSet;\n      // force value change detection\n      this.#cdr.detectChanges();\n    }\n  }\n  /** How many object-editor elements are parents of this object-editor element. @private */\n  @Input() depth = 0;\n\n  // Attributes for the template\n  Type = Type;\n  getStyleClassName = getStyleClassName;\n\n  setValue(property: Property, value: unknown) {\n    if (this.valueSet === undefined) {\n      return;\n    }\n    if (property.editable !== false) {\n      if (!equals(this.valueSet.getValue(property.name), value)) {\n        this.valueSet.setValue(property.name, value);\n        this.canvas.propertyEditorChanges$?.next();\n      }\n    }\n  }\n\n  dateToLocalDatetimeString(\n    date: string | number | Date | null | undefined\n  ): string {\n    if (typeof date === 'string') {\n      return date;\n    }\n    if (date === null || date === undefined || isNaN(date.valueOf())) {\n      return '';\n    }\n    const offsetDate = new Date(date);\n    const timezoneOffset = offsetDate.getTimezoneOffset();\n    offsetDate.setMinutes(offsetDate.getMinutes() - timezoneOffset);\n    return offsetDate.toISOString().substring(0, 19); // for user friendliness, we trim off the milliseconds\n  }\n\n  localDatetimeStringToDate(string: string): Date {\n    // with no timezone specified, the local time is assumed\n    return new Date(string);\n  }\n}\n","@for (property of valueSet?.displayedProperties || []; track property) {\n  <div\n    class=\"daga-property\"\n    [class]=\"getStyleClassName(property.name) + ' daga-depth-' + depth\"\n  >\n    <p class=\"daga-property-name\">\n      {{ property.label || property.name }}\n    </p>\n    @if (property.type === Type.Text) {\n      <input\n        type=\"daga-text\"\n        [disabled]=\"property.editable === false || !userCanEdit\"\n        [ngModel]=\"$safeNavigationMigration(valueSet?.getValue(property.name))\"\n        (ngModelChange)=\"setValue(property, $event)\"\n      />\n    }\n    @if (property.type === Type.TextArea) {\n      <textarea\n        [disabled]=\"property.editable === false || !userCanEdit\"\n        [ngModel]=\"$safeNavigationMigration(valueSet?.getValue(property.name))\"\n        (ngModelChange)=\"setValue(property, $event)\"\n      ></textarea>\n    }\n    @if (property.type === Type.Number) {\n      <input\n        type=\"number\"\n        [disabled]=\"property.editable === false || !userCanEdit\"\n        [ngModel]=\"$safeNavigationMigration(valueSet?.getValue(property.name))\"\n        (ngModelChange)=\"setValue(property, $event)\"\n      />\n    }\n    @if (property.type === Type.Color) {\n      <input\n        type=\"text\"\n        pattern=\"#[0-9a-fA-F]{6}\"\n        [disabled]=\"property.editable === false || !userCanEdit\"\n        [ngModel]=\"$safeNavigationMigration(valueSet?.getValue(property.name))\"\n        (ngModelChange)=\"setValue(property, $event)\"\n      />\n    }\n    @if (property.type === Type.Datetime) {\n      <input\n        type=\"datetime-local\"\n        [disabled]=\"property.editable === false || !userCanEdit\"\n        [ngModel]=\"dateToLocalDatetimeString($safeNavigationMigration(valueSet?.getValue(property.name)))\"\n        (ngModelChange)=\"setValue(property, localDatetimeStringToDate($event))\"\n      />\n    }\n    @if (property.type === Type.Date) {\n      <input\n        type=\"date\"\n        [disabled]=\"property.editable === false || !userCanEdit\"\n        [ngModel]=\"$safeNavigationMigration(valueSet?.getValue(property.name))\"\n        (ngModelChange)=\"setValue(property, $event)\"\n      />\n    }\n    @if (property.type === Type.Time) {\n      <input\n        type=\"time\"\n        [disabled]=\"property.editable === false || !userCanEdit\"\n        [ngModel]=\"$safeNavigationMigration(valueSet?.getValue(property.name))\"\n        (ngModelChange)=\"setValue(property, $event)\"\n      />\n    }\n    @if (property.type === Type.Url) {\n      <input\n        type=\"url\"\n        [disabled]=\"property.editable === false || !userCanEdit\"\n        [ngModel]=\"$safeNavigationMigration(valueSet?.getValue(property.name))\"\n        (ngModelChange)=\"setValue(property, $event)\"\n      />\n    }\n    @if (property.type === Type.Boolean) {\n      <div class=\"daga-radio\">\n        <label\n          class=\"daga-radio-item daga-radio-start\"\n          [class]=\"\n            valueSet?.getValue(property.name) === false ? 'daga-checked' : ''\n          \"\n        >\n          <input\n            type=\"radio\"\n            [disabled]=\"property.editable === false || !userCanEdit\"\n            [name]=\"property.name\"\n            value=\"false\"\n            (change)=\"setValue(property, false)\"\n          />\n          No\n        </label>\n        <label\n          class=\"daga-radio-item daga-radio-end\"\n          [class]=\"\n            valueSet?.getValue(property.name) === true ? 'daga-checked' : ''\n          \"\n        >\n          <input\n            type=\"radio\"\n            [disabled]=\"property.editable === false || !userCanEdit\"\n            [name]=\"property.name\"\n            value=\"true\"\n            (change)=\"setValue(property, true)\"\n          />\n          Yes\n        </label>\n      </div>\n    }\n    @if (property.type === Type.Option) {\n      <div class=\"daga-relatively-positioned\">\n        <daga-autocomplete\n          [disabled]=\"property.editable === false || !userCanEdit\"\n          [options]=\"property.options || []\"\n          [value]=\"$safeNavigationMigration(valueSet?.getValue(property.name))\"\n          (valueChange)=\"setValue(property, $event)\"\n        />\n      </div>\n    }\n    @if (\n      property.type === Type.OptionList || property.type === Type.OptionSet\n    ) {\n      <daga-option-list-editor\n        [disabled]=\"property.editable === false || !userCanEdit\"\n        [allowRepeats]=\"property.type === Type.OptionList\"\n        [options]=\"property.options || []\"\n        [value]=\"$safeNavigationMigration(valueSet?.getValue(property.name))\"\n        (valueChange)=\"setValue(property, $event)\"\n      ></daga-option-list-editor>\n    }\n    @if (property.type === Type.TextList || property.type === Type.TextSet) {\n      <daga-text-list-editor\n        [disabled]=\"property.editable === false || !userCanEdit\"\n        [allowRepeats]=\"property.type === Type.TextList\"\n        [value]=\"$safeNavigationMigration(valueSet?.getValue(property.name))\"\n        (valueChange)=\"setValue(property, $event)\"\n      ></daga-text-list-editor>\n    }\n    @if (property.type === Type.TextMap) {\n      <daga-text-map-editor\n        [disabled]=\"property.editable === false || !userCanEdit\"\n        [value]=\"$safeNavigationMigration(valueSet?.getValue(property.name))\"\n        (valueChange)=\"setValue(property, $event)\"\n      ></daga-text-map-editor>\n    }\n    @if (property.type === Type.Object) {\n      <div class=\"daga-left-bar\">\n        <daga-object-editor\n          [valueSet]=\"$safeNavigationMigration(valueSet?.getSubValueSet(property.name))\"\n          [depth]=\"depth + 1\"\n        ></daga-object-editor>\n      </div>\n    }\n  </div>\n}\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  ViewChild\n} from '@angular/core';\nimport {\n  Corner,\n  DiagramConfig,\n  PropertyEditor,\n  Side,\n  ValueSet\n} from '@metadev/daga';\nimport * as d3 from 'd3';\nimport { Subscription } from 'rxjs';\nimport { CollapseButtonComponent } from '../collapse-button/collapse-button.component';\nimport { DagaConfigurationService } from '../services/daga-configuration.service';\nimport { ObjectEditorComponent } from './object-editor/object-editor.component';\nimport { PropertySettingsComponent } from './property-settings/property-settings.component';\n\n/**\n * Duration of the highlight property animation in milliseconds.\n */\nconst HIGHLIGHT_ANIMATION_DURATION_MS = 1000;\n\n/**\n * Editor of the values of a value set.\n * @private\n * @see ValueSet\n */\n@Component({\n  selector: 'daga-property-editor',\n  templateUrl: './property-editor.component.html',\n  imports: [\n    CollapseButtonComponent,\n    ObjectEditorComponent,\n    PropertySettingsComponent\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PropertyEditorComponent\n  implements PropertyEditor, OnInit, AfterViewInit, OnDestroy\n{\n  #cdr = inject(ChangeDetectorRef);\n  #configService = inject(DagaConfigurationService);\n\n  @ViewChild('panel') panel!: ElementRef<HTMLDivElement>;\n\n  @Input()\n  collapsed!: boolean;\n  @Input()\n  location!: Corner;\n  @Input()\n  direction!: Side;\n  @Input()\n  width!: string;\n  @Input()\n  length!: string;\n\n  title?: string;\n  _valueSet: ValueSet | undefined;\n  @Input()\n  get valueSet(): ValueSet | undefined {\n    return this._valueSet;\n  }\n  set valueSet(valueSet: ValueSet | undefined) {\n    if (this._valueSet !== valueSet) {\n      this._valueSet = valueSet;\n      this.settings = undefined;\n      // force value change detection\n      this.#cdr.detectChanges();\n    }\n  }\n\n  settings?: boolean;\n\n  #configSubscription?: Subscription;\n\n  ngOnInit(): void {\n    this.#configSubscription = this.#configService.config$.subscribe((c) => {\n      this.init(c);\n    });\n  }\n\n  ngAfterViewInit(): void {\n    this.setPanelWidth();\n  }\n\n  ngOnDestroy(): void {\n    this.#configSubscription?.unsubscribe();\n  }\n\n  init(config: DiagramConfig): void {\n    this.collapsed = config.components?.propertyEditor?.open === false;\n    this.location =\n      config.components?.propertyEditor?.location || Corner.TopRight;\n    this.direction =\n      config.components?.propertyEditor?.direction || Side.Bottom;\n    this.width = config.components?.propertyEditor?.width || '24rem';\n    this.length = config.components?.propertyEditor?.length || 'min-content';\n    this.title = undefined;\n    this.valueSet = undefined;\n    this.setPanelWidth();\n  }\n\n  setPanelWidth(): void {\n    if (this.panel !== undefined) {\n      switch (this.direction) {\n        case Side.Bottom:\n        case Side.Top:\n          this.selectPanel()\n            .style('width', this.width)\n            .select('.daga-panel-content')\n            .style('height', this.length);\n          break;\n        case Side.Left:\n        case Side.Right:\n          this.selectPanel()\n            .style('height', this.width)\n            .select('.daga-panel-content')\n            .style('width', this.length);\n          break;\n      }\n    }\n  }\n\n  selectPanel(): d3.Selection<HTMLDivElement, unknown, null, undefined> {\n    return d3.select(this.panel.nativeElement);\n  }\n\n  highlightProperty(...propertyNames: string[]): void {\n    let selector = '';\n    let depth = 0;\n    for (const propertyName of propertyNames) {\n      selector += ` .daga-property.${getStyleClassName(propertyName)}.daga-depth-${depth}`;\n      ++depth;\n    }\n    if (this.valueSet) {\n      d3.select(this.panel.nativeElement)\n        .select(selector)\n        .transition()\n        .duration(HIGHLIGHT_ANIMATION_DURATION_MS)\n        .ease(d3.easeLinear)\n        .styleTween('background-color', () => {\n          const interpolator = d3.interpolate(\n            'rgba(255, 0, 0, 0)',\n            'rgba(255, 0, 0, 0.4)'\n          );\n          return (t: number) => interpolator(t > 0.5 ? 1 - t : t);\n        });\n    }\n  }\n}\n\nexport const getStyleClassName = (s: string): string => {\n  return 'daga-property-name-' + s.replace(/\\s/g, '');\n};\n","<div\n  #panel\n  class=\"daga-panel daga-bottom daga-{{ location }} daga-{{ direction }}\"\n>\n  <daga-collapse-button\n    #collapse\n    [disabled]=\"\n      !valueSet ||\n      !valueSet.propertySet ||\n      !valueSet.propertySet.hasProperties()\n    \"\n    [direction]=\"direction\"\n    [collapsableSelector]=\"panel\"\n    collapsableAdditionalSelector=\".daga-panel-content\"\n    rule=\"display\"\n    collapsedValue=\"none\"\n    visibleValue=\"block\"\n  />\n  <div\n    class=\"daga-panel-content\"\n    [style.display]=\"collapsed ? 'none' : 'block'\"\n  >\n    @if (\n      valueSet &&\n      valueSet.propertySet &&\n      valueSet.propertySet.hasProperties() &&\n      !collapse.collapsed\n    ) {\n      @if (title) {\n        <p class=\"daga-title\">\n          {{ title }}\n          <button class=\"daga-property-button\" (click)=\"settings = !settings\">\n            <div\n              class=\"daga-icon daga-settings-icon\"\n              [class]=\"\n                settings === undefined\n                  ? ''\n                  : settings\n                    ? 'daga-unrotate'\n                    : 'daga-rotate'\n              \"\n            ></div>\n          </button>\n        </p>\n      }\n      @if (!settings) {\n        <daga-object-editor [valueSet]=\"valueSet\" />\n      }\n      @if (settings) {\n        <daga-property-settings [valueSet]=\"valueSet\" />\n      }\n    }\n  </div>\n</div>\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n  ViewChild\n} from '@angular/core';\nimport {\n  Canvas,\n  Corner,\n  DagaExporter,\n  DagaImporter,\n  DagaModel,\n  DiagramConfig,\n  DiagramEditor,\n  DiagramEvent,\n  Side\n} from '@metadev/daga';\nimport { Observable, skip, Subscription } from 'rxjs';\nimport { DiagramButtonsComponent } from '../diagram-buttons/diagram-buttons.component';\nimport { ErrorsComponent } from '../errors/errors.component';\nimport { PaletteComponent } from '../palette/palette.component';\nimport { PropertyEditorComponent } from '../property-editor/property-editor.component';\nimport { CanvasProviderService } from '../services/canvas-provider.service';\nimport { DagaConfigurationService } from '../services/daga-configuration.service';\n\n/**\n * The context of a diagram. Every separate diagram must be contained within its own {@link DiagramComponent} and every {@link DiagramComponent} must contain its own {@link DiagramEditorComponent}.\n * This component defines a {@link DagaConfigurationService} and a {@link CanvasProviderService}, which is shared by all the components within and allows accessing the configuration and the canvas of this component's diagram, respectively.\n * @public\n */\n@Component({\n  standalone: true,\n  selector: 'daga-diagram',\n  templateUrl: './diagram.component.html',\n  providers: [CanvasProviderService, DagaConfigurationService],\n  imports: [\n    DiagramButtonsComponent,\n    PaletteComponent,\n    PropertyEditorComponent,\n    ErrorsComponent\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DiagramComponent\n  implements DiagramEditor, OnInit, AfterViewInit, OnDestroy\n{\n  #configurationService = inject(DagaConfigurationService);\n  #canvasProvider = inject(CanvasProviderService);\n  #cdr = inject(ChangeDetectorRef);\n\n  @ViewChild('appendTo') appendTo!: ElementRef<HTMLDivElement>;\n  @ViewChild('diagramButtons') diagramButtons!: DiagramButtonsComponent;\n  @ViewChild('palette') palette!: PaletteComponent;\n  @ViewChild('propertyEditor') propertyEditor!: PropertyEditorComponent;\n\n  #importer = new DagaImporter();\n  #exporter = new DagaExporter();\n  #model!: DagaModel;\n\n  /**\n   * Getter for the configuration of this diagram.\n   * @public\n   */\n  get config(): DiagramConfig {\n    return this.#configurationService.getConfig();\n  }\n  /**\n   * Setter for the configuration for the diagram.\n   * @public\n   */\n  @Input()\n  set config(config: DiagramConfig) {\n    if (this.#configurationService.getConfig() !== config) {\n      this.#configurationService.init(config);\n    }\n  }\n  /**\n   * Subject used to track when the diagram configuration has been updated.\n   * @public\n   */\n  get config$(): Observable<DiagramConfig> {\n    return this.#configurationService.config$;\n  }\n  /**\n   * Getter for the canvas of this diagram.\n   * @public\n   */\n  get canvas(): Canvas {\n    return this.#canvasProvider.getCanvas();\n  }\n  /**\n   * Subject used to track when the canvas has been updated.\n   * @public\n   */\n  get canvas$(): Observable<Canvas> {\n    return this.#canvasProvider.canvas$;\n  }\n  /**\n   * Subject used to track when the view has been initialized after updating the canvas.\n   * @public\n   */\n  get viewInitialized$(): Observable<Canvas> {\n    return this.#canvasProvider.viewInitialized$;\n  }\n  /**\n   * Serialized model for the diagram. Used for data binding to the model.\n   * @public\n   */\n  get model(): DagaModel {\n    return this.#model;\n  }\n  /**\n   * Serialized model for the diagram. Used for data binding to the model.\n   * @public\n   */\n  @Input()\n  set model(model: DagaModel) {\n    if (this.#model !== model) {\n      this.#model = model;\n      const canvas = this.canvas;\n      if (canvas) {\n        this.#importer.import(canvas.model, model);\n      }\n    }\n  }\n  /**\n   * Output for changes to the diagram's model.\n   * @public\n   */\n  @Output()\n  modelChange = new EventEmitter<DagaModel>();\n  /**\n   * Output for user events on the diagram.\n   * @public\n   */\n  @Output()\n  diagramEvent = new EventEmitter<DiagramEvent>();\n\n  #configSubscription?: Subscription;\n  #canvasSubscription?: Subscription;\n\n  Corner = Corner;\n  Side = Side;\n\n  ngOnInit(): void {\n    this.#canvasProvider.initCanvas(this, this.config);\n\n    this.#setUpCanvas(this.canvas);\n  }\n\n  ngAfterViewInit(): void {\n    // wait for setTimeout(0) to force browser to finish calculating the size of parent before initializing the view\n    setTimeout(() => {\n      this.#canvasProvider.initCanvasView(this.appendTo.nativeElement);\n\n      // initial import of the model\n      if (this.model) {\n        this.#importer.import(this.canvas.model, this.model);\n      }\n\n      this.#canvasSubscription = this.#canvasProvider.canvas$\n        // we skip the first one as the subscribe() underneath is\n        // for when the canvas is reloaded, not initially loaded\n        .pipe(skip(1))\n        .subscribe((c) => {\n          // reset model of the old canvas\n          this.model = this.#exporter.export(c.model);\n          this.#setUpCanvas(c);\n        });\n      this.#configSubscription = this.#configurationService.config$\n        // we skip the first one as the subscribe() underneath is\n        // for when the config is reloaded, not initially loaded\n        .pipe(skip(1))\n        .subscribe((c) => {\n          this.#canvasProvider.initCanvas(this, c);\n          this.#canvasProvider.initCanvasView(this.appendTo.nativeElement);\n          this.#cdr.detectChanges();\n        });\n    }, 0);\n  }\n\n  ngOnDestroy(): void {\n    this.#configSubscription?.unsubscribe();\n    this.#canvasSubscription?.unsubscribe();\n  }\n\n  #setUpCanvas(canvas: Canvas): void {\n    canvas.diagramEvent$.subscribe((e) => {\n      this.diagramEvent.emit(e);\n    });\n    canvas.diagramChange$.subscribe(() => {\n      const exportedModel = this.#exporter.export(this.canvas.model);\n      this.#model = exportedModel;\n      this.modelChange.emit(exportedModel);\n    });\n    if (this.model) {\n      this.#importer.import(canvas.model, this.model);\n    }\n  }\n}\n","<div class=\"daga-append-to\" #appendTo></div>\n@if (\n  $safeNavigationMigration(config.components?.buttons) !== undefined &&\n  config.components?.buttons?.enabled !== false\n) {\n  <daga-diagram-buttons #diagramButtons />\n}\n@if (\n  $safeNavigationMigration(config.components?.palette) !== undefined &&\n  config.components?.palette?.enabled !== false &&\n  config.components?.palette?.sections &&\n  (config.components?.palette?.sections?.length || 0) > 0\n) {\n  <daga-palette #palette />\n}\n@if (\n  $safeNavigationMigration(config.components?.propertyEditor) !== undefined &&\n  config.components?.propertyEditor?.enabled !== false\n) {\n  <daga-property-editor #propertyEditor />\n}\n@if (\n  $safeNavigationMigration(config.components?.errors) !== undefined &&\n  config.components?.errors?.enabled !== false\n) {\n  <daga-errors />\n}\n<ng-content />\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { CollapseButtonComponent } from './collapse-button/collapse-button.component';\nimport { DiagramButtonsComponent } from './diagram-buttons/diagram-buttons.component';\nimport { DiagramComponent } from './diagram/diagram.component';\nimport { ErrorsComponent } from './errors/errors.component';\nimport { PaletteComponent } from './palette/palette.component';\nimport { ObjectEditorComponent } from './property-editor/object-editor/object-editor.component';\nimport { PropertyEditorComponent } from './property-editor/property-editor.component';\nimport { TextListEditorComponent } from './property-editor/text-list-editor/text-list-editor.component';\nimport { TextMapEditorComponent } from './property-editor/text-map-editor/text-map-editor.component';\nimport { CanvasProviderService } from './services/canvas-provider.service';\nimport { DagaConfigurationService } from './services/daga-configuration.service';\n\n@NgModule({\n  declarations: [],\n  imports: [\n    CollapseButtonComponent,\n    DiagramButtonsComponent,\n    DiagramComponent,\n    ErrorsComponent,\n    ObjectEditorComponent,\n    PaletteComponent,\n    TextListEditorComponent,\n    TextMapEditorComponent,\n    PropertyEditorComponent,\n    CommonModule,\n    FormsModule\n  ],\n  exports: [DiagramComponent],\n  providers: [DagaConfigurationService, CanvasProviderService]\n})\nexport class DagaModule {}\n"],"mappings":"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"}