Загрузка данных


protected getHoveredItem(x: number, y: number): PrimitiveHoveredItem | null {
  if (this.hidden || this.mode === 'idle' || this.mode === 'drawing') {
    return null;
  }

  const point = { x, y };

  if (this.getPointTarget(point)) {
    return {
      cursorStyle: 'move',
      externalId: 'trend-line',
      zOrder: 'top',
    };
  }

  if (!this.isPointNearLine(point)) {
    return null;
  }

  return {
    cursorStyle: 'grab',
    externalId: 'trend-line',
    zOrder: 'top',
  };
}



protected handlePointerDown = (event: PointerEvent): void => {
  if (this.hidden || event.button !== 0) {
    return;
  }

  const point = this.getEventPoint(event);

  if (this.mode === 'idle') {
    event.preventDefault();
    event.stopPropagation();

    this.startDrawing(point);
    return;
  }

  if (this.mode === 'drawing') {
    event.preventDefault();
    event.stopPropagation();

    this.updateDrawing(point);
    this.finishDrawing();
    return;
  }

  if (this.mode !== 'ready') {
    return;
  }

  const pointTarget = this.getPointTarget(point);
  const isNearLine = this.isPointNearLine(point);
  const isDrawingHit = pointTarget !== null || isNearLine;

  if (!this.isActive.value) {
    if (!isDrawingHit) {
      return;
    }

    event.preventDefault();
    event.stopPropagation();

    this.isActive.next(true);
    this.render();
    return;
  }

  if (pointTarget === 'start') {
    event.preventDefault();
    event.stopPropagation();

    this.startDragging('dragging-start', point, event.pointerId);
    return;
  }

  if (pointTarget === 'end') {
    event.preventDefault();
    event.stopPropagation();

    this.startDragging('dragging-end', point, event.pointerId);
    return;
  }

  if (isNearLine) {
    event.preventDefault();
    event.stopPropagation();

    this.startDragging('dragging-body', point, event.pointerId);
    return;
  }

  this.isActive.next(false);
  this.render();
};