{"version":3,"file":"ng-whiteboard.mjs","sources":["../../../projects/ng-whiteboard/src/lib/core/types/actions.ts","../../../projects/ng-whiteboard/src/lib/core/types/config.ts","../../../projects/ng-whiteboard/src/lib/core/types/connections.ts","../../../projects/ng-whiteboard/src/lib/core/types/elements.ts","../../../projects/ng-whiteboard/src/lib/core/types/events.ts","../../../projects/ng-whiteboard/src/lib/core/types/types.ts","../../../projects/ng-whiteboard/src/lib/core/types/pen-presets.ts","../../../projects/ng-whiteboard/src/lib/core/types/styles.ts","../../../projects/ng-whiteboard/src/lib/core/types/tools.ts","../../../projects/ng-whiteboard/src/lib/core/types/tool-icons.ts","../../../projects/ng-whiteboard/src/lib/core/types/layers.ts","../../../projects/ng-whiteboard/src/lib/core/types/cursors.ts","../../../projects/ng-whiteboard/src/lib/core/event-bus/event-bus.service.ts","../../../projects/ng-whiteboard/src/lib/core/config/config.service.ts","../../../projects/ng-whiteboard/src/lib/core/canvas/canvas.service.ts","../../../projects/ng-whiteboard/src/lib/core/history/history.service.ts","../../../projects/ng-whiteboard/src/lib/core/utils/common/file.ts","../../../projects/ng-whiteboard/src/lib/core/utils/common/id.ts","../../../projects/ng-whiteboard/src/lib/core/constants/index.ts","../../../projects/ng-whiteboard/src/lib/core/utils/geometry/geometry.ts","../../../projects/ng-whiteboard/src/lib/core/utils/drawing/hit-test.ts","../../../projects/ng-whiteboard/src/lib/core/utils/drawing/vector.ts","../../../projects/ng-whiteboard/src/lib/core/elements/arrow-element.ts","../../../projects/ng-whiteboard/src/lib/core/elements/ellipse-element.ts","../../../projects/ng-whiteboard/src/lib/core/elements/image-element.ts","../../../projects/ng-whiteboard/src/lib/core/elements/line-element.ts","../../../projects/ng-whiteboard/src/lib/core/utils/geometry/bounds.ts","../../../projects/ng-whiteboard/src/lib/core/elements/pen-element.ts","../../../projects/ng-whiteboard/src/lib/core/elements/rectangle-element.ts","../../../projects/ng-whiteboard/src/lib/core/elements/text-element.ts","../../../projects/ng-whiteboard/src/lib/core/elements/element.utils.ts","../../../projects/ng-whiteboard/src/lib/core/utils/dom/element.ts","../../../projects/ng-whiteboard/src/lib/core/utils/dom/target.ts","../../../projects/ng-whiteboard/src/lib/core/utils/geometry/coordinate.ts","../../../projects/ng-whiteboard/src/lib/core/utils/geometry/transform-utils.ts","../../../projects/ng-whiteboard/src/lib/core/utils/index.ts","../../../projects/ng-whiteboard/src/lib/core/elements/layer-management.service.ts","../../../projects/ng-whiteboard/src/lib/core/elements/elements.service.ts","../../../projects/ng-whiteboard/src/lib/core/viewport/pan.service.ts","../../../projects/ng-whiteboard/src/lib/core/input/clipboard.service.ts","../../../projects/ng-whiteboard/src/lib/core/elements/connection-points.service.ts","../../../projects/ng-whiteboard/src/lib/core/elements/arrow-binding.service.ts","../../../projects/ng-whiteboard/src/lib/core/elements/connection-ui.service.ts","../../../projects/ng-whiteboard/src/lib/core/elements/handle.service.ts","../../../projects/ng-whiteboard/src/lib/core/tools/base-tool.ts","../../../projects/ng-whiteboard/src/lib/core/tools/arrow-tool.ts","../../../projects/ng-whiteboard/src/lib/core/tools/ellipse-tool.ts","../../../projects/ng-whiteboard/src/lib/core/tools/eraser-tool.ts","../../../projects/ng-whiteboard/src/lib/core/tools/hand-tool.ts","../../../projects/ng-whiteboard/src/lib/core/tools/image-tool.ts","../../../projects/ng-whiteboard/src/lib/core/tools/line-tool.ts","../../../projects/ng-whiteboard/src/lib/core/tools/pen-tool.ts","../../../projects/ng-whiteboard/src/lib/core/tools/rectangle-tool.ts","../../../projects/ng-whiteboard/src/lib/core/tools/select-tool.ts","../../../projects/ng-whiteboard/src/lib/core/tools/text-tool.ts","../../../projects/ng-whiteboard/src/lib/core/tools/zoom-area-tool.ts","../../../projects/ng-whiteboard/src/lib/core/tools/tool-factory.service.ts","../../../projects/ng-whiteboard/src/lib/core/tools/tools.service.ts","../../../projects/ng-whiteboard/src/lib/core/elements/selection.service.ts","../../../projects/ng-whiteboard/src/lib/core/viewport/zoom.service.ts","../../../projects/ng-whiteboard/src/lib/core/input/drag-drop.service.ts","../../../projects/ng-whiteboard/src/lib/core/utils/svg/svg.ts","../../../projects/ng-whiteboard/src/lib/core/input/io.service.ts","../../../projects/ng-whiteboard/src/lib/core/input/keyboard-shortcut.service.ts","../../../projects/ng-whiteboard/src/lib/core/api/api.service.ts","../../../projects/ng-whiteboard/src/lib/core/canvas/instance.service.ts","../../../projects/ng-whiteboard/src/lib/ng-whiteboard.service.ts","../../../projects/ng-whiteboard/src/lib/core/directives/context-menu.directive.ts","../../../projects/ng-whiteboard/src/lib/core/directives/resize-handler.directive.ts","../../../projects/ng-whiteboard/src/lib/core/components/context-menu/context-menu.service.ts","../../../projects/ng-whiteboard/src/lib/core/components/context-menu/context-menu.component.ts","../../../projects/ng-whiteboard/src/lib/core/viewport/wheel-handler.service.ts","../../../projects/ng-whiteboard/src/lib/core/svg/svg.service.ts","../../../projects/ng-whiteboard/src/lib/core/directives/global-keyboard.directive.ts","../../../projects/ng-whiteboard/src/lib/core/directives/index.ts","../../../projects/ng-whiteboard/src/lib/core/svg/svg.directive.ts","../../../projects/ng-whiteboard/src/lib/core/pipes/grip-cursor.pipe.ts","../../../projects/ng-whiteboard/src/lib/core/pipes/element-opacity.pipe.ts","../../../projects/ng-whiteboard/src/lib/core/utils/drawing/stroke-points.ts","../../../projects/ng-whiteboard/src/lib/core/utils/drawing/path.ts","../../../projects/ng-whiteboard/src/lib/core/pipes/points-to-path.pipe.ts","../../../projects/ng-whiteboard/src/lib/core/pipes/arrowhead.pipe.ts","../../../projects/ng-whiteboard/src/lib/core/components/canvas/whiteboard-canvas.component.ts","../../../projects/ng-whiteboard/src/lib/core/components/canvas/whiteboard-canvas.component.html","../../../projects/ng-whiteboard/src/lib/ng-whiteboard.component.ts","../../../projects/ng-whiteboard/src/index.ts","../../../projects/ng-whiteboard/src/ng-whiteboard.ts"],"sourcesContent":["import { FormatType, AddImage, WhiteboardElement, ToolType, WhiteboardConfig } from '.';\n\nexport enum ActionType {\n  Save = 'save',\n  Undo = 'undo',\n  Redo = 'redo',\n  Clear = 'clear',\n  AddImage = 'addImage',\n  ToggleGrid = 'toggleGrid',\n  AddElement = 'addElement',\n  UpdateElement = 'updateElement',\n  RemoveElements = 'removeElements',\n  RemoveSelectedElements = 'removeSelectedElements',\n  SelectElements = 'selectElements',\n  ToggleSelection = 'toggleSelection',\n  DeselectElement = 'deselectElement',\n  SelectAll = 'selectAll',\n  ClearSelection = 'clearSelection',\n  UpdateSelectedElements = 'updateSelectedElements',\n  SetActiveTool = 'setActiveTool',\n  SetCanvasDimensions = 'setCanvasDimensions',\n  SetCanvasPosition = 'setCanvasPosition',\n  UpdateGridTranslation = 'updateGridTranslation',\n  UpdateElementsTranslation = 'updateElementsTranslation',\n  FullScreen = 'fullScreen',\n  CenterCanvas = 'centerCanvas',\n  ZoomIn = 'zoomIn',\n  ZoomOut = 'zoomOut',\n  Zoom = 'zoom',\n  ZoomToFit = 'zoomToFit',\n  ZoomToSelection = 'zoomToSelection',\n  ResetZoom = 'resetZoom',\n  SetBackgroundColor = 'setBackgroundColor',\n  UpdateConfig = 'updateConfig',\n  Batch = 'batch',\n  // Layer Management Actions\n  AddLayer = 'addLayer',\n  RemoveLayer = 'removeLayer',\n  RenameLayer = 'renameLayer',\n  SetActiveLayer = 'setActiveLayer',\n  ToggleLayerVisibility = 'toggleLayerVisibility',\n  ToggleLayerLock = 'toggleLayerLock',\n  SetLayerOpacity = 'setLayerOpacity',\n  SetLayerBlendMode = 'setLayerBlendMode',\n  MoveLayerUp = 'moveLayerUp',\n  MoveLayerDown = 'moveLayerDown',\n}\n\nexport type WhiteboardAction =\n  | { type: ActionType.Save; payload: { format: FormatType; name: string } }\n  | { type: ActionType.Undo }\n  | { type: ActionType.Redo }\n  | { type: ActionType.Clear }\n  | { type: ActionType.AddImage; payload: AddImage }\n  | { type: ActionType.ToggleGrid }\n  | { type: ActionType.AddElement; payload: { element: WhiteboardElement } }\n  | { type: ActionType.UpdateElement; payload: { element: WhiteboardElement } }\n  | { type: ActionType.RemoveElements; payload: { ids: string[] } }\n  | { type: ActionType.RemoveSelectedElements }\n  | {\n      type: ActionType.SelectElements;\n      payload: { elementsOrIds: WhiteboardElement | WhiteboardElement[] | string | string[] };\n    }\n  | { type: ActionType.ToggleSelection; payload: { elementOrId: WhiteboardElement | string } }\n  | { type: ActionType.DeselectElement; payload: { elementOrId: WhiteboardElement | string } }\n  | { type: ActionType.SelectAll }\n  | { type: ActionType.ClearSelection }\n  | { type: ActionType.UpdateSelectedElements; payload: { partialElement: Partial<WhiteboardElement> } }\n  | { type: ActionType.SetActiveTool; payload: { tool: ToolType } }\n  | { type: ActionType.SetCanvasDimensions; payload: { width: number; height: number } }\n  | { type: ActionType.SetCanvasPosition; payload: { x: number; y: number } }\n  | { type: ActionType.UpdateGridTranslation; payload: { dx: number; dy: number } }\n  | { type: ActionType.UpdateElementsTranslation; payload: { dx: number; dy: number } }\n  | { type: ActionType.FullScreen }\n  | { type: ActionType.CenterCanvas }\n  | { type: ActionType.ZoomIn }\n  | { type: ActionType.ZoomOut }\n  | { type: ActionType.Zoom; payload: { zoom: number } }\n  | { type: ActionType.ZoomToFit }\n  | { type: ActionType.ZoomToSelection }\n  | { type: ActionType.ResetZoom }\n  | { type: ActionType.SetBackgroundColor; payload: { color: string } }\n  | { type: ActionType.UpdateConfig; payload: { config: Partial<WhiteboardConfig> } }\n  | { type: ActionType.Batch; payload: WhiteboardAction[] }\n  // Layer Management Actions\n  | { type: ActionType.AddLayer; payload: { name?: string } }\n  | { type: ActionType.RemoveLayer; payload: { id: string } }\n  | { type: ActionType.RenameLayer; payload: { id: string; name: string } }\n  | { type: ActionType.SetActiveLayer; payload: { id: string } }\n  | { type: ActionType.ToggleLayerVisibility; payload: { id: string } }\n  | { type: ActionType.ToggleLayerLock; payload: { id: string } }\n  | { type: ActionType.SetLayerOpacity; payload: { id: string; opacity: number } }\n  | { type: ActionType.SetLayerBlendMode; payload: { id: string; blendMode: string } }\n  | { type: ActionType.MoveLayerUp; payload: { id: string } }\n  | { type: ActionType.MoveLayerDown; payload: { id: string } };\n\nexport type Priority = 'high' | 'normal' | 'low';\n","import { ElementType, LineCap, LineJoin, PenType } from '.';\n\n/**\n * Controls what happens after a tool finishes drawing an element:\n * - `true` (for a tool): the new element is selected and the Select tool becomes active.\n * - `false`: nothing is selected and the current drawing tool stays active (draw several in a row).\n * - object: per-element-type overrides (e.g. `{ pen: false, rectangle: true }`).\n * - omitted: falls back to each element's own `selectAfterDraw` default.\n */\nexport type SelectAfterDrawConfig = boolean | Partial<Record<ElementType, boolean>>;\n\n/**\n * Describes the type of arrowhead.\n * Mirrors ArrowheadType for config usage.\n */\nexport type ArrowHeadStyle =\n  | 'none'\n  | 'arrow'\n  | 'open-arrow'\n  | 'diamond'\n  | 'open-diamond'\n  | 'circle'\n  | 'open-circle'\n  | 'bar';\n\n/**\n * Describes the default path style for new arrows.\n */\nexport type ArrowLineStyle = 'straight' | 'curve' | 'elbow';\n\nexport interface ArrowConfig {\n  /** Default head style for the start of an arrow */\n  startHeadStyle: ArrowHeadStyle;\n  /** Default head style for the end of an arrow */\n  endHeadStyle: ArrowHeadStyle;\n  /** Default line style for new arrows */\n  lineStyle: ArrowLineStyle;\n}\n\nexport const defaultArrowConfig: ArrowConfig = {\n  startHeadStyle: 'none',\n  endHeadStyle: 'open-arrow',\n  lineStyle: 'curve',\n};\n\nexport interface WhiteboardConfig {\n  drawingEnabled: boolean;\n  canvasWidth: number;\n  canvasHeight: number;\n  fullScreen: boolean;\n  center: boolean;\n  canvasX: number;\n  canvasY: number;\n  strokeColor: string;\n  strokeWidth: number;\n  backgroundColor: string;\n  lineJoin: LineJoin;\n  lineCap: LineCap;\n  fill: string;\n  zoom: number;\n  fontFamily: string;\n  fontSize: number;\n  dasharray: string;\n  dashoffset: number;\n  x: number;\n  y: number;\n  enableGrid: boolean;\n  gridSize: number;\n  snapToGrid: boolean;\n  keyboardShortcutsEnabled: boolean;\n  penType: PenType;\n  /** Minimum distance (in pixels) between points when drawing with the pen tool */\n  penThrottlingThreshold: number;\n  /** Arrow-specific configuration – heads, line style, size */\n  arrowConfig: ArrowConfig;\n  /**\n   * Post-draw behaviour: whether a freshly drawn element gets selected (and the Select tool\n   * activated) or the drawing tool stays active. Global, per-element-type, or omitted to use\n   * each element's own default. See {@link SelectAfterDrawConfig}.\n   */\n  selectAfterDraw?: SelectAfterDrawConfig;\n}\n\nexport interface EditorConfig {\n  title: string;\n  showTitle: boolean;\n  showZoom: boolean;\n  showLayers: boolean;\n  showTools: boolean;\n  showGrid: boolean;\n  showBackground: boolean;\n  showStroke: boolean;\n  showFill: boolean;\n  showOpacity: boolean;\n  showFont: boolean;\n  showDash: boolean;\n  showEraser: boolean;\n  showUndo: boolean;\n  showRedo: boolean;\n  showClear: boolean;\n  showSave: boolean;\n  showLoad: boolean;\n  showExport: boolean;\n  showImport: boolean;\n  showShare: boolean;\n  showSettings: boolean;\n  showHelp: boolean;\n  showAbout: boolean;\n  showFeedback: boolean;\n  showSupport: boolean;\n  showContact: boolean;\n  showPrivacy: boolean;\n  showTerms: boolean;\n  showLicense: boolean;\n  showAttribution: boolean;\n  showCredits: boolean;\n  showChangelog: boolean;\n  showReleaseNotes: boolean;\n  showRoadmap: boolean;\n  showBlog: boolean;\n  showForum: boolean;\n  showCommunity: boolean;\n  showEvents: boolean;\n  showWebinars: boolean;\n  showWorkshops: boolean;\n  showTutorials: boolean;\n  showDocumentation: boolean;\n  showAPI: boolean;\n  showSDK: boolean;\n  showCLI: boolean;\n  showPlugins: boolean;\n  showExtensions: boolean;\n  showIntegrations: boolean;\n  showAddons: boolean;\n  showThemes: boolean;\n  showTemplates: boolean;\n  showSnippets: boolean;\n  showExamples: boolean;\n  showDemos: boolean;\n  showSamples: boolean;\n  showShowcases: boolean;\n  showPortfolios: boolean;\n  showCaseStudies: boolean;\n  showSuccessStories: boolean;\n  showTestimonials: boolean;\n  showReviews: boolean;\n  showRatings: boolean;\n  showComparisons: boolean;\n  showAlternatives: boolean;\n  showInsights: boolean;\n  enableEditor: boolean;\n}\n","import { Point } from './types';\n\n/**\n * Represents a named connection point on a shape's edge.\n * `position` is the absolute world-coordinate of the point;\n * `normal` is an outward-facing unit vector used for arrowhead orientation.\n */\nexport interface ConnectionPoint {\n  id: string; // e.g. 'top', 'bottom-left', '0.35'\n  position: Point;\n  normal: Point; // unit vector pointing outward from the shape\n}\n\n/**\n * Where on a shape the arrow is anchored.\n *\n * - `elementId`  – the shape this end is bound to\n * - `pointId`    – which connection point (optional; `null` → closest edge)\n * - `focus`      – normalised position [0-1] along a specific edge, for fine-tuning\n */\nexport interface ArrowBinding {\n  elementId: string;\n  pointId: string | null;\n  /** 0 = start of edge, 1 = end of edge. Only used when pointId is set. */\n  focus: number;\n  /** Gap (in px) between shape edge and arrow endpoint */\n  gap: number;\n}\n\n/**\n * Describes an arrow's curvature between its two endpoints.\n *\n * - `type: 'straight'` – simple line\n * - `type: 'quadratic'` – single control point (cx, cy)\n * - `type: 'cubic'` – two control points\n * - `type: 'elbow'`    – right-angle segments with a configurable bend position\n */\nexport type ArrowPathType =\n  | { type: 'straight' }\n  | { type: 'quadratic'; cx: number; cy: number }\n  | { type: 'cubic'; cx1: number; cy1: number; cx2: number; cy2: number }\n  | { type: 'elbow'; midRatio: number };\n\n/**\n * The default straight arrow path.\n */\nexport const defaultArrowPath: ArrowPathType = { type: 'straight' };\n\n/**\n * Snap detection result when hovering near a connectable shape.\n */\nexport interface SnapResult {\n  /** The shape we're snapping to */\n  elementId: string;\n  /** The specific connection point (may be null for closest-edge) */\n  pointId: string | null;\n  /** The snapped world-coordinate */\n  point: Point;\n  /** Distance from the pointer to the snap point */\n  distance: number;\n}\n","import {\n  PenElement,\n  RectangleElement,\n  EllipseElement,\n  LineElement,\n  ArrowElement,\n  TextElement,\n  ImageElement,\n} from '../elements';\nimport { WhiteboardElementStyle } from './styles';\nimport { Bounds, Direction, Point } from './types';\n\nexport enum ElementType {\n  Pen = 'pen',\n  Rectangle = 'rectangle',\n  Ellipse = 'ellipse',\n  Line = 'line',\n  Arrow = 'arrow',\n  Text = 'text',\n  Image = 'image',\n}\n\nexport type WhiteboardElements = {\n  [ElementType.Pen]: PenElement;\n  [ElementType.Rectangle]: RectangleElement;\n  [ElementType.Ellipse]: EllipseElement;\n  [ElementType.Line]: LineElement;\n  [ElementType.Arrow]: ArrowElement;\n  [ElementType.Text]: TextElement;\n  [ElementType.Image]: ImageElement;\n};\n\nexport type WhiteboardElement = WhiteboardElements[keyof WhiteboardElements];\n\nexport type ElementByType<T extends ElementType> = WhiteboardElements[T];\n\nexport interface BaseElement {\n  type: ElementType;\n  id: string;\n  x: number;\n  y: number;\n  style: WhiteboardElementStyle;\n  rotation: number;\n  opacity: number;\n  zIndex: number;\n  scaleX?: number;\n  scaleY?: number;\n  layerId?: string;\n  groupId?: string;\n  locked?: boolean;\n  isDeleting?: boolean;\n  selectAfterDraw?: boolean;\n}\n\nexport interface ElementUtil<T> {\n  create(props: Partial<T>): T;\n  resize(element: T, direction: Direction, dx: number, dy: number): T;\n  getBounds(element: T): Bounds;\n  hitTest(element: T, pointA: Point, pointB: Point, threshold: number): boolean;\n}\n","import { WhiteboardConfig } from './config';\nimport { WhiteboardElement } from './elements';\nimport { ToolType } from './tools';\n\n/** Event types that can occur in ng-whiteboard. */\nexport enum WhiteboardEvent {\n  Ready = 'ready',\n  Destroyed = 'destroyed',\n  DrawStart = 'drawStart',\n  Drawing = 'drawing',\n  DrawEnd = 'drawEnd',\n  ElementsAdded = 'elementsAdded',\n  ElementsUpdated = 'elementsUpdated',\n  ElementsSelected = 'elementsSelected',\n  ElementsRemoved = 'elementsRemoved',\n  ElementDoubleClicked = 'elementDoubleClicked',\n  Undo = 'undo',\n  Redo = 'redo',\n  Clear = 'clear',\n  DataChange = 'dataChange',\n  Save = 'save',\n  ImageAdded = 'imageAdded',\n  ToolChange = 'toolChange',\n  ConfigChange = 'configChange',\n  ZoomChange = 'zoomChange',\n}\n\nexport type WhiteboardEventPayloads = {\n  [WhiteboardEvent.Ready]: void;\n  [WhiteboardEvent.Destroyed]: void;\n\n  [WhiteboardEvent.DrawStart]: { x: number; y: number };\n  [WhiteboardEvent.Drawing]: { x: number; y: number };\n  [WhiteboardEvent.DrawEnd]: void;\n\n  [WhiteboardEvent.ElementsAdded]: WhiteboardElement[];\n  [WhiteboardEvent.ElementsUpdated]: WhiteboardElement[];\n  [WhiteboardEvent.ElementsSelected]: WhiteboardElement[] | null;\n  [WhiteboardEvent.ElementsRemoved]: WhiteboardElement[];\n  [WhiteboardEvent.ElementDoubleClicked]: { target: EventTarget | null; clientX: number; clientY: number };\n\n  [WhiteboardEvent.Undo]: void;\n  [WhiteboardEvent.Redo]: void;\n  [WhiteboardEvent.Clear]: void;\n  [WhiteboardEvent.DataChange]: WhiteboardElement[];\n  [WhiteboardEvent.Save]: string;\n\n  [WhiteboardEvent.ImageAdded]: string | ArrayBuffer;\n\n  [WhiteboardEvent.ToolChange]: ToolType;\n  [WhiteboardEvent.ConfigChange]: WhiteboardConfig;\n  [WhiteboardEvent.ZoomChange]: { zoom: number };\n};\n\nexport type WhiteboardEventType =\n  | [WhiteboardEvent.Ready]\n  | [WhiteboardEvent.Destroyed]\n  | [WhiteboardEvent.DrawStart]\n  | [WhiteboardEvent.Drawing]\n  | [WhiteboardEvent.DrawEnd]\n  | [WhiteboardEvent.ElementsAdded]\n  | [WhiteboardEvent.ElementsUpdated]\n  | [WhiteboardEvent.ElementsSelected]\n  | [WhiteboardEvent.ElementsRemoved]\n  | [WhiteboardEvent.ElementDoubleClicked]\n  | [WhiteboardEvent.Undo]\n  | [WhiteboardEvent.Redo]\n  | [WhiteboardEvent.Clear]\n  | [WhiteboardEvent.DataChange]\n  | [WhiteboardEvent.Save]\n  | [WhiteboardEvent.ImageAdded]\n  | [WhiteboardEvent.ToolChange]\n  | [WhiteboardEvent.ConfigChange]\n  | [WhiteboardEvent.ZoomChange];\n","export enum FormatType {\n  Png = 'png',\n  Jpeg = 'jpeg',\n  Svg = 'svg',\n  Base64 = 'base64',\n}\n\nexport enum AlignmentType {\n  Left = 'left',\n  Center = 'center',\n  Right = 'right',\n  Top = 'top',\n  Middle = 'middle',\n  Bottom = 'bottom',\n  DistributeHorizontally = 'distribute-horizontally',\n  DistributeVertically = 'distribute-vertically',\n}\n\nexport enum LineCap {\n  Round = 'round',\n  Butt = 'butt',\n  Square = 'square',\n}\n\nexport enum LineJoin {\n  Round = 'round',\n  Miter = 'miter',\n  Bevel = 'bevel',\n  MiterClip = 'miter-clip',\n}\n\nexport interface AddImage {\n  image: string | ArrayBuffer;\n  x?: number;\n  y?: number;\n}\n\nexport enum Direction {\n  NW = 'nw',\n  N = 'n',\n  NE = 'ne',\n  E = 'e',\n  SE = 'se',\n  S = 's',\n  SW = 'sw',\n  W = 'w',\n}\n\nexport interface ResizeElement {\n  direction: Direction;\n  x: number;\n  y: number;\n}\n\nexport interface Point {\n  x: number;\n  y: number;\n}\n\nexport interface Bounds {\n  minX: number;\n  minY: number;\n  maxX: number;\n  maxY: number;\n  width: number;\n  height: number;\n}\n\nexport interface SelectionBox {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  visible: boolean;\n}\n\nexport interface BoundingBox {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  handles: {\n    topLeft: Point;\n    topRight: Point;\n    bottomLeft: Point;\n    bottomRight: Point;\n    rotateHandle: Point;\n  };\n  rotation: number;\n}\n","import { LineCap, LineJoin } from './types';\nimport { StrokeOptions } from '../utils/drawing/stroke-types';\n\n/** Predefined pen configurations for different drawing styles. */\n\n/** Available pen types. */\nexport enum PenType {\n  Pen = 'pen',\n  Marker = 'marker',\n  Highlighter = 'highlighter',\n  Brush = 'brush',\n  Pencil = 'pencil',\n}\n\n/** Pen thickness options. */\nexport enum PenThickness {\n  ExtraFine = 'extra-fine', // 1px\n  Fine = 'fine', // 2px\n  Medium = 'medium', // 4px\n  Thick = 'thick', // 8px\n  ExtraThick = 'extra-thick', // 12px\n}\n\n/** Complete pen preset configuration. */\nexport interface PenPreset {\n  id: string;\n  name: string;\n  type: PenType;\n  thickness: PenThickness;\n\n  strokeColor?: string;\n  strokeWidth?: number;\n  lineCap?: LineCap;\n  lineJoin?: LineJoin;\n  dasharray?: string;\n  dashoffset?: number;\n  opacity?: number;\n\n  strokeOptions: StrokeOptions;\n\n  display: {\n    description: string;\n    icon?: string;\n    preview?: string;\n  };\n}\n\n/** Base stroke options for smooth pen. */\nconst smoothPenOptions: StrokeOptions = {\n  size: 3,\n  thinning: 0.8,\n  smoothing: 0.9,\n  streamline: 0.8,\n  simulatePressure: true,\n  easing: (t: number) => (t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2),\n  start: { cap: true, taper: 0.5 },\n  end: { cap: true, taper: 0.6 },\n};\n\n/** Marker stroke options with uniform thickness. */\nconst markerOptions: StrokeOptions = {\n  size: 6,\n  thinning: 0.0,\n  smoothing: 0.2,\n  streamline: 0.3,\n  simulatePressure: false,\n  easing: () => 1.0,\n  start: { cap: false, taper: false },\n  end: { cap: false, taper: false },\n};\n\n/** Highlighter stroke options with wide rectangular shape. */\nconst highlighterOptions: StrokeOptions = {\n  size: 18,\n  thinning: 0.05,\n  smoothing: 0.1,\n  streamline: 0.1,\n  simulatePressure: false,\n  easing: (t: number) => t,\n  start: { cap: false, taper: false },\n  end: { cap: false, taper: false },\n};\n\n/** Brush stroke options with high expressiveness. */\nconst brushOptions: StrokeOptions = {\n  size: 14,\n  thinning: 0.85,\n  smoothing: 0.95,\n  streamline: 0.9,\n  simulatePressure: true,\n  easing: (t: number) => Math.pow(t, 1.8),\n  start: { cap: true, taper: 0.7 },\n  end: { cap: true, taper: 0.8 },\n};\n\n/** Pencil stroke options with rough texture. */\nconst pencilOptions: StrokeOptions = {\n  size: 1.5,\n  thinning: 0.6,\n  smoothing: 0.15,\n  streamline: 0.1,\n  simulatePressure: true,\n  easing: (t: number) => {\n    const base = t * 0.7 + 0.3;\n    return Math.min(1.0, base + Math.sin(t * 20) * 0.1);\n  },\n  start: { cap: true, taper: 0.1 },\n  end: { cap: true, taper: 0.2 },\n};\n\n/** Size mappings for different thickness levels. */\nexport const THICKNESS_SIZES: Record<PenThickness, number> = {\n  [PenThickness.ExtraFine]: 1,\n  [PenThickness.Fine]: 3,\n  [PenThickness.Medium]: 6,\n  [PenThickness.Thick]: 12,\n  [PenThickness.ExtraThick]: 20,\n};\n\n/** Stroke width mappings for different thickness levels. */\nexport const THICKNESS_STROKE_WIDTHS: Record<PenThickness, number> = {\n  [PenThickness.ExtraFine]: 0.5,\n  [PenThickness.Fine]: 1.5,\n  [PenThickness.Medium]: 3,\n  [PenThickness.Thick]: 6,\n  [PenThickness.ExtraThick]: 10,\n};\n\n/** Predefined pen presets. */\nexport const PEN_PRESETS_MAP: Record<string, PenPreset> = {\n  'pen-fine': {\n    id: 'pen-fine',\n    name: 'Fine Pen',\n    type: PenType.Pen,\n    thickness: PenThickness.Fine,\n    strokeColor: '#000000',\n    strokeWidth: THICKNESS_STROKE_WIDTHS[PenThickness.Fine],\n    lineCap: LineCap.Round,\n    lineJoin: LineJoin.Round,\n    strokeOptions: {\n      ...smoothPenOptions,\n      size: THICKNESS_SIZES[PenThickness.Fine],\n    },\n    display: {\n      description: 'Smooth fine pen for detailed drawing',\n      icon: '✏️',\n    },\n  },\n  'pen-medium': {\n    id: 'pen-medium',\n    name: 'Medium Pen',\n    type: PenType.Pen,\n    thickness: PenThickness.Medium,\n    strokeColor: '#000000',\n    strokeWidth: THICKNESS_STROKE_WIDTHS[PenThickness.Medium],\n    lineCap: LineCap.Round,\n    lineJoin: LineJoin.Round,\n    strokeOptions: {\n      ...smoothPenOptions,\n      size: THICKNESS_SIZES[PenThickness.Medium],\n    },\n    display: {\n      description: 'Standard pen for general use',\n      icon: '🖊️',\n    },\n  },\n  'pen-thick': {\n    id: 'pen-thick',\n    name: 'Thick Pen',\n    type: PenType.Pen,\n    thickness: PenThickness.Thick,\n    strokeColor: '#000000',\n    strokeWidth: THICKNESS_STROKE_WIDTHS[PenThickness.Thick],\n    lineCap: LineCap.Round,\n    lineJoin: LineJoin.Round,\n    strokeOptions: {\n      ...smoothPenOptions,\n      size: THICKNESS_SIZES[PenThickness.Thick],\n    },\n    display: {\n      description: 'Thick pen for bold strokes',\n      icon: '🖍️',\n    },\n  },\n\n  'marker-medium': {\n    id: 'marker-medium',\n    name: 'Medium Marker',\n    type: PenType.Marker,\n    thickness: PenThickness.Medium,\n    strokeColor: '#2563eb',\n    strokeWidth: THICKNESS_STROKE_WIDTHS[PenThickness.Medium],\n    lineCap: LineCap.Square,\n    lineJoin: LineJoin.Miter,\n    strokeOptions: {\n      ...markerOptions,\n      size: THICKNESS_SIZES[PenThickness.Medium],\n    },\n    display: {\n      description: 'Consistent marker for clean lines',\n      icon: '🖍️',\n    },\n  },\n  'marker-thick': {\n    id: 'marker-thick',\n    name: 'Thick Marker',\n    type: PenType.Marker,\n    thickness: PenThickness.Thick,\n    strokeColor: '#dc2626',\n    strokeWidth: THICKNESS_STROKE_WIDTHS[PenThickness.Thick],\n    lineCap: LineCap.Square,\n    lineJoin: LineJoin.Miter,\n    strokeOptions: {\n      ...markerOptions,\n      size: THICKNESS_SIZES[PenThickness.Thick],\n    },\n    display: {\n      description: 'Thick marker for emphasis',\n      icon: '🖍️',\n    },\n  },\n\n  'highlighter-medium': {\n    id: 'highlighter-medium',\n    name: 'Highlighter',\n    type: PenType.Highlighter,\n    thickness: PenThickness.Medium,\n    strokeColor: '#fefc34',\n    strokeWidth: THICKNESS_STROKE_WIDTHS[PenThickness.ExtraThick],\n    lineCap: LineCap.Square,\n    lineJoin: LineJoin.Miter,\n    opacity: 0.4,\n    strokeOptions: {\n      ...highlighterOptions,\n      size: THICKNESS_SIZES[PenThickness.ExtraThick],\n    },\n    display: {\n      description: 'Translucent highlighter for emphasis',\n      icon: '🖍️',\n    },\n  },\n\n  'brush-medium': {\n    id: 'brush-medium',\n    name: 'Paint Brush',\n    type: PenType.Brush,\n    thickness: PenThickness.Medium,\n    strokeColor: '#059669',\n    strokeWidth: THICKNESS_STROKE_WIDTHS[PenThickness.Thick],\n    lineCap: LineCap.Round,\n    lineJoin: LineJoin.Round,\n    strokeOptions: {\n      ...brushOptions,\n      size: THICKNESS_SIZES[PenThickness.Thick],\n    },\n    display: {\n      description: 'Expressive brush with pressure sensitivity',\n      icon: '🖌️',\n    },\n  },\n\n  'pencil-fine': {\n    id: 'pencil-fine',\n    name: 'Pencil',\n    type: PenType.Pencil,\n    thickness: PenThickness.Fine,\n    strokeColor: '#374151',\n    strokeWidth: THICKNESS_STROKE_WIDTHS[PenThickness.Fine],\n    lineCap: LineCap.Round,\n    lineJoin: LineJoin.Round,\n    strokeOptions: {\n      ...pencilOptions,\n      size: THICKNESS_SIZES[PenThickness.Fine],\n    },\n    display: {\n      description: 'Natural pencil for sketching',\n      icon: '✏️',\n    },\n  },\n};\n\n/** Array version for backward compatibility. */\nexport const PEN_PRESETS: PenPreset[] = Object.values(PEN_PRESETS_MAP);\n\nexport const PEN_PRESETS_BY_TYPE_THICKNESS: Record<string, PenPreset> = {};\nObject.values(PEN_PRESETS_MAP).forEach((preset) => {\n  const key = `${preset.type}-${preset.thickness}`;\n  PEN_PRESETS_BY_TYPE_THICKNESS[key] = preset;\n});\n\n/** Default pen preset. */\nexport const DEFAULT_PEN_PRESET = PEN_PRESETS_MAP['pen-medium'];\n\n/** Get preset by type and thickness combination. */\nexport function getPenPresetByTypeAndThickness(type: PenType, thickness: PenThickness): PenPreset | undefined {\n  return PEN_PRESETS_BY_TYPE_THICKNESS[`${type}-${thickness}`];\n}\n\n/** Get first available preset for a pen type with preferred thickness. */\nexport function getPresetForType(type: PenType, preferredThickness: PenThickness = PenThickness.Medium): PenPreset {\n  const preferred = getPenPresetByTypeAndThickness(type, preferredThickness);\n  if (preferred) return preferred;\n\n  const fallback = PEN_PRESETS.find((preset) => preset.type === type);\n  return fallback || DEFAULT_PEN_PRESET;\n}\n","import { LineCap, LineJoin } from './types';\n\nexport interface WhiteboardElementStyle {\n  strokeWidth?: number;\n  strokeColor?: string;\n  fill?: string;\n\n  lineJoin?: LineJoin;\n  lineCap?: LineCap;\n\n  fontSize?: number;\n  fontFamily?: string;\n\n  fontStyle?: 'normal' | 'italic';\n  fontWeight?: 'normal' | 'bold';\n  color?: string;\n\n  dasharray?: string;\n  dashoffset?: number;\n  opacity?: number;\n}\n\nexport const defaultElementStyle: WhiteboardElementStyle = {\n  strokeWidth: 2,\n  strokeColor: '#000000',\n  fill: '#000000',\n\n  lineJoin: LineJoin.Round,\n  lineCap: LineCap.Round,\n\n  dasharray: '',\n  dashoffset: 0,\n};\n\nexport const defaultTextElementStyle: WhiteboardElementStyle = {\n  ...defaultElementStyle,\n  fontSize: 14,\n  fontFamily: 'Arial',\n  fontStyle: 'normal',\n  fontWeight: 'normal',\n  color: '#000000',\n};\n","import { PointerInfo } from './pointer';\n\nexport enum ToolType {\n  Hand = 'hand',\n  Select = 'select',\n  Pen = 'pen',\n  Rectangle = 'rectangle',\n  Image = 'image',\n  Line = 'line',\n  Arrow = 'arrow',\n  Ellipse = 'ellipse',\n  Text = 'text',\n  Eraser = 'eraser',\n  ZoomArea = 'zoomArea',\n}\n\nexport interface ToolConfig {\n  id: string;\n  type: ToolType;\n  name: string;\n  description?: string;\n  icon?: string;\n  enabled: boolean;\n  order?: number;\n  permissions?: string[];\n  customData?: Record<string, unknown>;\n}\n\nexport type Tool = {\n  type: ToolType;\n  activate(): void;\n  deactivate(): void;\n  handlePointerDown?(event: PointerInfo): void;\n  handlePointerMove?(event: PointerInfo): void;\n  handlePointerUp?(event: PointerInfo): void;\n  handleKeyDown?(event: KeyboardEvent): void;\n  handleKeyUp?(event: KeyboardEvent): void;\n  onActivate?(): void;\n  onDeactivate?(): void;\n  isEditing?: boolean;\n};\n","import { ToolType } from './tools';\n\n/** Default SVG icons for whiteboard tools. */\nexport const TOOL_ICONS: Record<ToolType, string> = {\n  [ToolType.Hand]: `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"currentColor\"><path d=\"M402-40q-30 0-56-13.5T303-92L48-465l24-23q19-19 45-22t47 12l116 81v-383q0-17 11.5-28.5T320-840q17 0 28.5 11.5T360-800v537L212-367l157 229q5 8 14 13t19 5h278q33 0 56.5-23.5T760-200v-560q0-17 11.5-28.5T800-800q17 0 28.5 11.5T840-760v560q0 66-47 113T680-40H402Zm38-440v-400q0-17 11.5-28.5T480-920q17 0 28.5 11.5T520-880v400h-80Zm160 0v-360q0-17 11.5-28.5T640-880q17 0 28.5 11.5T680-840v360h-80ZM486-300Z\"/></svg>`,\n\n  [ToolType.Select]: `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"currentColor\"><path d=\"M516-120 402-402 120-516v-56l720-268-268 720h-56Zm26-148 162-436-436 162 196 78 78 196Zm-78-196Z\"/></svg>`,\n\n  [ToolType.Pen]: `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"currentColor\"><path d=\"M200-200h57l391-391-57-57-391 391v57Zm-80 80v-170l528-527q12-11 26.5-17t30.5-6q16 0 31 6t26 18l55 56q12 11 17.5 26t5.5 30q0 16-5.5 30.5T817-647L290-120H120Zm640-584-56-56 56 56Zm-141 85-28-29 57 57-29-28Z\"/></svg>`,\n\n  [ToolType.Line]: `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"currentColor\"><path d=\"M199-199q-9-9-9-21t9-21l520-520q9-9 21-9t21 9q9 9 9 21t-9 21L241-199q-9 9-21 9t-21-9Z\"/></svg>`,\n\n  [ToolType.Arrow]: `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"currentColor\"><path d=\"m560-240-56-58 142-142H160v-80h486L504-662l56-58 240 240-240 240Z\"/></svg>`,\n\n  [ToolType.Rectangle]: `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"currentColor\"><path d=\"M200-200q-33 0-56.5-23.5T120-280v-400q0-33 23.5-56.5T200-760h560q33 0 56.5 23.5T840-680v400q0 33-23.5 56.5T760-200H200Zm0-80h560v-400H200v400Zm0 0v-400 400Z\"/></svg>`,\n\n  [ToolType.Ellipse]: `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"currentColor\"><path d=\"M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z\"/></svg>`,\n\n  [ToolType.Text]: `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"currentColor\"><path d=\"M280-160v-520H80v-120h520v120H400v520H280Zm360 0v-320H520v-120h360v120H760v320H640Z\"/></svg>`,\n\n  [ToolType.Image]: `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"currentColor\"><path d=\"M480-480ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h320v80H200v560h560v-320h80v320q0 33-23.5 56.5T760-120H200Zm40-160h480L570-480 450-320l-90-120-120 160Zm440-320v-80h-80v-80h80v-80h80v80h80v80h-80v80h-80Z\"/></svg>`,\n\n  [ToolType.Eraser]: `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"currentColor\"><path d=\"M690-240h190v80H610l80-80Zm-500 80-85-85q-23-23-23.5-57t22.5-58l440-456q23-24 56.5-24t56.5 23l199 199q23 23 23 57t-23 57L520-160H190Zm296-80 314-322-198-198-442 456 64 64h262Zm-6-240Z\"/></svg>`,\n\n  [ToolType.ZoomArea]: `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"currentColor\"><path d=\"M450-420q38 0 64-26t26-64q0-38-26-64t-64-26q-38 0-64 26t-26 64q0 38 26 64t64 26Zm193 160L538-365q-20 13-42.5 19t-45.5 6q-71 0-120.5-49.5T280-510q0-71 49.5-120.5T450-680q71 0 120.5 49.5T620-510q0 23-6.5 45.5T594-422l106 106-57 56ZM200-120q-33 0-56.5-23.5T120-200v-160h80v160h160v80H200Zm400 0v-80h160v-160h80v160q0 33-23.5 56.5T760-120H600ZM120-600v-160q0-33 23.5-56.5T200-840h160v80H200v160h-80Zm640 0v-160H600v-80h160q33 0 56.5 23.5T840-760v160h-80Z\"/></svg>`,\n};\n","/** CSS Blend Modes. */\nexport type BlendMode =\n  | 'normal'\n  | 'multiply'\n  | 'screen'\n  | 'overlay'\n  | 'darken'\n  | 'lighten'\n  | 'color-dodge'\n  | 'color-burn'\n  | 'hard-light'\n  | 'soft-light'\n  | 'difference'\n  | 'exclusion'\n  | 'hue'\n  | 'saturation'\n  | 'color'\n  | 'luminosity';\n\n/** Blend mode display information for UI. */\nexport interface BlendModeOption {\n  value: BlendMode;\n  label: string;\n  description: string;\n  category: 'normal' | 'darken' | 'lighten' | 'contrast' | 'component';\n}\n\n/** Core Layer Model. */\nexport interface WhiteboardLayer {\n  id: string;\n  name: string;\n  visible: boolean;\n  locked: boolean;\n  zIndex: number;\n  elements: string[];\n  opacity?: number;\n  blendMode?: BlendMode;\n}\n\n/** Layer Management State. */\nexport interface LayerState {\n  layers: WhiteboardLayer[];\n  activeLayerId: string;\n}\n\n/** Available blend modes with metadata for UI display. */\nexport const BLEND_MODES: BlendModeOption[] = [\n  { value: 'normal', label: 'Normal', description: 'Default blending', category: 'normal' },\n  { value: 'multiply', label: 'Multiply', description: 'Darkens by multiplying colors', category: 'darken' },\n  { value: 'darken', label: 'Darken', description: 'Keeps darkest colors', category: 'darken' },\n  { value: 'color-burn', label: 'Color Burn', description: 'Increases contrast and darkens', category: 'darken' },\n  { value: 'screen', label: 'Screen', description: 'Lightens by inverting and multiplying', category: 'lighten' },\n  { value: 'lighten', label: 'Lighten', description: 'Keeps lightest colors', category: 'lighten' },\n  { value: 'color-dodge', label: 'Color Dodge', description: 'Brightens and reduces contrast', category: 'lighten' },\n  { value: 'overlay', label: 'Overlay', description: 'Combines multiply and screen', category: 'contrast' },\n  { value: 'soft-light', label: 'Soft Light', description: 'Subtle version of overlay', category: 'contrast' },\n  { value: 'hard-light', label: 'Hard Light', description: 'Intense version of overlay', category: 'contrast' },\n  { value: 'difference', label: 'Difference', description: 'Subtracts colors', category: 'contrast' },\n  {\n    value: 'exclusion',\n    label: 'Exclusion',\n    description: 'Similar to difference but less contrast',\n    category: 'contrast',\n  },\n  { value: 'hue', label: 'Hue', description: 'Uses hue of top layer', category: 'component' },\n  { value: 'saturation', label: 'Saturation', description: 'Uses saturation of top layer', category: 'component' },\n  { value: 'color', label: 'Color', description: 'Uses hue and saturation of top layer', category: 'component' },\n  { value: 'luminosity', label: 'Luminosity', description: 'Uses luminosity of top layer', category: 'component' },\n];\n","/** Standard CSS cursor types and custom SVG cursors for whiteboard tools. */\nexport enum CursorType {\n  // Selection & Pointer\n  Default = 'default',\n  Pointer = 'pointer',\n  None = 'none',\n  ContextMenu = 'context-menu',\n  Help = 'help',\n  Progress = 'progress',\n  Wait = 'wait',\n\n  // Drawing & Interaction\n  Crosshair = 'crosshair',\n  Cell = 'cell',\n  Text = 'text',\n  VerticalText = 'vertical-text',\n\n  // Drag & Move\n  Grab = 'grab',\n  Grabbing = 'grabbing',\n  Move = 'move',\n  AllScroll = 'all-scroll',\n\n  // Resize (Directional)\n  NResize = 'n-resize',\n  SResize = 's-resize',\n  EResize = 'e-resize',\n  WResize = 'w-resize',\n  NEResize = 'ne-resize',\n  NWResize = 'nw-resize',\n  SEResize = 'se-resize',\n  SWResize = 'sw-resize',\n  EWResize = 'ew-resize',\n  NSResize = 'ns-resize',\n  NESWResize = 'nesw-resize',\n  NWSEResize = 'nwse-resize',\n\n  // Action States\n  Copy = 'copy',\n  Alias = 'alias',\n  NoDrop = 'no-drop',\n  NotAllowed = 'not-allowed',\n\n  // Zoom\n  ZoomIn = 'zoom-in',\n  ZoomOut = 'zoom-out',\n\n  // Column & Row Resize\n  ColResize = 'col-resize',\n  RowResize = 'row-resize',\n\n  // Custom SVG Cursors\n  Pencil = \"url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PHBhdGggZmlsbD0iIzAwMCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjAuNSIgZD0ibTE2LjMxOCA2LjExLTMuNTM2LTMuNTM1IDEuNDE1LTEuNDE0Yy42My0uNjMgMi4wNzMtLjc1NSAyLjgyOCAwbC43MDcuNzA3Yy43NTUuNzU1LjYzMSAyLjE5OCAwIDIuODI5TDE2LjMxOCA2LjExem0tMS40MTQgMS40MTUtOS45IDkuOS00LjU5NiAxLjA2IDEuMDYtNC41OTYgOS45LTkuOSAzLjUzNiAzLjUzNnoiLz48L3N2Zz4=') 0 24, auto\",\n  Brush = \"url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSIjMDAwIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMC41IiBkPSJNNyAxNGMtMS42NiAwLTMgMS4zNC0zIDMgMCAxLjMxLTEuMTYgMi0yIDIgLjkyIDEuMjIgMi40OSAyIDQgMiAyLjIxIDAgNC0xLjc5IDQtNCAwLTEuNjYtMS4zNC0zLTMtM3ptMTMuNzEtOS4zN2wtMS4zNC0xLjM0YS45OTYuOTk2IDAgMCAwLTEuNDEgMEw5IDEyLjI1IDExLjc1IDE1bDguOTYtOC45NmEuOTk2Ljk5NiAwIDAgMCAwLTEuNDF6Ii8+PC9zdmc+') 0 24, auto\",\n  Eraser = \"url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSIjMDAwIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMC41IiBkPSJNMTYuMjQgMy41Nmw0Ljk1IDQuOTRjLjc4Ljc5Ljc4IDIuMDUgMCAyLjg0TDEyIDIwLjUzYTQuMDA4IDQuMDA4IDAgMCAxLTUuNjYgMEwyLjgxIDE3Yy0uNzgtLjc5LS43OC0yLjA1IDAtMi44NGwxMC42LTEwLjZjLjc5LS43OCAyLjA1LS43OCAyLjgzIDBNNC4yMiAxNS41OGwzLjU0IDMuNTNjLjc4Ljc5IDIuMDQuNzkgMi44MyAwbDMuNTMtMy41My00Ljk1LTQuOTUtNC45NSA0Ljk1eiIvPjwvc3ZnPg==') 12 12, auto\",\n  Highlighter = \"url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cmVjdCB4PSI0IiB5PSIxMCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjgiIGZpbGw9IiMwMDAiIG9wYWNpdHk9IjAuNiIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjAuNSIvPjxwYXRoIGQ9Ik0yIDIwaDIwdjNIMnoiIGZpbGw9IiMwMDAiIG9wYWNpdHk9IjAuOCIvPjwvc3ZnPg==') 12 24, auto\",\n  TextCursor = \"url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSIjMDAwIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMC41IiBkPSJNNSA0djNoNS41djEyaDNWN0gxOVY0SDV6Ii8+PC9zdmc+') 12 0, text\",\n  Shape = \"url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cmVjdCB4PSIzIiB5PSIzIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIi8+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==') 12 12, crosshair\",\n  Arrow = \"url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSIjMDAwIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMC41IiBkPSJNMyAzbDcuMDcgMTYuOTcgMi41MS03LjM5IDcuMzktMi41MUwzIDN6Ii8+PC9zdmc+') 0 0, default\",\n  Hand = \"url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSIjMDAwIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMC41IiBkPSJNMTMgNnY1aDNMMTIgMTdsLTQtNmgzVjZjMC0xLjEuOS0yIDItMnMyIC5IDIgMnptOCAwdjVoLTJWNmMwLTIuMjEtMS43OS00LTQtNGgtMkMxMC43OSAyIDkgMy43OSA5IDZ2NUg3VjZjMC0zLjMxIDIuNjktNiA2LTZoMmMzLjMxIDAgNiAyLjY5IDYgNnoiLz48L3N2Zz4=') 12 12, grab\",\n  Rotate = \"url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSIjMDAwIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMC41IiBkPSJNMTIgNnYzbDQtNC00LTR2M2MtNC40MiAwLTggMy41OC04IDggMCAxLjU3LjQ2IDMuMDMgMS4yNCA0LjI2TDYuNyAxNC44Yy0uNDUtLjgzLS43LTEuNzktLjctMi44IDAtMy4zMSAyLjY5LTYgNi02em02Ljc2IDEuNzRMMTcuMyA5LjJjLjQ0Ljg0LjcgMS43OS43IDIuOCAwIDMuMzEtMi42OSA2LTYgNnYtM2wtNCA0IDQgNHYtM2M0LjQyIDAgOC0zLjU4IDgtOCAwLTEuNTctLjQ2LTMuMDMtMS4yNC00LjI2eiIvPjwvc3ZnPg==') 12 12, grab\",\n  Eyedropper = \"url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSIjMDAwIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMC41IiBkPSJNMjAuNzEgNS42M2wtMi4zNC0yLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMy4xMiAzLjEyLTEuOTMtMS45MS0xLjQxIDEuNDEgMS40MiAxLjQyTDMgMTYuMjVWMjFoNC43NWw4LjkyLTguOTIgMS40MiAxLjQyIDEuNDEtMS40MS0xLjkyLTEuOTIgMy4xMy0zLjEyYy4zOS0uMzkuMzktMS4wMiAwLTEuNDJ6Ii8+PC9zdmc+') 0 24, crosshair\",\n  LaserPointer = \"url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI0IiBmaWxsPSIjMDAwIiBvcGFjaXR5PSIwLjgiLz48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI2IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMSIgb3BhY2l0eT0iMC41Ii8+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iOCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utd2lkdGg9IjAuNSIgb3BhY2l0eT0iMC4zIi8+PC9zdmc+') 12 12, none\",\n  Image = \"url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cmVjdCB4PSIzIiB5PSIzIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIi8+PGNpcmNsZSBjeD0iOC41IiBjeT0iOC41IiByPSIxLjUiIGZpbGw9IiMwMDAiLz48cG9seWxpbmUgcG9pbnRzPSIyMSAxNSAxNSA5IDkgMTUgNiAxMiAzIDE1IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==') 12 12, crosshair\",\n  Dot = \"url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj48Y2lyY2xlIGN4PSIxMCIgY3k9IjEwIiByPSIyIiBmaWxsPSIjMDAwIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMSIvPjwvc3ZnPg==') 10 10, crosshair\",\n  Plus = \"url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSIjMDAwIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMC41IiBkPSJNMTkgMTNoLTZ2NmgtMnYtNkg1di0yaDZWNWgydjZoNnYyeiIvPjwvc3ZnPg==') 12 12, crosshair\",\n  Line = \"url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48bGluZSB4MT0iMyIgeTE9IjIxIiB4Mj0iMjEiIHkyPSIzIiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+PGNpcmNsZSBjeD0iMyIgY3k9IjIxIiByPSIyIiBmaWxsPSIjMDAwIi8+PGNpcmNsZSBjeD0iMjEiIGN5PSIzIiByPSIyIiBmaWxsPSIjMDAwIi8+PC9zdmc+') 12 12, crosshair\",\n}\n","import { Injectable, OnDestroy, WritableSignal, signal, untracked } from '@angular/core';\nimport { Observable, Subject, filter, map, debounceTime, distinctUntilChanged } from 'rxjs';\nimport { WhiteboardEvent, WhiteboardEventPayloads } from '../types';\n\ninterface WhiteboardEventPayload<T extends WhiteboardEvent> {\n  type: T;\n  payload: WhiteboardEventPayloads[T];\n  timestamp: number;\n}\n\ninterface DebounceConfig<T = unknown> {\n  debounceTime: number;\n  distinctUntilChanged?: boolean;\n  comparator?: (prev: T, curr: T) => boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class EventBusService implements OnDestroy {\n  private eventSubject = new Subject<WhiteboardEventPayload<WhiteboardEvent>>();\n\n  private readonly eventSignals: { [K in WhiteboardEvent]: WritableSignal<WhiteboardEventPayloads[K] | undefined> } = {\n    [WhiteboardEvent.Ready]: signal<WhiteboardEventPayloads[WhiteboardEvent.Ready] | undefined>(undefined),\n    [WhiteboardEvent.Destroyed]: signal<WhiteboardEventPayloads[WhiteboardEvent.Destroyed] | undefined>(undefined),\n    [WhiteboardEvent.DrawStart]: signal<WhiteboardEventPayloads[WhiteboardEvent.DrawStart] | undefined>(undefined),\n    [WhiteboardEvent.Drawing]: signal<WhiteboardEventPayloads[WhiteboardEvent.Drawing] | undefined>(undefined),\n    [WhiteboardEvent.DrawEnd]: signal<WhiteboardEventPayloads[WhiteboardEvent.DrawEnd] | undefined>(undefined),\n    [WhiteboardEvent.ElementsAdded]: signal<WhiteboardEventPayloads[WhiteboardEvent.ElementsAdded] | undefined>(\n      undefined\n    ),\n    [WhiteboardEvent.ElementsUpdated]: signal<WhiteboardEventPayloads[WhiteboardEvent.ElementsUpdated] | undefined>(\n      undefined\n    ),\n    [WhiteboardEvent.ElementsSelected]: signal<WhiteboardEventPayloads[WhiteboardEvent.ElementsSelected] | undefined>(\n      undefined\n    ),\n    [WhiteboardEvent.ElementsRemoved]: signal<WhiteboardEventPayloads[WhiteboardEvent.ElementsRemoved] | undefined>(\n      undefined\n    ),\n    [WhiteboardEvent.ElementDoubleClicked]: signal<\n      WhiteboardEventPayloads[WhiteboardEvent.ElementDoubleClicked] | undefined\n    >(undefined),\n    [WhiteboardEvent.Undo]: signal<WhiteboardEventPayloads[WhiteboardEvent.Undo] | undefined>(undefined),\n    [WhiteboardEvent.Redo]: signal<WhiteboardEventPayloads[WhiteboardEvent.Redo] | undefined>(undefined),\n    [WhiteboardEvent.Clear]: signal<WhiteboardEventPayloads[WhiteboardEvent.Clear] | undefined>(undefined),\n    [WhiteboardEvent.DataChange]: signal<WhiteboardEventPayloads[WhiteboardEvent.DataChange] | undefined>(undefined),\n    [WhiteboardEvent.Save]: signal<WhiteboardEventPayloads[WhiteboardEvent.Save] | undefined>(undefined),\n    [WhiteboardEvent.ImageAdded]: signal<WhiteboardEventPayloads[WhiteboardEvent.ImageAdded] | undefined>(undefined),\n    [WhiteboardEvent.ToolChange]: signal<WhiteboardEventPayloads[WhiteboardEvent.ToolChange] | undefined>(undefined),\n    [WhiteboardEvent.ConfigChange]: signal<WhiteboardEventPayloads[WhiteboardEvent.ConfigChange] | undefined>(\n      undefined\n    ),\n    [WhiteboardEvent.ZoomChange]: signal<WhiteboardEventPayloads[WhiteboardEvent.ZoomChange] | undefined>(undefined),\n  } as const;\n\n  private readonly lastEventInternal = signal<WhiteboardEventPayload<WhiteboardEvent> | undefined>(undefined);\n  readonly lastEvent = this.lastEventInternal.asReadonly();\n\n  private readonly defaultDebounceConfigs: Partial<Record<WhiteboardEvent, DebounceConfig>> = {\n    [WhiteboardEvent.ElementsAdded]: {\n      debounceTime: 100,\n      distinctUntilChanged: true,\n    },\n    [WhiteboardEvent.Drawing]: {\n      debounceTime: 16,\n      distinctUntilChanged: false,\n    },\n  };\n\n  ngOnDestroy(): void {\n    this.destroy();\n  }\n\n  emit<T extends WhiteboardEvent>(type: T, payload?: WhiteboardEventPayloads[T]): void {\n    const eventPayload: WhiteboardEventPayload<T> = {\n      type,\n      payload: payload as WhiteboardEventPayloads[T],\n      timestamp: Date.now(),\n    };\n    this.eventSubject.next(eventPayload);\n    untracked(() => {\n      (this.eventSignals[type] as WritableSignal<WhiteboardEventPayloads[T] | undefined>).set(eventPayload.payload);\n      this.lastEventInternal.set(eventPayload);\n    });\n  }\n\n  listen(): Observable<WhiteboardEventPayload<WhiteboardEvent>> {\n    return this.eventSubject.asObservable();\n  }\n\n  getEventSignal<T extends WhiteboardEvent>(eventType: T) {\n    return this.eventSignals[eventType].asReadonly();\n  }\n\n  getAllEventsSignal() {\n    return this.lastEvent;\n  }\n\n  on<T extends WhiteboardEvent>(\n    eventType: T,\n    debounceConfig?: DebounceConfig<WhiteboardEventPayloads[T]>\n  ): Observable<WhiteboardEventPayloads[T]> {\n    let stream: Observable<WhiteboardEventPayloads[T]> = this.eventSubject.pipe(\n      filter((event): event is WhiteboardEventPayload<T> => event.type === eventType),\n      map((event) => event.payload as WhiteboardEventPayloads[T])\n    );\n\n    const config = debounceConfig || this.defaultDebounceConfigs[eventType];\n    if (!config) return stream;\n\n    if (config.debounceTime > 0) {\n      stream = stream.pipe(debounceTime(config.debounceTime));\n    }\n\n    if (config.distinctUntilChanged) {\n      const compareFn = config.comparator as\n        | ((a: WhiteboardEventPayloads[T], b: WhiteboardEventPayloads[T]) => boolean)\n        | undefined;\n      stream = stream.pipe(distinctUntilChanged(compareFn));\n    }\n\n    return stream;\n  }\n\n  listenToMultiple<T extends WhiteboardEvent>(\n    events: T[]\n  ): Observable<{ type: T; payload: WhiteboardEventPayloads[T]; timestamp: number }> {\n    return this.eventSubject.pipe(\n      filter((event): event is WhiteboardEventPayload<T> => events.includes(event.type as T)),\n      map((event) => ({\n        type: event.type as T,\n        payload: event.payload,\n        timestamp: event.timestamp,\n      }))\n    );\n  }\n\n  destroy(): void {\n    this.eventSubject.complete();\n  }\n}\n","import { Injectable, signal } from '@angular/core';\nimport {\n  ElementType,\n  LineCap,\n  LineJoin,\n  WhiteboardConfig,\n  WhiteboardEvent,\n  EditorConfig,\n  PenType,\n  defaultArrowConfig,\n} from '../types';\nimport { EventBusService } from '../event-bus/event-bus.service';\n\n@Injectable({ providedIn: 'root' })\nexport class ConfigService {\n  private config = signal<WhiteboardConfig>({\n    drawingEnabled: true,\n    canvasWidth: 800,\n    canvasHeight: 600,\n    fullScreen: true,\n    center: true,\n    canvasX: 0,\n    canvasY: 0,\n    strokeColor: '#333333',\n    strokeWidth: 2,\n    backgroundColor: '#F8F9FA',\n    lineJoin: LineJoin.Round,\n    lineCap: LineCap.Round,\n    fill: 'transparent',\n    zoom: 1,\n    x: 0,\n    y: 0,\n    fontFamily: 'sans-serif',\n    fontSize: 24,\n    dasharray: '',\n    dashoffset: 0,\n    enableGrid: false,\n    gridSize: 10,\n    snapToGrid: true,\n    keyboardShortcutsEnabled: true,\n    penType: PenType.Pen,\n    penThrottlingThreshold: 2,\n    arrowConfig: { ...defaultArrowConfig },\n  });\n\n  private editorConfig = signal<EditorConfig>({\n    title: 'Whiteboard',\n    enableEditor: true,\n    // Core panels / features\n    showTitle: true,\n    showZoom: true,\n    showLayers: true,\n    showTools: true,\n    showGrid: true,\n    showBackground: true,\n    showStroke: true,\n    showFill: true,\n    showOpacity: true,\n    showFont: true,\n    showDash: true,\n    showEraser: true,\n    showUndo: true,\n    showRedo: true,\n    showClear: true,\n    showSave: true,\n    showLoad: false,\n    showExport: true,\n    showImport: false,\n    showShare: false,\n    showSettings: false,\n    showHelp: false,\n    showAbout: false,\n    showFeedback: false,\n    showSupport: false,\n    showContact: false,\n    showPrivacy: false,\n    showTerms: false,\n    showLicense: false,\n    showAttribution: false,\n    showCredits: false,\n    showChangelog: false,\n    showReleaseNotes: false,\n    showRoadmap: false,\n    showBlog: false,\n    showForum: false,\n    showCommunity: false,\n    showEvents: false,\n    showWebinars: false,\n    showWorkshops: false,\n    showTutorials: false,\n    showDocumentation: false,\n    showAPI: false,\n    showSDK: false,\n    showCLI: false,\n    showPlugins: false,\n    showExtensions: false,\n    showIntegrations: false,\n    showAddons: false,\n    showThemes: false,\n    showTemplates: false,\n    showSnippets: false,\n    showExamples: true,\n    showDemos: true,\n    showSamples: false,\n    showShowcases: false,\n    showPortfolios: false,\n    showCaseStudies: false,\n    showSuccessStories: false,\n    showTestimonials: false,\n    showReviews: false,\n    showRatings: false,\n    showComparisons: false,\n    showAlternatives: false,\n    showInsights: false,\n  });\n\n  constructor(private eventBusService: EventBusService) {}\n\n  getConfig(): Readonly<WhiteboardConfig> {\n    return this.config();\n  }\n\n  /**\n   * Resolve the post-draw \"select after draw\" behaviour for an element type. Honours the\n   * `selectAfterDraw` config (global boolean or per-type object); falls back to the element's\n   * own default when the config is omitted (or has no entry for that type).\n   */\n  resolveSelectAfterDraw(type: ElementType, fallback: boolean): boolean {\n    const cfg = this.config().selectAfterDraw;\n    if (cfg === undefined) return fallback;\n    if (typeof cfg === 'boolean') return cfg;\n    return cfg[type] ?? fallback;\n  }\n\n  getConfigSignal() {\n    return this.config.asReadonly();\n  }\n\n  getEditorConfig(): Readonly<EditorConfig> {\n    return this.editorConfig();\n  }\n\n  getEditorConfigSignal() {\n    return this.editorConfig.asReadonly();\n  }\n\n  updateConfig(partialConfig: Partial<WhiteboardConfig>, emitEvent = true): void {\n    this.config.update((current) => ({ ...current, ...partialConfig }));\n\n    const hasZoomRelatedChanges = 'zoom' in partialConfig;\n\n    if (hasZoomRelatedChanges) {\n      const config = this.config();\n      this.eventBusService.emit(WhiteboardEvent.ZoomChange, {\n        zoom: config.zoom,\n      });\n    }\n    if (emitEvent) {\n      this.eventBusService.emit(WhiteboardEvent.ConfigChange, this.config());\n    }\n  }\n\n  isConfigDifferent(key: keyof WhiteboardConfig, value: WhiteboardConfig[keyof WhiteboardConfig]): boolean {\n    return this.config()[key] !== value;\n  }\n\n  updateConfigValue(key: keyof WhiteboardConfig, value: WhiteboardConfig[keyof WhiteboardConfig]): void {\n    this.config.update((current) => ({ ...current, [key]: value }));\n    this.eventBusService.emit(WhiteboardEvent.ConfigChange, this.config());\n  }\n\n  updateEditorConfigValue(key: keyof EditorConfig, value: EditorConfig[keyof EditorConfig]): void {\n    this.editorConfig.update((current) => ({ ...current, [key]: value }));\n  }\n\n  checkAndUpdateConfig(key: keyof WhiteboardConfig, value: WhiteboardConfig[keyof WhiteboardConfig]): void {\n    if (this.isConfigDifferent(key, value)) {\n      this.updateConfigValue(key, value);\n    }\n  }\n\n  getConfigValue<K extends keyof WhiteboardConfig>(key: K): WhiteboardConfig[K] {\n    return this.config()[key];\n  }\n\n  setConfigValue<K extends keyof WhiteboardConfig>(key: K, value: WhiteboardConfig[K]): void {\n    this.config.update((current) => ({ ...current, [key]: value }));\n    this.eventBusService.emit(WhiteboardEvent.ConfigChange, this.config());\n  }\n\n  getConfigKeys(): (keyof WhiteboardConfig)[] {\n    return Object.keys(this.config()) as (keyof WhiteboardConfig)[];\n  }\n\n  getConfigValues(): WhiteboardConfig[keyof WhiteboardConfig][] {\n    return Object.values(this.config()) as WhiteboardConfig[keyof WhiteboardConfig][];\n  }\n}\n","import { Injectable, Renderer2, RendererFactory2, Signal, computed } from '@angular/core';\nimport { ConfigService } from '../config/config.service';\nimport { EventBusService } from '../event-bus/event-bus.service';\nimport { WhiteboardConfig } from '../types';\nimport { WhiteboardEvent } from '../types/events';\n\n@Injectable({ providedIn: 'root' })\nexport class CanvasService {\n  private renderer: Renderer2;\n  private svgContainer: SVGSVGElement | null = null;\n\n  private transform = computed(() => {\n    const { zoom, x, y } = this.getConfig();\n    return `translate(${x}, ${y}) scale(${zoom})`;\n  });\n\n  constructor(\n    private configService: ConfigService,\n    private eventBusService: EventBusService,\n    rendererFactory: RendererFactory2\n  ) {\n    this.renderer = rendererFactory.createRenderer(null, null);\n  }\n\n  initializeCanvas(svgContainer: SVGSVGElement): void {\n    this.svgContainer = svgContainer;\n    const { fullScreen, center } = this.getConfig();\n\n    if (!fullScreen && center) {\n      setTimeout(() => {\n        this.centerCanvas();\n      }, 0);\n    }\n\n    this.eventBusService.emit(WhiteboardEvent.Ready);\n  }\n\n  getCanvas(): SVGSVGElement {\n    if (!this.svgContainer) {\n      throw new Error('SVG container not initialized');\n    }\n    return this.svgContainer;\n  }\n\n  isCanvasInitialized(): boolean {\n    return this.svgContainer !== null;\n  }\n\n  getConfig(): WhiteboardConfig {\n    return this.configService.getConfig();\n  }\n\n  setCanvasDimensions(width: number, height: number): void {\n    this.configService.updateConfig({ canvasWidth: width, canvasHeight: height });\n  }\n\n  setCanvasPosition(x: number, y: number): void {\n    this.configService.updateConfig({ x, y });\n  }\n\n  getCanvasDimensions(): { width: number; height: number } {\n    const config = this.getConfig();\n    return {\n      width: config.canvasWidth,\n      height: config.canvasHeight,\n    };\n  }\n\n  getCanvasPosition(): { x: number; y: number } {\n    const config = this.getConfig();\n    return { x: config.x, y: config.y };\n  }\n\n  getContainerDimensions(): { width: number; height: number } {\n    if (!this.svgContainer) {\n      return { width: 0, height: 0 };\n    }\n\n    return {\n      width: this.svgContainer.clientWidth || 0,\n      height: this.svgContainer.clientHeight || 0,\n    };\n  }\n\n  fullScreen(): void {\n    const { width, height } = this.getContainerDimensions();\n\n    this.setCanvasDimensions(width, height);\n    this.configService.updateConfig({ fullScreen: true });\n    this.centerCanvas();\n  }\n\n  exitFullScreen(defaultWidth = 800, defaultHeight = 600): void {\n    this.setCanvasDimensions(defaultWidth, defaultHeight);\n\n    this.configService.updateConfig({\n      fullScreen: false,\n      zoom: 1,\n    });\n\n    this.centerCanvas();\n  }\n\n  centerCanvas(): void {\n    const { fullScreen } = this.getConfig();\n\n    if (fullScreen) {\n      this.configService.updateConfig({ x: 0, y: 0, canvasX: 0, canvasY: 0 });\n    } else {\n      const { canvasWidth, canvasHeight, zoom, center } = this.getConfig();\n      const { width: containerWidth, height: containerHeight } = this.getContainerDimensions();\n\n      const scaledWidth = canvasWidth * zoom;\n      const scaledHeight = canvasHeight * zoom;\n\n      const canvasX = (containerWidth - scaledWidth) / 2;\n      const canvasY = (containerHeight - scaledHeight) / 2;\n\n      const x = center ? canvasWidth / 2 : 0;\n      const y = center ? canvasHeight / 2 : 0;\n\n      this.configService.updateConfig({ x, y, canvasX, canvasY });\n    }\n  }\n\n  resetCanvas(): void {\n    this.configService.updateConfig({\n      x: 0,\n      y: 0,\n      zoom: 1,\n      canvasX: 0,\n      canvasY: 0,\n    });\n  }\n\n  toggleGrid(): void {\n    const { enableGrid } = this.getConfig();\n    this.configService.updateConfig({ enableGrid: !enableGrid });\n  }\n\n  setGridVisible(visible: boolean): void {\n    this.configService.updateConfig({ enableGrid: visible });\n  }\n\n  setGridSize(size: number): void {\n    this.configService.updateConfig({ gridSize: size });\n  }\n\n  toggleSnapToGrid(): void {\n    const { snapToGrid } = this.getConfig();\n    this.configService.updateConfig({ snapToGrid: !snapToGrid });\n  }\n\n  getTransform(): Signal<string> {\n    return this.transform;\n  }\n\n  getTransformString(): string {\n    return this.transform();\n  }\n\n  screenToCanvas(screenX: number, screenY: number): { x: number; y: number } {\n    const { zoom, x, y } = this.getConfig();\n\n    return {\n      x: (screenX - x) / zoom,\n      y: (screenY - y) / zoom,\n    };\n  }\n\n  canvasToScreen(canvasX: number, canvasY: number): { x: number; y: number } {\n    const { zoom, x, y } = this.getConfig();\n\n    return {\n      x: canvasX * zoom + x,\n      y: canvasY * zoom + y,\n    };\n  }\n\n  getVisibleBounds(): { left: number; top: number; right: number; bottom: number } {\n    const { zoom, x, y } = this.getConfig();\n    const { width, height } = this.getContainerDimensions();\n\n    return {\n      left: -x / zoom,\n      top: -y / zoom,\n      right: (-x + width) / zoom,\n      bottom: (-y + height) / zoom,\n    };\n  }\n\n  isPointVisible(x: number, y: number): boolean {\n    const bounds = this.getVisibleBounds();\n    return x >= bounds.left && x <= bounds.right && y >= bounds.top && y <= bounds.bottom;\n  }\n\n  isRectVisible(x: number, y: number, width: number, height: number): boolean {\n    const bounds = this.getVisibleBounds();\n\n    return !(x + width < bounds.left || x > bounds.right || y + height < bounds.top || y > bounds.bottom);\n  }\n\n  getCanvasDimensionsProvider(): () => { width: number; height: number } {\n    return () => this.getCanvasDimensions();\n  }\n\n  getContainerDimensionsProvider(): () => { width: number; height: number } {\n    return () => this.getContainerDimensions();\n  }\n\n  protected transformCoordinates(x: number, y: number): { x: number; y: number } {\n    return { x, y };\n  }\n\n  protected validateZoom(zoom: number): number {\n    return Math.max(0.1, Math.min(10, zoom));\n  }\n}\n","import { signal, Injectable } from '@angular/core';\nimport { WhiteboardElement } from '../types';\n\ninterface HistoryEntry {\n  before: WhiteboardElement[];\n  after: WhiteboardElement[];\n  description: string;\n  timestamp: number;\n}\n\nexport interface BatchHandle {\n  execute: () => void;\n  clear: () => void;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class HistoryService {\n  private undoStack: HistoryEntry[] = [];\n  private redoStack: HistoryEntry[] = [];\n  private readonly MAX_HISTORY = 50;\n\n  // Signals\n  private canUndoSignal = signal(false);\n  private canRedoSignal = signal(false);\n  private undoDescriptionSignal = signal<string | undefined>(undefined);\n  private redoDescriptionSignal = signal<string | undefined>(undefined);\n\n  private batching = false;\n  private batchDepth = 0;\n  private batchBeforeSnapshot: WhiteboardElement[] | null = null;\n  private batchDescription = 'Batch operation';\n  private pendingBatchAfter: WhiteboardElement[] | null = null;\n\n  getCanUndoSignal() {\n    return this.canUndoSignal.asReadonly();\n  }\n  getCanRedoSignal() {\n    return this.canRedoSignal.asReadonly();\n  }\n  getUndoDescriptionSignal() {\n    return this.undoDescriptionSignal.asReadonly();\n  }\n  getRedoDescriptionSignal() {\n    return this.redoDescriptionSignal.asReadonly();\n  }\n\n  recordChange(before: WhiteboardElement[], after: WhiteboardElement[], description: string) {\n    if (this.batching) {\n      return;\n    }\n\n    if (!this.snapshotsEqual(before, after)) {\n      this.pushHistory({\n        before: this.cloneElements(before),\n        after: this.cloneElements(after),\n        description,\n        timestamp: Date.now(),\n      });\n    }\n  }\n\n  recordElementCreation(before: WhiteboardElement[], after: WhiteboardElement[]) {\n    this.recordChange(before, after, 'Create element');\n  }\n  recordElementUpdate(before: WhiteboardElement[], after: WhiteboardElement[]) {\n    this.recordChange(before, after, 'Update element');\n  }\n  recordElementDeletion(before: WhiteboardElement[], after: WhiteboardElement[]) {\n    this.recordChange(before, after, 'Delete element');\n  }\n  recordClear(before: WhiteboardElement[], after: WhiteboardElement[]) {\n    this.recordChange(before, after, 'Clear whiteboard');\n  }\n\n  startBatch(description: string, beforeSnapshot: WhiteboardElement[]): BatchHandle {\n    if (this.batchDepth === 0) {\n      this.batchBeforeSnapshot = this.cloneElements(beforeSnapshot);\n      this.batchDescription = description;\n      this.batching = true;\n    }\n    this.batchDepth++;\n    return {\n      execute: () => this.finishBatchCommit(),\n      clear: () => this.cancelBatch(),\n    };\n  }\n\n  completeBatch(afterSnapshot: WhiteboardElement[]) {\n    if (!this.batching) return;\n    this.pendingBatchAfter = this.cloneElements(afterSnapshot);\n  }\n\n  private finishBatchCommit() {\n    this.batchDepth = Math.max(0, this.batchDepth - 1);\n    if (this.batchDepth > 0) return;\n    if (!this.batching || !this.batchBeforeSnapshot) {\n      this.resetBatchState();\n      return;\n    }\n    const after = this.pendingBatchAfter ?? this.batchBeforeSnapshot;\n    if (!this.snapshotsEqual(this.batchBeforeSnapshot, after)) {\n      this.pushHistory({\n        before: this.batchBeforeSnapshot,\n        after,\n        description: this.batchDescription,\n        timestamp: Date.now(),\n      });\n    }\n    this.resetBatchState();\n  }\n\n  private cancelBatch() {\n    this.batchDepth = 0;\n    this.resetBatchState();\n  }\n\n  private resetBatchState() {\n    this.batching = false;\n    this.batchBeforeSnapshot = null;\n    this.batchDescription = 'Batch operation';\n  }\n\n  undo(): WhiteboardElement[] | null {\n    return this.performUndo();\n  }\n\n  redo(): WhiteboardElement[] | null {\n    return this.performRedo();\n  }\n\n  clearHistory(): void {\n    this.undoStack = [];\n    this.redoStack = [];\n    this.updateSignals();\n  }\n\n  private performUndo(): WhiteboardElement[] | null {\n    if (this.undoStack.length === 0) return null;\n    const entry = this.undoStack.pop();\n    if (!entry) return null;\n    this.redoStack.push(entry);\n    this.updateSignals();\n    return this.cloneElements(entry.before);\n  }\n\n  private performRedo(): WhiteboardElement[] | null {\n    if (this.redoStack.length === 0) return null;\n    const entry = this.redoStack.pop();\n    if (!entry) return null;\n    this.undoStack.push(entry);\n    this.updateSignals();\n    return this.cloneElements(entry.after);\n  }\n\n  private pushHistory(entry: HistoryEntry) {\n    this.undoStack.push(entry);\n    if (this.undoStack.length > this.MAX_HISTORY) this.undoStack.shift();\n    this.redoStack = [];\n    this.updateSignals();\n  }\n\n  private updateSignals() {\n    this.canUndoSignal.set(this.undoStack.length > 0);\n    this.canRedoSignal.set(this.redoStack.length > 0);\n    this.undoDescriptionSignal.set(this.undoStack[this.undoStack.length - 1]?.description);\n    this.redoDescriptionSignal.set(this.redoStack[this.redoStack.length - 1]?.description);\n  }\n\n  private cloneElements(elements: WhiteboardElement[]): WhiteboardElement[] {\n    interface PointElement {\n      points?: [number, number][];\n    }\n    return elements.map((el) => {\n      const cloned: WhiteboardElement = { ...el };\n      const maybePoints = (el as unknown as PointElement).points;\n      if (Array.isArray(maybePoints)) {\n        (cloned as unknown as PointElement).points = maybePoints.map((pt) => [...pt]) as [number, number][];\n      }\n      return cloned;\n    });\n  }\n\n  private snapshotsEqual(a: WhiteboardElement[], b: WhiteboardElement[]): boolean {\n    if (a.length !== b.length) return false;\n    const byIdA = new Map(a.map((e) => [e.id, e] as const));\n    for (const el of b) {\n      const prev = byIdA.get(el.id);\n      if (!prev) return false;\n      if (JSON.stringify(prev) !== JSON.stringify(el)) return false;\n    }\n    return true;\n  }\n}\n","/**\n * Initiates the download of a file from a given URL.\n */\nexport function downloadFile(url: string, name?: string): void {\n  const link = document.createElement('a');\n  link.href = url;\n  link.setAttribute('visibility', 'hidden');\n  link.download = name || 'new white-board';\n  document.body.appendChild(link);\n  link.click();\n  document.body.removeChild(link);\n}\n\n/**\n * Creates a debounced function that delays invoking the provided function until after a specified wait time.\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n  func: T,\n  delay: number\n): (...args: Parameters<T>) => void {\n  let timer: ReturnType<typeof setTimeout>;\n\n  return (...args: Parameters<T>) => {\n    clearTimeout(timer);\n    timer = setTimeout(() => func(...args), delay);\n  };\n}\n","/**\n * Generates a unique identifier with a consistent length.\n */\nexport function generateId(): string {\n  const randomStr = Math.random().toString(36).substring(2);\n  return randomStr.padEnd(12, '0').substring(0, 12);\n}\n\n/**\n * Generates a UUID (Universally Unique Identifier).\n * Uses crypto.randomUUID() when available (secure contexts like HTTPS or localhost).\n * Falls back to a compliant UUID v4 generator for insecure contexts.\n *\n * @returns A UUID string in the format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\n */\nexport function generateUUID(): string {\n  // Try to use native crypto.randomUUID() if available\n  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n    try {\n      return crypto.randomUUID();\n    } catch (e) {\n      // Fall through to fallback if crypto.randomUUID() throws (insecure context)\n    }\n  }\n\n  // Fallback: RFC4122 compliant UUID v4 generator\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n    const r = (Math.random() * 16) | 0;\n    const v = c === 'x' ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n}\n","export const SELECTOR_GROUP_ID = 'selectorGroup';\nexport const SVG_ROOT_ID = 'svgroot';\nexport const ITEM_PREFIX = 'item_';\nexport const SELECTOR_BOX = 'selectorBox';\nexport const SELECTOR_GRIP_PREFIX = 'selectorGrip_';\nexport const SELECTOR_GRIP_RESIZE = 'selectorGrip_resize';\nexport const SELECTOR_GRIP_ROTATE = 'selectorGrip_rotate';\nexport const ENDPOINT_HANDLE_PREFIX = 'endpointHandle_';\nexport const CURVE_HANDLE_PREFIX = 'curveHandle_';\nexport const MAX_STACK_SIZE = 1000;\nexport const DATA_ID = 'data-wb-id';\n\nexport const PRIORITY_WEIGHTS = {\n  high: 3,\n  normal: 2,\n  low: 1,\n};\n\nexport const ZOOM_STEP = 0.25;\nexport const MIN_ZOOM = 0.1;\nexport const MAX_ZOOM = 5.0;\nexport const DEFAULT_ZOOM = 1.0;\n\nexport const PAN_SENSITIVITY = 0.5;\n\nexport const MOUSE_BUTTON = {\n  LEFT: 0,\n  MIDDLE: 1,\n  RIGHT: 2,\n} as const;\n\nexport const TEMPORARY_TOOL_ID = {\n  PAN_MIDDLE: 'pan-middle',\n  PAN_SPACE: 'pan-space',\n} as const;\n\nexport const MIME_TYPE = {\n  HTML: 'text/html',\n  PLAIN: 'text/plain',\n  JSON: 'application/json',\n} as const;\n\nexport const DROP_EFFECT = {\n  COPY: 'copy',\n} as const;\n\nexport const KEY = {\n  ESCAPE: 'Escape',\n  ENTER: 'Enter',\n  SPACE: 'Space',\n  DELETE: 'Delete',\n  BACKSPACE: 'Backspace',\n  ARROW_UP: 'ArrowUp',\n  ARROW_DOWN: 'ArrowDown',\n  ARROW_LEFT: 'ArrowLeft',\n  ARROW_RIGHT: 'ArrowRight',\n  TAB: 'Tab',\n} as const;\n\nexport const KEY_LOWER = {\n  ESCAPE: 'escape',\n  ENTER: 'enter',\n  SPACE: 'space',\n  DELETE: 'delete',\n  BACKSPACE: 'backspace',\n  ARROW_UP: 'arrowup',\n  ARROW_DOWN: 'arrowdown',\n  ARROW_LEFT: 'arrowleft',\n  ARROW_RIGHT: 'arrowright',\n  TAB: 'tab',\n} as const;\n\nexport const FILE_TYPE_PREFIX = {\n  IMAGE: 'image/',\n} as const;\n\nexport const MOVEMENT = {\n  SMALL_STEP: 1,\n  LARGE_STEP: 10,\n} as const;\n","import { Point, Direction } from '../../types';\n\n/** Geometric computation utilities for angle calculations, line operations, collision detection, and vector math. */\n\n/** Epsilon value for floating-point comparisons. */\nexport const EPSILON = 0.000001;\n\n/** Calculates the angle in degrees between a center point and a target point. */\nexport function calculateAngle(center: Point, point: Point): number {\n  return Math.atan2(point.y - center.y, point.x - center.x) * (180 / Math.PI);\n}\n\n/** Normalizes an angle to the range [0, 360) degrees. */\nexport function normalizeAngle(angle: number): number {\n  angle = angle % 360;\n  return angle < 0 ? angle + 360 : angle;\n}\n\n/** Returns a constrained movement offset (horizontal or vertical only). */\nexport function getSnappedOffset(dx: number, dy: number): Point {\n  return Math.abs(dx) > Math.abs(dy) ? { x: dx, y: 0 } : { x: 0, y: dy };\n}\n\n/** Calculates the shortest distance from a point to a line segment. */\nexport function pointToLineDistance(px: number, py: number, lineStart: Point, lineEnd: Point): number {\n  const x1 = lineStart.x;\n  const y1 = lineStart.y;\n  const x2 = lineEnd.x;\n  const y2 = lineEnd.y;\n\n  const lineLengthSquared = (x2 - x1) ** 2 + (y2 - y1) ** 2;\n\n  if (lineLengthSquared === 0) {\n    return Math.sqrt((px - x1) ** 2 + (py - y1) ** 2);\n  }\n\n  let t = ((px - x1) * (x2 - x1) + (py - y1) * (y2 - y1)) / lineLengthSquared;\n  t = Math.max(0, Math.min(1, t));\n\n  const closestX = x1 + t * (x2 - x1);\n  const closestY = y1 + t * (y2 - y1);\n\n  return Math.sqrt((px - closestX) ** 2 + (py - closestY) ** 2);\n}\n\n/** Tests whether two line segments intersect. */\nexport function lineSegmentsIntersect(p1: Point, p2: Point, q1: Point, q2: Point, threshold = EPSILON): boolean {\n  const cross = (v1: Point, v2: Point) => v1.x * v2.y - v1.y * v2.x;\n  const subtract = (v1: Point, v2: Point): Point => ({ x: v1.x - v2.x, y: v1.y - v2.y });\n\n  const r = subtract(p2, p1);\n  const s = subtract(q2, q1);\n  const qp = subtract(q1, p1);\n  const rsCross = cross(r, s);\n  const qpCrossR = cross(qp, r);\n\n  if (Math.abs(rsCross) < threshold) {\n    if (Math.abs(qpCrossR) >= threshold) {\n      return false;\n    }\n\n    const rdotr = r.x * r.x + r.y * r.y;\n    const t0 = (qp.x * r.x + qp.y * r.y) / rdotr;\n    const s_qp = subtract(q2, p1);\n    const t1 = (s_qp.x * r.x + s_qp.y * r.y) / rdotr;\n\n    return (t0 >= 0 && t0 <= 1) || (t1 >= 0 && t1 <= 1) || (t0 < 0 && t1 > 1) || (t0 > 1 && t1 < 0);\n  }\n\n  const t = qpCrossR / rsCross;\n  const u = cross(qp, s) / rsCross;\n\n  return t >= 0 && t <= 1 && u >= 0 && u <= 1;\n}\n\n/** Tests if an element's bounding box intersects with a selection box. */\nexport function isElementInSelectionBox(\n  bounds: { minX: number; minY: number; maxX: number; maxY: number },\n  selectionBox: { x: number; y: number; width: number; height: number }\n): boolean {\n  return (\n    bounds.minX <= selectionBox.x + selectionBox.width &&\n    bounds.maxX >= selectionBox.x &&\n    bounds.minY <= selectionBox.y + selectionBox.height &&\n    bounds.maxY >= selectionBox.y\n  );\n}\n\n/** Calculates the rotated direction based on rotation angle. */\nexport function getRotatedDirection(direction: Direction, rotation: number): Direction {\n  const normalizedRotation = Math.round(normalizeAngle(rotation) / 45) % 8;\n  const directionValues = Object.values(Direction);\n  const currentIndex = directionValues.indexOf(direction);\n  const newIndex = (currentIndex + normalizedRotation) % 8;\n  return directionValues[newIndex];\n}\n","import { Bounds, Point } from '../../types';\nimport { lineSegmentsIntersect, pointToLineDistance } from '../geometry/geometry';\n\n/** Tests if a line segment intersects with a bounding box. */\nexport function hitTestBoundingBox(bounds: Bounds, pointA: Point, pointB: Point, threshold: number): boolean {\n  const edges: [Point, Point][] = [\n    [\n      { x: bounds.minX, y: bounds.minY },\n      { x: bounds.maxX, y: bounds.minY },\n    ],\n    [\n      { x: bounds.maxX, y: bounds.minY },\n      { x: bounds.maxX, y: bounds.maxY },\n    ],\n    [\n      { x: bounds.maxX, y: bounds.maxY },\n      { x: bounds.minX, y: bounds.maxY },\n    ],\n    [\n      { x: bounds.minX, y: bounds.maxY },\n      { x: bounds.minX, y: bounds.minY },\n    ],\n  ];\n\n  for (const [edgeStart, edgeEnd] of edges) {\n    if (lineSegmentsIntersect(pointA, pointB, edgeStart, edgeEnd, threshold)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/** Tests if a line segment intersects with an ellipse. */\nexport function hitTestEllipse(\n  cx: number,\n  cy: number,\n  rx: number,\n  ry: number,\n  pointA: Point,\n  pointB: Point,\n  threshold: number\n): boolean {\n  return pointToLineDistance(cx, cy, pointA, pointB) <= Math.max(rx, ry) + threshold;\n}\n\n/** Tests if a line segment intersects with another line segment. */\nexport function hitTestLine(\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n  pointA: Point,\n  pointB: Point,\n  threshold: number\n): boolean {\n  const lineStart: Point = { x: x1, y: y1 };\n  const lineEnd: Point = { x: x2, y: y2 };\n\n  return (\n    pointToLineDistance(pointA.x, pointA.y, lineStart, lineEnd) <= threshold ||\n    pointToLineDistance(pointB.x, pointB.y, lineStart, lineEnd) <= threshold\n  );\n}\n\n/** Tests if a line segment intersects with a pen stroke. */\nexport function hitTestPen(points: [number, number][], pointA: Point, pointB: Point, threshold: number): boolean {\n  for (let i = 0; i < points.length - 1; i++) {\n    const segmentStart: Point = { x: points[i][0], y: points[i][1] };\n    const segmentEnd: Point = { x: points[i + 1][0], y: points[i + 1][1] };\n    if (\n      pointToLineDistance(pointA.x, pointA.y, segmentStart, segmentEnd) <= threshold ||\n      pointToLineDistance(pointB.x, pointB.y, segmentStart, segmentEnd) <= threshold\n    ) {\n      return true;\n    }\n  }\n\n  return false;\n}\n","/**\n * Vector math utilities for stroke generation.\n */\n\n/** Add vectors. */\nexport function add(A: number[], B: number[]) {\n  return [A[0] + B[0], A[1] + B[1]];\n}\n\n/** Subtract vectors. */\nexport function sub(A: number[], B: number[]) {\n  return [A[0] - B[0], A[1] - B[1]];\n}\n\n/** Vector multiplication by scalar. */\nexport function mul(A: number[], n: number) {\n  return [A[0] * n, A[1] * n];\n}\n\n/** Vector division by scalar. */\nexport function div(A: number[], n: number) {\n  return [A[0] / n, A[1] / n];\n}\n\n/** Length of the vector squared. */\nfunction len2(A: number[]) {\n  return A[0] * A[0] + A[1] * A[1];\n}\n\n/** Length from A to B squared. */\nexport function dist2(A: number[], B: number[]) {\n  return len2(sub(A, B));\n}\n\n/** Distance from A to B. */\nexport function dist(A: number[], B: number[]) {\n  return Math.hypot(A[1] - B[1], A[0] - B[0]);\n}\n\n/** Interpolate vector A to B with a scalar t. */\nexport function lrp(A: number[], B: number[], t: number) {\n  return add(A, mul(sub(B, A), t));\n}\n\nexport function toPoint(arr: number[]): number[] {\n  const x = arr[0] !== undefined ? arr[0] : 0;\n  const y = arr[1] !== undefined ? arr[1] : 0;\n  const pressure = arr[2] !== undefined ? arr[2] : 1;\n  return [x, y, pressure];\n}\n\nexport function equals(a: number[], b: number[]): boolean {\n  return Math.abs(a[0] - b[0]) < 0.0001 && Math.abs(a[1] - b[1]) < 0.0001;\n}\n","import {\n  ArrowBinding,\n  ArrowPathType,\n  BaseElement,\n  Bounds,\n  Direction,\n  ElementType,\n  ElementUtil,\n  Point,\n  defaultArrowPath,\n  defaultElementStyle,\n} from '../types';\nimport { generateId } from '../utils/common';\nimport { hitTestLine } from '../utils/drawing';\n\nexport enum ArrowheadType {\n  None = 'none',\n  Arrow = 'arrow',\n  OpenArrow = 'open-arrow',\n  Diamond = 'diamond',\n  OpenDiamond = 'open-diamond',\n  Circle = 'circle',\n  OpenCircle = 'open-circle',\n  Bar = 'bar',\n}\n\nexport interface ArrowheadConfig {\n  type: ArrowheadType;\n}\n\nexport const defaultStartHead: ArrowheadConfig = {\n  type: ArrowheadType.OpenArrow,\n};\n\nexport const defaultEndHead: ArrowheadConfig = {\n  type: ArrowheadType.Arrow,\n};\n\nexport interface ArrowElement extends BaseElement {\n  type: ElementType.Arrow;\n  x1: number;\n  y1: number;\n  x2: number;\n  y2: number;\n  startHead: ArrowheadConfig;\n  endHead: ArrowheadConfig;\n  startBinding: ArrowBinding | null;\n  endBinding: ArrowBinding | null;\n  pathType: ArrowPathType;\n}\n\nexport class ArrowElementUtil implements ElementUtil<ArrowElement> {\n  create(props: Partial<ArrowElement>): ArrowElement {\n    return {\n      type: ElementType.Arrow,\n      id: generateId(),\n      x: 0,\n      y: 0,\n      x1: 0,\n      y1: 0,\n      x2: 0,\n      y2: 0,\n      rotation: 0,\n      opacity: 100,\n      zIndex: 1,\n      selectAfterDraw: true,\n      startBinding: null,\n      endBinding: null,\n      pathType: defaultArrowPath,\n      ...props,\n      style: {\n        ...defaultElementStyle,\n        ...props.style,\n      },\n      startHead: {\n        ...defaultStartHead,\n        ...props.startHead,\n      },\n      endHead: {\n        ...defaultEndHead,\n        ...props.endHead,\n      },\n    };\n  }\n  resize(element: ArrowElement, direction: Direction, dx: number, dy: number): ArrowElement {\n    if (direction.includes(Direction.N)) element.y2 += dy;\n    if (direction.includes(Direction.S)) element.y1 += dy;\n    if (direction.includes(Direction.W)) element.x1 += dx;\n    if (direction.includes(Direction.E)) element.x2 += dx;\n    return element;\n  }\n\n  getBounds(element: ArrowElement): Bounds {\n    const x1 = element.x1 + element.x;\n    const y1 = element.y1 + element.y;\n    const x2 = element.x2 + element.x;\n    const y2 = element.y2 + element.y;\n\n    return {\n      minX: Math.min(x1, x2),\n      minY: Math.min(y1, y2),\n      maxX: Math.max(x1, x2),\n      maxY: Math.max(y1, y2),\n      width: Math.abs(x2 - x1),\n      height: Math.abs(y2 - y1),\n    };\n  }\n\n  hitTest(element: ArrowElement, pointA: Point, pointB: Point, threshold: number): boolean {\n    const { x1, y1, x2, y2 } = element;\n    return hitTestLine(x1, y1, x2, y2, pointA, pointB, threshold);\n  }\n}\n","import { BaseElement, Bounds, Direction, ElementType, ElementUtil, Point, defaultElementStyle } from '../types';\nimport { generateId } from '../utils/common';\nimport { hitTestEllipse } from '../utils/drawing';\n\nexport interface EllipseElement extends BaseElement {\n  type: ElementType.Ellipse;\n  cx: number;\n  cy: number;\n  rx: number;\n  ry: number;\n}\n\nexport class EllipseElementUtil implements ElementUtil<EllipseElement> {\n  create(props: Partial<EllipseElement>): EllipseElement {\n    return {\n      type: ElementType.Ellipse,\n      id: generateId(),\n      x: 0,\n      y: 0,\n      cx: 0,\n      cy: 0,\n      rx: 1,\n      ry: 1,\n      rotation: 0,\n      opacity: 100,\n      zIndex: 1, // Default zIndex, will be overridden by tools\n      selectAfterDraw: true, // Ellipses should be selected after drawing by default\n      ...props,\n      style: {\n        ...defaultElementStyle,\n        ...props.style,\n      },\n    };\n  }\n\n  resize(element: EllipseElement, direction: Direction, dx: number, dy: number): EllipseElement {\n    if (direction.includes(Direction.N)) {\n      const newRy = element.ry - dy / 2;\n      if (newRy > 0) {\n        element.ry = newRy;\n        element.cy += dy / 2;\n      }\n    }\n    if (direction.includes(Direction.S)) {\n      const newRy = element.ry + dy / 2;\n      if (newRy > 0) {\n        element.ry = newRy;\n        element.cy += dy / 2;\n      }\n    }\n    if (direction.includes(Direction.W)) {\n      const newRx = element.rx - dx / 2;\n      if (newRx > 0) {\n        element.rx = newRx;\n        element.cx += dx / 2;\n      }\n    }\n    if (direction.includes(Direction.E)) {\n      const newRx = element.rx + dx / 2;\n      if (newRx > 0) {\n        element.rx = newRx;\n        element.cx += dx / 2;\n      }\n    }\n\n    return element;\n  }\n\n  getBounds(element: EllipseElement): Bounds {\n    const globalCx = element.cx + element.x;\n    const globalCy = element.cy + element.y;\n\n    return {\n      minX: globalCx - element.rx,\n      minY: globalCy - element.ry,\n      maxX: globalCx + element.rx,\n      maxY: globalCy + element.ry,\n      width: element.rx * 2,\n      height: element.ry * 2,\n    };\n  }\n\n  hitTest(element: EllipseElement, pointA: Point, pointB: Point, threshold: number): boolean {\n    const { cx, cy, rx, ry } = element;\n    return hitTestEllipse(cx, cy, rx, ry, pointA, pointB, threshold);\n  }\n}\n","import { BaseElement, Bounds, Direction, ElementType, ElementUtil, Point, defaultElementStyle } from '../types';\nimport { generateId } from '../utils/common';\nimport { hitTestBoundingBox } from '../utils/drawing';\n\nexport interface ImageElement extends BaseElement {\n  type: ElementType.Image;\n  width: number;\n  height: number;\n  src: string | ArrayBuffer;\n}\n\nexport class ImageElementUtil implements ElementUtil<ImageElement> {\n  create(props: Partial<ImageElement>): ImageElement {\n    return {\n      type: ElementType.Image,\n      id: generateId(),\n      x: 0,\n      y: 0,\n      width: 1,\n      height: 1,\n      src: '',\n      rotation: 0,\n      opacity: 100,\n      zIndex: 1, // Default zIndex, will be overridden by tools\n      selectAfterDraw: true, // Images should be selected after drawing by default\n      ...props,\n      style: {\n        ...defaultElementStyle,\n        ...props.style,\n      },\n    };\n  }\n\n  resize(element: ImageElement, direction: Direction, dx: number, dy: number): ImageElement {\n    if (direction.includes(Direction.N)) {\n      const newHeight = element.height - dy;\n      if (newHeight > 0) {\n        element.y += dy;\n        element.height = newHeight;\n      }\n    }\n    if (direction.includes(Direction.S)) {\n      const newHeight = element.height + dy;\n      if (newHeight > 0) {\n        element.height = newHeight;\n      }\n    }\n    if (direction.includes(Direction.W)) {\n      const newWidth = element.width - dx;\n      if (newWidth > 0) {\n        element.x += dx;\n        element.width = newWidth;\n      }\n    }\n    if (direction.includes(Direction.E)) {\n      const newWidth = element.width + dx;\n      if (newWidth > 0) {\n        element.width = newWidth;\n      }\n    }\n    return element;\n  }\n\n  getBounds(element: ImageElement): Bounds {\n    return {\n      minX: element.x,\n      minY: element.y,\n      maxX: element.x + element.width,\n      maxY: element.y + element.height,\n      width: element.width,\n      height: element.height,\n    };\n  }\n\n  hitTest(element: ImageElement, pointA: Point, pointB: Point, threshold: number): boolean {\n    const bounds = this.getBounds(element);\n    return hitTestBoundingBox(bounds, pointA, pointB, threshold);\n  }\n}\n","import { BaseElement, Bounds, Direction, ElementType, ElementUtil, Point, defaultElementStyle } from '../types';\nimport { generateId } from '../utils/common';\nimport { hitTestLine } from '../utils/drawing';\n\nexport interface LineElement extends BaseElement {\n  type: ElementType.Line;\n  x1: number;\n  y1: number;\n  x2: number;\n  y2: number;\n}\n\nexport class LineElementUtil implements ElementUtil<LineElement> {\n  create(props: Partial<LineElement>): LineElement {\n    return {\n      type: ElementType.Line,\n      id: generateId(),\n      x: 0,\n      y: 0,\n      x1: 0,\n      y1: 0,\n      x2: 0,\n      y2: 0,\n      rotation: 0,\n      opacity: 100,\n      zIndex: 1, // Default zIndex, will be overridden by tools\n      selectAfterDraw: true, // Lines should be selected after drawing by default\n      ...props,\n      style: {\n        ...defaultElementStyle,\n        ...props.style,\n      },\n    };\n  }\n\n  resize(element: LineElement, direction: Direction, dx: number, dy: number): LineElement {\n    if (direction.includes(Direction.N)) element.y1 += dy;\n    if (direction.includes(Direction.S)) element.y2 += dy;\n    if (direction.includes(Direction.W)) element.x1 += dx;\n    if (direction.includes(Direction.E)) element.x2 += dx;\n    return element;\n  }\n\n  getBounds(element: LineElement): Bounds {\n    const x1 = element.x1 + element.x;\n    const y1 = element.y1 + element.y;\n    const x2 = element.x2 + element.x;\n    const y2 = element.y2 + element.y;\n\n    return {\n      minX: Math.min(x1, x2),\n      minY: Math.min(y1, y2),\n      maxX: Math.max(x1, x2),\n      maxY: Math.max(y1, y2),\n      width: Math.abs(x2 - x1),\n      height: Math.abs(y2 - y1),\n    };\n  }\n\n  hitTest(element: LineElement, pointA: Point, pointB: Point, threshold: number): boolean {\n    const { x1, y1, x2, y2 } = element;\n    return hitTestLine(x1, y1, x2, y2, pointA, pointB, threshold);\n  }\n}\n","import { Bounds, Point } from '../../types';\n\n/** Utilities for working with axis-aligned bounding boxes (AABB). */\n\n/** Calculates the axis-aligned bounding box for a set of 2D points. */\nexport function calculateBoundingBox(points: number[][]): Bounds {\n  if (points.length === 0) {\n    throw new Error('Cannot calculate bounding box for empty points array');\n  }\n\n  let minX = Infinity;\n  let minY = Infinity;\n  let maxX = -Infinity;\n  let maxY = -Infinity;\n\n  for (const [x, y] of points) {\n    minX = Math.min(minX, x);\n    minY = Math.min(minY, y);\n    maxX = Math.max(maxX, x);\n    maxY = Math.max(maxY, y);\n  }\n\n  return {\n    minX,\n    minY,\n    maxX,\n    maxY,\n    width: maxX - minX,\n    height: maxY - minY,\n  };\n}\n\n/** Checks if two axis-aligned bounding boxes intersect or overlap. */\nexport function doBoundingBoxesIntersect(box1: Bounds, box2: Bounds): boolean {\n  return box1.minX <= box2.maxX && box1.maxX >= box2.minX && box1.minY <= box2.maxY && box1.maxY >= box2.minY;\n}\n\n/** Converts a box representation (x, y, width, height) to a Bounds object. */\nexport function boxToBounds(box: { x: number; y: number; width: number; height: number }): Bounds {\n  return {\n    minX: box.x,\n    minY: box.y,\n    maxX: box.x + box.width,\n    maxY: box.y + box.height,\n    width: box.width,\n    height: box.height,\n  };\n}\n\n/** Tests if a point is contained within a bounding box. */\nexport function isPointInBounds(bounds: Bounds, point: Point): boolean {\n  return point.x >= bounds.minX && point.x <= bounds.maxX && point.y >= bounds.minY && point.y <= bounds.maxY;\n}\n\n/** Calculates the center point of a bounding box. */\nexport function getBoundsCenter(bounds: Bounds): Point {\n  return {\n    x: bounds.minX + bounds.width / 2,\n    y: bounds.minY + bounds.height / 2,\n  };\n}\n\n/** Tests if a line segment potentially intersects with a bounding box. */\nexport function isBoundsIntersect(bounds: Bounds, p1: Point, p2: Point, margin: number): boolean {\n  return (\n    bounds.minX - margin <= Math.max(p1.x, p2.x) &&\n    bounds.maxX + margin >= Math.min(p1.x, p2.x) &&\n    bounds.minY - margin <= Math.max(p1.y, p2.y) &&\n    bounds.maxY + margin >= Math.min(p1.y, p2.y)\n  );\n}\n","import { BaseElement, Bounds, ElementType, ElementUtil, Point, defaultElementStyle } from '../types';\nimport { generateId } from '../utils/common';\nimport { hitTestPen, StrokeOptions } from '../utils/drawing';\nimport { calculateBoundingBox } from '../utils/geometry/bounds';\n\nexport interface PenElement extends BaseElement {\n  type: ElementType.Pen;\n  points: [number, number][];\n  pathOptions?: StrokeOptions;\n  isComplete?: boolean;\n  isClosed?: boolean;\n}\n\nexport class PenElementUtil implements ElementUtil<PenElement> {\n  create(props: Partial<PenElement>): PenElement {\n    return {\n      type: ElementType.Pen,\n      id: generateId(),\n      x: 0,\n      y: 0,\n      points: [],\n      rotation: 0,\n      opacity: 100,\n      zIndex: 1, // Default zIndex, will be overridden by tools\n      selectAfterDraw: false, // Pen strokes should NOT be selected after drawing by default\n      ...props,\n      style: {\n        ...defaultElementStyle,\n        ...props.style,\n      },\n    };\n  }\n\n  resize(element: PenElement, direction: string, dx: number, dy: number): PenElement {\n    const bounds = calculateBoundingBox(element.points);\n    const { points, position } = this.getScaleFactors(direction, bounds, dx, dy);\n    const centerX = bounds.minX + bounds.width / 2;\n    const centerY = bounds.minY + bounds.height / 2;\n    const [scaleX, scaleY] = points;\n\n    if (bounds.width * scaleX < 10 || bounds.height * scaleY < 10) {\n      return element;\n    }\n\n    element.x += position.x;\n    element.y += position.y;\n    element.points = element.points.map((point) => [\n      centerX + (point[0] - centerX) * scaleX,\n      centerY + (point[1] - centerY) * scaleY,\n    ]);\n\n    return element;\n  }\n\n  private getScaleFactors(direction: string, bounds: Bounds, dx: number, dy: number) {\n    const points = [1, 1];\n    const position = { x: 0, y: 0 };\n\n    if (direction.includes('w')) {\n      points[0] = (bounds.width - dx) / bounds.width;\n      position.x += dx / 2;\n    }\n    if (direction.includes('n')) {\n      points[1] = (bounds.height - dy) / bounds.height;\n      position.y += dy / 2;\n    }\n    if (direction.includes('e')) {\n      points[0] = (bounds.width + dx) / bounds.width;\n      position.x += dx / 2;\n    }\n    if (direction.includes('s')) {\n      points[1] = (bounds.height + dy) / bounds.height;\n      position.y += dy / 2;\n    }\n\n    return { points, position };\n  }\n\n  getBounds(element: PenElement): Bounds {\n    const { minX, minY, maxX, maxY, width, height } = calculateBoundingBox(element.points);\n    return {\n      minX: minX + element.x,\n      minY: minY + element.y,\n      maxX: maxX + element.x,\n      maxY: maxY + element.y,\n      width,\n      height,\n    };\n  }\n\n  hitTest(element: PenElement, pointA: Point, pointB: Point, threshold: number): boolean {\n    return hitTestPen(element.points, pointA, pointB, threshold);\n  }\n}\n","import { BaseElement, Bounds, Direction, ElementType, ElementUtil, Point, defaultElementStyle } from '../types';\nimport { generateId } from '../utils/common';\nimport { hitTestBoundingBox } from '../utils/drawing';\n\nexport interface RectangleElement extends BaseElement {\n  type: ElementType.Rectangle;\n  width: number;\n  height: number;\n  rx: number;\n}\n\nexport class RectangleElementUtil implements ElementUtil<RectangleElement> {\n  create(props: Partial<RectangleElement>): RectangleElement {\n    return {\n      type: ElementType.Rectangle,\n      id: generateId(),\n      x: 0,\n      y: 0,\n      width: 1,\n      height: 1,\n      rx: 5,\n      rotation: 0,\n      opacity: 100,\n      zIndex: 1, // Default zIndex, will be overridden by tools\n      selectAfterDraw: true, // Rectangles should be selected after drawing by default\n      ...props,\n      style: {\n        ...defaultElementStyle,\n        ...props.style,\n      },\n    };\n  }\n\n  resize(element: RectangleElement, direction: Direction, dx: number, dy: number): RectangleElement {\n    if (direction.includes(Direction.N)) {\n      const newHeight = element.height - dy;\n      if (newHeight > 0) {\n        element.y += dy;\n        element.height = newHeight;\n      }\n    }\n    if (direction.includes(Direction.S)) {\n      const newHeight = element.height + dy;\n      if (newHeight > 0) {\n        element.height = newHeight;\n      }\n    }\n    if (direction.includes(Direction.W)) {\n      const newWidth = element.width - dx;\n      if (newWidth > 0) {\n        element.x += dx;\n        element.width = newWidth;\n      }\n    }\n    if (direction.includes(Direction.E)) {\n      const newWidth = element.width + dx;\n      if (newWidth > 0) {\n        element.width = newWidth;\n      }\n    }\n    return element;\n  }\n\n  getBounds(element: RectangleElement): Bounds {\n    return {\n      minX: element.x,\n      minY: element.y,\n      maxX: element.x + element.width,\n      maxY: element.y + element.height,\n      width: element.width,\n      height: element.height,\n    };\n  }\n\n  hitTest(element: RectangleElement, pointA: Point, pointB: Point, threshold: number): boolean {\n    const bounds = this.getBounds(element);\n    return hitTestBoundingBox(bounds, pointA, pointB, threshold);\n  }\n}\n","import { BaseElement, Bounds, Direction, ElementType, ElementUtil, Point, defaultTextElementStyle } from '../types';\nimport { generateId } from '../utils/common';\nimport { hitTestBoundingBox } from '../utils/drawing';\n\ninterface TextNaturalDimensions {\n  naturalWidth: number;\n  naturalHeight: number;\n  bboxX: number;\n  bboxY: number;\n}\n\n/**\n * Measures the natural (pre-scale) dimensions of a text element by creating a\n * temporary SVG in the document. Returns null if measurement fails or in SSR.\n */\nfunction measureTextNatural(element: TextElement): TextNaturalDimensions | null {\n  try {\n    if (typeof document === 'undefined') return null;\n    const svgNS = 'http://www.w3.org/2000/svg';\n    const fontSize = element.style.fontSize ?? 16;\n    const fontFamily = element.style.fontFamily ?? 'Arial';\n    const fontStyle = element.style.fontStyle ?? 'normal';\n    const fontWeight = String(element.style.fontWeight ?? 'normal');\n    const lineHeight = fontSize * 1.2;\n    const lines = (element.text ?? '').split('\\n');\n\n    const tempSvg = document.createElementNS(svgNS, 'svg') as SVGSVGElement;\n    tempSvg.style.cssText = 'position:absolute;visibility:hidden;pointer-events:none;width:0;height:0;overflow:hidden;';\n    document.body.appendChild(tempSvg);\n\n    const tempText = document.createElementNS(svgNS, 'text') as SVGTextElement;\n    tempText.setAttribute('text-anchor', 'start');\n    tempText.setAttribute('alignment-baseline', 'before-edge');\n    tempText.setAttribute('font-size', String(fontSize));\n    tempText.setAttribute('font-family', fontFamily);\n    tempText.setAttribute('font-style', fontStyle);\n    tempText.setAttribute('font-weight', fontWeight);\n\n    lines.forEach((line: string, i: number) => {\n      const tspan = document.createElementNS(svgNS, 'tspan') as SVGTSpanElement;\n      tspan.setAttribute('x', '0');\n      tspan.setAttribute('dy', i === 0 ? '0' : String(lineHeight));\n      tspan.textContent = line.length > 0 ? line : '\\u200B';\n      tempText.appendChild(tspan);\n    });\n\n    tempSvg.appendChild(tempText);\n    const bbox = tempText.getBBox();\n    document.body.removeChild(tempSvg);\n\n    if (bbox.width === 0 && bbox.height === 0) return null;\n\n    return { naturalWidth: bbox.width, naturalHeight: bbox.height, bboxX: bbox.x, bboxY: bbox.y };\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Natural (pre-scale) geometry of a text element, in the element's local coordinate\n * space. `(ox, oy)` is the center of the text's fill-box — the pivot that the renderer\n * scales and rotates around (CSS `transform-box: fill-box; transform-origin: center`).\n */\ninterface TextNaturalMetrics {\n  width: number;\n  height: number;\n  /** fill-box center, local space (unscaled) */\n  ox: number;\n  oy: number;\n}\n\n/**\n * Resolves the natural (unscaled) text metrics, preferring real font measurement and\n * falling back to font-size estimates when measurement is unavailable (e.g. SSR/tests).\n * getBounds and resize share this so the displayed box and the resize math always agree.\n */\nfunction getNaturalMetrics(element: TextElement): TextNaturalMetrics {\n  const fontSize = element.style.fontSize ?? defaultTextElementStyle.fontSize ?? 16;\n  const measured = measureTextNatural(element);\n\n  if (measured) {\n    return {\n      width: measured.naturalWidth,\n      height: measured.naturalHeight,\n      ox: measured.bboxX + measured.naturalWidth / 2,\n      oy: measured.bboxY + measured.naturalHeight / 2,\n    };\n  }\n\n  const lines = (element.text ?? '').split('\\n');\n  const maxChars = lines.reduce((max, line) => Math.max(max, line.length), 0);\n  const width = fontSize * 0.6 * maxChars || fontSize;\n  const height = fontSize * 1.2 * lines.length || fontSize * 1.2;\n  // SVG text origin is at the first baseline; the visual top sits ~0.8*fontSize above it.\n  const bboxY = -(fontSize * 0.8);\n  return { width, height, ox: width / 2, oy: bboxY + height / 2 };\n}\n\nexport interface TextElement extends BaseElement {\n  type: ElementType.Text;\n  text: string;\n  selection?: { start: number; end: number };\n  scaleX: number;\n  scaleY: number;\n}\nexport class TextElementUtil implements ElementUtil<TextElement> {\n  create(props: Partial<TextElement>): TextElement {\n    return {\n      type: ElementType.Text,\n      id: generateId(),\n      x: 0,\n      y: 0,\n      text: '',\n      rotation: 0,\n      opacity: 100,\n      zIndex: 1, // Default zIndex, will be overridden by tools\n      selectAfterDraw: true, // Text should be selected after drawing by default\n      scaleX: 1,\n      scaleY: 1,\n      ...props,\n      style: {\n        ...defaultTextElementStyle,\n        ...props.style,\n      },\n    };\n  }\n\n  resize(element: TextElement, direction: Direction, dx: number, dy: number): TextElement {\n    const MIN_SCALE = 0.1;\n    const { width, height } = getNaturalMetrics(element);\n\n    // Scale pivots around the fill-box center, so dragging an edge by `d` (in local\n    // space) changes the scale by `d / naturalSize` and shifts the origin so the opposite\n    // edge stays anchored. When unclamped that shift is exactly d/2; when the scale is\n    // clamped it is derived from the actual scale change instead.\n    if (direction.includes(Direction.E) || direction.includes(Direction.W)) {\n      const sign = direction.includes(Direction.E) ? 1 : -1;\n      const raw = element.scaleX + (sign * dx) / width;\n      const newScaleX = Math.max(MIN_SCALE, raw);\n      element.x += newScaleX === raw ? dx / 2 : (sign * (newScaleX - element.scaleX) * width) / 2;\n      element.scaleX = newScaleX;\n    }\n\n    if (direction.includes(Direction.S) || direction.includes(Direction.N)) {\n      const sign = direction.includes(Direction.S) ? 1 : -1;\n      const raw = element.scaleY + (sign * dy) / height;\n      const newScaleY = Math.max(MIN_SCALE, raw);\n      element.y += newScaleY === raw ? dy / 2 : (sign * (newScaleY - element.scaleY) * height) / 2;\n      element.scaleY = newScaleY;\n    }\n\n    return element;\n  }\n\n  getBounds(element: TextElement): Bounds {\n    const { x, y, scaleX, scaleY } = element;\n    const { width: naturalWidth, height: naturalHeight, ox, oy } = getNaturalMetrics(element);\n\n    // Scale is applied around the fill-box center (ox, oy), matching the SVG render.\n    const width = naturalWidth * scaleX;\n    const height = naturalHeight * scaleY;\n    const minX = x + ox - width / 2;\n    const minY = y + oy - height / 2;\n\n    return {\n      minX,\n      minY,\n      maxX: minX + width,\n      maxY: minY + height,\n      width,\n      height,\n    };\n  }\n\n  hitTest(element: TextElement, pointA: Point, pointB: Point, threshold: number): boolean {\n    const bounds = this.getBounds(element);\n    return hitTestBoundingBox(bounds, pointA, pointB, threshold);\n  }\n}\n","import { ElementByType, ElementType, ElementUtil, WhiteboardElement } from '../types';\nimport { ArrowElementUtil } from './arrow-element';\nimport { EllipseElementUtil } from './ellipse-element';\nimport { ImageElementUtil } from './image-element';\nimport { LineElementUtil } from './line-element';\nimport { PenElementUtil } from './pen-element';\nimport { RectangleElementUtil } from './rectangle-element';\nimport { TextElementUtil } from './text-element';\n\nconst elementUtilsMap: Record<ElementType, ElementUtil<WhiteboardElement>> = {\n  [ElementType.Arrow]: new ArrowElementUtil(),\n  [ElementType.Ellipse]: new EllipseElementUtil(),\n  [ElementType.Image]: new ImageElementUtil(),\n  [ElementType.Line]: new LineElementUtil(),\n  [ElementType.Pen]: new PenElementUtil(),\n  [ElementType.Rectangle]: new RectangleElementUtil(),\n  [ElementType.Text]: new TextElementUtil(),\n} as const;\n\nexport function getElementUtil(type: ElementType) {\n  return elementUtilsMap[type];\n}\n\n// Global active layer provider (set by EditorStateService)\nlet getActiveLayerId: (() => string) | null = null;\n\nexport function setActiveLayerProvider(provider: () => string) {\n  getActiveLayerId = provider;\n}\n\nexport function createElement<T extends ElementType>(\n  type: T,\n  props: Partial<ElementByType<T>>,\n  layerId?: string\n): ElementByType<T> {\n  const targetLayerId = layerId || (getActiveLayerId ? getActiveLayerId() : '');\n  const elementProps = { ...props, layerId: targetLayerId } as Partial<ElementByType<T>>;\n  return elementUtilsMap[type].create(elementProps) as ElementByType<T>;\n}\n\nexport interface LineEndpointInput {\n  x: number;\n  y: number;\n  x1: number;\n  y1: number;\n  x2: number;\n  y2: number;\n  rotation: number;\n  scaleX?: number;\n  scaleY?: number;\n}\n\n/**\n * Compute world-space endpoints for an arrow or line element.\n *\n * The element `<g>` uses the SVG transform `translate(x,y) rotate(rotation)` together\n * with CSS `transform-box: fill-box; transform-origin: center`. In modern browsers this\n * makes the rotation pivot the fill-box center (midpoint of the local geometry) rather\n * than the local origin (0,0). We replicate that here:\n *\n *   world = translate(x,y) * rotate_around_fill_center(rotation) * scale(scaleX,scaleY)\n *\n * Fill-box center in local space: cx = (x1+x2)/2, cy = (y1+y2)/2.\n */\nexport function getLineWorldEndpoints(el: LineEndpointInput): { sx: number; sy: number; ex: number; ey: number } {\n  const scaleX = el.scaleX ?? 1;\n  const scaleY = el.scaleY ?? 1;\n\n  const lx1 = el.x1 * scaleX;\n  const ly1 = el.y1 * scaleY;\n  const lx2 = el.x2 * scaleX;\n  const ly2 = el.y2 * scaleY;\n\n  const rot = ((el.rotation ?? 0) * Math.PI) / 180;\n  if (rot === 0) {\n    return { sx: el.x + lx1, sy: el.y + ly1, ex: el.x + lx2, ey: el.y + ly2 };\n  }\n\n  const pivotX = (lx1 + lx2) / 2;\n  const pivotY = (ly1 + ly2) / 2;\n\n  const cos = Math.cos(rot);\n  const sin = Math.sin(rot);\n\n  const rx1 = lx1 - pivotX;\n  const ry1 = ly1 - pivotY;\n  const rx2 = lx2 - pivotX;\n  const ry2 = ly2 - pivotY;\n\n  return {\n    sx: el.x + pivotX + rx1 * cos - ry1 * sin,\n    sy: el.y + pivotY + rx1 * sin + ry1 * cos,\n    ex: el.x + pivotX + rx2 * cos - ry2 * sin,\n    ey: el.y + pivotY + rx2 * sin + ry2 * cos,\n  };\n}\n","import { Bounds, WhiteboardElement } from '../../types';\nimport { ITEM_PREFIX } from '../../constants';\nimport { getElementUtil } from '../../elements/element.utils';\n\n/** Get the bounding box of an element from the DOM. */\nexport function getElementBbox(svgContainer: SVGSVGElement, element: WhiteboardElement): DOMRect {\n  const elementId = `${ITEM_PREFIX}${element.id}`;\n  const el = svgContainer.querySelector(`#${elementId}`) as SVGGraphicsElement;\n  if (el) {\n    return el.getBBox();\n  }\n  throw new Error(`Element with id ${elementId} not found`);\n}\n\n/** Get the bounds of an element. */\nexport function getElementBounds(element: WhiteboardElement): Bounds {\n  return getElementUtil(element.type).getBounds(element);\n}\n","import { PointerInfo, WhiteboardElement } from '../../types';\nimport {\n  SELECTOR_GROUP_ID,\n  ITEM_PREFIX,\n  SELECTOR_GRIP_PREFIX,\n  SELECTOR_BOX,\n  SVG_ROOT_ID,\n  DATA_ID,\n  ENDPOINT_HANDLE_PREFIX,\n  CURVE_HANDLE_PREFIX,\n} from '../../constants';\n\n/** Get the target element from a pointer event. */\nexport function getTargetElement(info: PointerInfo, data: WhiteboardElement[]): WhiteboardElement | null {\n  const mouseTarget = getMouseTarget(info);\n  if (mouseTarget) {\n    if (mouseTarget.id === SELECTOR_GROUP_ID) {\n      return null;\n    }\n    const id = mouseTarget.getAttribute(DATA_ID);\n    const element = data.find((el) => el.id === id);\n    return element || null;\n  }\n  return null;\n}\n\n/** Get the mouse target element from a pointer event. */\nexport function getMouseTarget(info: PointerInfo): SVGGraphicsElement | null {\n  if (!info?.target) {\n    return null;\n  }\n\n  let mouseTarget = info.target as SVGGraphicsElement;\n\n  while (mouseTarget) {\n    if (mouseTarget.id === SVG_ROOT_ID) {\n      return null;\n    }\n    if (\n      mouseTarget.id.includes(ITEM_PREFIX) ||\n      mouseTarget.id.includes(SELECTOR_GRIP_PREFIX) ||\n      mouseTarget.id.includes(SELECTOR_BOX) ||\n      mouseTarget.id.includes(ENDPOINT_HANDLE_PREFIX) ||\n      mouseTarget.id.includes(CURVE_HANDLE_PREFIX)\n    ) {\n      return mouseTarget;\n    }\n    if (mouseTarget.parentNode) {\n      mouseTarget = mouseTarget.parentNode as SVGGraphicsElement;\n    } else {\n      break;\n    }\n  }\n\n  return null;\n}\n","import { Point, WhiteboardConfig } from '../../types';\n\n/** Coordinate transformation utilities for screen ↔ canvas conversion with zoom, pan, and grid snapping. */\n\n/** Converts screen coordinates to canvas coordinates accounting for zoom and pan. */\nexport function getCanvasCoordinates(config: WhiteboardConfig, point: Point): Point {\n  const { zoom, x, y, canvasX, canvasY, fullScreen } = config;\n\n  if (fullScreen) {\n    const realX = point.x / zoom - x;\n    const realY = point.y / zoom - y;\n    return { x: realX, y: realY };\n  }\n\n  const relativeToInnerX = point.x - canvasX;\n  const relativeToInnerY = point.y - canvasY;\n  const realX = relativeToInnerX / zoom - x;\n  const realY = relativeToInnerY / zoom - y;\n\n  return { x: realX, y: realY };\n}\n\n/** Snaps a point to the closest 45-degree angle relative to an origin point. */\nexport function snapToAngle(x1: number, y1: number, x2: number, y2: number): { x: number; y: number; a: number } {\n  const SNAP_ANGLE = Math.PI / 4;\n\n  const dx = x2 - x1;\n  const dy = y2 - y1;\n  const angle = Math.atan2(dy, dx);\n  const distance = Math.sqrt(dx * dx + dy * dy);\n\n  const snappedAngle = Math.round(angle / SNAP_ANGLE) * SNAP_ANGLE;\n\n  const x = x1 + distance * Math.cos(snappedAngle);\n  const y = y1 + distance * Math.sin(snappedAngle);\n\n  return { x, y, a: snappedAngle };\n}\n\n/** Snaps a single numeric value to the nearest grid point. */\nexport function snapToGrid(n: number, gridSize: number): number {\n  return Math.round(n / gridSize) * gridSize;\n}\n\n/** Snaps a 2D point to the nearest grid intersection. */\nexport function snapPointToGrid(point: Point, gridSize: number): Point {\n  return {\n    x: snapToGrid(point.x, gridSize),\n    y: snapToGrid(point.y, gridSize),\n  };\n}\n","import { Point, Bounds, Direction, WhiteboardElement } from '../../types';\nimport { getElementBounds } from '../dom/element';\n\n/**\n * Utilities for geometric transformations and bounding box calculations.\n */\n\n/**\n * Calculates the screen-space bounding box for an element, accounting for rotation.\n */\nfunction getElementScreenBounds(element: WhiteboardElement): Bounds {\n  const globalBounds = getElementBounds(element);\n\n  if (!element.rotation || element.rotation === 0) {\n    return globalBounds;\n  }\n\n  const centerX = globalBounds.minX + globalBounds.width / 2;\n  const centerY = globalBounds.minY + globalBounds.height / 2;\n\n  const corners: Point[] = [\n    { x: globalBounds.minX, y: globalBounds.minY },\n    { x: globalBounds.maxX, y: globalBounds.minY },\n    { x: globalBounds.maxX, y: globalBounds.maxY },\n    { x: globalBounds.minX, y: globalBounds.maxY },\n  ];\n\n  const rotation = (element.rotation || 0) * (Math.PI / 180);\n  const cos = Math.cos(rotation);\n  const sin = Math.sin(rotation);\n\n  const rotatedCorners = corners.map((corner) => {\n    const dx = corner.x - centerX;\n    const dy = corner.y - centerY;\n    return {\n      x: centerX + dx * cos - dy * sin,\n      y: centerY + dx * sin + dy * cos,\n    };\n  });\n\n  const xs = rotatedCorners.map((p) => p.x);\n  const ys = rotatedCorners.map((p) => p.y);\n\n  const minX = Math.min(...xs);\n  const minY = Math.min(...ys);\n  const maxX = Math.max(...xs);\n  const maxY = Math.max(...ys);\n\n  return {\n    minX,\n    minY,\n    maxX,\n    maxY,\n    width: maxX - minX,\n    height: maxY - minY,\n  };\n}\n\n/**\n * Calculates the combined bounding box for multiple elements in screen space.\n */\nexport function getCombinedScreenBounds(elements: WhiteboardElement[]): Bounds | null {\n  if (elements.length === 0) {\n    return null;\n  }\n\n  const allBounds = elements.map((el) => getElementScreenBounds(el));\n\n  const minX = Math.min(...allBounds.map((b) => b.minX));\n  const minY = Math.min(...allBounds.map((b) => b.minY));\n  const maxX = Math.max(...allBounds.map((b) => b.maxX));\n  const maxY = Math.max(...allBounds.map((b) => b.maxY));\n\n  return {\n    minX,\n    minY,\n    maxX,\n    maxY,\n    width: maxX - minX,\n    height: maxY - minY,\n  };\n}\n\n/**\n * Rotates a point around a center point by a given angle.\n */\nexport function rotatePointAroundCenter(point: Point, center: Point, angleDegrees: number): Point {\n  const angleRadians = angleDegrees * (Math.PI / 180);\n  const cos = Math.cos(angleRadians);\n  const sin = Math.sin(angleRadians);\n\n  const dx = point.x - center.x;\n  const dy = point.y - center.y;\n\n  return {\n    x: center.x + dx * cos - dy * sin,\n    y: center.y + dx * sin + dy * cos,\n  };\n}\n\n/**\n * World-space position of the resize anchor — the corner/edge that must stay pinned\n * while dragging `handle` (i.e. the one opposite the dragged handle).\n *\n * The element renders rotated around its fill-box (geometry) center, which equals the\n * center of `bounds`. So the anchor is the opposite corner rotated around that center —\n * matching the render model `world(p) = center + R·(p − center)`. Computing it this way\n * (rather than rotating around the element origin) keeps the anchor fixed in world space\n * when the box dimensions change, so resizing a rotated element no longer drifts.\n */\n/**\n * Scale factors to apply to a rotated child's local width/height when a multi-selection\n * group is resized by world-axis scale `(scaleX, scaleY)`.\n *\n * Applying the group's X-scale directly to a rotated child's local width stretches it\n * along the child's own (rotated) axis, so a 45°-rotated box grows diagonally and spills\n * out of the selection. Projecting the group scale onto the child's local axes instead\n * scales each side by how much that side actually stretches in world space — shear-free,\n * stays inside the box, reduces to `(scaleX, scaleY)` when unrotated and swaps at 90°.\n */\nexport function getRotatedChildScale(\n  scaleX: number,\n  scaleY: number,\n  rotationDegrees: number\n): { scaleX: number; scaleY: number } {\n  const rad = (rotationDegrees * Math.PI) / 180;\n  const cos = Math.cos(rad);\n  const sin = Math.sin(rad);\n\n  return {\n    scaleX: Math.hypot(scaleX * cos, scaleY * sin),\n    scaleY: Math.hypot(scaleX * sin, scaleY * cos),\n  };\n}\n\nexport function getRotatedResizeAnchor(bounds: Bounds, handle: Direction, rotationDegrees: number): Point {\n  const centerX = (bounds.minX + bounds.maxX) / 2;\n  const centerY = (bounds.minY + bounds.maxY) / 2;\n\n  const anchorX = handle.includes(Direction.W) ? bounds.maxX : handle.includes(Direction.E) ? bounds.minX : centerX;\n  const anchorY = handle.includes(Direction.N) ? bounds.maxY : handle.includes(Direction.S) ? bounds.minY : centerY;\n\n  return rotatePointAroundCenter({ x: anchorX, y: anchorY }, { x: centerX, y: centerY }, rotationDegrees);\n}\n","// Utility modules\nexport * from './common';\nexport * from './dom';\nexport * from './drawing';\nexport * from './geometry';\n","import { Injectable, signal, computed } from '@angular/core';\nimport { WhiteboardElement, WhiteboardLayer, LayerState, BlendMode, BLEND_MODES } from '../types';\nimport { generateUUID } from '../utils';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class LayerManagementService {\n  // Core state signals\n  private _layers = signal<WhiteboardLayer[]>([]);\n  private _activeLayerId = signal<string>('');\n\n  // Public readonly signals\n  readonly layers = this._layers.asReadonly();\n  readonly activeLayerId = this._activeLayerId.asReadonly();\n\n  // Computed selectors\n  readonly activeLayer = computed(() => {\n    const layers = this._layers();\n    const activeId = this._activeLayerId();\n    return layers.find((layer) => layer.id === activeId) || layers[0];\n  });\n\n  readonly sortedLayers = computed(() => {\n    return [...this._layers()].sort((a, b) => a.zIndex - b.zIndex);\n  });\n\n  readonly visibleLayers = computed(() => {\n    return this._layers().filter((layer) => layer.visible);\n  });\n\n  readonly unlockedLayers = computed(() => {\n    return this._layers().filter((layer) => !layer.locked);\n  });\n\n  constructor() {\n    this.initializeDefaultLayer();\n  }\n\n  /**\n   * Add a new layer\n   */\n  addLayer(name?: string): WhiteboardLayer {\n    const layers = this._layers();\n    const newZIndex = Math.max(...layers.map((l) => l.zIndex), 0) + 1;\n    const layerCount = layers.length + 1;\n\n    const newLayer: WhiteboardLayer = {\n      id: this.generateLayerId(),\n      name: name || `Layer ${layerCount}`,\n      visible: true,\n      locked: false,\n      zIndex: newZIndex,\n      elements: [],\n      opacity: 1,\n      blendMode: 'normal',\n    };\n\n    // Make all other layers invisible\n    const updatedLayers = layers.map((layer) => ({\n      ...layer,\n      visible: false,\n    }));\n\n    this._layers.set([...updatedLayers, newLayer]);\n    this.setActiveLayer(newLayer.id);\n\n    return newLayer;\n  }\n\n  /**\n   * Remove a layer (prevents deletion of last layer)\n   */\n  removeLayer(id: string): boolean {\n    const layers = this._layers();\n\n    // Prevent deletion of last remaining layer\n    if (layers.length <= 1) {\n      console.warn('Cannot delete the last remaining layer');\n      return false;\n    }\n\n    const layerToRemove = layers.find((l) => l.id === id);\n    if (!layerToRemove) {\n      console.warn(`Layer with id ${id} not found`);\n      return false;\n    }\n\n    // Remove layer\n    const updatedLayers = layers.filter((l) => l.id !== id);\n    this._layers.set(updatedLayers);\n\n    // If active layer was removed, set new active layer\n    if (this._activeLayerId() === id) {\n      const newActiveLayer = updatedLayers[Math.max(0, updatedLayers.length - 1)];\n      this.setActiveLayer(newActiveLayer.id);\n    }\n\n    return true;\n  }\n\n  /**\n   * Duplicate a layer with all its properties and elements\n   */\n  duplicateLayer(\n    id: string,\n    elements: WhiteboardElement[]\n  ): { layer: WhiteboardLayer | null; elementMap: Map<string, string> } {\n    const layers = this._layers();\n    const layerToDuplicate = layers.find((l) => l.id === id);\n\n    if (!layerToDuplicate) {\n      console.warn(`Layer with id ${id} not found`);\n      return { layer: null, elementMap: new Map() };\n    }\n\n    // Create new layer with copied properties\n    const newZIndex = Math.max(...layers.map((l) => l.zIndex), 0) + 1;\n    const newLayer: WhiteboardLayer = {\n      id: this.generateLayerId(),\n      name: `${layerToDuplicate.name} Copy`,\n      visible: true,\n      locked: layerToDuplicate.locked,\n      zIndex: newZIndex,\n      elements: [], // Will be populated with duplicated element IDs\n      opacity: layerToDuplicate.opacity,\n      blendMode: layerToDuplicate.blendMode,\n    };\n\n    // Create a map of old element IDs to new element IDs\n    const elementMap = new Map<string, string>();\n    const layerElements = elements.filter((el) => layerToDuplicate.elements.includes(el.id));\n\n    layerElements.forEach((element) => {\n      const newElementId = generateUUID();\n      elementMap.set(element.id, newElementId);\n      newLayer.elements.push(newElementId);\n    });\n\n    // Add the new layer\n    this._layers.set([...layers, newLayer]);\n    this.setActiveLayer(newLayer.id);\n\n    return { layer: newLayer, elementMap };\n  }\n\n  /**\n   * Rename a layer\n   */\n  renameLayer(id: string, name: string): boolean {\n    const layers = this._layers();\n    const layerIndex = layers.findIndex((l) => l.id === id);\n\n    if (layerIndex === -1) {\n      console.warn(`Layer with id ${id} not found`);\n      return false;\n    }\n\n    // Prevent renaming locked layers\n    if (layers[layerIndex].locked) {\n      console.warn(`Cannot rename locked layer: ${layers[layerIndex].name}`);\n      return false;\n    }\n\n    const updatedLayers = [...layers];\n    updatedLayers[layerIndex] = {\n      ...updatedLayers[layerIndex],\n      name: name.trim() || `Layer ${layerIndex + 1}`,\n    };\n\n    this._layers.set(updatedLayers);\n    return true;\n  }\n\n  /**\n   * Reorder layer by changing zIndex\n   */\n  reorderLayer(id: string, newZIndex: number): boolean {\n    const layers = this._layers();\n    const layerIndex = layers.findIndex((l) => l.id === id);\n\n    if (layerIndex === -1) {\n      console.warn(`Layer with id ${id} not found`);\n      return false;\n    }\n\n    // Prevent reordering locked layers\n    if (layers[layerIndex].locked) {\n      console.warn(`Cannot reorder locked layer: ${layers[layerIndex].name}`);\n      return false;\n    }\n\n    const updatedLayers = [...layers];\n    updatedLayers[layerIndex] = {\n      ...updatedLayers[layerIndex],\n      zIndex: newZIndex,\n    };\n\n    this._layers.set(updatedLayers);\n    return true;\n  }\n\n  /**\n   * Move layer up in z-order\n   */\n  moveLayerUp(id: string): boolean {\n    const layers = this.sortedLayers();\n    const currentIndex = layers.findIndex((l) => l.id === id);\n\n    if (currentIndex === -1 || currentIndex === layers.length - 1) {\n      return false; // Layer not found or already at top\n    }\n\n    const currentLayer = layers[currentIndex];\n\n    // Prevent moving locked layers\n    if (currentLayer.locked) {\n      console.warn(`Cannot move locked layer: ${currentLayer.name}`);\n      return false;\n    }\n\n    const nextLayer = layers[currentIndex + 1];\n\n    // Swap z-indices\n    return this.reorderLayer(currentLayer.id, nextLayer.zIndex) && this.reorderLayer(nextLayer.id, currentLayer.zIndex);\n  }\n\n  /**\n   * Move layer down in z-order\n   */\n  moveLayerDown(id: string): boolean {\n    const layers = this.sortedLayers();\n    const currentIndex = layers.findIndex((l) => l.id === id);\n\n    if (currentIndex === -1 || currentIndex === 0) {\n      return false; // Layer not found or already at bottom\n    }\n\n    const currentLayer = layers[currentIndex];\n\n    // Prevent moving locked layers\n    if (currentLayer.locked) {\n      console.warn(`Cannot move locked layer: ${currentLayer.name}`);\n      return false;\n    }\n\n    const prevLayer = layers[currentIndex - 1];\n\n    // Swap z-indices\n    return this.reorderLayer(currentLayer.id, prevLayer.zIndex) && this.reorderLayer(prevLayer.id, currentLayer.zIndex);\n  }\n\n  /**\n   * Reorder layers by moving a layer from one position to another\n   * This properly reassigns zIndex values based on the new order\n   *\n   * @param previousIndex - Current index in the layers array\n   * @param currentIndex - Target index in the layers array\n   * @returns true if successful, false otherwise\n   */\n  reorderLayersByIndex(previousIndex: number, currentIndex: number): boolean {\n    const layers = this._layers();\n\n    if (previousIndex === currentIndex) {\n      return false; // No change needed\n    }\n\n    if (previousIndex < 0 || previousIndex >= layers.length || currentIndex < 0 || currentIndex >= layers.length) {\n      console.warn('Invalid layer indices for reordering');\n      return false;\n    }\n\n    const layerToMove = layers[previousIndex];\n\n    // Prevent moving locked layers\n    if (layerToMove.locked) {\n      console.warn(`Cannot reorder locked layer: ${layerToMove.name}`);\n      return false;\n    }\n\n    // Create new array with the layer moved to its new position\n    const reorderedLayers = [...layers];\n    reorderedLayers.splice(previousIndex, 1); // Remove from old position\n    reorderedLayers.splice(currentIndex, 0, layerToMove); // Insert at new position\n\n    // Reassign zIndex values based on new array order\n    // Lower index = higher zIndex (renders on top)\n    const updatedLayers = reorderedLayers.map((layer, index) => ({\n      ...layer,\n      zIndex: reorderedLayers.length - 1 - index, // Reverse: first item gets highest zIndex\n    }));\n\n    this._layers.set(updatedLayers);\n    return true;\n  }\n\n  /**\n   * Toggle layer visibility\n   */\n  toggleLayerVisibility(id: string): boolean {\n    return this.updateLayerProperty(id, 'visible', (current) => !current);\n  }\n\n  /**\n   * Toggle layer lock state\n   *\n   * Behavior:\n   * - Allows locking/unlocking any layer including the active layer\n   * - When active layer is locked, drawing will be disabled but layer remains active\n   */\n  toggleLayerLock(id: string): boolean {\n    const layers = this._layers();\n    const layer = layers.find((l) => l.id === id);\n\n    if (!layer) {\n      console.warn(`Layer with id ${id} not found`);\n      return false;\n    }\n\n    return this.updateLayerProperty(id, 'locked', (current) => !current);\n  }\n\n  /**\n   * Set layer opacity\n   */\n  setLayerOpacity(id: string, opacity: number): boolean {\n    const layers = this._layers();\n    const layer = layers.find((l) => l.id === id);\n\n    if (!layer) {\n      console.warn(`Layer with id ${id} not found`);\n      return false;\n    }\n\n    // Prevent changing opacity of locked layers\n    if (layer.locked) {\n      console.warn(`Cannot change opacity of locked layer: ${layer.name}`);\n      return false;\n    }\n\n    const clampedOpacity = Math.max(0, Math.min(1, opacity));\n    return this.updateLayerProperty(id, 'opacity', () => clampedOpacity);\n  }\n\n  /**\n   * Set layer blend mode\n   */\n  setLayerBlendMode(id: string, blendMode: BlendMode): boolean {\n    const layers = this._layers();\n    const layer = layers.find((l) => l.id === id);\n\n    if (!layer) {\n      console.warn(`Layer with id ${id} not found`);\n      return false;\n    }\n\n    // Prevent changing blend mode of locked layers\n    if (layer.locked) {\n      console.warn(`Cannot change blend mode of locked layer: ${layer.name}`);\n      return false;\n    }\n\n    // Validate blend mode\n    const validBlendModes = BLEND_MODES.map((mode) => mode.value);\n    if (!validBlendModes.includes(blendMode)) {\n      console.warn(`Invalid blend mode: ${blendMode}. Using 'normal' instead.`);\n      return this.updateLayerProperty(id, 'blendMode', () => 'normal');\n    }\n\n    return this.updateLayerProperty(id, 'blendMode', () => blendMode);\n  }\n\n  /**\n   * Set the active layer\n   *\n   * Behavior:\n   * - Allows activating any layer including locked layers\n   * - When a locked layer is active, drawing will be disabled\n   * - Makes all other layers invisible when a layer is activated\n   * - This ensures only the active layer is visible\n   */\n  setActiveLayer(id: string): boolean {\n    const layers = this._layers();\n    const layer = layers.find((l) => l.id === id);\n\n    if (!layer) {\n      console.warn(`Layer with id ${id} not found`);\n      return false;\n    }\n\n    // Make all layers invisible except the one being activated\n    const updatedLayers = layers.map((l) => ({\n      ...l,\n      visible: l.id === id,\n    }));\n\n    this._layers.set(updatedLayers);\n\n    this._activeLayerId.set(id);\n    return true;\n  }\n\n  /**\n   * Get the active layer ID\n   */\n  getActiveLayerId(): string {\n    return this._activeLayerId();\n  }\n\n  /**\n   * Check if the active layer is in a valid drawing state\n   * Valid means: exists, visible, and unlocked\n   */\n  isActiveLayerValid(): boolean {\n    const active = this.activeLayer();\n    return !!active && active.visible && !active.locked;\n  }\n\n  /**\n   * Get any issues with the current active layer\n   * Returns empty array if no issues\n   */\n  getActiveLayerIssues(): string[] {\n    const active = this.activeLayer();\n    if (!active) return ['No active layer'];\n\n    const issues: string[] = [];\n    if (!active.visible) issues.push('Active layer is hidden');\n    if (active.locked) issues.push('Active layer is locked');\n    return issues;\n  }\n\n  // ELEMENT ASSOCIATION\n\n  /**\n   * Assign element to active layer\n   */\n  assignElementToActiveLayer(elementId: string): boolean {\n    const activeLayerId = this._activeLayerId();\n    return this.assignElementToLayer(elementId, activeLayerId);\n  }\n\n  /**\n   * Assign element to specific layer\n   */\n  assignElementToLayer(elementId: string, layerId: string): boolean {\n    const layers = this._layers();\n    const layerIndex = layers.findIndex((l) => l.id === layerId);\n\n    if (layerIndex === -1) {\n      console.warn(`Layer with id ${layerId} not found`);\n      return false;\n    }\n\n    // Prevent assigning elements to locked layers\n    if (layers[layerIndex].locked) {\n      console.warn(`Cannot assign elements to locked layer: ${layers[layerIndex].name}`);\n      return false;\n    }\n\n    // Remove element from all other layers first\n    this.removeElementFromAllLayers(elementId);\n\n    // Add to target layer - get fresh layers after removal\n    const freshLayers = this._layers();\n    const freshLayerIndex = freshLayers.findIndex((l) => l.id === layerId);\n    const updatedLayers = [...freshLayers];\n    const updatedElements = [...updatedLayers[freshLayerIndex].elements];\n\n    if (!updatedElements.includes(elementId)) {\n      updatedElements.push(elementId);\n      updatedLayers[freshLayerIndex] = {\n        ...updatedLayers[freshLayerIndex],\n        elements: updatedElements,\n      };\n      this._layers.set(updatedLayers);\n    }\n\n    return true;\n  }\n\n  /**\n   * Remove element from all layers\n   */\n  removeElementFromAllLayers(elementId: string): void {\n    const layers = this._layers();\n    const updatedLayers = layers.map((layer) => ({\n      ...layer,\n      elements: layer.elements.filter((id) => id !== elementId),\n    }));\n    this._layers.set(updatedLayers);\n  }\n\n  /**\n   * Get layer containing element\n   */\n  getElementLayer(elementId: string): WhiteboardLayer | null {\n    const layers = this._layers();\n    return layers.find((layer) => layer.elements.includes(elementId)) || null;\n  }\n\n  // RENDERING HELPERS\n\n  /**\n   * Get elements from visible layers only\n   */\n  getVisibleElements(allElements: WhiteboardElement[]): WhiteboardElement[] {\n    const visibleLayers = this.visibleLayers();\n    const visibleElementIds = new Set(visibleLayers.flatMap((layer) => layer.elements));\n\n    return allElements.filter((element) => visibleElementIds.has(element.id));\n  }\n\n  /**\n   * Get elements from unlocked layers only (for editing)\n   */\n  getEditableElements(allElements: WhiteboardElement[]): WhiteboardElement[] {\n    const unlockedLayers = this.unlockedLayers();\n    const editableElementIds = new Set(unlockedLayers.flatMap((layer) => layer.elements));\n\n    return allElements.filter((element) => editableElementIds.has(element.id));\n  }\n\n  /**\n   * Get elements sorted by layer z-index\n   */\n  getSortedElements(allElements: WhiteboardElement[]): WhiteboardElement[] {\n    const sortedLayers = this.sortedLayers();\n    const elementLayerMap = new Map<string, number>();\n\n    // Map each element to its layer's z-index\n    sortedLayers.forEach((layer) => {\n      layer.elements.forEach((elementId) => {\n        elementLayerMap.set(elementId, layer.zIndex);\n      });\n    });\n\n    return allElements.sort((a, b) => {\n      const aZIndex = elementLayerMap.get(a.id) ?? 0;\n      const bZIndex = elementLayerMap.get(b.id) ?? 0;\n      return aZIndex - bZIndex;\n    });\n  }\n\n  // EXPORT/IMPORT SUPPORT\n\n  /**\n   * Serialize layer state for saving\n   */\n  exportLayerState(): LayerState {\n    return {\n      layers: this._layers(),\n      activeLayerId: this._activeLayerId(),\n    };\n  }\n\n  /**\n   * Restore layer state from saved data\n   */\n  importLayerState(state: LayerState): void {\n    if (!state.layers || state.layers.length === 0) {\n      console.warn('Invalid layer state provided');\n      this.initializeDefaultLayer();\n      return;\n    }\n\n    this._layers.set(state.layers);\n\n    // Validate active layer\n    const activeLayer = state.layers.find((l) => l.id === state.activeLayerId);\n    this._activeLayerId.set(activeLayer ? state.activeLayerId : state.layers[0].id);\n  }\n\n  /**\n   * Reset to default state\n   */\n  reset(): void {\n    this.initializeDefaultLayer();\n  }\n\n  // PRIVATE HELPERS\n\n  private initializeDefaultLayer(): void {\n    const defaultLayer: WhiteboardLayer = {\n      id: 'default',\n      name: 'Layer 1',\n      visible: true,\n      locked: false,\n      zIndex: 0,\n      elements: [],\n      opacity: 1,\n      blendMode: 'normal',\n    };\n\n    this._layers.set([defaultLayer]);\n    this._activeLayerId.set(defaultLayer.id);\n  }\n\n  private generateLayerId(): string {\n    return `layer-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n  }\n\n  private updateLayerProperty<K extends keyof WhiteboardLayer>(\n    id: string,\n    property: K,\n    updater: (current: WhiteboardLayer[K]) => WhiteboardLayer[K]\n  ): boolean {\n    const layers = this._layers();\n    const layerIndex = layers.findIndex((l) => l.id === id);\n\n    if (layerIndex === -1) {\n      console.warn(`Layer with id ${id} not found`);\n      return false;\n    }\n\n    const updatedLayers = [...layers];\n    const currentValue = updatedLayers[layerIndex][property];\n    updatedLayers[layerIndex] = {\n      ...updatedLayers[layerIndex],\n      [property]: updater(currentValue),\n    };\n\n    this._layers.set(updatedLayers);\n    return true;\n  }\n}\n","import { HistoryService } from '../history/history.service';\nimport { computed, inject, Injectable, signal } from '@angular/core';\nimport { EventBusService } from '../event-bus';\nimport { WhiteboardElement, WhiteboardEvent } from '../types';\nimport { getElementBounds } from '../utils';\nimport { LayerManagementService } from './layer-management.service';\n\nexport interface LockInfo {\n  timestamp: number;\n  reason?: string;\n}\n\nexport interface ElementsSnapshot {\n  elements: WhiteboardElement[];\n  draftElements: WhiteboardElement[];\n  maxZIndex: number;\n  timestamp?: number;\n}\n\nexport interface LockOperationResult {\n  updated: string[];\n  locked: string[];\n}\n\nexport interface LockStats {\n  total: number;\n  locked: number;\n  unlocked: number;\n  lockPercentage: number;\n  allLocked: boolean;\n  noneLocked: boolean;\n}\n\nexport interface ElementTransformation {\n  translation?: { x: number; y: number };\n  rotation?: number;\n  scale?: { x: number; y: number };\n  opacity?: number;\n}\n\nexport interface ElementSearchCriteria {\n  type?: string;\n  layerId?: string;\n  locked?: boolean;\n  textContent?: string;\n  zIndexRange?: { min: number; max: number };\n  bounds?: { x: number; y: number; width: number; height: number };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ElementsService {\n  private historyService = inject(HistoryService);\n  private layerManagement = inject(LayerManagementService);\n\n  // Signal-based state management\n  private readonly _elements = signal<WhiteboardElement[]>([]);\n  private readonly _draftElements = signal<WhiteboardElement[]>([]);\n  private readonly _maxZIndex = signal(0);\n  private readonly _locks = signal(new Map<string, LockInfo>());\n\n  constructor(private eventBus: EventBusService) {}\n\n  readonly elements = this._elements.asReadonly();\n\n  /**\n   * Signal containing all draft (temporary) elements\n   */\n  readonly draftElements = this._draftElements.asReadonly();\n\n  /**\n   * Computed signal containing all elements (persistent + draft)\n   */\n  readonly allElements = computed(() => [...this._elements(), ...this._draftElements()]);\n\n  /**\n   * Computed signal for elements count\n   */\n  readonly elementsCount = computed(() => this._elements().length);\n\n  /**\n   * Computed signal checking if elements exist\n   */\n  readonly hasElements = computed(() => this.elementsCount() > 0);\n\n  /**\n   * Computed signal for unique element types\n   */\n  readonly elementTypes = computed(() => {\n    const types = this._elements().map((el) => el.type);\n    return [...new Set(types)];\n  });\n\n  /**\n   * Computed signal for elements by type\n   */\n  readonly elementsByType = computed(() => {\n    const elements = this._elements();\n    const byType = new Map<string, WhiteboardElement[]>();\n\n    elements.forEach((element) => {\n      const type = element.type;\n      if (!byType.has(type)) {\n        byType.set(type, []);\n      }\n      const typeArray = byType.get(type);\n      if (typeArray) {\n        typeArray.push(element);\n      }\n    });\n\n    return byType;\n  });\n\n  /**\n   * Computed signal for max z-index\n   */\n  readonly maxZIndex = computed(() => this._maxZIndex());\n\n  /**\n   * Computed signal for elements sorted by z-index\n   */\n  readonly elementsByZIndex = computed(() => {\n    return [...this._elements()].sort((a, b) => (a.zIndex || 0) - (b.zIndex || 0));\n  });\n\n  /**\n   * Computed signal for locked elements\n   */\n  readonly lockedElements = computed(() => {\n    return this._elements().filter((element) => element.locked === true);\n  });\n\n  /**\n   * Computed signal for unlocked elements\n   */\n  readonly unlockedElements = computed(() => {\n    return this._elements().filter((element) => element.locked !== true);\n  });\n\n  /**\n   * Computed signal for locked elements count\n   */\n  readonly lockedElementsCount = computed(() => this.lockedElements().length);\n\n  /**\n   * Computed signal checking if any elements are locked\n   */\n  readonly hasLockedElements = computed(() => this.lockedElementsCount() > 0);\n\n  /**\n   * Computed signal for lock statistics\n   */\n  readonly lockStats = computed(() => {\n    const total = this.elementsCount();\n    const locked = this.lockedElementsCount();\n    const unlocked = total - locked;\n    const lockPercentage = total > 0 ? Math.round((locked / total) * 100) : 0;\n\n    return {\n      total,\n      locked,\n      unlocked,\n      lockPercentage,\n      allLocked: total > 0 && locked === total,\n      noneLocked: locked === 0,\n    };\n  });\n\n  /**\n   * Signal containing element locks\n   */\n  readonly locks = this._locks.asReadonly();\n\n  /**\n   * Get current persistent elements snapshot\n   */\n  getElements(): WhiteboardElement[] {\n    return [...this._elements()];\n  }\n\n  /**\n   * Get current draft elements snapshot\n   */\n  getDraftElements(): WhiteboardElement[] {\n    return [...this._draftElements()];\n  }\n\n  /**\n   * Get all elements (persistent + draft) snapshot\n   */\n  getAllElements(): WhiteboardElement[] {\n    return this.allElements();\n  }\n\n  // ---------- Element Management ----------\n\n  /**\n   * Add elements to persistent storage\n   */\n  addElements(elements: WhiteboardElement[]): void {\n    if (!elements?.length) return;\n\n    const activeLayerId = this.layerManagement.getActiveLayerId();\n\n    const elementsWithZIndex = elements.map((element) => ({\n      ...element,\n      zIndex: element.zIndex ?? this.getNextZIndex(),\n      layerId: element.layerId ?? activeLayerId, // Auto-assign to active layer\n    }));\n\n    this.updateMaxZIndex(elementsWithZIndex);\n\n    const currentElements = this._elements();\n    const newElements = [...currentElements, ...elementsWithZIndex];\n\n    this._elements.set(newElements);\n\n    // Register elements with layer management\n    elementsWithZIndex.forEach((element) => {\n      if (element.layerId) {\n        this.layerManagement.assignElementToLayer(element.id, element.layerId);\n      }\n    });\n\n    this.historyService.recordElementCreation(currentElements, newElements);\n    // Emit granular event for elements addition\n    this.eventBus.emit(WhiteboardEvent.ElementsAdded, elementsWithZIndex);\n    // Emit data change event\n    this.eventBus.emit(WhiteboardEvent.DataChange, newElements);\n  }\n\n  /**\n   * Update existing elements (respects lock status)\n   */\n  updateElements(updates: Partial<WhiteboardElement> & { id: string }[], ignoreLock = false): void {\n    if (!updates?.length) return;\n\n    const currentElements = this._elements();\n    const updatesMap = new Map(updates.map((update) => [update.id, update]));\n    const updatedElements: WhiteboardElement[] = [];\n\n    const newElements = currentElements.map((element) => {\n      const update = updatesMap.get(element.id);\n      if (!update) return element;\n\n      // Check if element is locked and operation doesn't ignore lock\n      if (!ignoreLock && element.locked && !this.isLockOperation(update)) {\n        console.warn(`Attempted to modify locked element: ${element.id}`);\n        return element; // Return unchanged element\n      }\n\n      // Check if element's layer is locked\n      if (!ignoreLock && element.layerId) {\n        const elementLayer = this.layerManagement.getElementLayer(element.id);\n        if (elementLayer?.locked) {\n          console.warn(`Attempted to modify element on locked layer: ${elementLayer.name}`);\n          return element; // Return unchanged element\n        }\n      }\n\n      const updatedElement = { ...element, ...update };\n\n      // Update max z-index if necessary\n      if (updatedElement.zIndex != null) {\n        this._maxZIndex.update((current) => Math.max(current, updatedElement.zIndex as number));\n      }\n\n      updatedElements.push(updatedElement);\n      return updatedElement;\n    });\n\n    this._elements.set(newElements);\n\n    if (updatedElements.length > 0) {\n      this.historyService.recordElementUpdate(currentElements, newElements);\n    }\n\n    if (updatedElements.length > 0) {\n      this.eventBus.emit(WhiteboardEvent.ElementsUpdated, updatedElements);\n      // Emit data change event\n      this.eventBus.emit(WhiteboardEvent.DataChange, newElements);\n    }\n  }\n\n  /**\n   * Remove elements by IDs (respects lock status)\n   */\n  removeElementsByIds(elementIds: string[], ignoreLock = false): void {\n    if (!elementIds?.length) return;\n\n    const idsToRemove = new Set(elementIds);\n    const currentElements = this._elements();\n\n    // Filter out locked elements unless ignoreLock is true\n    const validElementsToRemove = currentElements.filter((element) => {\n      if (!idsToRemove.has(element.id)) return false;\n\n      if (!ignoreLock && element.locked) {\n        console.warn(`Attempted to remove locked element: ${element.id}`);\n        return false;\n      }\n\n      // Check if element's layer is locked\n      if (!ignoreLock && element.layerId) {\n        const elementLayer = this.layerManagement.getElementLayer(element.id);\n        if (elementLayer?.locked) {\n          console.warn(`Attempted to remove element from locked layer: ${elementLayer.name}`);\n          return false;\n        }\n      }\n\n      return true;\n    });\n\n    if (validElementsToRemove.length === 0) return;\n\n    const removeIds = new Set(validElementsToRemove.map((el) => el.id));\n    const newElements = currentElements.filter((element) => !removeIds.has(element.id));\n\n    this._elements.set(newElements);\n\n    // Remove elements from layers\n    validElementsToRemove.forEach((element) => {\n      this.layerManagement.removeElementFromAllLayers(element.id);\n    });\n\n    // Record history for undo/redo\n    this.historyService.recordElementDeletion(currentElements, newElements);\n\n    // Emit events\n    this.eventBus.emit(WhiteboardEvent.ElementsRemoved, validElementsToRemove);\n    this.eventBus.emit(WhiteboardEvent.DataChange, newElements);\n  }\n\n  /**\n   * Remove elements (simplified interface, respects lock status)\n   */\n  removeElements(elements: WhiteboardElement[], ignoreLock = false): void {\n    const elementIds = elements.map((element) => element.id);\n    this.removeElementsByIds(elementIds, ignoreLock);\n  }\n\n  /**\n   * Clear all persistent elements\n   */\n  clear(): void {\n    const currentElements = this._elements();\n    this._elements.set([]);\n    this._maxZIndex.set(0);\n\n    // Clear all elements from layers\n    currentElements.forEach((element) => {\n      this.layerManagement.removeElementFromAllLayers(element.id);\n    });\n\n    // Record history for undo/redo\n    this.historyService.recordClear(currentElements, []);\n    // Emit data change event\n    this.eventBus.emit(WhiteboardEvent.DataChange, []);\n  }\n\n  /**\n   * Set all persistent elements (replaces current elements)\n   */\n  setElements(elements: WhiteboardElement[]): void {\n    const elementsWithZIndex = elements.map((element) => ({\n      ...element,\n      zIndex: element.zIndex ?? this.getNextZIndex(),\n    }));\n\n    this.updateMaxZIndex(elementsWithZIndex);\n    this._elements.set([...elementsWithZIndex]);\n    // Emit data change event\n    this.eventBus.emit(WhiteboardEvent.DataChange, elementsWithZIndex);\n  }\n\n  // ---------- Draft Element Management ----------\n\n  /**\n   * Add elements to draft storage (temporary elements)\n   */\n  addDraftElements(elements: WhiteboardElement[]): void {\n    if (!elements?.length) return;\n\n    // Check if active layer is locked\n    const activeLayer = this.layerManagement.activeLayer();\n    if (activeLayer?.locked) {\n      console.warn(`Cannot draw on locked layer: ${activeLayer.name}`);\n      return;\n    }\n\n    const elementsWithZIndex = elements.map((element) => ({\n      ...element,\n      zIndex: element.zIndex ?? this.getNextZIndex(),\n    }));\n\n    this.updateMaxZIndex(elementsWithZIndex);\n\n    const currentDraftElements = this._draftElements();\n    const newDraftElements = [...currentDraftElements, ...elementsWithZIndex];\n\n    this._draftElements.set(newDraftElements);\n  }\n\n  /**\n   * Update draft elements\n   */\n  updateDraftElements(updates: Partial<WhiteboardElement>[]): void {\n    if (!updates?.length) return;\n\n    const currentDraftElements = this._draftElements();\n    const updatesMap = new Map(updates.map((update) => [update.id, update]));\n    const updatedElements: WhiteboardElement[] = [];\n\n    const newDraftElements = currentDraftElements.map((element) => {\n      const update = updatesMap.get(element.id);\n      if (update) {\n        const updatedElement: WhiteboardElement = { ...element, ...update } as WhiteboardElement;\n        updatedElements.push(updatedElement);\n        return updatedElement;\n      }\n      return element;\n    });\n\n    this._draftElements.set(newDraftElements);\n  }\n\n  /**\n   * Remove draft elements by IDs\n   */\n  removeDraftElements(elementIds: string[]): void {\n    if (!elementIds?.length) return;\n\n    const idsToRemove = new Set(elementIds);\n    const currentDraftElements = this._draftElements();\n    const newDraftElements = currentDraftElements.filter((element) => !idsToRemove.has(element.id));\n\n    this._draftElements.set(newDraftElements);\n  }\n\n  /**\n   * Clear all draft elements\n   */\n  clearDraftElements(): void {\n    this._draftElements.set([]);\n  }\n\n  /**\n   * Move elements from draft to persistent storage\n   */\n  commitDraftElements(elementIds?: string[]): WhiteboardElement[] {\n    const draftElements = this._draftElements();\n    const elementsToCommit = elementIds ? draftElements.filter((el) => elementIds.includes(el.id)) : draftElements;\n\n    if (elementsToCommit.length === 0) return [];\n\n    // Check if active layer is locked before committing\n    const activeLayer = this.layerManagement.activeLayer();\n    if (activeLayer?.locked) {\n      console.warn(`Cannot commit elements to locked layer: ${activeLayer.name}`);\n      // Clear draft elements since they can't be committed\n      this._draftElements.set([]);\n      return [];\n    }\n\n    // Add to persistent storage\n    this.addElements(elementsToCommit);\n\n    // Remove from draft storage\n    const remainingDrafts = elementIds ? draftElements.filter((el) => !elementIds.includes(el.id)) : [];\n\n    this._draftElements.set(remainingDrafts);\n\n    // Return the committed elements for potential selection\n    return elementsToCommit;\n  }\n\n  // ---------- Z-Index Management ----------\n\n  /**\n   * Get the next available z-index\n   */\n  getNextZIndex(): number {\n    this._maxZIndex.update((current) => current + 1);\n    return this._maxZIndex();\n  }\n\n  /**\n   * Bring elements to front (respects lock status)\n   */\n  bringToFront(elementIds: string[], ignoreLock = false): void {\n    if (!elementIds?.length) return;\n\n    const newZIndex = this.getNextZIndex();\n    const updates = elementIds.map((id) => ({ id, zIndex: newZIndex }));\n\n    this.updateElements(updates, ignoreLock);\n  }\n\n  /**\n   * Send elements to back (respects lock status)\n   */\n  sendToBack(elementIds: string[], ignoreLock = false): void {\n    if (!elementIds?.length) return;\n\n    const updates = elementIds.map((id) => ({ id, zIndex: 0 }));\n    this.updateElements(updates, ignoreLock);\n  }\n\n  // ---------- Lock Management ----------\n\n  /**\n   * Lock elements to prevent modifications\n   */\n  lockElements(elementIds: string[]): void {\n    if (!elementIds?.length) return;\n\n    const lockInfo: LockInfo = {\n      timestamp: Date.now(),\n      reason: 'User locked',\n    };\n\n    const locks = this._locks();\n    const newLocks = new Map(locks);\n\n    const updates = elementIds.map((id) => {\n      newLocks.set(id, lockInfo);\n      return { id, locked: true as const };\n    });\n\n    this._locks.set(newLocks);\n    this.updateElements(updates, true); // Ignore lock status for locking operation\n  }\n\n  /**\n   * Unlock elements to allow modifications\n   */\n  unlockElements(elementIds: string[]): void {\n    if (!elementIds?.length) return;\n\n    const locks = this._locks();\n    const newLocks = new Map(locks);\n\n    const updates = elementIds.map((id) => {\n      newLocks.delete(id);\n      return { id, locked: false as const };\n    });\n\n    this._locks.set(newLocks);\n    this.updateElements(updates, true); // Ignore lock status for unlocking operation\n  }\n\n  /**\n   * Toggle lock status of elements\n   */\n  toggleElementsLock(elementIds: string[]): void {\n    if (!elementIds?.length) return;\n\n    const elementsToLock: string[] = [];\n    const elementsToUnlock: string[] = [];\n\n    elementIds.forEach((id) => {\n      const element = this.getElementById(id);\n      if (element) {\n        if (element.locked) {\n          elementsToUnlock.push(id);\n        } else {\n          elementsToLock.push(id);\n        }\n      }\n    });\n\n    if (elementsToLock.length > 0) {\n      this.lockElements(elementsToLock);\n    }\n    if (elementsToUnlock.length > 0) {\n      this.unlockElements(elementsToUnlock);\n    }\n  }\n\n  /**\n   * Lock all elements\n   */\n  lockAllElements(): void {\n    const allIds = this._elements().map((el) => el.id);\n    this.lockElements(allIds);\n  }\n\n  /**\n   * Unlock all elements\n   */\n  unlockAllElements(): void {\n    const allIds = this._elements().map((el) => el.id);\n    this.unlockElements(allIds);\n  }\n\n  /**\n   * Check if an element is locked\n   */\n  isElementLocked(elementId: string): boolean {\n    const element = this.getElementById(elementId);\n    return Boolean(element?.locked);\n  }\n\n  /**\n   * Get locked element IDs\n   */\n  getLockedElementIds(): string[] {\n    return this.lockedElements().map((el) => el.id);\n  }\n\n  /**\n   * Get unlocked element IDs\n   */\n  getUnlockedElementIds(): string[] {\n    return this.unlockedElements().map((el) => el.id);\n  }\n\n  // ---------- Layer Management ----------\n\n  /**\n   * Move elements to a specific layer (respects lock status)\n   */\n  moveToLayer(elementIds: string[], layerId: string, ignoreLock = false): void {\n    if (!elementIds?.length) return;\n\n    const updates = elementIds.map((id) => ({ id, layerId }));\n    this.updateElements(updates, ignoreLock);\n  }\n\n  /**\n   * Get elements by layer\n   */\n  getElementsByLayer(layerId: string): WhiteboardElement[] {\n    return this._elements().filter((el) => el.layerId === layerId);\n  }\n\n  // ---------- Search and Query ----------\n\n  /**\n   * Find element by ID in both persistent and draft elements\n   */\n  getElementById(id: string): WhiteboardElement | undefined {\n    // Search in persistent elements first\n    const persistentElement = this._elements().find((el) => el.id === id);\n    if (persistentElement) return persistentElement;\n\n    // Search in draft elements\n    return this._draftElements().find((el) => el.id === id);\n  }\n\n  /**\n   * Find elements by IDs\n   */\n  getElementsByIds(ids: string[]): WhiteboardElement[] {\n    const idsSet = new Set(ids);\n    const allElements = this.allElements();\n    return allElements.filter((el) => idsSet.has(el.id));\n  }\n\n  /**\n   * Get elements by type\n   */\n  getElementsByType(type: string): WhiteboardElement[] {\n    return this._elements().filter((el) => el.type === type);\n  }\n\n  /**\n   * Search elements with multiple criteria\n   */\n  searchElements(criteria: ElementSearchCriteria): WhiteboardElement[] {\n    let results = this._elements();\n\n    if (criteria.type) {\n      results = results.filter((el) => el.type === criteria.type);\n    }\n\n    if (criteria.layerId) {\n      results = results.filter((el) => el.layerId === criteria.layerId);\n    }\n\n    if (criteria.locked !== undefined) {\n      results = results.filter((el) => Boolean(el.locked) === criteria.locked);\n    }\n\n    if (criteria.textContent) {\n      const searchText = criteria.textContent.toLowerCase();\n      results = results.filter((el) => {\n        const textElement = el as WhiteboardElement & { text?: string; content?: string };\n        const text = (textElement.text || textElement.content || '').toLowerCase();\n        return text.includes(searchText);\n      });\n    }\n\n    if (criteria.zIndexRange) {\n      const { min, max } = criteria.zIndexRange;\n      results = results.filter((el) => {\n        const zIndex = el.zIndex || 0;\n        return zIndex >= min && zIndex <= max;\n      });\n    }\n\n    if (criteria.bounds) {\n      results = this.findElementsInBounds(criteria.bounds).filter((el) => results.some((r) => r.id === el.id));\n    }\n\n    return results;\n  }\n\n  /**\n   * Find elements by text content\n   */\n  findElementsByText(searchText: string): WhiteboardElement[] {\n    return this.searchElements({ textContent: searchText });\n  }\n\n  /**\n   * Get elements within a radius of a point\n   */\n  getElementsInRadius(centerX: number, centerY: number, radius: number): WhiteboardElement[] {\n    return this._elements().filter((element) => {\n      const dx = element.x - centerX;\n      const dy = element.y - centerY;\n      const distance = Math.sqrt(dx * dx + dy * dy);\n      return distance <= radius;\n    });\n  }\n\n  /**\n   * Get nearest element to a point\n   */\n  getNearestElement(x: number, y: number): WhiteboardElement | undefined {\n    const elements = this._elements();\n    if (elements.length === 0) return undefined;\n\n    let nearestElement = elements[0];\n    let minDistance = this.getDistanceToElement(x, y, nearestElement);\n\n    for (let i = 1; i < elements.length; i++) {\n      const distance = this.getDistanceToElement(x, y, elements[i]);\n      if (distance < minDistance) {\n        minDistance = distance;\n        nearestElement = elements[i];\n      }\n    }\n\n    return nearestElement;\n  }\n\n  // ---------- State Management ----------\n\n  /**\n   * Create a snapshot of current state\n   */\n  createSnapshot(): ElementsSnapshot {\n    return {\n      elements: [...this._elements()],\n      draftElements: [...this._draftElements()],\n      maxZIndex: this._maxZIndex(),\n      timestamp: Date.now(),\n    };\n  }\n\n  /**\n   * Restore state from snapshot\n   */\n  restoreSnapshot(snapshot: ElementsSnapshot): void {\n    this._elements.set([...snapshot.elements]);\n    this._draftElements.set([...snapshot.draftElements]);\n    this._maxZIndex.set(snapshot.maxZIndex);\n  }\n\n  // ---------- Utility Methods ----------\n\n  /**\n   * Find elements intersecting with a boundary\n   */\n  findElementsInBounds(bounds: { x: number; y: number; width: number; height: number }): WhiteboardElement[] {\n    return this._elements().filter((element) => {\n      const elementWidth = (element as WhiteboardElement & { width?: number }).width || 50;\n      const elementHeight = (element as WhiteboardElement & { height?: number }).height || 50;\n\n      return (\n        element.x < bounds.x + bounds.width &&\n        element.x + elementWidth > bounds.x &&\n        element.y < bounds.y + bounds.height &&\n        element.y + elementHeight > bounds.y\n      );\n    });\n  }\n\n  /**\n   * Calculate combined bounds of multiple elements\n   */\n  calculateElementsBounds(elements: WhiteboardElement[]): {\n    x: number;\n    y: number;\n    width: number;\n    height: number;\n    centerX: number;\n    centerY: number;\n  } | null {\n    if (elements.length === 0) {\n      return null;\n    }\n\n    const allBounds = elements.map(getElementBounds);\n\n    const minX = Math.min(...allBounds.map((b) => b.minX));\n    const minY = Math.min(...allBounds.map((b) => b.minY));\n    const maxX = Math.max(...allBounds.map((b) => b.maxX));\n    const maxY = Math.max(...allBounds.map((b) => b.maxY));\n\n    const width = maxX - minX;\n    const height = maxY - minY;\n\n    return {\n      x: minX,\n      y: minY,\n      width,\n      height,\n      centerX: minX + width / 2,\n      centerY: minY + height / 2,\n    };\n  }\n\n  /**\n   * Get elements count (use computed signal for reactivity)\n   */\n  getElementsCount(): number {\n    return this.elementsCount();\n  }\n\n  /**\n   * Get unique element types (use computed signal for reactivity)\n   */\n  getElementTypes(): string[] {\n    return this.elementTypes();\n  }\n\n  /**\n   * Normalize z-indices to sequential integers\n   */\n  normalizeZIndices(): void {\n    const elements = [...this._elements()].sort((a, b) => (a.zIndex || 0) - (b.zIndex || 0));\n\n    const updates = elements.map((element, index) => ({\n      id: element.id,\n      zIndex: index + 1,\n    }));\n\n    this._maxZIndex.set(elements.length);\n    this.updateElements(updates, true);\n  }\n\n  // ---------- Convenience Methods ----------\n\n  /**\n   * Add a single element (convenience method)\n   */\n  addElement(element: WhiteboardElement): void {\n    this.addElements([element]);\n  }\n\n  /**\n   * Update a single element (convenience method, respects lock status)\n   */\n  updateElement(update: Partial<WhiteboardElement> & { id: string }, ignoreLock = false): void {\n    this.updateElements([update], ignoreLock);\n  }\n\n  /**\n   * Remove a single element (convenience method, respects lock status)\n   */\n  removeElement(element: WhiteboardElement, ignoreLock = false): void {\n    this.removeElementsByIds([element.id], ignoreLock);\n  }\n\n  /**\n   * Check if a specific element exists\n   */\n  elementExists(id: string): boolean {\n    return this.getElementById(id) !== undefined;\n  }\n\n  /**\n   * Get elements within a specific z-index range\n   */\n  getElementsByZIndexRange(min: number, max: number): WhiteboardElement[] {\n    return this._elements().filter((el) => {\n      const zIndex = el.zIndex || 0;\n      return zIndex >= min && zIndex <= max;\n    });\n  }\n\n  /**\n   * Get elements with specific properties\n   */\n  getElementsByProperty<K extends keyof WhiteboardElement>(\n    property: K,\n    value: WhiteboardElement[K]\n  ): WhiteboardElement[] {\n    return this._elements().filter((el) => el[property] === value);\n  }\n\n  /**\n   * Lock a single element\n   */\n  lockElement(elementId: string): void {\n    this.lockElements([elementId]);\n  }\n\n  /**\n   * Unlock a single element\n   */\n  unlockElement(elementId: string): void {\n    this.unlockElements([elementId]);\n  }\n\n  /**\n   * Toggle lock status of a single element\n   */\n  toggleElementLock(elementId: string): void {\n    this.toggleElementsLock([elementId]);\n  }\n\n  /**\n   * Get modifiable elements (unlocked elements)\n   */\n  getModifiableElements(): WhiteboardElement[] {\n    return this.unlockedElements();\n  }\n\n  /**\n   * Check if any of the given elements are locked\n   */\n  hasLockedElementsInSelection(elementIds: string[]): boolean {\n    return elementIds.some((id) => this.isElementLocked(id));\n  }\n\n  /**\n   * Filter out locked elements from a selection\n   */\n  filterUnlockedElements(elementIds: string[]): string[] {\n    return elementIds.filter((id) => !this.isElementLocked(id));\n  }\n\n  /**\n   * Get elements that can be safely modified (respects lock status)\n   */\n  getModifiableElementsFromIds(elementIds: string[]): WhiteboardElement[] {\n    const unlocked = this.filterUnlockedElements(elementIds);\n    return this.getElementsByIds(unlocked);\n  }\n\n  /**\n   * Safely update multiple elements (warns about locked elements)\n   */\n  safeUpdateElements(updates: Partial<WhiteboardElement> & { id: string }[]): LockOperationResult {\n    const locked: string[] = [];\n    const updated: string[] = [];\n\n    const safeUpdates = updates.filter((update) => {\n      if (this.isElementLocked(update.id)) {\n        locked.push(update.id);\n        return false;\n      } else {\n        updated.push(update.id);\n        return true;\n      }\n    });\n\n    if (safeUpdates.length > 0) {\n      this.updateElements(safeUpdates, false);\n    }\n\n    return { updated, locked };\n  }\n\n  // ---------- Private Helper Methods ----------\n\n  /**\n   * Check if an update operation is a lock-related operation\n   */\n  private isLockOperation(update: Partial<WhiteboardElement>): boolean {\n    return 'locked' in update;\n  }\n\n  /**\n   * Update the maximum z-index based on elements\n   */\n  private updateMaxZIndex(elements: WhiteboardElement[]): void {\n    const maxZ = Math.max(...elements.map((el) => el.zIndex || 0));\n    this._maxZIndex.update((current) => Math.max(current, maxZ));\n  }\n\n  /**\n   * Get distance from point to element\n   */\n  private getDistanceToElement(x: number, y: number, element: WhiteboardElement): number {\n    const elementWidth = (element as WhiteboardElement & { width?: number }).width || 50;\n    const elementHeight = (element as WhiteboardElement & { height?: number }).height || 50;\n\n    const centerX = element.x + elementWidth / 2;\n    const centerY = element.y + elementHeight / 2;\n\n    const dx = x - centerX;\n    const dy = y - centerY;\n\n    return Math.sqrt(dx * dx + dy * dy);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { ConfigService } from '../config/config.service';\nimport { EventBusService } from '../event-bus/event-bus.service';\nimport { WhiteboardConfig } from '../types';\n\n/**\n * Manages canvas panning operations including pan by delta, pan to position,\n * pan constraints, and bounds checking.\n */\n@Injectable({ providedIn: 'root' })\nexport class PanService {\n  private readonly DEFAULT_PAN_BOUNDS = { x: -Infinity, y: -Infinity, width: Infinity, height: Infinity };\n  private panBounds = this.DEFAULT_PAN_BOUNDS;\n\n  constructor(private configService: ConfigService, private eventBusService: EventBusService) {}\n\n  private getConfig(): WhiteboardConfig {\n    return this.configService.getConfig();\n  }\n\n  /**\n   * Pan the canvas by delta amounts.\n   */\n  pan(dx: number, dy: number): void {\n    const config = this.getConfig();\n    const { x, y } = config;\n\n    const newX = x + dx;\n    const newY = y + dy;\n\n    // Apply pan constraints\n    const constrainedPosition = this.constrainPanPosition(newX, newY);\n\n    this.setCanvasPosition(constrainedPosition.x, constrainedPosition.y);\n  }\n\n  /**\n   * Pan to specific position.\n   */\n  panTo(x: number, y: number): void {\n    const constrainedPosition = this.constrainPanPosition(x, y);\n    this.setCanvasPosition(constrainedPosition.x, constrainedPosition.y);\n  }\n\n  private setCanvasPosition(x: number, y: number): void {\n    this.configService.updateConfig({ x, y });\n  }\n\n  /**\n   * Get current pan position.\n   */\n  getPanPosition(): { x: number; y: number } {\n    const config = this.getConfig();\n    return { x: config.x, y: config.y };\n  }\n\n  /**\n   * Reset pan to origin.\n   */\n  resetPan(): void {\n    this.setCanvasPosition(0, 0);\n  }\n\n  /**\n   * Set pan bounds to constrain panning within specific area.\n   */\n  setPanBounds(bounds: { x: number; y: number; width: number; height: number }): void {\n    this.panBounds = bounds;\n  }\n\n  /**\n   * Reset pan bounds to unlimited.\n   */\n  resetPanBounds(): void {\n    this.panBounds = this.DEFAULT_PAN_BOUNDS;\n  }\n\n  /**\n   * Get current pan bounds.\n   */\n  getPanBounds(): { x: number; y: number; width: number; height: number } {\n    return { ...this.panBounds };\n  }\n\n  private constrainPanPosition(x: number, y: number): { x: number; y: number } {\n    if (this.panBounds === this.DEFAULT_PAN_BOUNDS) {\n      return { x, y };\n    }\n\n    const constrainedX = Math.max(this.panBounds.x, Math.min(this.panBounds.x + this.panBounds.width, x));\n\n    const constrainedY = Math.max(this.panBounds.y, Math.min(this.panBounds.y + this.panBounds.height, y));\n\n    return { x: constrainedX, y: constrainedY };\n  }\n\n  /**\n   * Check if position is within pan bounds.\n   */\n  isPositionWithinBounds(x: number, y: number): boolean {\n    if (this.panBounds === this.DEFAULT_PAN_BOUNDS) {\n      return true;\n    }\n\n    return (\n      x >= this.panBounds.x &&\n      x <= this.panBounds.x + this.panBounds.width &&\n      y >= this.panBounds.y &&\n      y <= this.panBounds.y + this.panBounds.height\n    );\n  }\n\n  /**\n   * Get distance to pan bounds from current position.\n   */\n  getDistanceToBounds(): { left: number; top: number; right: number; bottom: number } {\n    const { x, y } = this.getPanPosition();\n\n    if (this.panBounds === this.DEFAULT_PAN_BOUNDS) {\n      return { left: Infinity, top: Infinity, right: Infinity, bottom: Infinity };\n    }\n\n    return {\n      left: x - this.panBounds.x,\n      top: y - this.panBounds.y,\n      right: this.panBounds.x + this.panBounds.width - x,\n      bottom: this.panBounds.y + this.panBounds.height - y,\n    };\n  }\n\n  /**\n   * Pan with easing animation.\n   */\n  panWithEasing(targetX: number, targetY: number): void {\n    this.panTo(targetX, targetY);\n  }\n\n  /**\n   * Pan by delta with momentum.\n   */\n  panWithMomentum(dx: number, dy: number): void {\n    this.pan(dx, dy);\n  }\n\n  /**\n   * Extension point for custom pan constraints validation.\n   */\n  protected validatePanOperation(x: number, y: number, dx: number, dy: number): boolean {\n    return this.isPositionWithinBounds(x + dx, y + dy);\n  }\n\n  /**\n   * Extension point for custom pan acceleration.\n   */\n  protected applyPanAcceleration(dx: number, dy: number): { dx: number; dy: number } {\n    return { dx, dy };\n  }\n\n  /**\n   * Extension point for pan state change callback.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  protected onPanChange(_oldPosition: { x: number; y: number }, _newPosition: { x: number; y: number }): void {\n    // Override in derived classes for custom behavior\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { ClipboardData, ClipboardInfo, WhiteboardElement } from '../types';\nimport { ElementsService } from '../elements/elements.service';\n\n/**\n * Manages clipboard operations for whiteboard elements with localStorage persistence.\n */\n@Injectable({ providedIn: 'root' })\nexport class ClipboardService {\n  private readonly CLIPBOARD_KEY = 'whiteboard-clipboard';\n  private readonly OFFSET_INCREMENT = 20;\n\n  constructor(private elementsService: ElementsService) {}\n\n  copy(elements: WhiteboardElement[]): void {\n    if (elements.length === 0) return;\n\n    const clipboardData: ClipboardData = {\n      elements: elements,\n      timestamp: Date.now(),\n    };\n\n    try {\n      localStorage.setItem(this.CLIPBOARD_KEY, JSON.stringify(clipboardData));\n    } catch (error) {\n      console.error('Failed to copy elements to clipboard:', error);\n    }\n  }\n\n  cut(elements: WhiteboardElement[]): void {\n    this.copy(elements);\n  }\n\n  paste(): WhiteboardElement[] {\n    const clipboardData = this.getData();\n    if (!clipboardData?.elements.length) {\n      return [];\n    }\n\n    const pastedElements = this.duplicateElementsWithOffset(\n      clipboardData.elements,\n      this.OFFSET_INCREMENT,\n      this.OFFSET_INCREMENT\n    );\n\n    this.elementsService.addElements(pastedElements);\n    return pastedElements;\n  }\n\n  clear(): void {\n    try {\n      localStorage.removeItem(this.CLIPBOARD_KEY);\n    } catch (error) {\n      console.error('Failed to clear clipboard:', error);\n    }\n  }\n\n  hasData(): boolean {\n    const data = this.getData();\n    return data !== null && data.elements.length > 0;\n  }\n\n  getData(): ClipboardData | null {\n    try {\n      const data = localStorage.getItem(this.CLIPBOARD_KEY);\n      return data ? JSON.parse(data) : null;\n    } catch (error) {\n      console.error('Failed to read clipboard data:', error);\n      return null;\n    }\n  }\n\n  duplicateElements(\n    elements: WhiteboardElement[],\n    offsetX: number = this.OFFSET_INCREMENT,\n    offsetY: number = this.OFFSET_INCREMENT\n  ): WhiteboardElement[] {\n    if (elements.length === 0) {\n      return [];\n    }\n\n    const duplicatedElements = this.duplicateElementsWithOffset(elements, offsetX, offsetY);\n    this.elementsService.addElements(duplicatedElements);\n    return duplicatedElements;\n  }\n\n  createDuplicates(\n    elements: WhiteboardElement[],\n    offsetX: number = this.OFFSET_INCREMENT,\n    offsetY: number = this.OFFSET_INCREMENT\n  ): WhiteboardElement[] {\n    return this.duplicateElementsWithOffset(elements, offsetX, offsetY);\n  }\n\n  getClipboardInfo(): ClipboardInfo | null {\n    const data = this.getData();\n    if (!data) return null;\n\n    return {\n      elementCount: data.elements.length,\n      timestamp: data.timestamp,\n    };\n  }\n\n  isDataFresh(maxAgeMs: number = 5 * 60 * 1000): boolean {\n    const data = this.getData();\n    if (!data) return false;\n\n    return Date.now() - data.timestamp <= maxAgeMs;\n  }\n\n  getClipboardElementTypes(): string[] {\n    const data = this.getData();\n    if (!data) return [];\n\n    const types = data.elements.map((el) => el.type);\n    return [...new Set(types)];\n  }\n\n  private duplicateElementsWithOffset(\n    elements: WhiteboardElement[],\n    offsetX: number,\n    offsetY: number\n  ): WhiteboardElement[] {\n    return elements.map((element) => ({\n      ...element,\n      id: `${element.id}_copy_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n      x: element.x + offsetX,\n      y: element.y + offsetY,\n    }));\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { ConnectionPoint, Point, SnapResult, WhiteboardElement, ElementType, Bounds } from '../types';\nimport { getElementUtil } from './element.utils';\n// ArrowElement type not needed directly in this service\nimport { RectangleElement } from './rectangle-element';\nimport { EllipseElement } from './ellipse-element';\n\n/** Snap radius in canvas pixels */\nconst DEFAULT_SNAP_RADIUS = 20;\n\n/**\n * Computes connection points on shapes and provides snap-to-shape logic\n * for arrow endpoints during drawing and reconnecting.\n */\n@Injectable({ providedIn: 'root' })\nexport class ConnectionPointsService {\n  /**\n   * Get all named connection points for a given element.\n   *\n   * Connection points are returned in **world coordinates** (accounting for\n   * the element's position offset).\n   */\n  getConnectionPoints(element: WhiteboardElement): ConnectionPoint[] {\n    switch (element.type) {\n      case ElementType.Rectangle:\n        return this.getRectangleConnectionPoints(element as RectangleElement);\n      case ElementType.Ellipse:\n        return this.getEllipseConnectionPoints(element as EllipseElement);\n      case ElementType.Image:\n        return this.getImageConnectionPoints(element);\n      case ElementType.Text:\n        return this.getTextConnectionPoints(element);\n      default:\n        // Fallback: use bounding box corners and edge centers\n        return this.getBoundsConnectionPoints(element);\n    }\n  }\n\n  /**\n   * Find the closest connection point on any connectable element near the given position.\n   *\n   * @param position  - current pointer world coordinates\n   * @param elements  - all elements to consider\n   * @param excludeIds - element IDs to exclude (e.g. the arrow itself)\n   * @param snapRadius - maximum snapping distance in canvas px\n   */\n  findSnapTarget(\n    position: Point,\n    elements: WhiteboardElement[],\n    excludeIds: Set<string>,\n    snapRadius = DEFAULT_SNAP_RADIUS\n  ): SnapResult | null {\n    let best: SnapResult | null = null;\n\n    for (const element of elements) {\n      if (excludeIds.has(element.id)) continue;\n      if (!this.isConnectable(element)) continue;\n\n      // First check if pointer is near the element's bounding box at all (fast reject)\n      const util = getElementUtil(element.type);\n      const bounds = util.getBounds(element);\n      if (!this.isNearBounds(position, bounds, snapRadius * 2)) continue;\n\n      const points = this.getConnectionPoints(element);\n      for (const cp of points) {\n        const dist = this.distance(position, cp.position);\n        if (dist <= snapRadius && (!best || dist < best.distance)) {\n          best = {\n            elementId: element.id,\n            pointId: cp.id,\n            point: cp.position,\n            distance: dist,\n          };\n        }\n      }\n\n      // Also consider the closest point on the shape edge\n      const closestEdge = this.getClosestEdgePoint(element, position);\n      if (closestEdge) {\n        const dist = this.distance(position, closestEdge);\n        if (dist <= snapRadius && (!best || dist < best.distance)) {\n          best = {\n            elementId: element.id,\n            pointId: null, // closest edge, no named point\n            point: closestEdge,\n            distance: dist,\n          };\n        }\n      }\n    }\n\n    return best;\n  }\n\n  /**\n   * Compute the point on a shape's edge where a bound arrow should connect,\n   * given a binding and the current state of the target element.\n   */\n  resolveBindingPoint(\n    element: WhiteboardElement,\n    pointId: string | null,\n    fallbackDirection: Point,\n    gap: number\n  ): Point {\n    if (pointId) {\n      const points = this.getConnectionPoints(element);\n      const cp = points.find((p) => p.id === pointId);\n      if (cp) {\n        return {\n          x: cp.position.x + cp.normal.x * gap,\n          y: cp.position.y + cp.normal.y * gap,\n        };\n      }\n    }\n\n    // Fallback: project from the element center toward the fallback direction\n    return this.getClosestEdgePoint(element, fallbackDirection) ?? this.getElementCenter(element);\n  }\n\n  // ────────────────── Shape-specific connection points ──────────────────\n\n  private getRectangleConnectionPoints(el: RectangleElement): ConnectionPoint[] {\n    const { x, y, width, height } = el;\n    const cx = x + width / 2;\n    const cy = y + height / 2;\n    return [\n      { id: 'top', position: { x: cx, y }, normal: { x: 0, y: -1 } },\n      { id: 'right', position: { x: x + width, y: cy }, normal: { x: 1, y: 0 } },\n      { id: 'bottom', position: { x: cx, y: y + height }, normal: { x: 0, y: 1 } },\n      { id: 'left', position: { x, y: cy }, normal: { x: -1, y: 0 } },\n      { id: 'top-left', position: { x, y }, normal: { x: -0.707, y: -0.707 } },\n      { id: 'top-right', position: { x: x + width, y }, normal: { x: 0.707, y: -0.707 } },\n      { id: 'bottom-right', position: { x: x + width, y: y + height }, normal: { x: 0.707, y: 0.707 } },\n      { id: 'bottom-left', position: { x, y: y + height }, normal: { x: -0.707, y: 0.707 } },\n    ];\n  }\n\n  private getEllipseConnectionPoints(el: EllipseElement): ConnectionPoint[] {\n    const cx = el.x + el.cx;\n    const cy = el.y + el.cy;\n    const { rx, ry } = el;\n    return [\n      { id: 'top', position: { x: cx, y: cy - ry }, normal: { x: 0, y: -1 } },\n      { id: 'right', position: { x: cx + rx, y: cy }, normal: { x: 1, y: 0 } },\n      { id: 'bottom', position: { x: cx, y: cy + ry }, normal: { x: 0, y: 1 } },\n      { id: 'left', position: { x: cx - rx, y: cy }, normal: { x: -1, y: 0 } },\n      // 45° points on the ellipse\n      { id: 'top-right', position: { x: cx + rx * 0.707, y: cy - ry * 0.707 }, normal: { x: 0.707, y: -0.707 } },\n      { id: 'bottom-right', position: { x: cx + rx * 0.707, y: cy + ry * 0.707 }, normal: { x: 0.707, y: 0.707 } },\n      { id: 'bottom-left', position: { x: cx - rx * 0.707, y: cy + ry * 0.707 }, normal: { x: -0.707, y: 0.707 } },\n      { id: 'top-left', position: { x: cx - rx * 0.707, y: cy - ry * 0.707 }, normal: { x: -0.707, y: -0.707 } },\n    ];\n  }\n\n  private getImageConnectionPoints(el: WhiteboardElement): ConnectionPoint[] {\n    // Image has width/height same as Rectangle\n    const anyEl = el as unknown as { x: number; y: number; width: number; height: number };\n    const { x, y, width, height } = anyEl;\n    const cx = x + width / 2;\n    const cy = y + height / 2;\n    return [\n      { id: 'top', position: { x: cx, y }, normal: { x: 0, y: -1 } },\n      { id: 'right', position: { x: x + width, y: cy }, normal: { x: 1, y: 0 } },\n      { id: 'bottom', position: { x: cx, y: y + height }, normal: { x: 0, y: 1 } },\n      { id: 'left', position: { x, y: cy }, normal: { x: -1, y: 0 } },\n    ];\n  }\n\n  private getTextConnectionPoints(el: WhiteboardElement): ConnectionPoint[] {\n    return this.getBoundsConnectionPoints(el);\n  }\n\n  /** Fallback: bounding-box-based connection points */\n  private getBoundsConnectionPoints(element: WhiteboardElement): ConnectionPoint[] {\n    const util = getElementUtil(element.type);\n    const bounds = util.getBounds(element);\n    const cx = (bounds.minX + bounds.maxX) / 2;\n    const cy = (bounds.minY + bounds.maxY) / 2;\n    return [\n      { id: 'top', position: { x: cx, y: bounds.minY }, normal: { x: 0, y: -1 } },\n      { id: 'right', position: { x: bounds.maxX, y: cy }, normal: { x: 1, y: 0 } },\n      { id: 'bottom', position: { x: cx, y: bounds.maxY }, normal: { x: 0, y: 1 } },\n      { id: 'left', position: { x: bounds.minX, y: cy }, normal: { x: -1, y: 0 } },\n    ];\n  }\n\n  // ────────────────── Edge intersection helpers ──────────────────\n\n  /**\n   * Get the closest point on an element's edge to a given world coordinate.\n   */\n  private getClosestEdgePoint(element: WhiteboardElement, target: Point): Point | null {\n    switch (element.type) {\n      case ElementType.Rectangle:\n        return this.closestRectEdgePoint(element as RectangleElement, target);\n      case ElementType.Ellipse:\n        return this.closestEllipseEdgePoint(element as EllipseElement, target);\n      default: {\n        const util = getElementUtil(element.type);\n        const b = util.getBounds(element);\n        return this.closestBoundsEdgePoint(b, target);\n      }\n    }\n  }\n\n  private closestRectEdgePoint(el: RectangleElement, target: Point): Point {\n    const { x, y, width, height } = el;\n    const cx = x + width / 2;\n    const cy = y + height / 2;\n\n    // Clamp the target into the rectangle perimeter\n    const dx = target.x - cx;\n    const dy = target.y - cy;\n\n    if (dx === 0 && dy === 0) return { x: cx, y };\n\n    const halfW = width / 2;\n    const halfH = height / 2;\n\n    // Find intersection of ray from center toward target with rectangle edges\n    const scaleX = halfW / Math.abs(dx || 0.001);\n    const scaleY = halfH / Math.abs(dy || 0.001);\n    const scale = Math.min(scaleX, scaleY);\n\n    return {\n      x: cx + dx * scale,\n      y: cy + dy * scale,\n    };\n  }\n\n  private closestEllipseEdgePoint(el: EllipseElement, target: Point): Point {\n    const cx = el.x + el.cx;\n    const cy = el.y + el.cy;\n    const { rx, ry } = el;\n\n    const dx = target.x - cx;\n    const dy = target.y - cy;\n    const angle = Math.atan2(dy, dx);\n\n    return {\n      x: cx + rx * Math.cos(angle),\n      y: cy + ry * Math.sin(angle),\n    };\n  }\n\n  private closestBoundsEdgePoint(bounds: Bounds, target: Point): Point {\n    const cx = (bounds.minX + bounds.maxX) / 2;\n    const cy = (bounds.minY + bounds.maxY) / 2;\n    const halfW = bounds.width / 2;\n    const halfH = bounds.height / 2;\n\n    const dx = target.x - cx;\n    const dy = target.y - cy;\n\n    if (dx === 0 && dy === 0) return { x: cx, y: bounds.minY };\n\n    const scaleX = halfW / Math.abs(dx || 0.001);\n    const scaleY = halfH / Math.abs(dy || 0.001);\n    const scale = Math.min(scaleX, scaleY);\n\n    return { x: cx + dx * scale, y: cy + dy * scale };\n  }\n\n  // ────────────────── Utility helpers ──────────────────\n\n  getElementCenter(element: WhiteboardElement): Point {\n    const util = getElementUtil(element.type);\n    const bounds = util.getBounds(element);\n    return {\n      x: (bounds.minX + bounds.maxX) / 2,\n      y: (bounds.minY + bounds.maxY) / 2,\n    };\n  }\n\n  isConnectable(element: WhiteboardElement): boolean {\n    return (\n      element.type === ElementType.Rectangle ||\n      element.type === ElementType.Ellipse ||\n      element.type === ElementType.Image ||\n      element.type === ElementType.Text\n    );\n  }\n\n  private isNearBounds(point: Point, bounds: Bounds, margin: number): boolean {\n    return (\n      point.x >= bounds.minX - margin &&\n      point.x <= bounds.maxX + margin &&\n      point.y >= bounds.minY - margin &&\n      point.y <= bounds.maxY + margin\n    );\n  }\n\n  private distance(a: Point, b: Point): number {\n    const dx = a.x - b.x;\n    const dy = a.y - b.y;\n    return Math.sqrt(dx * dx + dy * dy);\n  }\n}\n","import { computed, inject, Injectable, OnDestroy, Signal } from '@angular/core';\nimport { ArrowElement } from './arrow-element';\nimport { ConnectionPointsService } from './connection-points.service';\nimport { ElementsService } from './elements.service';\nimport { EventBusService } from '../event-bus/event-bus.service';\nimport { ArrowBinding, ElementType, Point, WhiteboardElement, WhiteboardEvent } from '../types';\nimport { Subscription } from 'rxjs';\n\n/**\n * Manages the relationships between arrows and the shapes they are bound to.\n *\n * Responsibilities:\n * - Resolve binding endpoints to world coordinates\n * - Update arrow endpoints when bound shapes move or resize\n * - Attach / detach arrow endpoints to/from shapes\n * - Provide reverse-lookup: which arrows are bound to a given shape\n * - Auto-detach bindings when shapes are removed\n */\n@Injectable({ providedIn: 'root' })\nexport class ArrowBindingService implements OnDestroy {\n  private connectionPoints = inject(ConnectionPointsService);\n  private elementsService = inject(ElementsService);\n  private eventBus = inject(EventBusService);\n  private subscription: Subscription;\n\n  constructor() {\n    // Listen for element removals to auto-detach bindings\n    this.subscription = this.eventBus.on(WhiteboardEvent.ElementsRemoved).subscribe((removedElements) => {\n      if (!removedElements || !Array.isArray(removedElements) || removedElements.length === 0) return;\n      const updates: Array<Partial<ArrowElement> & { id: string }> = [];\n\n      for (const removedEl of removedElements as WhiteboardElement[]) {\n        updates.push(...this.detachAllFromElement(removedEl.id));\n      }\n\n      if (updates.length > 0) {\n        this.elementsService.updateElements(updates as Array<Partial<WhiteboardElement> & { id: string }>);\n      }\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.subscription?.unsubscribe();\n  }\n\n  // ────────────────── Reverse index ──────────────────\n\n  /**\n   * Returns all arrow elements that are currently bound to the given element id\n   * (at either their start or end).\n   */\n  getArrowsBoundTo(elementId: string): ArrowElement[] {\n    return this.elementsService\n      .getElements()\n      .filter(\n        (el): el is ArrowElement =>\n          el.type === ElementType.Arrow &&\n          (el.startBinding?.elementId === elementId || el.endBinding?.elementId === elementId)\n      );\n  }\n\n  /**\n   * Computed signal of all arrow elements in the workspace.\n   */\n  readonly arrows: Signal<ArrowElement[]> = computed(() =>\n    this.elementsService.elements().filter((el): el is ArrowElement => el.type === ElementType.Arrow)\n  );\n\n  // ────────────────── Binding resolution ──────────────────\n\n  /**\n   * Resolve the world-coordinate for one end of an arrow based on its binding.\n   *\n   * @param binding      - the ArrowBinding at this end (may be null → free point)\n   * @param freePoint    - the free (x,y) endpoint if binding is null\n   * @param otherEnd     - the other endpoint (for computing direction when using closest-edge)\n   */\n  resolveEndpoint(binding: ArrowBinding | null, freePoint: Point, otherEnd: Point): Point {\n    if (!binding) return freePoint;\n\n    const target = this.elementsService.getElementById(binding.elementId);\n    if (!target) return freePoint; // target was deleted\n\n    return this.connectionPoints.resolveBindingPoint(target, binding.pointId, otherEnd, binding.gap);\n  }\n\n  // ────────────────── Attach / Detach ──────────────────\n\n  /**\n   * Create a binding object for a snap result.\n   */\n  createBinding(elementId: string, pointId: string | null, gap = 0): ArrowBinding {\n    return { elementId, pointId, focus: 0.5, gap };\n  }\n\n  /**\n   * Attach one end of an arrow to a specific shape.\n   * Returns a new partial ArrowElement with updated binding + endpoint.\n   */\n  attachStart(arrow: ArrowElement, elementId: string, pointId: string | null, gap = 0): Partial<ArrowElement> {\n    const binding = this.createBinding(elementId, pointId, gap);\n    const otherEnd = { x: arrow.x2 + arrow.x, y: arrow.y2 + arrow.y };\n    const point = this.resolveEndpoint(binding, { x: arrow.x1 + arrow.x, y: arrow.y1 + arrow.y }, otherEnd);\n    return {\n      id: arrow.id,\n      startBinding: binding,\n      x1: point.x - arrow.x,\n      y1: point.y - arrow.y,\n    } as Partial<ArrowElement>;\n  }\n\n  attachEnd(arrow: ArrowElement, elementId: string, pointId: string | null, gap = 0): Partial<ArrowElement> {\n    const binding = this.createBinding(elementId, pointId, gap);\n    const otherEnd = { x: arrow.x1 + arrow.x, y: arrow.y1 + arrow.y };\n    const point = this.resolveEndpoint(binding, { x: arrow.x2 + arrow.x, y: arrow.y2 + arrow.y }, otherEnd);\n    return {\n      id: arrow.id,\n      endBinding: binding,\n      x2: point.x - arrow.x,\n      y2: point.y - arrow.y,\n    } as Partial<ArrowElement>;\n  }\n\n  detachStart(arrow: ArrowElement): Partial<ArrowElement> {\n    return { id: arrow.id, startBinding: null } as Partial<ArrowElement>;\n  }\n\n  detachEnd(arrow: ArrowElement): Partial<ArrowElement> {\n    return { id: arrow.id, endBinding: null } as Partial<ArrowElement>;\n  }\n\n  // ────────────────── Bulk updates (shape moved/resized) ──────────────────\n\n  /**\n   * Called after one or more shapes have been moved/resized.\n   * Recomputes all arrow endpoints that are bound to any of the moved shapes.\n   *\n   * @param movedIds - set of element IDs that were modified\n   * @returns array of arrow updates to apply via `elementsService.updateElements()`\n   */\n  recomputeBindingsForElements(movedIds: Set<string>): Array<Partial<ArrowElement> & { id: string }> {\n    const updates: Array<Partial<ArrowElement> & { id: string }> = [];\n\n    const allElements = this.elementsService.getElements();\n    const arrows = allElements.filter((el): el is ArrowElement => el.type === ElementType.Arrow);\n\n    for (const arrow of arrows) {\n      let changed = false;\n      const update: Partial<ArrowElement> & { id: string } = { id: arrow.id };\n\n      // Check start binding\n      if (arrow.startBinding && movedIds.has(arrow.startBinding.elementId)) {\n        const otherEnd: Point = { x: arrow.x2 + arrow.x, y: arrow.y2 + arrow.y };\n        const newStart = this.resolveEndpoint(\n          arrow.startBinding,\n          { x: arrow.x1 + arrow.x, y: arrow.y1 + arrow.y },\n          otherEnd\n        );\n        update.x1 = newStart.x - arrow.x;\n        update.y1 = newStart.y - arrow.y;\n        changed = true;\n      }\n\n      // Check end binding\n      if (arrow.endBinding && movedIds.has(arrow.endBinding.elementId)) {\n        const otherEnd: Point = {\n          x: (update.x1 !== undefined ? update.x1 : arrow.x1) + arrow.x,\n          y: (update.y1 !== undefined ? update.y1 : arrow.y1) + arrow.y,\n        };\n        const newEnd = this.resolveEndpoint(\n          arrow.endBinding,\n          { x: arrow.x2 + arrow.x, y: arrow.y2 + arrow.y },\n          otherEnd\n        );\n        update.x2 = newEnd.x - arrow.x;\n        update.y2 = newEnd.y - arrow.y;\n        changed = true;\n      }\n\n      if (changed) {\n        updates.push(update);\n      }\n    }\n\n    return updates;\n  }\n\n  /**\n   * When an element is about to be deleted, detach all arrows bound to it.\n   * Returns updates to apply before the element is removed.\n   */\n  detachAllFromElement(elementId: string): Array<Partial<ArrowElement> & { id: string }> {\n    const updates: Array<Partial<ArrowElement> & { id: string }> = [];\n\n    const arrows = this.getArrowsBoundTo(elementId);\n    for (const arrow of arrows) {\n      const update: Partial<ArrowElement> & { id: string } = { id: arrow.id };\n      if (arrow.startBinding?.elementId === elementId) {\n        update.startBinding = null;\n      }\n      if (arrow.endBinding?.elementId === elementId) {\n        update.endBinding = null;\n      }\n      updates.push(update);\n    }\n\n    return updates;\n  }\n\n  /**\n   * Check whether the given arrow has any active bindings.\n   */\n  hasBindings(arrow: ArrowElement): boolean {\n    return arrow.startBinding !== null || arrow.endBinding !== null;\n  }\n\n  /**\n   * Get a human-readable description of bindings (useful for debugging).\n   */\n  describeBindings(arrow: ArrowElement): string {\n    const parts: string[] = [];\n    if (arrow.startBinding) {\n      parts.push(`start→${arrow.startBinding.elementId}(${arrow.startBinding.pointId ?? 'edge'})`);\n    }\n    if (arrow.endBinding) {\n      parts.push(`end→${arrow.endBinding.elementId}(${arrow.endBinding.pointId ?? 'edge'})`);\n    }\n    return parts.length > 0 ? parts.join(', ') : 'unbound';\n  }\n}\n","import { Injectable, signal } from '@angular/core';\nimport { ConnectionPoint, Point } from '../types';\n\n/**\n * Lightweight signal-based service for communicating arrow-connection UI state\n * from tools (ArrowTool, SelectTool) to the canvas component.\n */\n@Injectable({ providedIn: 'root' })\nexport class ConnectionUIService {\n  /** Snap indicator position – shown when cursor is near a connectable shape */\n  private readonly _snapIndicator = signal<Point | null>(null);\n  readonly snapIndicator = this._snapIndicator.asReadonly();\n\n  /** Connection points currently visible (hovered connectable shapes) */\n  private readonly _visibleConnectionPoints = signal<ConnectionPoint[]>([]);\n  readonly visibleConnectionPoints = this._visibleConnectionPoints.asReadonly();\n\n  setSnapIndicator(point: Point | null): void {\n    this._snapIndicator.set(point);\n  }\n\n  setVisibleConnectionPoints(points: ConnectionPoint[]): void {\n    this._visibleConnectionPoints.set(points);\n  }\n\n  /** Clear all UI hints (called when tool finishes or deactivates) */\n  clearAll(): void {\n    this._snapIndicator.set(null);\n    this._visibleConnectionPoints.set([]);\n  }\n}\n","import { computed, inject, Injectable } from '@angular/core';\nimport { ApiService } from '../api';\nimport { ElementType } from '../types';\nimport { ArrowElement } from './arrow-element';\nimport { LineElement } from './line-element';\nimport { getLineWorldEndpoints } from './element.utils';\nimport { SelectionService } from './selection.service';\n\nexport interface EndpointHandle {\n  elementId: string;\n  end: 'start' | 'end';\n  x: number;\n  y: number;\n  bound: boolean;\n  elementType: ElementType;\n}\n\nexport interface CurveHandle {\n  elementId: string;\n  x: number;\n  y: number;\n  isCurved: boolean;\n}\n\n@Injectable()\nexport class HandleService {\n  private readonly selectionService = inject(SelectionService);\n  private readonly apiService = inject(ApiService);\n\n  /** True when only line-type elements (Arrow, Line) are selected */\n  readonly isLineOnlySelection = this.selectionService.isLineOnlySelectionSignal;\n\n  /**\n   * Endpoint handles for all selected line-type elements (Arrow / Line).\n   * Each entry describes one endpoint in world coordinates.\n   */\n  readonly lineEndpointHandles = computed<EndpointHandle[]>(() => {\n    const ids = this.selectionService.selectedIdsSignal();\n    if (ids.length === 0) return [];\n\n    const elements = this.apiService.allElements();\n    const handles: EndpointHandle[] = [];\n\n    for (const id of ids) {\n      const el = elements.find((e) => e.id === id);\n      if (!el) continue;\n\n      if (el.type === ElementType.Arrow) {\n        const arrow = el as ArrowElement;\n        const { sx, sy, ex, ey } = getLineWorldEndpoints(arrow);\n        handles.push({\n          elementId: arrow.id,\n          end: 'start',\n          x: sx,\n          y: sy,\n          bound: !!arrow.startBinding,\n          elementType: ElementType.Arrow,\n        });\n        handles.push({\n          elementId: arrow.id,\n          end: 'end',\n          x: ex,\n          y: ey,\n          bound: !!arrow.endBinding,\n          elementType: ElementType.Arrow,\n        });\n      } else if (el.type === ElementType.Line) {\n        const line = el as LineElement;\n        const { sx, sy, ex, ey } = getLineWorldEndpoints(line);\n        handles.push({ elementId: line.id, end: 'start', x: sx, y: sy, bound: false, elementType: ElementType.Line });\n        handles.push({ elementId: line.id, end: 'end', x: ex, y: ey, bound: false, elementType: ElementType.Line });\n      }\n    }\n\n    return handles;\n  });\n\n  /**\n   * Middle curve handle for selected arrows.\n   * Provides a draggable control point for adjusting the curve.\n   */\n  readonly curveHandles = computed<CurveHandle[]>(() => {\n    const ids = this.selectionService.selectedIdsSignal();\n    if (ids.length === 0) return [];\n\n    const elements = this.apiService.allElements();\n    const handles: CurveHandle[] = [];\n\n    for (const id of ids) {\n      const el = elements.find((e) => e.id === id);\n      if (!el || el.type !== ElementType.Arrow) continue;\n\n      const arrow = el as ArrowElement;\n      const { sx, sy, ex, ey } = getLineWorldEndpoints(arrow);\n      const midX = (sx + ex) / 2;\n      const midY = (sy + ey) / 2;\n\n      if (arrow.pathType?.type === 'quadratic') {\n        const rot = ((arrow.rotation ?? 0) * Math.PI) / 180;\n        const scaleX = arrow.scaleX ?? 1;\n        const scaleY = arrow.scaleY ?? 1;\n        let cx = arrow.pathType.cx * scaleX;\n        let cy = arrow.pathType.cy * scaleY;\n        if (rot !== 0) {\n          const pivotX = (arrow.x1 * scaleX + arrow.x2 * scaleX) / 2;\n          const pivotY = (arrow.y1 * scaleY + arrow.y2 * scaleY) / 2;\n          const dx = cx - pivotX;\n          const dy = cy - pivotY;\n          const cos = Math.cos(rot);\n          const sin = Math.sin(rot);\n          cx = pivotX + dx * cos - dy * sin;\n          cy = pivotY + dx * sin + dy * cos;\n        }\n        handles.push({\n          elementId: arrow.id,\n          x: arrow.x + cx,\n          y: arrow.y + cy,\n          isCurved: true,\n        });\n      } else if (arrow.pathType?.type === 'elbow') {\n        const scaleX = arrow.scaleX ?? 1;\n        const scaleY = arrow.scaleY ?? 1;\n        const midRatio = arrow.pathType.midRatio ?? 0.5;\n        const localX = arrow.x1 * scaleX + (arrow.x2 - arrow.x1) * scaleX * midRatio;\n        const localY = (arrow.y1 * scaleY + arrow.y2 * scaleY) / 2;\n        const rot = ((arrow.rotation ?? 0) * Math.PI) / 180;\n        let bendX: number, bendY: number;\n        if (rot === 0) {\n          bendX = arrow.x + localX;\n          bendY = arrow.y + localY;\n        } else {\n          const pivotX = (arrow.x1 * scaleX + arrow.x2 * scaleX) / 2;\n          const pivotY = (arrow.y1 * scaleY + arrow.y2 * scaleY) / 2;\n          const dx = localX - pivotX;\n          const dy = localY - pivotY;\n          const cos = Math.cos(rot);\n          const sin = Math.sin(rot);\n          bendX = arrow.x + pivotX + dx * cos - dy * sin;\n          bendY = arrow.y + pivotY + dx * sin + dy * cos;\n        }\n        handles.push({\n          elementId: arrow.id,\n          x: bendX,\n          y: bendY,\n          isCurved: true,\n        });\n      } else {\n        handles.push({\n          elementId: arrow.id,\n          x: midX,\n          y: midY,\n          isCurved: false,\n        });\n      }\n    }\n\n    return handles;\n  });\n}\n","import { ApiService } from '../api/api.service';\nimport { Point, PointerInfo, Tool, ToolType, WhiteboardConfig } from '../types';\nimport { CursorType } from '../types/cursors';\nimport { getCanvasCoordinates } from '../utils/geometry';\n\nexport abstract class BaseTool implements Tool {\n  abstract type: ToolType;\n  protected active = false;\n  // Base cursor for this tool (used when tool becomes active)\n  baseCursor: CursorType = CursorType.Default;\n\n  constructor(protected apiService: ApiService) {}\n\n  get whiteboardConfig(): WhiteboardConfig {\n    return this.apiService?.getConfig();\n  }\n\n  getPointerPosition({ x, y }: PointerInfo): Point {\n    return getCanvasCoordinates(this.apiService.getConfig(), { x, y });\n  }\n\n  activate(): void {\n    this.active = true;\n    this.onActivate?.();\n  }\n\n  deactivate(): void {\n    this.active = false;\n    this.onDeactivate?.();\n  }\n\n  protected setCursor(cursor: CursorType) {\n    this.apiService.setCursor(cursor);\n  }\n\n  protected resetCursor() {\n    this.apiService.resetCursor();\n  }\n\n  get isActive() {\n    return this.active;\n  }\n\n  handlePointerDown?(event: PointerInfo): void;\n  handlePointerMove?(event: PointerInfo): void;\n  handlePointerUp?(event: PointerInfo): void;\n  handleKeyDown?(event: KeyboardEvent): void;\n  handleKeyUp?(event: KeyboardEvent): void;\n  onActivate?(): void;\n  onDeactivate?(): void;\n}\n","import { ArrowElement, ArrowheadType } from '../elements';\nimport { ArrowBindingService } from '../elements/arrow-binding.service';\nimport { ConnectionPointsService } from '../elements/connection-points.service';\nimport { ConnectionUIService } from '../elements/connection-ui.service';\nimport { createElement } from '../elements/element.utils';\nimport {\n  ArrowHeadStyle,\n  ElementType,\n  Point,\n  PointerInfo,\n  SnapResult,\n  ToolType,\n  WhiteboardElementStyle,\n} from '../types';\nimport { snapToAngle, snapToGrid } from '../utils/geometry';\nimport { BaseTool } from './base-tool';\nimport { CursorType } from '../types/cursors';\n\nexport class ArrowTool extends BaseTool {\n  type = ToolType.Arrow;\n  override baseCursor = CursorType.Crosshair;\n  element: ArrowElement | null = null;\n  startPoint: Point | null = null;\n  private lastX = 0;\n  private lastY = 0;\n  private readonly MIN_LENGTH = 2;\n  private readonly SNAP_RADIUS = 20;\n\n  // Connection snapping state\n  private startSnap: SnapResult | null = null;\n  private endSnap: SnapResult | null = null;\n\n  // Injected via setter from ToolFactory\n  private connectionPointsService!: ConnectionPointsService;\n  private arrowBindingService!: ArrowBindingService;\n  private connectionUIService!: ConnectionUIService;\n\n  setConnectionServices(cp: ConnectionPointsService, ab: ArrowBindingService, ui: ConnectionUIService): void {\n    this.connectionPointsService = cp;\n    this.arrowBindingService = ab;\n    this.connectionUIService = ui;\n  }\n\n  override onDeactivate(): void {\n    this.connectionUIService?.clearAll();\n  }\n\n  override handlePointerDown(event: PointerInfo): void {\n    if (!this.active) return;\n\n    const coordinates = this.getPointerPosition(event);\n    let { x, y } = coordinates;\n\n    const { snapToGrid: allowedSnap } = this.whiteboardConfig;\n    if (allowedSnap) {\n      const { gridSize } = this.whiteboardConfig;\n      x = snapToGrid(x, gridSize);\n      y = snapToGrid(y, gridSize);\n    }\n\n    // Try to snap the start point to a shape\n    this.startSnap = null;\n    if (this.connectionPointsService) {\n      const allElements = this.apiService.getElements();\n      const snap = this.connectionPointsService.findSnapTarget(\n        { x, y },\n        allElements,\n        new Set(), // no exclusions at start\n        this.SNAP_RADIUS\n      );\n      if (snap) {\n        x = snap.point.x;\n        y = snap.point.y;\n        this.startSnap = snap;\n        this.connectionUIService?.setSnapIndicator(snap.point);\n      }\n    }\n\n    this.startPoint = { x, y };\n    this.lastX = x;\n    this.lastY = y;\n\n    this.element = createElement(\n      ElementType.Arrow,\n      {\n        x1: x,\n        y1: y,\n        x2: x,\n        y2: y,\n        style: this.getElementStyle(),\n        zIndex: this.apiService.getNextZIndex(),\n        startHead: {\n          type: this.mapHeadStyle(this.whiteboardConfig.arrowConfig?.startHeadStyle),\n        },\n        endHead: {\n          type: this.mapHeadStyle(this.whiteboardConfig.arrowConfig?.endHeadStyle),\n        },\n        pathType:\n          this.whiteboardConfig.arrowConfig?.lineStyle === 'curve'\n            ? { type: 'quadratic' as const, cx: x, cy: y }\n            : this.whiteboardConfig.arrowConfig?.lineStyle === 'elbow'\n            ? { type: 'elbow' as const, midRatio: 0.5 }\n            : { type: 'straight' as const },\n        startBinding: this.startSnap\n          ? this.arrowBindingService.createBinding(this.startSnap.elementId, this.startSnap.pointId)\n          : null,\n      },\n      this.apiService.getActiveLayerId()\n    );\n\n    this.apiService.addDraftElements([this.element]);\n  }\n\n  override handlePointerMove(event: PointerInfo): void {\n    if (!this.active || !this.element) return;\n\n    const coordinates = this.getPointerPosition(event);\n    let x2 = coordinates.x;\n    let y2 = coordinates.y;\n\n    const { snapToGrid: allowedSnap } = this.whiteboardConfig;\n    if (allowedSnap) {\n      const { gridSize } = this.whiteboardConfig;\n      x2 = snapToGrid(x2, gridSize);\n      y2 = snapToGrid(y2, gridSize);\n    }\n\n    if (event.shiftKey) {\n      const x1 = this.element.x1;\n      const y1 = this.element.y1;\n      const { x, y } = snapToAngle(x1, y1, x2, y2);\n      x2 = x;\n      y2 = y;\n    }\n\n    // Try to snap end point to a shape\n    this.endSnap = null;\n    if (this.connectionPointsService) {\n      const allElements = this.apiService.getElements();\n      const excludeIds = new Set([this.element.id]);\n      // Also exclude the shape we started from (to avoid self-connections initially)\n      if (this.startSnap) {\n        // Actually allow connecting back to same shape, just exclude the arrow itself\n      }\n      const snap = this.connectionPointsService.findSnapTarget(\n        { x: x2, y: y2 },\n        allElements,\n        excludeIds,\n        this.SNAP_RADIUS\n      );\n      if (snap) {\n        x2 = snap.point.x;\n        y2 = snap.point.y;\n        this.endSnap = snap;\n        this.connectionUIService?.setSnapIndicator(snap.point);\n        // Show connection points on the hovered element\n        const targetEl = allElements.find((el) => el.id === snap.elementId);\n        if (targetEl) {\n          this.connectionUIService?.setVisibleConnectionPoints(\n            this.connectionPointsService.getConnectionPoints(targetEl)\n          );\n        }\n      } else {\n        this.connectionUIService?.setSnapIndicator(null);\n        this.connectionUIService?.setVisibleConnectionPoints([]);\n      }\n    }\n\n    if (Math.abs(x2 - this.lastX) > this.MIN_LENGTH || Math.abs(y2 - this.lastY) > this.MIN_LENGTH) {\n      const draftUpdate: Partial<ArrowElement> = { id: this.element.id, x2, y2 } as Partial<ArrowElement> & {\n        id: string;\n      };\n\n      // Auto-compute control point for curve arrows (midpoint between start and end)\n      if (this.element.pathType?.type === 'quadratic') {\n        draftUpdate.pathType = {\n          type: 'quadratic',\n          cx: (this.element.x1 + x2) / 2,\n          cy: (this.element.y1 + y2) / 2,\n        };\n      }\n      // Elbow keeps its midRatio; no auto-compute needed\n\n      this.apiService.updateDraftElements([draftUpdate]);\n      this.lastX = x2;\n      this.lastY = y2;\n    }\n  }\n\n  override handlePointerUp(): void {\n    if (!this.active) return;\n\n    if (this.element && this.startPoint) {\n      const element = this.element;\n\n      // Apply end binding if snapped\n      if (this.endSnap && this.arrowBindingService) {\n        this.apiService.updateDraftElements([\n          {\n            id: element.id,\n            endBinding: this.arrowBindingService.createBinding(this.endSnap.elementId, this.endSnap.pointId),\n            x2: this.endSnap.point.x,\n            y2: this.endSnap.point.y,\n          } as Partial<ArrowElement>,\n        ]);\n      }\n\n      this.apiService.commitDraftElements();\n\n      this.apiService.finalizeDraw(element);\n\n      this.startPoint = null;\n      this.element = null;\n      this.startSnap = null;\n      this.endSnap = null;\n    }\n\n    this.connectionUIService?.clearAll();\n\n    this.lastX = 0;\n    this.lastY = 0;\n  }\n\n  private getElementStyle(): WhiteboardElementStyle {\n    return {\n      strokeColor: this.whiteboardConfig.strokeColor,\n      strokeWidth: this.whiteboardConfig.strokeWidth,\n      lineCap: this.whiteboardConfig.lineCap,\n      dasharray: this.whiteboardConfig.dasharray,\n      dashoffset: this.whiteboardConfig.dashoffset,\n    };\n  }\n\n  /** Map a config ArrowHeadStyle string to the ArrowheadType enum value */\n  private mapHeadStyle(style?: ArrowHeadStyle): ArrowheadType {\n    if (!style) return ArrowheadType.None;\n    switch (style) {\n      case 'none':\n        return ArrowheadType.None;\n      case 'arrow':\n        return ArrowheadType.Arrow;\n      case 'open-arrow':\n        return ArrowheadType.OpenArrow;\n      case 'diamond':\n        return ArrowheadType.Diamond;\n      case 'open-diamond':\n        return ArrowheadType.OpenDiamond;\n      case 'circle':\n        return ArrowheadType.Circle;\n      case 'open-circle':\n        return ArrowheadType.OpenCircle;\n      case 'bar':\n        return ArrowheadType.Bar;\n      default:\n        return ArrowheadType.None;\n    }\n  }\n}\n","import { EllipseElement } from '../elements';\nimport { createElement } from '../elements/element.utils';\nimport { ToolType, ElementType, WhiteboardElementStyle, Point, PointerInfo } from '../types';\nimport { snapToGrid } from '../utils/geometry';\nimport { BaseTool } from './base-tool';\nimport { CursorType } from '../types/cursors';\n\nexport class EllipseTool extends BaseTool {\n  type = ToolType.Ellipse;\n  override baseCursor = CursorType.Crosshair;\n  element: EllipseElement | null = null;\n  startPoint: Point | null = null;\n\n  override handlePointerDown(event: PointerInfo): void {\n    if (!this.active) return;\n\n    let { x, y } = this.getPointerPosition(event);\n\n    const { snapToGrid: allowedSnap } = this.whiteboardConfig;\n    if (allowedSnap) {\n      const { gridSize } = this.whiteboardConfig;\n      x = snapToGrid(x, gridSize);\n      y = snapToGrid(y, gridSize);\n    }\n    this.startPoint = { x, y };\n\n    this.element = createElement(\n      ElementType.Ellipse,\n      {\n        cx: x,\n        cy: y,\n        style: this.getElementStyle(),\n        zIndex: this.apiService.getNextZIndex(),\n      },\n      this.apiService.getActiveLayerId()\n    );\n\n    this.apiService.addDraftElements([this.element]);\n  }\n\n  override handlePointerMove(event: PointerInfo): void {\n    if (!this.active || !this.element || !this.startPoint) return;\n\n    const { x, y } = this.getPointerPosition(event);\n    const { x: startX, y: startY } = this.startPoint;\n\n    let cx: number, cy: number, rx: number, ry: number;\n\n    if (event.altKey) {\n      // Draw from center\n      cx = startX;\n      cy = startY;\n      rx = Math.abs(x - cx);\n      ry = event.shiftKey ? rx : Math.abs(y - cy);\n    } else {\n      // Draw from corner\n      cx = (startX + x) / 2;\n      cy = (startY + y) / 2;\n      rx = Math.abs(startX - x) / 2;\n      ry = event.shiftKey ? rx : Math.abs(startY - y) / 2;\n\n      if (event.shiftKey) {\n        cy = y > startY ? startY + rx : startY - rx;\n      }\n    }\n\n    this.apiService.updateDraftElements([{ id: this.element.id, rx, ry, cx, cy }]);\n  }\n\n  override handlePointerUp(): void {\n    if (!this.active) return;\n    if (this.element && this.startPoint) {\n      const element = this.element;\n      this.apiService.commitDraftElements();\n\n      this.apiService.finalizeDraw(element);\n\n      this.startPoint = null;\n      this.element = null;\n    }\n  }\n\n  private getElementStyle(): WhiteboardElementStyle {\n    return {\n      strokeColor: this.whiteboardConfig.strokeColor,\n      strokeWidth: this.whiteboardConfig.strokeWidth,\n      fill: this.whiteboardConfig.fill,\n      dasharray: this.whiteboardConfig.dasharray,\n      dashoffset: this.whiteboardConfig.dashoffset,\n    };\n  }\n}\n","import { getElementUtil } from '../elements/element.utils';\nimport { Point, PointerInfo, ToolType, WhiteboardElement } from '../types';\nimport { CursorType } from '../types/cursors';\nimport { isBoundsIntersect } from '../utils/geometry';\nimport { BaseTool } from './base-tool';\n\nexport class EraserTool extends BaseTool {\n  type = ToolType.Eraser;\n  override baseCursor = CursorType.Eraser;\n  private isErasing = false;\n  private readonly hoveredElementIds: Set<string> = new Set();\n  private lastPosition: Point | null = null;\n\n  override handlePointerDown(event: PointerInfo): void {\n    if (!this.active) return;\n\n    this.hoveredElementIds.clear();\n\n    const position = this.getPointerPosition(event);\n    this.isErasing = true;\n    this.eraseElementsAt(position, position);\n    this.lastPosition = position;\n  }\n\n  override handlePointerMove(event: PointerInfo): void {\n    if (!this.active || !this.isErasing || !this.lastPosition) return;\n\n    const position = this.getPointerPosition(event);\n    this.eraseElementsAt(this.lastPosition, position, event.altKey);\n    this.lastPosition = position;\n  }\n\n  override handlePointerUp(): void {\n    if (!this.active) return;\n\n    if (this.hoveredElementIds.size > 0) {\n      const elementsToRemoveIds = Array.from(this.hoveredElementIds);\n      const expandedIds = this.expandToIncludeGroups(elementsToRemoveIds);\n\n      const elementsToRemove = this.apiService.getElements().filter((el) => expandedIds.includes(el.id));\n      elementsToRemove.forEach((el) => {\n        el.isDeleting = false;\n      });\n\n      this.apiService.updateElements(elementsToRemove);\n      this.apiService.removeElements(elementsToRemove);\n    }\n\n    this.hoveredElementIds.clear();\n    this.isErasing = false;\n    this.lastPosition = null;\n  }\n\n  private eraseElementsAt(lastPosition: Point, position: Point, isAltPressed = false): void {\n    const elements = this.apiService.getElements();\n    const zoom = this.apiService.getConfig()?.zoom || 1;\n    const distance = Math.hypot(position.x - lastPosition.x, position.y - lastPosition.y);\n\n    const baseThreshold = 10 / zoom;\n    const speedFactor = Math.log2(distance + 1) * 0.5;\n    const dynamicThreshold = baseThreshold + distance * speedFactor;\n\n    for (const element of elements) {\n      const bounds = getElementUtil(element.type).getBounds(element);\n      if (!isBoundsIntersect(bounds, lastPosition, position, dynamicThreshold)) continue;\n\n      if (this.isPointInElement(element, lastPosition, position, dynamicThreshold)) {\n        if (isAltPressed) {\n          const groupedIds = this.expandToIncludeGroups([element.id]);\n          groupedIds.forEach((id) => {\n            this.hoveredElementIds.delete(id);\n            const el = elements.find((e) => e.id === id);\n            if (el) el.isDeleting = false;\n          });\n        }\n\n        if (!isAltPressed && !this.hoveredElementIds.has(element.id)) {\n          const groupedIds = this.expandToIncludeGroups([element.id]);\n          groupedIds.forEach((id) => {\n            this.hoveredElementIds.add(id);\n            const el = elements.find((e) => e.id === id);\n            if (el) el.isDeleting = true;\n          });\n        }\n\n        const affectedIds = this.expandToIncludeGroups([element.id]);\n        const affectedElements = elements.filter((el) => affectedIds.includes(el.id));\n        this.apiService.updateElements(affectedElements);\n      }\n    }\n  }\n\n  private isPointInElement(\n    element: WhiteboardElement,\n    lastPosition: Point,\n    position: Point,\n    threshold: number\n  ): boolean {\n    return getElementUtil(element.type).hitTest(element, lastPosition, position, threshold);\n  }\n\n  private expandToIncludeGroups(elementIds: string[]): string[] {\n    const allElements = this.apiService.getElements();\n    const elementsToExpand = allElements.filter((el) => elementIds.includes(el.id));\n\n    const groupIds = new Set(\n      elementsToExpand\n        .map((el) => el.groupId)\n        .filter((groupId): groupId is string => groupId !== undefined && groupId !== null)\n    );\n\n    if (groupIds.size === 0) {\n      return elementIds;\n    }\n\n    const expandedElements = allElements.filter((el) => {\n      return elementIds.includes(el.id) || (el.groupId && groupIds.has(el.groupId));\n    });\n\n    return expandedElements.map((el) => el.id);\n  }\n}\n","import { PointerInfo, ToolType } from '../types';\nimport { BaseTool } from './base-tool';\nimport { CursorType } from '../types/cursors';\n\nexport class HandTool extends BaseTool {\n  type = ToolType.Hand;\n  override baseCursor = CursorType.Grab;\n  private isDragging = false;\n  private startX = 0;\n  private startY = 0;\n\n  override handlePointerDown(event: PointerInfo): void {\n    this.isDragging = true;\n    this.startX = event.clientX;\n    this.startY = event.clientY;\n    this.setCursor(CursorType.Grabbing);\n  }\n\n  override handlePointerMove(event: PointerInfo): void {\n    if (!this.isDragging) return;\n    const { zoom } = this.whiteboardConfig;\n\n    const mouseDX = (event.clientX - this.startX) / zoom;\n    const mouseDY = (event.clientY - this.startY) / zoom;\n\n    this.apiService.pan(mouseDX, mouseDY);\n\n    this.startX = event.clientX;\n    this.startY = event.clientY;\n  }\n\n  override handlePointerUp(): void {\n    this.isDragging = false;\n    this.resetCursor();\n  }\n}\n","import { PointerInfo, ToolType } from '../types';\nimport { CursorType } from '../types/cursors';\nimport { BaseTool } from './base-tool';\n\nexport class ImageTool extends BaseTool {\n  type = ToolType.Image;\n  override baseCursor = CursorType.Image;\n\n  override handlePointerDown(event: PointerInfo): void {\n    const { x, y } = this.getPointerPosition(event);\n    const input = document.createElement('input');\n    input.type = 'file';\n    input.accept = 'image/*';\n    input.onchange = (e) => {\n      const files = (e.target as HTMLInputElement).files;\n      if (files) {\n        const reader = new FileReader();\n        reader.onload = (e: ProgressEvent) => {\n          const image = (e.target as FileReader).result as string;\n          this.apiService.addImage({ image, x, y });\n        };\n        reader.readAsDataURL(files[0]);\n      }\n    };\n    input.click();\n  }\n}\n","import { LineElement } from '../elements';\nimport { createElement } from '../elements/element.utils';\nimport { ElementType, Point, PointerInfo, ToolType, WhiteboardElementStyle } from '../types';\nimport { snapToAngle, snapToGrid } from '../utils/geometry';\nimport { BaseTool } from './base-tool';\nimport { CursorType } from '../types/cursors';\n\nexport class LineTool extends BaseTool {\n  type = ToolType.Line;\n  override baseCursor = CursorType.Crosshair;\n  element: LineElement | null = null;\n  startPoint: Point | null = null;\n  private lastX = 0;\n  private lastY = 0;\n  private readonly MIN_LENGTH = 2;\n\n  override handlePointerDown(event: PointerInfo): void {\n    if (!this.active) return;\n\n    let { x, y } = this.getPointerPosition(event);\n\n    const { snapToGrid: allowedSnap } = this.whiteboardConfig;\n    if (allowedSnap) {\n      const { gridSize } = this.whiteboardConfig;\n      x = snapToGrid(x, gridSize);\n      y = snapToGrid(y, gridSize);\n    }\n\n    this.startPoint = { x, y };\n    this.lastX = x;\n    this.lastY = y;\n\n    this.element = createElement(\n      ElementType.Line,\n      {\n        x1: x,\n        y1: y,\n        x2: x,\n        y2: y,\n        style: this.getElementStyle(),\n        zIndex: this.apiService.getNextZIndex(),\n      },\n      this.apiService.getActiveLayerId()\n    );\n\n    this.apiService.addDraftElements([this.element]);\n  }\n\n  override handlePointerMove(event: PointerInfo): void {\n    if (!this.active || !this.element) return;\n\n    const coords = this.getPointerPosition(event);\n    let x2 = coords.x;\n    let y2 = coords.y;\n\n    const { snapToGrid: allowedSnap } = this.whiteboardConfig;\n    if (allowedSnap) {\n      const { gridSize } = this.whiteboardConfig;\n      x2 = snapToGrid(x2, gridSize);\n      y2 = snapToGrid(y2, gridSize);\n    }\n\n    if (event.shiftKey) {\n      const x1 = this.element.x1;\n      const y1 = this.element.y1;\n      const { x, y } = snapToAngle(x1, y1, x2, y2);\n      [x2, y2] = [x, y];\n    }\n\n    // Only update if the movement is significant\n    if (Math.abs(x2 - this.lastX) > this.MIN_LENGTH || Math.abs(y2 - this.lastY) > this.MIN_LENGTH) {\n      this.apiService.updateDraftElements([{ id: this.element.id, x2, y2 }]);\n      this.lastX = x2;\n      this.lastY = y2;\n    }\n  }\n\n  override handlePointerUp(): void {\n    if (!this.active) return;\n\n    if (this.element && this.startPoint) {\n      const element = this.element;\n      this.apiService.commitDraftElements();\n\n      this.apiService.finalizeDraw(element);\n\n      this.startPoint = null;\n      this.element = null;\n    }\n    this.lastX = 0;\n    this.lastY = 0;\n  }\n\n  private getElementStyle(): WhiteboardElementStyle {\n    return {\n      strokeColor: this.whiteboardConfig.strokeColor,\n      strokeWidth: this.whiteboardConfig.strokeWidth,\n      lineCap: this.whiteboardConfig.lineCap,\n      dasharray: this.whiteboardConfig.dasharray,\n      dashoffset: this.whiteboardConfig.dashoffset,\n    };\n  }\n}\n","import { PenElement } from '../elements';\nimport { createElement } from '../elements/element.utils';\nimport { ElementType, PointerInfo, ToolType, WhiteboardElementStyle, PenThickness } from '../types';\nimport { getPresetForType } from '../types/pen-presets';\nimport { StrokeOptions } from '../utils/drawing';\nimport { BaseTool } from './base-tool';\nimport { CursorType } from '../types/cursors';\nimport { ApiService } from '../api/api.service';\n\nexport class PenTool extends BaseTool {\n  type = ToolType.Pen;\n  override baseCursor = CursorType.Crosshair;\n  element: PenElement | null = null;\n\n  constructor(apiService: ApiService) {\n    super(apiService);\n  }\n\n  private getCurrentPathOptions(): StrokeOptions {\n    const penType = this.whiteboardConfig.penType;\n    const preset = getPresetForType(penType, PenThickness.Medium);\n\n    const strokeOptions = preset.strokeOptions;\n\n    return {\n      smoothing: strokeOptions.smoothing || 0.5,\n      streamline: strokeOptions.streamline || 0.5,\n      thinning: strokeOptions.thinning || 0.5,\n      simulatePressure: strokeOptions.simulatePressure !== undefined ? strokeOptions.simulatePressure : true,\n      size: strokeOptions.size || 16,\n      easing: strokeOptions.easing || ((t: number) => (t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2)),\n      start: strokeOptions.start || { cap: true, taper: 0.3 },\n      end: strokeOptions.end || { cap: true, taper: 0.4 },\n    };\n  }\n\n  override handlePointerDown(event: PointerInfo): void {\n    if (!this.active) return;\n\n    const point = this.getPointerPosition(event);\n    const currentPathOptions = this.getCurrentPathOptions();\n    const initialPoints = [[point.x, point.y]] as [number, number][];\n\n    this.element = createElement(\n      ElementType.Pen,\n      {\n        points: initialPoints,\n        pathOptions: currentPathOptions,\n        isComplete: false,\n        style: this.getElementStyle(),\n        zIndex: this.apiService.getNextZIndex(),\n      },\n      this.apiService.getActiveLayerId()\n    );\n\n    this.apiService.addDraftElements([this.element]);\n  }\n\n  override handlePointerMove(event: PointerInfo): void {\n    if (!this.active || !this.element) return;\n\n    const { x, y } = this.getPointerPosition(event);\n\n    // Only add point if it's far enough from the last point to improve performance and data size\n    const lastPoint = this.element.points[this.element.points.length - 1];\n    if (lastPoint) {\n      const dx = x - lastPoint[0];\n      const dy = y - lastPoint[1];\n      const distanceSquared = dx * dx + dy * dy;\n      const threshold = this.whiteboardConfig.penThrottlingThreshold ?? 2;\n      const minDistanceSquared = threshold * threshold;\n\n      if (distanceSquared < minDistanceSquared) {\n        return;\n      }\n    }\n\n    const points = [...this.element.points, [x, y]] as [number, number][];\n\n    this.element.points = points;\n\n    this.apiService.updateDraftElements([\n      {\n        id: this.element.id,\n        points,\n      },\n    ]);\n  }\n\n  override handlePointerUp(): void {\n    if (!this.active) return;\n    if (this.element) {\n      const element = this.element;\n\n      this.apiService.updateDraftElements([\n        {\n          id: element.id,\n          isComplete: true,\n        },\n      ]);\n\n      this.apiService.commitDraftElements();\n\n      this.apiService.finalizeDraw(element);\n\n      this.element = null;\n    }\n  }\n\n  private getElementStyle(): WhiteboardElementStyle {\n    const penType = this.whiteboardConfig.penType;\n    const preset = getPresetForType(penType, PenThickness.Medium);\n\n    return {\n      strokeColor: this.whiteboardConfig.strokeColor,\n      strokeWidth: this.whiteboardConfig.strokeWidth,\n      lineCap: this.whiteboardConfig.lineCap,\n      lineJoin: this.whiteboardConfig.lineJoin,\n      dasharray: this.whiteboardConfig.dasharray,\n      dashoffset: this.whiteboardConfig.dashoffset,\n      opacity: preset.opacity,\n    };\n  }\n}\n","import { RectangleElement } from '../elements';\nimport { createElement } from '../elements/element.utils';\nimport { ElementType, Point, PointerInfo, ToolType, WhiteboardElementStyle } from '../types';\nimport { snapToGrid } from '../utils/geometry';\nimport { BaseTool } from './base-tool';\nimport { CursorType } from '../types/cursors';\n\nexport class RectangleTool extends BaseTool {\n  type = ToolType.Rectangle;\n  override baseCursor = CursorType.Crosshair;\n  element: RectangleElement | null = null;\n  startPoint: Point | null = null;\n\n  override handlePointerDown(event: PointerInfo): void {\n    if (!this.active) return;\n\n    let { x, y } = this.getPointerPosition(event);\n\n    const { snapToGrid: allowedSnap } = this.whiteboardConfig;\n    if (allowedSnap) {\n      const { gridSize } = this.whiteboardConfig;\n      x = snapToGrid(x, gridSize);\n      y = snapToGrid(y, gridSize);\n    }\n    this.startPoint = { x, y };\n\n    this.element = createElement(\n      ElementType.Rectangle,\n      {\n        x,\n        y,\n        style: this.getElementStyle(),\n        zIndex: this.apiService.getNextZIndex(),\n      },\n      this.apiService.getActiveLayerId()\n    );\n\n    this.apiService.addDraftElements([this.element]);\n  }\n\n  override handlePointerMove(event: PointerInfo): void {\n    if (!this.active || !this.element || !this.startPoint) return;\n\n    const { x, y } = this.getPointerPosition(event);\n    const start_x = this.startPoint.x;\n    const start_y = this.startPoint.y;\n    let w = Math.abs(x - start_x);\n    let h = Math.abs(y - start_y);\n    let new_x = null;\n    let new_y = null;\n\n    if (event.shiftKey) {\n      w = h = Math.max(w, h);\n      new_x = start_x < x ? start_x : start_x - w;\n      new_y = start_y < y ? start_y : start_y - h;\n    } else {\n      new_x = Math.min(start_x, x);\n      new_y = Math.min(start_y, y);\n    }\n    if (event.altKey) {\n      w *= 2;\n      h *= 2;\n      new_x = start_x - w / 2;\n      new_y = start_y - h / 2;\n    }\n\n    const { snapToGrid: allowedSnap } = this.whiteboardConfig;\n    if (allowedSnap) {\n      const { gridSize } = this.whiteboardConfig;\n      w = snapToGrid(w, gridSize);\n      h = snapToGrid(h, gridSize);\n      new_x = snapToGrid(new_x, gridSize);\n      new_y = snapToGrid(new_y, gridSize);\n    }\n\n    this.apiService.updateDraftElements([{ id: this.element.id, width: w, height: h, x: new_x, y: new_y }]);\n  }\n\n  override handlePointerUp(): void {\n    if (!this.active) return;\n    if (this.element && this.startPoint) {\n      const element = this.element;\n      this.apiService.commitDraftElements();\n\n      this.apiService.finalizeDraw(element);\n\n      this.startPoint = null;\n      this.element = null;\n    }\n  }\n\n  private getElementStyle(): WhiteboardElementStyle {\n    return {\n      strokeColor: this.whiteboardConfig.strokeColor,\n      strokeWidth: this.whiteboardConfig.strokeWidth,\n      lineJoin: this.whiteboardConfig.lineJoin,\n      fill: this.whiteboardConfig.fill,\n      dasharray: this.whiteboardConfig.dasharray,\n      dashoffset: this.whiteboardConfig.dashoffset,\n    };\n  }\n}\n","import { DATA_ID, ITEM_PREFIX, SELECTOR_BOX, SELECTOR_GRIP_RESIZE, SELECTOR_GRIP_ROTATE } from '../constants';\nimport { getElementUtil } from '../elements/element.utils';\nimport { ArrowElement } from '../elements/arrow-element';\nimport { ArrowBindingService } from '../elements/arrow-binding.service';\nimport { ConnectionPointsService } from '../elements/connection-points.service';\nimport { ConnectionUIService } from '../elements/connection-ui.service';\nimport { Direction, ElementType, Point, PointerInfo, SnapResult, ToolType, WhiteboardElement } from '../types';\nimport { getMouseTarget } from '../utils/dom';\nimport {\n  calculateAngle,\n  getSnappedOffset,\n  isElementInSelectionBox,\n  normalizeAngle,\n  rotatePointAroundCenter,\n} from '../utils/geometry';\nimport { getElementBounds } from '../utils/dom/element';\nimport {\n  getCombinedScreenBounds,\n  getRotatedChildScale,\n  getRotatedResizeAnchor,\n} from '../utils/geometry/transform-utils';\n\nimport { BaseTool } from './base-tool';\nimport { CursorType } from '../types/cursors';\nimport { BatchHandle } from '../history/history.service';\n\nexport enum SelectAction {\n  None,\n  Select,\n  Move,\n  Resize,\n  Rotate,\n  BoxSelect,\n  /** Dragging an arrow/line endpoint handle to move, attach, or detach */\n  DragEndpoint,\n  /** Dragging the middle curve handle to adjust arrow curvature */\n  DragCurveHandle,\n}\n\nexport class SelectTool extends BaseTool {\n  type = ToolType.Select;\n  override baseCursor = CursorType.Default;\n  private currentAction = SelectAction.None;\n  private startPoint: Point | null = null;\n  private currentHandle: Direction | null = null;\n  private rotateStartAngle: number | null = null;\n  private selectionCenter: Point | null = null;\n  private initialBoundingBox: { x: number; y: number; width: number; height: number } | null = null;\n  private initialElementRotations: Map<string, number> = new Map();\n  private initialElementStates: Map<string, WhiteboardElement> = new Map();\n  private rafId: number | null = null;\n  private pendingPointerEvent: PointerInfo | null = null;\n\n  // Arrow / Line endpoint drag state\n  private dragEndpointId: string | null = null;\n  private dragEndpointEnd: 'start' | 'end' | null = null;\n  private dragEndpointSnap: SnapResult | null = null;\n  private readonly SNAP_RADIUS = 20;\n\n  // Arrow curve handle drag state\n  private dragCurveArrowId: string | null = null;\n\n  // Track whether arrow bindings were detached during current move\n  private arrowBindingsDetached = false;\n\n  // Actions that transform existing elements over many frames; each must collapse\n  // into a single undo entry via a history batch (see handlePointerMove/Up).\n  private static readonly TRANSFORM_ACTIONS: ReadonlySet<SelectAction> = new Set([\n    SelectAction.Move,\n    SelectAction.Resize,\n    SelectAction.Rotate,\n    SelectAction.DragEndpoint,\n    SelectAction.DragCurveHandle,\n  ]);\n  // Open history batch for the in-progress transform gesture, if any.\n  private transformBatch: BatchHandle | null = null;\n\n  // Injected connection services\n  private connectionPointsService!: ConnectionPointsService;\n  private arrowBindingService!: ArrowBindingService;\n  private connectionUIService!: ConnectionUIService;\n\n  setConnectionServices(cp: ConnectionPointsService, ab: ArrowBindingService, ui: ConnectionUIService): void {\n    this.connectionPointsService = cp;\n    this.arrowBindingService = ab;\n    this.connectionUIService = ui;\n  }\n\n  getCurrentAction(): SelectAction {\n    return this.currentAction;\n  }\n\n  getStartPoint(): Point | null {\n    return this.startPoint;\n  }\n\n  getCurrentHandle(): Direction | null {\n    return this.currentHandle;\n  }\n\n  override onDeactivate(): void {\n    // Drop any batch left open by a gesture interrupted mid-flight, so the\n    // history service never stays stuck in batching mode.\n    if (this.transformBatch) {\n      this.transformBatch.clear();\n      this.transformBatch = null;\n    }\n    this.apiService.clearSelection();\n  }\n\n  private batchDescriptionFor(action: SelectAction): string {\n    switch (action) {\n      case SelectAction.Move:\n        return 'Move element';\n      case SelectAction.Resize:\n        return 'Resize element';\n      case SelectAction.Rotate:\n        return 'Rotate element';\n      case SelectAction.DragEndpoint:\n        return 'Move endpoint';\n      case SelectAction.DragCurveHandle:\n        return 'Adjust curve';\n      default:\n        return 'Transform element';\n    }\n  }\n\n  override handlePointerDown(event: PointerInfo): void {\n    const target = getMouseTarget(event);\n\n    const targetId = target?.id ?? '';\n\n    this.startPoint = this.getPointerPosition(event);\n\n    // Check if clicking an arrow endpoint handle for reconnection\n    const arrowHandle = typeof target?.getAttribute === 'function' ? target.getAttribute('data-handle') : null;\n    const arrowId = typeof target?.getAttribute === 'function' ? target.getAttribute('data-arrow-id') : null;\n    if (arrowHandle && arrowId && (arrowHandle === 'start' || arrowHandle === 'end')) {\n      this.dragEndpointId = arrowId;\n      this.dragEndpointEnd = arrowHandle;\n      this.dragEndpointSnap = null;\n      this.currentAction = SelectAction.DragEndpoint;\n      return;\n    }\n\n    // Check if clicking a curve handle for adjusting arrow curvature\n    if (arrowHandle === 'curve' && arrowId) {\n      this.dragCurveArrowId = arrowId;\n      this.currentAction = SelectAction.DragCurveHandle;\n      return;\n    }\n\n    if (targetId.includes(ITEM_PREFIX)) {\n      const elementId = target?.getAttribute(DATA_ID) ?? null;\n      this.handleElementSelect(elementId, event.shiftKey);\n      this.currentAction = SelectAction.Move;\n    } else if (targetId.includes(SELECTOR_GRIP_RESIZE)) {\n      this.currentHandle = this.getResizeDirection(targetId);\n      this.initializeResize();\n      this.currentAction = SelectAction.Resize;\n    } else if (targetId.includes(SELECTOR_GRIP_ROTATE)) {\n      this.initializeRotation(event);\n      this.currentAction = SelectAction.Rotate;\n    } else if (targetId.includes(SELECTOR_BOX)) {\n      this.currentAction = SelectAction.Move;\n    } else {\n      this.initializeBoxSelect(event);\n      this.currentAction = SelectAction.BoxSelect;\n    }\n  }\n\n  override handlePointerMove(event: PointerInfo): void {\n    this.pendingPointerEvent = event;\n\n    if (this.rafId === null) {\n      this.rafId = requestAnimationFrame(() => {\n        this.rafId = null;\n\n        if (!this.pendingPointerEvent || !this.startPoint) {\n          return;\n        }\n\n        const event = this.pendingPointerEvent;\n        const currentPoint = this.getPointerPosition(event);\n\n        // Open a history batch on the first transform frame: from here every\n        // per-frame element update is coalesced, so the whole gesture commits as\n        // one undo entry on pointer up. A plain click never reaches here, so no\n        // batch is left dangling.\n        if (!this.transformBatch && SelectTool.TRANSFORM_ACTIONS.has(this.currentAction)) {\n          this.transformBatch = this.apiService.startBatch(\n            this.batchDescriptionFor(this.currentAction),\n            this.apiService.getElements()\n          );\n        }\n\n        switch (this.currentAction) {\n          case SelectAction.Move:\n            this.handleMove(currentPoint, event.shiftKey);\n            break;\n          case SelectAction.Resize:\n            this.handleResize(currentPoint, event.shiftKey);\n            break;\n          case SelectAction.Rotate:\n            this.handleRotate(currentPoint, event.ctrlKey);\n            break;\n          case SelectAction.BoxSelect:\n            this.handleBoxSelect(currentPoint, event.shiftKey);\n            break;\n          case SelectAction.DragEndpoint:\n            this.handleDragEndpoint(currentPoint);\n            break;\n          case SelectAction.DragCurveHandle:\n            this.handleDragCurveHandle(currentPoint);\n            break;\n        }\n      });\n    }\n  }\n\n  override handlePointerUp(): void {\n    if (this.rafId !== null) {\n      cancelAnimationFrame(this.rafId);\n      this.rafId = null;\n    }\n    this.pendingPointerEvent = null;\n\n    if (this.currentAction === SelectAction.BoxSelect) {\n      this.apiService.clearSelectionBox();\n    }\n\n    if (this.currentAction === SelectAction.Rotate) {\n      this.initialElementRotations.clear();\n      this.apiService.updateBoundingBox();\n    }\n\n    // Finalize endpoint drag (arrow reconnection or line endpoint move)\n    if (this.currentAction === SelectAction.DragEndpoint) {\n      this.finalizeDragEndpoint();\n    }\n\n    // Finalize curve handle drag\n    if (this.currentAction === SelectAction.DragCurveHandle) {\n      this.dragCurveArrowId = null;\n    }\n\n    // After a move, update bound arrows for all moved elements\n    if (\n      (this.currentAction === SelectAction.Move ||\n        this.currentAction === SelectAction.Resize ||\n        this.currentAction === SelectAction.Rotate) &&\n      this.arrowBindingService\n    ) {\n      const selectedElements = this.apiService.getSelectedElements();\n      const movedIds = new Set(selectedElements.map((el) => el.id));\n      const arrowUpdates = this.arrowBindingService.recomputeBindingsForElements(movedIds);\n      if (arrowUpdates.length > 0) {\n        this.apiService.updateElements(arrowUpdates as Array<Partial<WhiteboardElement> & { id: string }>);\n      }\n    }\n\n    // Commit the gesture's coalesced changes as a single undo entry.\n    if (this.transformBatch) {\n      this.apiService.completeBatch(this.apiService.getElements());\n      this.transformBatch.execute();\n      this.transformBatch = null;\n    }\n\n    this.initialElementStates.clear();\n\n    this.currentAction = SelectAction.None;\n    this.startPoint = null;\n    this.currentHandle = null;\n    this.rotateStartAngle = null;\n    this.selectionCenter = null;\n    this.initialBoundingBox = null;\n    this.dragEndpointId = null;\n    this.dragEndpointEnd = null;\n    this.dragEndpointSnap = null;\n    this.dragCurveArrowId = null;\n    this.arrowBindingsDetached = false;\n  }\n\n  private handleElementSelect(elementId: string | null, isMultiSelect: boolean): void {\n    if (!elementId) return;\n\n    const element = this.apiService.getElementById(elementId);\n    if (!element) return;\n\n    if (element.locked) {\n      return;\n    }\n\n    if (isMultiSelect) {\n      this.apiService.toggleSelection(element);\n    } else {\n      this.apiService.selectElements([element]);\n    }\n  }\n\n  private handleMove(currentPoint: Point, shiftKey: boolean): void {\n    if (!this.startPoint) return;\n\n    const dx = currentPoint.x - this.startPoint.x;\n    const dy = currentPoint.y - this.startPoint.y;\n\n    let snappedX = dx;\n    let snappedY = dy;\n\n    if (shiftKey) {\n      const snapped = getSnappedOffset(dx, dy);\n      snappedX = snapped.x;\n      snappedY = snapped.y;\n    }\n\n    // Detach bindings from arrows that are being moved by their body (not via endpoint handles)\n    if (!this.arrowBindingsDetached && this.arrowBindingService) {\n      const selectedElements = this.apiService.getSelectedElements();\n      const movedArrows = selectedElements.filter(\n        (el): el is ArrowElement =>\n          el.type === ElementType.Arrow && (el.startBinding !== null || el.endBinding !== null)\n      );\n      if (movedArrows.length > 0) {\n        const detachUpdates: Array<Partial<WhiteboardElement> & { id: string }> = [];\n        for (const arrow of movedArrows) {\n          const update: Partial<ArrowElement> & { id: string } = { id: arrow.id };\n          if (arrow.startBinding) update.startBinding = null;\n          if (arrow.endBinding) update.endBinding = null;\n          detachUpdates.push(update as Partial<WhiteboardElement> & { id: string });\n        }\n        this.apiService.updateElements(detachUpdates);\n        this.arrowBindingsDetached = true;\n      }\n    }\n\n    this.apiService.transformSelectedElements((elements) =>\n      elements.map((element) => {\n        if (element.locked) {\n          return element;\n        }\n        return {\n          ...element,\n          x: element.x + snappedX,\n          y: element.y + snappedY,\n        };\n      })\n    );\n\n    // Update bound arrows in real-time as shapes are moved\n    if (this.arrowBindingService) {\n      const selectedElements = this.apiService.getSelectedElements();\n      const movedIds = new Set(selectedElements.map((el) => el.id));\n      const arrowUpdates = this.arrowBindingService.recomputeBindingsForElements(movedIds);\n      if (arrowUpdates.length > 0) {\n        this.apiService.updateElements(arrowUpdates as Array<Partial<WhiteboardElement> & { id: string }>);\n      }\n    }\n\n    this.startPoint = currentPoint;\n  }\n\n  private handleResize(currentPoint: Point, shiftKey: boolean): void {\n    if (!this.startPoint || this.currentHandle === null || !this.initialBoundingBox) return;\n\n    const handle = this.currentHandle;\n    const selectedElements = this.apiService.getSelectedElements();\n    if (!selectedElements.length) return;\n\n    if (selectedElements.length === 1) {\n      const element = selectedElements[0];\n\n      const initialElement = this.initialElementStates.get(element.id);\n      if (!initialElement) return;\n\n      let localDx: number;\n      let localDy: number;\n\n      if (element.rotation && element.rotation !== 0) {\n        // For rotated elements keep the delta-from-click approach and un-rotate to local space.\n        const rawDx = currentPoint.x - this.startPoint.x;\n        const rawDy = currentPoint.y - this.startPoint.y;\n        const angleRad = (-element.rotation * Math.PI) / 180;\n        const cos = Math.cos(angleRad);\n        const sin = Math.sin(angleRad);\n        localDx = rawDx * cos - rawDy * sin;\n        localDy = rawDx * sin + rawDy * cos;\n      } else {\n        // Absolute cursor tracking: compute dx/dy relative to the initial natural\n        // bbox corners so the dragged handle edge follows the cursor exactly,\n        // regardless of where inside the grip the user clicked.\n        const naturalBounds = getElementUtil(initialElement.type).getBounds(initialElement);\n        localDx = handle.includes(Direction.E)\n          ? currentPoint.x - naturalBounds.maxX\n          : handle.includes(Direction.W)\n          ? currentPoint.x - naturalBounds.minX\n          : 0;\n        localDy = handle.includes(Direction.S)\n          ? currentPoint.y - naturalBounds.maxY\n          : handle.includes(Direction.N)\n          ? currentPoint.y - naturalBounds.minY\n          : 0;\n      }\n\n      let snappedX = localDx;\n      let snappedY = localDy;\n\n      if (shiftKey) {\n        const snapped = getSnappedOffset(localDx, localDy);\n        snappedX = snapped.x;\n        snappedY = snapped.y;\n      }\n\n      this.apiService.transformSelectedElements((elements) =>\n        elements.map((el) => {\n          if (el.locked) {\n            return el;\n          }\n\n          const initial = this.initialElementStates.get(el.id);\n          if (!initial) return el;\n\n          // For a rotated element the element renders rotated around its fill-box center,\n          // so pin the anchor corner (opposite the dragged handle) in world space using\n          // that same center. Computing it before and after the resize and shifting by the\n          // difference keeps the opposite corner fixed instead of drifting.\n          let anchorPointBefore: Point | null = null;\n          if (initial.rotation && initial.rotation !== 0) {\n            const initialBounds = getElementUtil(initial.type).getBounds(initial);\n            anchorPointBefore = getRotatedResizeAnchor(initialBounds, handle, initial.rotation);\n          }\n\n          const elementUtil = getElementUtil(initial.type);\n          const resized = elementUtil.resize({ ...initial }, handle, snappedX, snappedY);\n\n          if (initial.rotation && initial.rotation !== 0 && anchorPointBefore) {\n            const resizedBounds = getElementUtil(resized.type).getBounds(resized);\n            const anchorPointAfter = getRotatedResizeAnchor(resizedBounds, handle, resized.rotation ?? 0);\n\n            resized.x += anchorPointBefore.x - anchorPointAfter.x;\n            resized.y += anchorPointBefore.y - anchorPointAfter.y;\n          }\n\n          return resized;\n        })\n      );\n\n      return;\n    }\n\n    const initialBounds = this.initialBoundingBox;\n    const dx = currentPoint.x - this.startPoint.x;\n    const dy = currentPoint.y - this.startPoint.y;\n\n    let anchorX: number, anchorY: number;\n    let newWidth: number, newHeight: number;\n\n    switch (handle) {\n      case Direction.N:\n        anchorX = initialBounds.x;\n        anchorY = initialBounds.y + initialBounds.height;\n        newWidth = initialBounds.width;\n        newHeight = initialBounds.height - dy;\n        break;\n      case Direction.S:\n        anchorX = initialBounds.x;\n        anchorY = initialBounds.y;\n        newWidth = initialBounds.width;\n        newHeight = initialBounds.height + dy;\n        break;\n      case Direction.E:\n        anchorX = initialBounds.x;\n        anchorY = initialBounds.y;\n        newWidth = initialBounds.width + dx;\n        newHeight = initialBounds.height;\n        break;\n      case Direction.W:\n        anchorX = initialBounds.x + initialBounds.width;\n        anchorY = initialBounds.y;\n        newWidth = initialBounds.width - dx;\n        newHeight = initialBounds.height;\n        break;\n      case Direction.NE:\n        anchorX = initialBounds.x;\n        anchorY = initialBounds.y + initialBounds.height;\n        newWidth = initialBounds.width + dx;\n        newHeight = initialBounds.height - dy;\n        break;\n      case Direction.NW:\n        anchorX = initialBounds.x + initialBounds.width;\n        anchorY = initialBounds.y + initialBounds.height;\n        newWidth = initialBounds.width - dx;\n        newHeight = initialBounds.height - dy;\n        break;\n      case Direction.SE:\n        anchorX = initialBounds.x;\n        anchorY = initialBounds.y;\n        newWidth = initialBounds.width + dx;\n        newHeight = initialBounds.height + dy;\n        break;\n      case Direction.SW:\n        anchorX = initialBounds.x + initialBounds.width;\n        anchorY = initialBounds.y;\n        newWidth = initialBounds.width - dx;\n        newHeight = initialBounds.height + dy;\n        break;\n      default:\n        return;\n    }\n\n    if (newWidth <= 0 || newHeight <= 0) return;\n\n    const scaleX = newWidth / initialBounds.width;\n    const scaleY = newHeight / initialBounds.height;\n\n    let finalScaleX = scaleX;\n    let finalScaleY = scaleY;\n    if (shiftKey) {\n      const uniformScale = Math.min(Math.abs(scaleX), Math.abs(scaleY)) * Math.sign(scaleX) * Math.sign(scaleY);\n      finalScaleX = uniformScale;\n      finalScaleY = uniformScale;\n    }\n\n    this.apiService.transformSelectedElements((elements) =>\n      elements.map((element) => {\n        if (element.locked) {\n          return element;\n        }\n\n        const initialElement = this.initialElementStates.get(element.id);\n        if (!initialElement) {\n          return element;\n        }\n\n        // Project the group scale onto the child's own axes so rotated children scale\n        // along their orientation instead of stretching diagonally out of the box.\n        const childScale = getRotatedChildScale(finalScaleX, finalScaleY, initialElement.rotation ?? 0);\n\n        const hasSize =\n          'width' in initialElement &&\n          initialElement.width !== undefined &&\n          'height' in initialElement &&\n          initialElement.height !== undefined;\n\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const updates: any = { ...element };\n\n        if (hasSize) {\n          // Scale the child's center about the anchor with the group scale, then re-derive\n          // the origin from the projected-scaled size. Origin-only scaling would shift a\n          // rotated child whenever its size scale differs from the group scale.\n          const w0 = initialElement.width as number;\n          const h0 = initialElement.height as number;\n          const newWidthEl = w0 * childScale.scaleX;\n          const newHeightEl = h0 * childScale.scaleY;\n          const centerX = initialElement.x + w0 / 2;\n          const centerY = initialElement.y + h0 / 2;\n          const newCenterX = anchorX + (centerX - anchorX) * finalScaleX;\n          const newCenterY = anchorY + (centerY - anchorY) * finalScaleY;\n          updates.x = newCenterX - newWidthEl / 2;\n          updates.y = newCenterY - newHeightEl / 2;\n          updates.width = newWidthEl;\n          updates.height = newHeightEl;\n        } else {\n          updates.x = anchorX + (initialElement.x - anchorX) * finalScaleX;\n          updates.y = anchorY + (initialElement.y - anchorY) * finalScaleY;\n        }\n\n        if (initialElement.style?.strokeWidth) {\n          const avgScale = (Math.abs(finalScaleX) + Math.abs(finalScaleY)) / 2;\n          updates.style = {\n            ...element.style,\n            strokeWidth: initialElement.style.strokeWidth * avgScale,\n          };\n        }\n\n        updates.rotation = initialElement.rotation;\n\n        return updates as WhiteboardElement;\n      })\n    );\n  }\n\n  private handleRotate(currentPoint: Point, ctrlKey: boolean): void {\n    if (!this.startPoint || !this.selectionCenter || this.rotateStartAngle === null) return;\n\n    const selectedElements = this.apiService.getSelectedElements();\n    if (selectedElements.length === 0) return;\n\n    const currentAngle = calculateAngle(this.selectionCenter, currentPoint);\n\n    let deltaAngle = currentAngle - this.rotateStartAngle;\n\n    if (deltaAngle > 180) deltaAngle -= 360;\n    if (deltaAngle < -180) deltaAngle += 360;\n\n    if (ctrlKey) {\n      deltaAngle = Math.round(deltaAngle / 15) * 15;\n    }\n\n    if (selectedElements.length > 1) {\n      const selectionCenter = this.selectionCenter;\n\n      this.apiService.transformSelectedElements((elements) =>\n        elements.map((element) => {\n          if (element.locked) {\n            return element;\n          }\n\n          const initialElement = this.initialElementStates.get(element.id);\n          if (!initialElement) {\n            return element;\n          }\n\n          const initialRotation = this.initialElementRotations.get(element.id) ?? initialElement.rotation ?? 0;\n\n          const elementUtil = getElementUtil(initialElement.type);\n          const bounds = elementUtil.getBounds(initialElement);\n\n          const elementCenter = {\n            x: (bounds.minX + bounds.maxX) / 2,\n            y: (bounds.minY + bounds.maxY) / 2,\n          };\n\n          const newCenter = rotatePointAroundCenter(elementCenter, selectionCenter, deltaAngle);\n\n          const centerOffsetX = elementCenter.x - initialElement.x;\n          const centerOffsetY = elementCenter.y - initialElement.y;\n\n          const newX = newCenter.x - centerOffsetX;\n          const newY = newCenter.y - centerOffsetY;\n\n          const newRotation = normalizeAngle(initialRotation + deltaAngle);\n\n          return {\n            ...element,\n            x: newX,\n            y: newY,\n            rotation: newRotation,\n          };\n        })\n      );\n    } else {\n      const element = selectedElements[0];\n      const initialRotation = this.initialElementRotations.get(element.id) ?? element.rotation ?? 0;\n      let newRotation = initialRotation + deltaAngle;\n\n      newRotation = normalizeAngle(newRotation);\n\n      this.apiService.transformSelectedElements((elements) =>\n        elements.map((el) => {\n          if (el.locked) {\n            return el;\n          }\n          return {\n            ...el,\n            rotation: newRotation,\n          };\n        })\n      );\n    }\n  }\n\n  // ────────────────── Endpoint Drag (Arrow + Line) ──────────────────\n\n  /**\n   * Handle dragging an endpoint of an arrow or line in real-time.\n   * For arrows: attempts snap-to-shape with visual feedback.\n   * For lines: free movement of the endpoint.\n   */\n  private handleDragEndpoint(currentPoint: Point): void {\n    if (!this.dragEndpointId || !this.dragEndpointEnd) return;\n\n    const element = this.apiService.getElementById(this.dragEndpointId);\n    if (!element) return;\n\n    // Convert world point to local coordinates (account for element origin + rotation)\n    const local = this.worldToLocal(element, currentPoint);\n    let x = local.x;\n    let y = local.y;\n\n    const isArrow = element.type === ElementType.Arrow;\n\n    // Snap-to-shape for arrows only\n    this.dragEndpointSnap = null;\n    if (isArrow && this.connectionPointsService) {\n      const allElements = this.apiService.getElements();\n      const excludeIds = new Set([this.dragEndpointId]);\n      const snap = this.connectionPointsService.findSnapTarget(\n        currentPoint, // snap uses world coords\n        allElements,\n        excludeIds,\n        this.SNAP_RADIUS\n      );\n      if (snap) {\n        // Convert snapped world point back to local\n        const snapLocal = this.worldToLocal(element, snap.point);\n        x = snapLocal.x;\n        y = snapLocal.y;\n        this.dragEndpointSnap = snap;\n        this.connectionUIService?.setSnapIndicator(snap.point);\n        const targetEl = allElements.find((el) => el.id === snap.elementId);\n        if (targetEl) {\n          this.connectionUIService?.setVisibleConnectionPoints(\n            this.connectionPointsService.getConnectionPoints(targetEl)\n          );\n        }\n      } else {\n        this.connectionUIService?.setSnapIndicator(null);\n        this.connectionUIService?.setVisibleConnectionPoints([]);\n      }\n    }\n\n    // Update the endpoint in real-time\n    const update =\n      this.dragEndpointEnd === 'start' ? { id: element.id, x1: x, y1: y } : { id: element.id, x2: x, y2: y };\n    this.apiService.updateElements([update as Partial<WhiteboardElement> & { id: string }]);\n  }\n\n  /**\n   * Finalize the endpoint drag.\n   * For arrows: commit binding if snapped, or detach.\n   * For lines: no further action needed (already updated in real-time).\n   */\n  private finalizeDragEndpoint(): void {\n    if (!this.dragEndpointId || !this.dragEndpointEnd) return;\n\n    const element = this.apiService.getElementById(this.dragEndpointId);\n    if (!element) return;\n\n    const isArrow = element.type === ElementType.Arrow;\n\n    if (isArrow && this.arrowBindingService) {\n      const arrow = element as ArrowElement;\n\n      if (this.dragEndpointSnap) {\n        const binding = this.arrowBindingService.createBinding(\n          this.dragEndpointSnap.elementId,\n          this.dragEndpointSnap.pointId\n        );\n        const snapLocal = this.worldToLocal(arrow, this.dragEndpointSnap.point);\n        const update =\n          this.dragEndpointEnd === 'start'\n            ? { id: arrow.id, startBinding: binding, x1: snapLocal.x, y1: snapLocal.y }\n            : { id: arrow.id, endBinding: binding, x2: snapLocal.x, y2: snapLocal.y };\n        this.apiService.updateElements([update as Partial<WhiteboardElement> & { id: string }]);\n      } else {\n        // Detach from any shape\n        const update =\n          this.dragEndpointEnd === 'start' ? { id: arrow.id, startBinding: null } : { id: arrow.id, endBinding: null };\n        this.apiService.updateElements([update as Partial<WhiteboardElement> & { id: string }]);\n      }\n    }\n\n    this.connectionUIService?.clearAll();\n  }\n\n  /**\n   * Handle dragging the middle curve handle to adjust an arrow's curvature.\n   * Converts the world-space pointer position to a quadratic control point.\n   * Dragging away from the midpoint creates/modifies a quadratic bezier;\n   * dragging back to the midpoint resets to straight.\n   */\n  private handleDragCurveHandle(currentPoint: Point): void {\n    if (!this.dragCurveArrowId) return;\n\n    const element = this.apiService.getElementById(this.dragCurveArrowId);\n    if (!element || element.type !== ElementType.Arrow) return;\n\n    const arrow = element as ArrowElement;\n\n    // --- Elbow: dragging controls the midRatio (bend position along X axis) ---\n    if (arrow.pathType?.type === 'elbow') {\n      const local = this.worldToLocal(arrow, currentPoint);\n      const dx = arrow.x2 - arrow.x1;\n      if (Math.abs(dx) < 1) return; // degenerate case\n      const ratio = Math.max(0.05, Math.min(0.95, (local.x - arrow.x1) / dx));\n      const update = {\n        id: arrow.id,\n        pathType: { type: 'elbow' as const, midRatio: ratio },\n      };\n      this.apiService.updateElements([update as Partial<WhiteboardElement> & { id: string }]);\n      return;\n    }\n\n    // --- Quadratic / Straight: existing behaviour ---\n    // Convert the world-space pointer to local coordinates\n    const local = this.worldToLocal(arrow, currentPoint);\n\n    // Compute midpoint in local space\n    const midX = (arrow.x1 + arrow.x2) / 2;\n    const midY = (arrow.y1 + arrow.y2) / 2;\n\n    // Distance from the local control point to the midpoint\n    const dist = Math.sqrt((local.x - midX) ** 2 + (local.y - midY) ** 2);\n\n    // If the handle is close to the midpoint, reset to straight\n    const STRAIGHT_THRESHOLD = 5;\n    if (dist < STRAIGHT_THRESHOLD) {\n      const update = { id: arrow.id, pathType: { type: 'straight' as const } };\n      this.apiService.updateElements([update as Partial<WhiteboardElement> & { id: string }]);\n    } else {\n      // Set quadratic control point\n      const update = {\n        id: arrow.id,\n        pathType: { type: 'quadratic' as const, cx: local.x, cy: local.y },\n      };\n      this.apiService.updateElements([update as Partial<WhiteboardElement> & { id: string }]);\n    }\n  }\n\n  /**\n   * Convert a world-space point to an element's local coordinate system,\n   * accounting for translation, fill-box-centered rotation, and scale.\n   *\n   * The element <g> uses `translate(x,y) rotate(rotation)` with CSS\n   * `transform-box: fill-box; transform-origin: center`, so the rotation\n   * pivot is the fill-box center, not the local origin.\n   */\n  private worldToLocal(element: WhiteboardElement, worldPoint: Point): Point {\n    const rot = element.rotation ?? 0;\n    const scaleX = (element as WhiteboardElement & { scaleX?: number }).scaleX ?? 1;\n    const scaleY = (element as WhiteboardElement & { scaleY?: number }).scaleY ?? 1;\n\n    // Un-translate\n    const dx = worldPoint.x - element.x;\n    const dy = worldPoint.y - element.y;\n\n    if (rot === 0) {\n      return { x: dx / scaleX, y: dy / scaleY };\n    }\n\n    // Fill-box pivot in local (post-scale) space\n    const el = element as WhiteboardElement & { x1?: number; y1?: number; x2?: number; y2?: number };\n    const x1s = (el.x1 ?? 0) * scaleX;\n    const y1s = (el.y1 ?? 0) * scaleY;\n    const x2s = (el.x2 ?? 0) * scaleX;\n    const y2s = (el.y2 ?? 0) * scaleY;\n    const pivotX = (x1s + x2s) / 2;\n    const pivotY = (y1s + y2s) / 2;\n\n    // Inverse rotation around fill-box pivot\n    const rad = (-rot * Math.PI) / 180;\n    const cos = Math.cos(rad);\n    const sin = Math.sin(rad);\n    const rx = dx - pivotX;\n    const ry = dy - pivotY;\n    const localX = pivotX + rx * cos - ry * sin;\n    const localY = pivotY + rx * sin + ry * cos;\n\n    return { x: localX / scaleX, y: localY / scaleY };\n  }\n\n  private handleBoxSelect(currentPoint: Point, shiftKey: boolean): void {\n    if (!this.startPoint) return;\n\n    const selectionBox = {\n      x: Math.min(this.startPoint.x, currentPoint.x),\n      y: Math.min(this.startPoint.y, currentPoint.y),\n      width: Math.abs(currentPoint.x - this.startPoint.x),\n      height: Math.abs(currentPoint.y - this.startPoint.y),\n      visible: true,\n    };\n\n    this.apiService.setSelectionBox(selectionBox);\n\n    const allElements = this.apiService.getElements();\n    const elementsInBox = allElements.filter(\n      (element) => this.checkElementInSelectionBox(element, selectionBox) && !element.locked\n    );\n\n    this.apiService.selectElements(elementsInBox, shiftKey);\n    this.apiService.updateBoundingBox();\n  }\n\n  private initializeBoxSelect(event: PointerInfo): void {\n    if (!event.shiftKey) {\n      this.apiService.clearSelection();\n    }\n\n    const { x, y } = this.getPointerPosition(event);\n\n    const selectionBox = {\n      x,\n      y,\n      width: 0,\n      height: 0,\n      visible: true,\n    };\n\n    this.apiService.setSelectionBox(selectionBox);\n  }\n\n  private initializeResize(): void {\n    const selectedElements = this.apiService.getSelectedElements();\n    if (selectedElements.length === 0) return;\n\n    this.initialElementStates.clear();\n    selectedElements.forEach((element) => {\n      this.initialElementStates.set(element.id, { ...element });\n    });\n\n    // Use the already-computed bounding box signal (which uses measureTextElementSvg\n    // for text elements) so that initialBoundingBox matches the displayed box exactly.\n    const currentBbox = this.apiService.getBoundingBoxSignal()();\n    if (currentBbox) {\n      this.initialBoundingBox = {\n        x: currentBbox.x,\n        y: currentBbox.y,\n        width: currentBbox.width,\n        height: currentBbox.height,\n      };\n    } else {\n      const combinedBounds = getCombinedScreenBounds(selectedElements);\n      if (combinedBounds) {\n        this.initialBoundingBox = {\n          x: combinedBounds.minX,\n          y: combinedBounds.minY,\n          width: combinedBounds.width,\n          height: combinedBounds.height,\n        };\n      } else {\n        const allBounds = selectedElements.map((el) => getElementBounds(el));\n        const minX = Math.min(...allBounds.map((b) => b.minX));\n        const minY = Math.min(...allBounds.map((b) => b.minY));\n        const maxX = Math.max(...allBounds.map((b) => b.maxX));\n        const maxY = Math.max(...allBounds.map((b) => b.maxY));\n        this.initialBoundingBox = {\n          x: minX,\n          y: minY,\n          width: maxX - minX,\n          height: maxY - minY,\n        };\n      }\n    }\n  }\n\n  private initializeRotation(event: PointerInfo): void {\n    const bboxOrSignal = this.apiService.getBoundingBoxSignal();\n    const maybeFn = bboxOrSignal as unknown;\n    type BBox = { x: number; y: number; width: number; height: number } | null;\n    const bbox: BBox = typeof maybeFn === 'function' ? (maybeFn as () => BBox)() : (bboxOrSignal as unknown as BBox);\n    if (!bbox) return;\n\n    this.selectionCenter = {\n      x: bbox.x + bbox.width / 2,\n      y: bbox.y + bbox.height / 2,\n    };\n\n    const point = this.getPointerPosition(event);\n\n    this.rotateStartAngle = calculateAngle(this.selectionCenter, point);\n\n    const selectedElements = this.apiService.getSelectedElements();\n    this.initialElementRotations.clear();\n    this.initialElementStates.clear();\n    selectedElements.forEach((element) => {\n      this.initialElementRotations.set(element.id, element.rotation || 0);\n      this.initialElementStates.set(element.id, { ...element });\n    });\n\n    this.apiService.setBoundingBox(null);\n  }\n\n  private checkElementInSelectionBox(\n    element: WhiteboardElement,\n    selectionBox: { x: number; y: number; width: number; height: number }\n  ): boolean {\n    const elementUtil = getElementUtil(element.type);\n    const bounds = elementUtil.getBounds(element);\n    return isElementInSelectionBox(bounds, selectionBox);\n  }\n\n  private getResizeDirection(handleId: string): Direction {\n    const staticDirectionStr = handleId.split('_')[2];\n\n    let baseDirection: Direction = Direction.N;\n    if (Object.values(Direction).includes(staticDirectionStr as Direction)) {\n      baseDirection = staticDirectionStr as Direction;\n    }\n\n    // The selection box and its grips render inside #selectorParentGroup, which rotates\n    // with the element, so each grip stays glued to its own local corner. The resize\n    // direction is therefore the grip's own (static) direction — the handler un-rotates\n    // the cursor delta into local space, so applying a rotation remap here would\n    // double-count the rotation and resize the wrong corner.\n    return baseDirection;\n  }\n}\n","import { TextElement } from '../elements';\nimport { createElement } from '../elements/element.utils';\nimport { ElementType, PointerInfo, ToolType, WhiteboardElementStyle } from '../types';\nimport { getTargetElement } from '../utils/dom';\nimport { snapToGrid } from '../utils/geometry';\nimport { BaseTool } from './base-tool';\nimport { CursorType } from '../types/cursors';\nimport { KEY } from '../constants';\n\nexport class TextTool extends BaseTool {\n  type = ToolType.Text;\n  override baseCursor = CursorType.Text;\n  private textElement: TextElement | null = null;\n  private textInput: HTMLTextAreaElement | null = null;\n\n  get isEditing(): boolean {\n    return this.textInput !== null;\n  }\n\n  override handlePointerDown(event: PointerInfo): void {\n    if (!this.active) return;\n\n    if (this.textInput) {\n      this.finishTextInput();\n      return;\n    }\n\n    const targetElement = getTargetElement(event, this.apiService.getElements());\n    if (targetElement && targetElement.type === ElementType.Text) {\n      this.textElement = targetElement;\n      this.createTextInput(targetElement.x, targetElement.y, targetElement.text);\n      return;\n    }\n\n    const { x, y } = this.getPointerPosition(event);\n    const fontSize = this.whiteboardConfig.fontSize || 16;\n    const adjustedY = y + fontSize * 0.8;\n    this.textElement = this.createTextElement(x, adjustedY);\n    this.createTextInput(x, adjustedY, '', event);\n  }\n\n  override handlePointerUp(): void {\n    if (this.textInput) {\n      this.textInput.addEventListener('blur', () => this.finishTextInput());\n      this.textInput.focus();\n    }\n  }\n  private createTextElement(x: number, y: number): TextElement {\n    const { snapToGrid: allowedSnap, gridSize } = this.whiteboardConfig;\n    return createElement(\n      ElementType.Text,\n      {\n        x: allowedSnap ? snapToGrid(x, gridSize) : x,\n        y: allowedSnap ? snapToGrid(y, gridSize) : y,\n        text: '',\n        style: this.getElementStyle(),\n        zIndex: this.apiService.getNextZIndex(),\n      },\n      this.apiService.getActiveLayerId()\n    );\n  }\n\n  private createTextInput(x: number, y: number, initialValue = '', event?: PointerInfo): void {\n    const borderOffset = 1;\n    const fontSize = this.textElement?.style?.fontSize || 16;\n    const baselineOffset = fontSize * 0.8;\n\n    const svgElement = this.apiService.getCanvas();\n    const container = svgElement.parentElement;\n\n    if (!container) {\n      console.error('Cannot find whiteboard container');\n      return;\n    }\n\n    const containerRect = container.getBoundingClientRect();\n\n    let calculatedLeft: number;\n    let calculatedTop: number;\n\n    if (event) {\n      calculatedLeft = event.clientX - containerRect.left - borderOffset;\n      calculatedTop = event.clientY - containerRect.top - borderOffset;\n    } else {\n      const config = this.whiteboardConfig;\n      calculatedLeft = config.canvasX + (x + config.x) * config.zoom - borderOffset;\n      calculatedTop = config.canvasY + (y + config.y) * config.zoom - borderOffset - baselineOffset * config.zoom;\n    }\n\n    const textarea = document.createElement('textarea');\n    textarea.id = 'whiteboard-text-input';\n    textarea.setAttribute('aria-label', 'Text input');\n\n    textarea.style.position = 'absolute';\n    textarea.style.left = `${calculatedLeft}px`;\n    textarea.style.top = `${calculatedTop}px`;\n    textarea.style.fontSize = `${this.textElement?.style?.fontSize || 16}px`;\n    textarea.style.fontFamily = this.textElement?.style?.fontFamily || 'Arial';\n    textarea.style.color = this.textElement?.style?.color || '#000000';\n    textarea.style.fontWeight = this.textElement?.style?.fontWeight || 'normal';\n    textarea.style.fontStyle = this.textElement?.style?.fontStyle || 'normal';\n    textarea.style.border = '1px dashed #000';\n    textarea.style.background = 'white';\n    textarea.style.outline = 'none';\n    textarea.style.resize = 'none';\n    textarea.style.overflow = 'hidden';\n    textarea.style.lineHeight = '1.2';\n    textarea.style.whiteSpace = 'pre-wrap';\n    textarea.style.margin = '0';\n    textarea.style.padding = '2px';\n    textarea.style.boxSizing = 'border-box';\n    textarea.style.zIndex = '10000';\n    textarea.style.pointerEvents = 'auto';\n    textarea.value = initialValue;\n    textarea.rows = 1;\n\n    textarea.addEventListener('input', () => this.handleTextInput(textarea));\n    textarea.addEventListener('keydown', (e) => {\n      if (e.key === KEY.ENTER && e.ctrlKey) {\n        e.preventDefault();\n        this.finishTextInput();\n      } else if (e.key === KEY.ESCAPE) {\n        e.preventDefault();\n        this.finishTextInput();\n      }\n    });\n\n    if (container) {\n      container.appendChild(textarea);\n    } else {\n      document.body.appendChild(textarea);\n    }\n    textarea.focus();\n\n    this.textInput = textarea;\n    this.handleTextInput(textarea);\n  }\n\n  private handleTextInput(input: HTMLTextAreaElement): void {\n    const lines = input.value.split('\\n');\n    const maxLineLength = lines.reduce((max, line) => Math.max(max, line.length), 0);\n    input.style.width = `${Math.max(maxLineLength, 10)}ch`;\n    input.rows = Math.max(lines.length, 1);\n\n    if (this.textElement) {\n      this.textElement.text = input.value;\n      this.apiService.updateElements([this.textElement]);\n    }\n  }\n\n  private finishTextInput(): void {\n    if (this.textInput && this.textElement) {\n      if (this.textInput.value.trim()) {\n        if (!this.apiService.elementExists(this.textElement.id)) {\n          this.apiService.addElements([this.textElement]);\n\n          this.apiService.finalizeDraw(this.textElement);\n        }\n      } else {\n        this.apiService.removeElements([this.textElement]);\n      }\n\n      try {\n        if (this.textInput.parentElement) {\n          this.textInput.parentElement.removeChild(this.textInput);\n        }\n      } catch {\n        // Textarea already removed\n      }\n\n      this.textInput = null;\n      this.textElement = null;\n    }\n  }\n\n  private getElementStyle(): WhiteboardElementStyle {\n    return {\n      color: this.whiteboardConfig.strokeColor,\n      fontSize: this.whiteboardConfig.fontSize,\n      fontFamily: this.whiteboardConfig.fontFamily,\n      lineJoin: this.whiteboardConfig.lineJoin,\n      lineCap: this.whiteboardConfig.lineCap,\n      dasharray: this.whiteboardConfig.dasharray,\n      dashoffset: this.whiteboardConfig.dashoffset,\n      strokeColor: this.whiteboardConfig.fill,\n      strokeWidth: 0,\n    };\n  }\n}\n","import { Point, PointerInfo, SelectionBox, ToolType } from '../types';\nimport { BaseTool } from './base-tool';\nimport { CursorType } from '../types/cursors';\n\n/**\n * Marquee zoom tool: drag a rectangle on the canvas, then zoom the viewport to that area on\n * release. Reuses the existing selection-box rendering for the marquee overlay and never\n * creates or modifies elements. A plain click (no meaningful drag) is ignored.\n */\nexport class ZoomAreaTool extends BaseTool {\n  type = ToolType.ZoomArea;\n  override baseCursor = CursorType.Crosshair;\n\n  /** Smallest drag (in canvas units) treated as a marquee; below this it's a click → ignored. */\n  private static readonly MIN_DRAG = 5;\n\n  private start: Point | null = null;\n  private current: Point | null = null;\n\n  override handlePointerDown(event: PointerInfo): void {\n    this.start = this.getPointerPosition(event);\n    this.current = this.start;\n    this.apiService.setSelectionBox(this.boxFrom(this.start, this.current));\n  }\n\n  override handlePointerMove(event: PointerInfo): void {\n    if (!this.start) return;\n    this.current = this.getPointerPosition(event);\n    this.apiService.setSelectionBox(this.boxFrom(this.start, this.current));\n  }\n\n  override handlePointerUp(): void {\n    const start = this.start;\n    const current = this.current;\n    this.start = null;\n    this.current = null;\n    this.apiService.clearSelectionBox();\n    if (!start || !current) return;\n\n    const box = this.boxFrom(start, current);\n    if (box.width < ZoomAreaTool.MIN_DRAG || box.height < ZoomAreaTool.MIN_DRAG) return; // a click, not a marquee\n\n    // zoomToRegion zooms to the marquee AND pans so it is centred (zoomToArea alone only sets\n    // the zoom level — in fullScreen it wouldn't actually bring the region into view).\n    this.apiService.zoomToRegion(box.x, box.y, box.width, box.height);\n  }\n\n  private boxFrom(a: Point, b: Point): SelectionBox {\n    return {\n      x: Math.min(a.x, b.x),\n      y: Math.min(a.y, b.y),\n      width: Math.abs(b.x - a.x),\n      height: Math.abs(b.y - a.y),\n      visible: true,\n    };\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ApiService } from '../api';\nimport { ArrowBindingService, ConnectionPointsService, ConnectionUIService } from '../elements';\nimport {\n  ArrowTool,\n  EllipseTool,\n  EraserTool,\n  HandTool,\n  ImageTool,\n  LineTool,\n  PenTool,\n  RectangleTool,\n  SelectTool,\n  TextTool,\n  ZoomAreaTool,\n} from '../tools';\nimport { Tool, ToolType } from '../types';\n\n@Injectable({ providedIn: 'root' })\nexport class ToolFactory {\n  private connectionPointsService = inject(ConnectionPointsService);\n  private arrowBindingService = inject(ArrowBindingService);\n  private connectionUIService = inject(ConnectionUIService);\n\n  createTool(toolType: ToolType, apiService: ApiService): Tool {\n    switch (toolType) {\n      case ToolType.Arrow: {\n        const tool = new ArrowTool(apiService);\n        tool.setConnectionServices(this.connectionPointsService, this.arrowBindingService, this.connectionUIService);\n        return tool;\n      }\n      case ToolType.Ellipse:\n        return new EllipseTool(apiService);\n      case ToolType.Eraser:\n        return new EraserTool(apiService);\n      case ToolType.Hand:\n        return new HandTool(apiService);\n      case ToolType.Image:\n        return new ImageTool(apiService);\n      case ToolType.Line:\n        return new LineTool(apiService);\n      case ToolType.Pen:\n        return new PenTool(apiService);\n      case ToolType.Rectangle:\n        return new RectangleTool(apiService);\n      case ToolType.Select: {\n        const tool = new SelectTool(apiService);\n        tool.setConnectionServices(this.connectionPointsService, this.arrowBindingService, this.connectionUIService);\n        return tool;\n      }\n      case ToolType.Text:\n        return new TextTool(apiService);\n      case ToolType.ZoomArea:\n        return new ZoomAreaTool(apiService);\n      default:\n        throw new Error(`Unknown tool type: ${toolType}`);\n    }\n  }\n}\n","import { Injectable, signal, computed, inject, effect } from '@angular/core';\nimport { EventBusService } from '../event-bus/event-bus.service';\nimport { Tool, ToolType, ToolConfig, TOOL_ICONS } from '../types';\nimport { CursorType } from '../types/cursors';\nimport { WhiteboardEvent } from '../types/events';\nimport { ToolFactory } from '../tools/tool-factory.service';\nimport { ApiService } from '../api';\nimport { BaseTool } from '../tools';\n\ninterface TemporaryToolOverride {\n  tool: ToolType;\n  reason: string;\n  timestamp: number;\n}\n\nconst DEFAULT_TOOLS: ReadonlyArray<ToolConfig> = [\n  {\n    id: 'hand',\n    type: ToolType.Hand,\n    name: 'Hand',\n    description: 'Pan and navigate the canvas',\n    icon: TOOL_ICONS[ToolType.Hand],\n    enabled: true,\n    order: 0,\n  },\n  {\n    id: 'select',\n    type: ToolType.Select,\n    name: 'Select',\n    description: 'Select and manipulate elements',\n    icon: TOOL_ICONS[ToolType.Select],\n    enabled: true,\n    order: 1,\n  },\n  {\n    id: 'pen',\n    type: ToolType.Pen,\n    name: 'Pen',\n    description: 'Draw freehand lines',\n    icon: TOOL_ICONS[ToolType.Pen],\n    enabled: true,\n    order: 2,\n  },\n  {\n    id: 'line',\n    type: ToolType.Line,\n    name: 'Line',\n    description: 'Draw straight lines',\n    icon: TOOL_ICONS[ToolType.Line],\n    enabled: true,\n    order: 3,\n  },\n  {\n    id: 'arrow',\n    type: ToolType.Arrow,\n    name: 'Arrow',\n    description: 'Draw arrow lines',\n    icon: TOOL_ICONS[ToolType.Arrow],\n    enabled: true,\n    order: 4,\n  },\n  {\n    id: 'rectangle',\n    type: ToolType.Rectangle,\n    name: 'Rectangle',\n    description: 'Draw rectangles',\n    icon: TOOL_ICONS[ToolType.Rectangle],\n    enabled: true,\n    order: 5,\n  },\n  {\n    id: 'ellipse',\n    type: ToolType.Ellipse,\n    name: 'Ellipse',\n    description: 'Draw ellipses and circles',\n    icon: TOOL_ICONS[ToolType.Ellipse],\n    enabled: true,\n    order: 6,\n  },\n  {\n    id: 'text',\n    type: ToolType.Text,\n    name: 'Text',\n    description: 'Add text annotations',\n    icon: TOOL_ICONS[ToolType.Text],\n    enabled: true,\n    order: 7,\n  },\n  {\n    id: 'image',\n    type: ToolType.Image,\n    name: 'Image',\n    description: 'Add images',\n    icon: TOOL_ICONS[ToolType.Image],\n    enabled: true,\n    order: 8,\n  },\n  {\n    id: 'eraser',\n    type: ToolType.Eraser,\n    name: 'Eraser',\n    description: 'Remove elements',\n    icon: TOOL_ICONS[ToolType.Eraser],\n    enabled: true,\n    order: 9,\n  },\n  {\n    id: 'zoomArea',\n    type: ToolType.ZoomArea,\n    name: 'Zoom to area',\n    description: 'Drag a rectangle to zoom into it',\n    icon: TOOL_ICONS[ToolType.ZoomArea],\n    enabled: true,\n    order: 10,\n  },\n] as const;\n\n@Injectable({ providedIn: 'root' })\nexport class ToolsService {\n  private readonly eventBusService = inject(EventBusService);\n  private readonly toolFactory = inject(ToolFactory);\n  private readonly _apiServiceCache = signal<ApiService | undefined>(undefined);\n\n  private readonly _selectedTool = signal<ToolType>(ToolType.Pen);\n  private readonly _toolConfigs = signal<ReadonlyMap<string, ToolConfig>>(new Map());\n  private readonly _currentToolInstance = signal<Tool | null>(null);\n  private readonly _cursor = signal<CursorType>(CursorType.Default);\n  private readonly _temporaryOverrides = signal<readonly TemporaryToolOverride[]>([]);\n\n  private readonly toolInstanceCache = new Map<ToolType, Tool>();\n\n  readonly selectedTool = this._selectedTool.asReadonly();\n  readonly currentTool = this._currentToolInstance.asReadonly();\n  readonly cursor = this._cursor.asReadonly();\n  readonly temporaryOverrides = this._temporaryOverrides.asReadonly();\n\n  readonly effectiveTool = computed((): ToolType => {\n    const overrides = this._temporaryOverrides();\n    return overrides.length > 0 ? overrides[overrides.length - 1].tool : this._selectedTool();\n  });\n\n  readonly availableTools = computed((): readonly ToolConfig[] => {\n    const configs = this._toolConfigs();\n    return Array.from(configs.values())\n      .filter((tool) => tool.enabled)\n      .sort((a, b) => (a.order ?? 999) - (b.order ?? 999));\n  });\n\n  constructor() {\n    this.initializeDefaultTools();\n\n    effect(\n      () => {\n        const toolType = this.effectiveTool();\n        const apiService = this._apiServiceCache();\n        // Only update tool instance after ApiService is initialized\n        if (apiService) {\n          this.updateCurrentToolInstance(toolType);\n        }\n      },\n      { allowSignalWrites: true }\n    );\n\n    effect(\n      () => {\n        // Only update cursor after tool instance is available\n        if (this._currentToolInstance()) {\n          this.updateCursorForActiveTool();\n        }\n      },\n      { allowSignalWrites: true }\n    );\n  }\n\n  private initializeDefaultTools(): void {\n    const configMap = new Map<string, ToolConfig>();\n    DEFAULT_TOOLS.forEach((config) => {\n      configMap.set(config.id, { ...config });\n    });\n    this._toolConfigs.set(configMap);\n  }\n\n  private updateCurrentToolInstance(toolType: ToolType): void {\n    const currentTool = this._currentToolInstance();\n\n    if (currentTool && currentTool.type !== toolType) {\n      currentTool.deactivate();\n    }\n\n    const newTool = this.getToolInstance(toolType);\n    newTool.activate();\n    this._currentToolInstance.set(newTool);\n\n    if (!this.hasTemporaryOverride()) {\n      this.eventBusService.emit(WhiteboardEvent.ToolChange, toolType);\n    }\n  }\n\n  private updateCursorForActiveTool(): void {\n    const tool = this._currentToolInstance();\n    if (tool && 'baseCursor' in tool) {\n      this._cursor.set((tool as BaseTool).baseCursor);\n    } else {\n      this._cursor.set(CursorType.Default);\n    }\n  }\n\n  getActiveToolType(): ToolType {\n    return this.effectiveTool();\n  }\n\n  getActiveToolInstance(): Tool {\n    const tool = this._currentToolInstance();\n    if (!tool) {\n      throw new Error('No active tool instance found.');\n    }\n    return tool;\n  }\n\n  setActiveTool(tool: ToolType): void {\n    if (this._selectedTool() !== tool) {\n      this._selectedTool.set(tool);\n    }\n  }\n\n  isToolActive(tool: ToolType): boolean {\n    return this.effectiveTool() === tool;\n  }\n\n  getToolInstance(toolType: ToolType): Tool {\n    const isRegistered = Array.from(this._toolConfigs().values()).some((config) => config.type === toolType);\n\n    if (!isRegistered) {\n      throw new Error(`Tool type '${toolType}' is not registered.`);\n    }\n\n    if (!this.toolInstanceCache.has(toolType)) {\n      const apiService = this._apiServiceCache();\n      if (!apiService) {\n        throw new Error('ApiService not set. Call setApiService() first.');\n      }\n      const tool = this.toolFactory.createTool(toolType, apiService);\n      this.toolInstanceCache.set(toolType, tool);\n    }\n\n    const tool = this.toolInstanceCache.get(toolType);\n    if (!tool) {\n      throw new Error(`Failed to create or retrieve tool instance for type: ${toolType}`);\n    }\n    return tool;\n  }\n\n  getRegisteredToolTypes(): ToolType[] {\n    return Array.from(this._toolConfigs().values())\n      .map((config) => config.type)\n      .filter((type, index, array) => array.indexOf(type) === index);\n  }\n\n  isToolRegistered(toolType: ToolType): boolean {\n    return Array.from(this._toolConfigs().values()).some((config) => config.type === toolType);\n  }\n\n  resetToDefaultTool(): void {\n    this.setActiveTool(ToolType.Pen);\n  }\n\n  registerTool(config: ToolConfig): void {\n    const currentConfigs = this._toolConfigs();\n    const updatedConfigs = new Map(currentConfigs);\n    updatedConfigs.set(config.id, { ...config });\n    this._toolConfigs.set(updatedConfigs);\n  }\n\n  registerTools(configs: ToolConfig[]): void {\n    const currentConfigs = this._toolConfigs();\n    const updatedConfigs = new Map(currentConfigs);\n\n    configs.forEach((config) => {\n      updatedConfigs.set(config.id, { ...config });\n    });\n\n    this._toolConfigs.set(updatedConfigs);\n  }\n\n  unregisterTool(toolId: string): boolean {\n    const currentConfigs = this._toolConfigs();\n\n    if (!currentConfigs.has(toolId)) {\n      return false;\n    }\n\n    const toolConfig = currentConfigs.get(toolId);\n    const updatedConfigs = new Map(currentConfigs);\n    updatedConfigs.delete(toolId);\n    this._toolConfigs.set(updatedConfigs);\n\n    if (this._selectedTool() === toolConfig?.type) {\n      this.resetToDefaultTool();\n    }\n\n    return true;\n  }\n\n  getToolConfig(toolId: string): ToolConfig | undefined {\n    return this._toolConfigs().get(toolId);\n  }\n\n  getToolConfigs(): readonly ToolConfig[] {\n    return Array.from(this._toolConfigs().values());\n  }\n\n  setToolEnabled(toolId: string, enabled: boolean): boolean {\n    const config = this.getToolConfig(toolId);\n    if (!config) return false;\n\n    this.registerTool({ ...config, enabled });\n\n    if (!enabled && this._selectedTool() === config.type) {\n      this.resetToDefaultTool();\n    }\n\n    return true;\n  }\n\n  setToolEnabledByType(toolType: ToolType, enabled: boolean): boolean {\n    const config = Array.from(this._toolConfigs().values()).find((c) => c.type === toolType);\n    if (!config) return false;\n\n    return this.setToolEnabled(config.id, enabled);\n  }\n\n  setEnabledTools(toolTypes: ToolType[]): void {\n    const enabledSet = new Set(toolTypes);\n    const currentConfigs = this._toolConfigs();\n    const updatedConfigs = new Map<string, ToolConfig>();\n\n    currentConfigs.forEach((config, id) => {\n      updatedConfigs.set(id, {\n        ...config,\n        enabled: enabledSet.has(config.type),\n      });\n    });\n\n    this._toolConfigs.set(updatedConfigs);\n\n    if (!enabledSet.has(this._selectedTool())) {\n      const firstEnabled = toolTypes[0] || ToolType.Pen;\n      this.setActiveTool(firstEnabled);\n    }\n  }\n\n  pushTemporaryTool(tool: ToolType, reason = `temp-${Date.now()}`): void {\n    const overrides = this._temporaryOverrides();\n\n    if (overrides.some((override) => override.reason === reason)) {\n      return;\n    }\n\n    const newOverride: TemporaryToolOverride = {\n      tool,\n      reason,\n      timestamp: Date.now(),\n    };\n\n    this._temporaryOverrides.update((overrides) => [...overrides, newOverride]);\n  }\n\n  popTemporaryTool(reason?: string): void {\n    const overrides = this._temporaryOverrides();\n\n    if (overrides.length === 0) return;\n\n    let newOverrides: TemporaryToolOverride[];\n\n    if (reason) {\n      newOverrides = overrides.filter((override) => override.reason !== reason);\n    } else {\n      newOverrides = overrides.slice(0, -1);\n    }\n\n    if (newOverrides.length !== overrides.length) {\n      this._temporaryOverrides.set(newOverrides);\n    }\n  }\n\n  clearTemporaryTools(): void {\n    this._temporaryOverrides.set([]);\n  }\n\n  hasTemporaryOverride(): boolean {\n    return this._temporaryOverrides().length > 0;\n  }\n\n  setCursor(cursor: CursorType): void {\n    this._cursor.set(cursor);\n  }\n\n  resetCursor(): void {\n    this.updateCursorForActiveTool();\n  }\n\n  destroy(): void {\n    const currentTool = this._currentToolInstance();\n    if (currentTool) {\n      currentTool.deactivate();\n    }\n\n    this.toolInstanceCache.clear();\n    this.clearTemporaryTools();\n  }\n\n  setApiService(apiService: ApiService): void {\n    this._apiServiceCache.set(apiService);\n  }\n}\n","import { computed, Injectable, signal, Signal } from '@angular/core';\nimport { EventBusService } from '../event-bus';\nimport { CanvasService } from '../canvas/canvas.service';\nimport { ClipboardService } from '../input/clipboard.service';\nimport { ToolsService } from '../tools/tools.service';\nimport { AlignmentType, Bounds, BoundingBox, ElementType, SelectionBox, ToolType, WhiteboardElement } from '../types';\nimport { TextElement } from './text-element';\nimport { WhiteboardEvent } from '../types/events';\nimport { getElementBounds } from '../utils/dom';\nimport { getCombinedScreenBounds } from '../utils/geometry/transform-utils';\nimport { ElementsService } from './elements.service';\n\n@Injectable({ providedIn: 'root' })\nexport class SelectionService {\n  private readonly OFFSET_INCREMENT = 20;\n\n  // Selection state\n  private readonly selectedElementIdsSignal = signal<Set<string>>(new Set());\n  private readonly selectionBoxSignal = signal<SelectionBox>({\n    x: 0,\n    y: 0,\n    width: 0,\n    height: 0,\n    visible: false,\n  });\n  private readonly boundingBoxSignal = signal<BoundingBox | null>(null);\n\n  // Derived signals\n  readonly selectedIdsSignal = computed(() => Array.from(this.selectedElementIdsSignal()));\n  readonly hasSelectionSignal = computed(() => this.selectedElementIdsSignal().size > 0);\n\n  /** Types that use 2-point endpoint selection instead of bounding-box */\n  private static readonly LINE_TYPES: ReadonlySet<ElementType> = new Set([ElementType.Arrow, ElementType.Line]);\n\n  /**\n   * True when the selection consists exclusively of line-type elements (Arrow / Line).\n   * In this mode the standard bounding box + resize/rotate grips should be hidden,\n   * and 2-point endpoint handles should be shown instead.\n   */\n  readonly isLineOnlySelectionSignal = computed(() => {\n    const ids = this.selectedElementIdsSignal();\n    if (ids.size === 0) return false;\n    const elements = this.getElementsFn?.() ?? [];\n    return Array.from(ids).every((id) => {\n      const el = elements.find((e) => e.id === id);\n      return el ? SelectionService.LINE_TYPES.has(el.type) : false;\n    });\n  });\n\n  private getElementsFn?: () => WhiteboardElement[];\n  private updateElementsFn?: (elements: (Partial<WhiteboardElement> & { id: string })[], history?: boolean) => void;\n  private removeElementsFn?: (elements: WhiteboardElement[], history?: boolean) => void;\n\n  constructor(\n    private eventBus: EventBusService,\n    private clipboardService: ClipboardService,\n    private elementsService: ElementsService,\n    private toolsService: ToolsService,\n    private canvasService: CanvasService\n  ) {\n    this.initializeDataProviders();\n  }\n\n  private initializeDataProviders(): void {\n    this.getElementsFn = () => this.elementsService.getElements();\n    this.updateElementsFn = (updates) => this.elementsService.updateElements(updates);\n    this.removeElementsFn = (elements, history) => this.elementsService.removeElements(elements, history);\n  }\n\n  cutElements(): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0) return;\n\n    this.clipboardService.cut(selectedElements);\n    this.deleteSelectedElements();\n  }\n\n  copyElements(): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0) return;\n\n    this.clipboardService.copy(selectedElements);\n  }\n\n  pasteElements(): void {\n    const pastedElements = this.clipboardService.paste();\n    if (pastedElements.length > 0) {\n      this.selectElements(pastedElements);\n      // Pasting is a manipulate intent → drop into Select so the pasted elements can be moved.\n      this.toolsService.setActiveTool(ToolType.Select);\n    }\n  }\n\n  duplicateElements(): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0) return;\n\n    const duplicatedElements = this.clipboardService.duplicateElements(selectedElements);\n    if (duplicatedElements.length > 0) {\n      this.selectElements(duplicatedElements);\n      this.toolsService.setActiveTool(ToolType.Select);\n    }\n  }\n\n  deleteSelectedElements(): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0 || !this.removeElementsFn) return;\n\n    this.removeElementsFn(selectedElements, true);\n    this.clearSelection();\n  }\n\n  getSelectedIds(): string[] {\n    return this.selectedIdsSignal();\n  }\n\n  /**\n   * Get currently selected elements\n   */\n  getSelectedElements(): WhiteboardElement[] {\n    if (!this.getElementsFn) {\n      console.warn('Element data provider not set');\n      return [];\n    }\n\n    const ids = this.getSelectedIds();\n    return this.getElementsFn().filter((el) => ids.includes(el.id));\n  }\n\n  getSelectedElementsSignal(): Signal<WhiteboardElement[]> {\n    return computed(() => this.getSelectedElements());\n  }\n\n  /**\n   * Check if element is selected\n   */\n  isSelected(elementOrId: WhiteboardElement | string): boolean {\n    const id = typeof elementOrId === 'string' ? elementOrId : elementOrId.id;\n    return this.selectedElementIdsSignal().has(id);\n  }\n\n  /**\n   * Get selection count\n   */\n  getSelectionCount(): number {\n    return this.selectedElementIdsSignal().size;\n  }\n\n  /**\n   * Check if any elements are selected\n   */\n  hasSelection(): boolean {\n    return this.getSelectionCount() > 0;\n  }\n\n  // SELECTION OPERATIONS\n\n  /**\n   * Select elements by reference or ID, with option to append to existing selection\n   */\n  selectElements(elementsOrIds: WhiteboardElement | WhiteboardElement[] | string | string[], append = false): void {\n    const incoming = Array.isArray(elementsOrIds) ? elementsOrIds : [elementsOrIds];\n    const selectedIds = incoming.map((el) => (typeof el === 'string' ? el : el.id));\n\n    // Expand selection to include all grouped elements\n    const expandedIds = this.expandSelectionToIncludeGroups(selectedIds);\n\n    const currentSelection = Array.from(this.selectedElementIdsSignal());\n    const newSelection = append ? [...new Set([...currentSelection, ...expandedIds])] : expandedIds;\n\n    this.selectedElementIdsSignal.set(new Set(newSelection));\n\n    // NOTE: selecting no longer auto-activates the Select tool. That decision belongs to the\n    // caller's context — the post-draw flow resolves it via `selectAfterDraw` (see\n    // ApiService.finalizeDraw), and explicit user-select paths (toggleSelection, selectAll,\n    // paste/duplicate) switch on their own. Keeps selectElements() focused on selection state.\n\n    // Get the updated selection elements after group expansion\n    const fullSelectionElements = this.getSelectedElements();\n\n    this.updateBoundingBoxFromElements(fullSelectionElements);\n    this.eventBus.emit(WhiteboardEvent.ElementsSelected, fullSelectionElements);\n  }\n\n  /**\n   * Deselect specific element\n   */\n  deselectElement(elementOrId: WhiteboardElement | string): void {\n    const id = typeof elementOrId === 'string' ? elementOrId : elementOrId.id;\n    const current = new Set(this.selectedElementIdsSignal());\n\n    if (current.has(id)) {\n      // Expand deselection to include all grouped elements\n      const expandedIds = this.expandSelectionToIncludeGroups([id]);\n\n      expandedIds.forEach((expandedId) => {\n        current.delete(expandedId);\n      });\n\n      this.selectedElementIdsSignal.set(current);\n      this.updateBoundingBox();\n\n      const selectedElements = this.getSelectedElements();\n      this.eventBus.emit(WhiteboardEvent.ElementsSelected, selectedElements);\n    }\n  }\n\n  /**\n   * Toggle selection of element\n   */\n  toggleSelection(elementOrId: WhiteboardElement | string): void {\n    const id = typeof elementOrId === 'string' ? elementOrId : elementOrId.id;\n    const current = new Set(this.selectedElementIdsSignal());\n    const wasSelected = current.has(id);\n\n    // Expand to include all grouped elements\n    const expandedIds = this.expandSelectionToIncludeGroups([id]);\n\n    if (wasSelected) {\n      // Deselect all elements in the group\n      expandedIds.forEach((expandedId) => {\n        current.delete(expandedId);\n      });\n    } else {\n      // Select all elements in the group\n      expandedIds.forEach((expandedId) => {\n        current.add(expandedId);\n      });\n      // Automatically activate select tool when an element gets selected\n      this.toolsService.setActiveTool(ToolType.Select);\n    }\n\n    this.selectedElementIdsSignal.set(current);\n    this.updateBoundingBox();\n\n    const selectedElements = this.getSelectedElements();\n    this.eventBus.emit(WhiteboardEvent.ElementsSelected, selectedElements);\n  }\n\n  /**\n   * Clear all selection\n   */\n  clearSelection(): void {\n    this.selectedElementIdsSignal.set(new Set());\n    this.clearBoundingBox();\n    this.eventBus.emit(WhiteboardEvent.ElementsSelected, []);\n  }\n\n  /**\n   * Select all elements\n   */\n  selectAll(): void {\n    if (!this.getElementsFn) {\n      console.warn('Element data provider not set');\n      return;\n    }\n\n    // Exclude locked elements, consistent with box selection (see SelectTool.handleBoxSelect,\n    // which filters `!element.locked`) and with every other select interaction that skips locked\n    // elements. Without this, Ctrl+A grabs locked elements and a following delete removes them.\n    const selectableElements = this.getElementsFn().filter((el) => !el.locked);\n    const ids = new Set(selectableElements.map((el) => el.id));\n    this.selectedElementIdsSignal.set(ids);\n\n    // Automatically activate select tool when elements are selected\n    if (selectableElements.length > 0) {\n      this.toolsService.setActiveTool(ToolType.Select);\n    }\n\n    this.updateBoundingBox();\n\n    this.eventBus.emit(WhiteboardEvent.ElementsSelected, selectableElements);\n  }\n\n  /**\n   * Select elements within a rectangular area\n   */\n  selectElementsInArea(area: { x: number; y: number; width: number; height: number }): void {\n    if (!this.getElementsFn) {\n      console.warn('Element data provider not set');\n      return;\n    }\n\n    const allElements = this.getElementsFn();\n    const selectedIds: string[] = [];\n\n    allElements.forEach((element) => {\n      const bounds = getElementBounds(element);\n\n      // Check if element intersects with selection area\n      const intersects = !(\n        bounds.maxX < area.x ||\n        bounds.minX > area.x + area.width ||\n        bounds.maxY < area.y ||\n        bounds.minY > area.y + area.height\n      );\n\n      if (intersects) {\n        selectedIds.push(element.id);\n      }\n    });\n\n    if (selectedIds.length > 0) {\n      // Expand to include grouped elements - this will be handled by selectElements\n      this.selectElements(selectedIds);\n    }\n  }\n\n  // SELECTION BOX (drag selection rectangle)\n\n  /**\n   * Set selection box state\n   */\n  setSelectionBox(box: SelectionBox): void {\n    this.selectionBoxSignal.set(box);\n  }\n\n  /**\n   * Get current selection box\n   */\n  getSelectionBox(): SelectionBox {\n    return this.selectionBoxSignal();\n  }\n\n  /**\n   * Get selection box signal\n   */\n  getSelectionBoxSignal(): Signal<SelectionBox> {\n    return this.selectionBoxSignal.asReadonly();\n  }\n\n  /**\n   * Clear selection box\n   */\n  clearSelectionBox(): void {\n    this.selectionBoxSignal.set({\n      x: 0,\n      y: 0,\n      width: 0,\n      height: 0,\n      visible: false,\n    });\n  }\n\n  // BOUNDING BOX (transform handles around selection)\n\n  /**\n   * Update bounding box based on current selection\n   */\n  updateBoundingBox(): void {\n    const selectedElements = this.getSelectedElements();\n    this.updateBoundingBoxFromElements(selectedElements);\n  }\n\n  /**\n   * Get current bounding box\n   */\n  getBoundingBox(): BoundingBox | null {\n    return this.boundingBoxSignal();\n  }\n\n  /**\n   * Get bounding box signal\n   */\n  getBoundingBoxSignal(): Signal<BoundingBox | null> {\n    return this.boundingBoxSignal.asReadonly();\n  }\n\n  /**\n   * Clear bounding box\n   */\n  clearBoundingBox(): void {\n    this.boundingBoxSignal.set(null);\n  }\n\n  /**\n   * Set bounding box directly (useful for dynamic updates during rotation)\n   */\n  setBoundingBox(bbox: BoundingBox | null): void {\n    this.boundingBoxSignal.set(bbox);\n  }\n\n  // INTERNAL HELPERS\n\n  /**\n   * Get all elements that belong to the same groups as the provided elements\n   */\n  private expandSelectionToIncludeGroups(elementIds: string[]): string[] {\n    if (!this.getElementsFn) return elementIds;\n\n    const allElements = this.getElementsFn();\n    const elementsToExpand = allElements.filter((el) => elementIds.includes(el.id));\n    const groupIds = new Set(\n      elementsToExpand\n        .map((el) => el.groupId)\n        .filter((groupId): groupId is string => groupId !== undefined && groupId !== null)\n    );\n\n    if (groupIds.size === 0) {\n      return elementIds; // No groups, return original selection\n    }\n\n    // Find all elements that belong to any of these groups\n    const expandedElements = allElements.filter((el) => {\n      return (\n        elementIds.includes(el.id) || // Original selection\n        (el.groupId && groupIds.has(el.groupId)) // Elements in the same groups\n      );\n    });\n\n    return expandedElements.map((el) => el.id);\n  }\n\n  /**\n   * Measures text element bounds by creating a temporary hidden SVG <text> element\n   * with matching font properties and calling getBBox() synchronously.\n   * This avoids depending on Angular's rendering cycle — the element need not be in\n   * the live DOM yet.\n   */\n  private measureTextElementSvg(element: WhiteboardElement): Bounds | null {\n    try {\n      if (!this.canvasService.isCanvasInitialized()) return null;\n      const svgContainer = this.canvasService.getCanvas();\n\n      const textEl = element as TextElement;\n      const fontSize = textEl.style.fontSize ?? 16;\n      const fontFamily = textEl.style.fontFamily ?? 'Arial';\n      const fontStyle = textEl.style.fontStyle ?? 'normal';\n      const fontWeight = textEl.style.fontWeight ?? 'normal';\n      const lineHeight = fontSize * 1.2;\n      const lines = (textEl.text ?? '').split('\\n');\n      const scaleX = element.scaleX ?? 1;\n      const scaleY = element.scaleY ?? 1;\n\n      // Create a hidden temporary <text> matching the template's font attributes\n      const tempText = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n      tempText.setAttribute('text-anchor', 'start');\n      tempText.setAttribute('alignment-baseline', 'before-edge');\n      tempText.setAttribute('font-size', String(fontSize));\n      tempText.setAttribute('font-family', fontFamily);\n      tempText.setAttribute('font-style', fontStyle);\n      tempText.setAttribute('font-weight', fontWeight);\n      tempText.style.visibility = 'hidden';\n\n      lines.forEach((line: string, i: number) => {\n        const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');\n        tspan.setAttribute('x', '0');\n        tspan.setAttribute('dy', i === 0 ? '0' : String(lineHeight));\n        // Use zero-width space for empty lines to preserve height contribution\n        tspan.textContent = line.length > 0 ? line : '\\u200B';\n        tempText.appendChild(tspan);\n      });\n\n      svgContainer.appendChild(tempText);\n      const bbox = tempText.getBBox();\n      svgContainer.removeChild(tempText);\n\n      if (bbox.width === 0 && bbox.height === 0) return null;\n\n      // Scale is applied around the fill-box center (transform-box: fill-box;\n      // transform-origin: center), so position the scaled box about that center\n      // rather than the local origin — otherwise the box drifts from the rendered text.\n      const centerX = bbox.x + bbox.width / 2;\n      const centerY = bbox.y + bbox.height / 2;\n      const width = bbox.width * scaleX;\n      const height = bbox.height * scaleY;\n      const minX = element.x + centerX - width / 2;\n      const minY = element.y + centerY - height / 2;\n\n      return {\n        minX,\n        minY,\n        maxX: minX + width,\n        maxY: minY + height,\n        width,\n        height,\n      };\n    } catch {\n      return null;\n    }\n  }\n\n  private calculateBoundingBox(elements: WhiteboardElement[]): BoundingBox {\n    let bounds;\n    let rotation = 0;\n\n    if (elements.length === 1) {\n      // For single element, the bounding box should match the element's non-rotated bounds\n      // The bounding box will rotate with the element via SVG transform\n      const element = elements[0];\n      rotation = element.rotation || 0;\n\n      // For text elements, measure via a temporary SVG element for accurate font metrics\n      if (element.type === ElementType.Text) {\n        bounds = this.measureTextElementSvg(element) ?? getElementBounds(element);\n      } else {\n        bounds = getElementBounds(element);\n      }\n    } else {\n      // For multiple elements, use screen-space bounds that account for rotation\n      const combinedBounds = getCombinedScreenBounds(elements);\n      if (!combinedBounds) {\n        throw new Error('Cannot calculate bounding box for empty element list');\n      }\n      bounds = combinedBounds;\n      rotation = 0; // No rotation for multi-selection\n    }\n\n    const { minX, minY, maxX, maxY, width, height } = bounds;\n    const centerX = minX + width / 2;\n    const handleOffset = 20;\n\n    return {\n      x: minX,\n      y: minY,\n      width,\n      height,\n      handles: {\n        topLeft: { x: minX, y: minY },\n        topRight: { x: maxX, y: minY },\n        bottomLeft: { x: minX, y: maxY },\n        bottomRight: { x: maxX, y: maxY },\n        rotateHandle: { x: centerX, y: minY - handleOffset },\n      },\n      rotation,\n    };\n  }\n\n  private updateBoundingBoxFromElements(elements: WhiteboardElement[]): void {\n    if (!elements || elements.length === 0) {\n      this.clearBoundingBox();\n      return;\n    }\n\n    // Suppress normal bounding box when only line-type elements are selected.\n    // They use their own 2-point endpoint handles rendered in the canvas overlay.\n    const allLineTypes = elements.every((el) => SelectionService.LINE_TYPES.has(el.type));\n    if (allLineTypes) {\n      this.clearBoundingBox();\n      return;\n    }\n\n    this.boundingBoxSignal.set(this.calculateBoundingBox(elements));\n  }\n\n  // SELECTION TRANSFORMATION HELPERS\n\n  /**\n   * Update all selected elements with partial data\n   */\n  updateSelectedElements(\n    partial: Partial<WhiteboardElement>,\n    updateElementsFn?: (elements: (Partial<WhiteboardElement> & { id: string })[], history?: boolean) => void\n  ): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0) return;\n\n    // Prefer provided updater, otherwise use internal elementsService updater\n    const updater = updateElementsFn || this.updateElementsFn;\n    if (!updater) return; // Nothing to do if no updater available\n\n    // Create update patches for all selected elements\n    const updates = selectedElements.map((element) => ({\n      ...partial,\n      id: element.id,\n    }));\n\n    // Apply updates through the provided function\n    updater(updates, true);\n\n    // Update bounding box to reflect changes\n    this.updateBoundingBox();\n\n    // Emit selection event to update UI\n    const updatedElements = this.getSelectedElements();\n    this.eventBus.emit(WhiteboardEvent.ElementsSelected, updatedElements);\n  }\n\n  /**\n   * Transform selected elements using a transformation function\n   */\n  transformSelectedElements(\n    transformFn: (elements: WhiteboardElement[]) => WhiteboardElement[],\n    updateElementsFn?: (elements: (Partial<WhiteboardElement> & { id: string })[], history?: boolean) => void\n  ): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0) return;\n\n    const updater = updateElementsFn || this.updateElementsFn;\n    if (!updater) return;\n\n    const transformedElements = transformFn(selectedElements);\n\n    // Apply updates through the provided function\n    const updates = transformedElements.map((el) => ({ ...el, id: el.id }));\n    updater(updates, true);\n\n    // Update bounding box to reflect changes\n    this.updateBoundingBox();\n\n    // Emit selection event to update UI\n    const updatedElements = this.getSelectedElements();\n    this.eventBus.emit(WhiteboardEvent.ElementsSelected, updatedElements);\n  }\n\n  // SELECTION UTILITIES\n\n  /**\n   * Get selection bounds (combined bounds of all selected elements)\n   */\n  getSelectionBounds(): { minX: number; minY: number; maxX: number; maxY: number } | null {\n    const selectedElements = this.getSelectedElements();\n\n    if (selectedElements.length === 0) {\n      return null;\n    }\n\n    const allBounds = selectedElements.map(getElementBounds);\n\n    return {\n      minX: Math.min(...allBounds.map((b) => b.minX)),\n      minY: Math.min(...allBounds.map((b) => b.minY)),\n      maxX: Math.max(...allBounds.map((b) => b.maxX)),\n      maxY: Math.max(...allBounds.map((b) => b.maxY)),\n    };\n  }\n\n  /**\n   * Check if selection contains specific element type\n   */\n  selectionContainsType(elementType: string): boolean {\n    return this.getSelectedElements().some((el) => el.type === elementType);\n  }\n\n  /**\n   * Get unique element types in current selection\n   */\n  getSelectedElementTypes(): string[] {\n    const types = this.getSelectedElements().map((el) => el.type);\n    return [...new Set(types)];\n  }\n\n  /**\n   * Remove selected elements\n   */\n  removeSelectedElements(): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0) {\n      return;\n    }\n\n    if (this.removeElementsFn) {\n      this.removeElementsFn(selectedElements, true);\n      this.clearSelection();\n    }\n  }\n\n  // Z-INDEX OPERATIONS\n\n  /**\n   * Bring selected elements to front\n   */\n  bringToFront(): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0 || !this.getElementsFn || !this.updateElementsFn) return;\n\n    const allElements = this.getElementsFn();\n    const maxZIndex = Math.max(...allElements.map((el: WhiteboardElement) => el.zIndex || 0));\n\n    const updates = selectedElements.map((element, index) => ({\n      id: element.id,\n      zIndex: maxZIndex + index + 1,\n    }));\n\n    this.updateElementsFn(updates);\n  }\n\n  /**\n   * Bring selected elements forward by one level\n   */\n  bringForward(): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0 || !this.getElementsFn || !this.updateElementsFn) return;\n\n    const allElements = this.getElementsFn();\n\n    // Sort all elements by z-index\n    const sortedElements = [...allElements].sort((a, b) => (a.zIndex || 0) - (b.zIndex || 0));\n    const updates: (Partial<WhiteboardElement> & { id: string })[] = [];\n\n    selectedElements.forEach((selectedElement) => {\n      const currentIndex = sortedElements.findIndex((el) => el.id === selectedElement.id);\n\n      // Find the next non-selected element ahead of this one\n      let targetIndex = currentIndex + 1;\n      while (\n        targetIndex < sortedElements.length &&\n        selectedElements.some((sel) => sel.id === sortedElements[targetIndex].id)\n      ) {\n        targetIndex++;\n      }\n\n      // If there's an element to swap with\n      if (targetIndex < sortedElements.length) {\n        const targetElement = sortedElements[targetIndex];\n        updates.push({\n          id: selectedElement.id,\n          zIndex: targetElement.zIndex,\n        });\n        updates.push({\n          id: targetElement.id,\n          zIndex: selectedElement.zIndex,\n        });\n      }\n    });\n\n    if (updates.length > 0) {\n      this.updateElementsFn(updates);\n    }\n  }\n\n  /**\n   * Send selected elements backward by one level\n   */\n  sendBackward(): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0 || !this.getElementsFn || !this.updateElementsFn) return;\n\n    const allElements = this.getElementsFn();\n\n    // Sort all elements by z-index\n    const sortedElements = [...allElements].sort((a, b) => (a.zIndex || 0) - (b.zIndex || 0));\n    const updates: (Partial<WhiteboardElement> & { id: string })[] = [];\n\n    selectedElements.forEach((selectedElement) => {\n      const currentIndex = sortedElements.findIndex((el) => el.id === selectedElement.id);\n\n      // Find the previous non-selected element behind this one\n      let targetIndex = currentIndex - 1;\n      while (targetIndex >= 0 && selectedElements.some((sel) => sel.id === sortedElements[targetIndex].id)) {\n        targetIndex--;\n      }\n\n      // If there's an element to swap with\n      if (targetIndex >= 0) {\n        const targetElement = sortedElements[targetIndex];\n        updates.push({\n          id: selectedElement.id,\n          zIndex: targetElement.zIndex,\n        });\n        updates.push({\n          id: targetElement.id,\n          zIndex: selectedElement.zIndex,\n        });\n      }\n    });\n\n    if (updates.length > 0) {\n      this.updateElementsFn(updates);\n    }\n  }\n\n  /**\n   * Send selected elements to back\n   */\n  sendToBack(): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0 || !this.getElementsFn || !this.updateElementsFn) return;\n\n    // Start from z-index 1 and assign sequential values\n    const updates = selectedElements.map((element, index) => ({\n      id: element.id,\n      zIndex: index + 1,\n    }));\n\n    this.updateElementsFn(updates);\n\n    // Shift all other elements up to make room\n    const allElements = this.getElementsFn();\n    const otherElements = allElements.filter(\n      (el: WhiteboardElement) => !selectedElements.some((selected) => selected.id === el.id)\n    );\n\n    const otherUpdates = otherElements.map((element: WhiteboardElement, index: number) => ({\n      id: element.id,\n      zIndex: selectedElements.length + index + 1,\n    }));\n\n    if (otherUpdates.length > 0) {\n      this.updateElementsFn(otherUpdates);\n    }\n  }\n\n  // GROUPING OPERATIONS\n\n  /**\n   * Group selected elements\n   */\n  groupSelectedElements(): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length < 2 || !this.updateElementsFn) return;\n\n    const groupId = `group_${Date.now()}`;\n    const updates = selectedElements.map((element) => ({\n      id: element.id,\n      groupId: groupId,\n    }));\n\n    this.updateElementsFn(updates);\n  }\n\n  /**\n   * Ungroup selected elements\n   */\n  ungroupSelectedElements(): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0 || !this.getElementsFn || !this.updateElementsFn) return;\n\n    // Find elements that belong to the same group as selected elements\n    const selectedElementsWithGroups = selectedElements.filter((el) => el.groupId !== undefined && el.groupId !== null);\n    if (selectedElementsWithGroups.length === 0) return;\n\n    // Get all group IDs from selected elements\n    const groupIds = [...new Set(selectedElementsWithGroups.map((el) => el.groupId).filter(Boolean))];\n\n    // Find all elements that belong to these groups\n    const allElements = this.getElementsFn();\n    const elementsToUngroup = allElements.filter((el: WhiteboardElement) => {\n      return el.groupId !== undefined && el.groupId !== null && groupIds.includes(el.groupId);\n    });\n\n    // Remove group ID from all elements in the groups\n    const updates = elementsToUngroup.map((element) => ({\n      id: element.id,\n      groupId: undefined,\n    }));\n\n    this.updateElementsFn(updates);\n  }\n\n  // LOCKING OPERATIONS\n\n  /**\n   * Lock selected elements\n   */\n  lockElements(): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0 || !this.updateElementsFn) return;\n\n    const updates = selectedElements.map((element) => ({\n      id: element.id,\n      locked: true,\n    }));\n\n    this.updateElementsFn(updates);\n  }\n\n  /**\n   * Unlock selected elements\n   */\n  unlockElements(): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0 || !this.updateElementsFn) return;\n\n    const updates = selectedElements.map((element) => ({\n      id: element.id,\n      locked: false,\n    }));\n\n    this.updateElementsFn(updates);\n  }\n\n  // ALIGNMENT OPERATIONS\n\n  /**\n   * Align selected elements\n   */\n  alignElements(alignment: AlignmentType): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0) return;\n\n    if (!this.updateElementsFn) {\n      console.warn('Update elements function not available');\n      return;\n    }\n\n    const updates = this.calculateAlignmentUpdates(selectedElements, alignment);\n    if (updates.length > 0) {\n      this.updateElementsFn(updates, true);\n      this.updateBoundingBox();\n    }\n  }\n\n  /**\n   * Distribute selected elements horizontally with equal spacing\n   */\n  distributeHorizontally(): void {\n    this.alignElements(AlignmentType.DistributeHorizontally);\n  }\n\n  /**\n   * Distribute selected elements vertically with equal spacing\n   */\n  distributeVertically(): void {\n    this.alignElements(AlignmentType.DistributeVertically);\n  }\n\n  /**\n   * Calculate alignment updates for selected elements\n   */\n  private calculateAlignmentUpdates(\n    elements: WhiteboardElement[],\n    alignment: AlignmentType\n  ): (Partial<WhiteboardElement> & { id: string })[] {\n    if (elements.length === 0) return [];\n\n    const updates: (Partial<WhiteboardElement> & { id: string })[] = [];\n    const bounds = elements.map((element) => ({\n      element,\n      bounds: getElementBounds(element),\n    }));\n\n    // For single element, align to visible viewport\n    if (elements.length === 1) {\n      const visibleBounds = this.canvasService.getVisibleBounds();\n      const elementBounds = bounds[0].bounds;\n      const element = bounds[0].element;\n\n      switch (alignment) {\n        case AlignmentType.Left: {\n          const offsetX = visibleBounds.left - elementBounds.minX;\n          if (offsetX !== 0) {\n            updates.push({\n              id: element.id,\n              x: element.x + offsetX,\n            });\n          }\n          break;\n        }\n\n        case AlignmentType.Center: {\n          const viewportCenterX = (visibleBounds.left + visibleBounds.right) / 2;\n          const elementCenterX = elementBounds.minX + elementBounds.width / 2;\n          const offsetX = viewportCenterX - elementCenterX;\n          if (offsetX !== 0) {\n            updates.push({\n              id: element.id,\n              x: element.x + offsetX,\n            });\n          }\n          break;\n        }\n\n        case AlignmentType.Right: {\n          const offsetX = visibleBounds.right - elementBounds.maxX;\n          if (offsetX !== 0) {\n            updates.push({\n              id: element.id,\n              x: element.x + offsetX,\n            });\n          }\n          break;\n        }\n\n        case AlignmentType.Top: {\n          const offsetY = visibleBounds.top - elementBounds.minY;\n          if (offsetY !== 0) {\n            updates.push({\n              id: element.id,\n              y: element.y + offsetY,\n            });\n          }\n          break;\n        }\n\n        case AlignmentType.Middle: {\n          const viewportCenterY = (visibleBounds.top + visibleBounds.bottom) / 2;\n          const elementCenterY = elementBounds.minY + elementBounds.height / 2;\n          const offsetY = viewportCenterY - elementCenterY;\n          if (offsetY !== 0) {\n            updates.push({\n              id: element.id,\n              y: element.y + offsetY,\n            });\n          }\n          break;\n        }\n\n        case AlignmentType.Bottom: {\n          const offsetY = visibleBounds.bottom - elementBounds.maxY;\n          if (offsetY !== 0) {\n            updates.push({\n              id: element.id,\n              y: element.y + offsetY,\n            });\n          }\n          break;\n        }\n\n        default:\n          console.warn('Unsupported alignment type for single element:', alignment);\n          return [];\n      }\n\n      return updates;\n    }\n\n    // For multiple elements, align to each other\n    switch (alignment) {\n      case AlignmentType.Left: {\n        const leftMost = Math.min(...bounds.map((b) => b.bounds.minX));\n        bounds.forEach(({ element, bounds: elementBounds }) => {\n          const offsetX = leftMost - elementBounds.minX;\n          if (offsetX !== 0) {\n            updates.push({\n              id: element.id,\n              x: element.x + offsetX,\n            });\n          }\n        });\n        break;\n      }\n\n      case AlignmentType.Center: {\n        const centerX = bounds.reduce((acc, b) => acc + (b.bounds.minX + b.bounds.width / 2), 0) / bounds.length;\n        bounds.forEach(({ element, bounds: elementBounds }) => {\n          const elementCenterX = elementBounds.minX + elementBounds.width / 2;\n          const offsetX = centerX - elementCenterX;\n          if (offsetX !== 0) {\n            updates.push({\n              id: element.id,\n              x: element.x + offsetX,\n            });\n          }\n        });\n        break;\n      }\n\n      case AlignmentType.Right: {\n        const rightMost = Math.max(...bounds.map((b) => b.bounds.maxX));\n        bounds.forEach(({ element, bounds: elementBounds }) => {\n          const offsetX = rightMost - elementBounds.maxX;\n          if (offsetX !== 0) {\n            updates.push({\n              id: element.id,\n              x: element.x + offsetX,\n            });\n          }\n        });\n        break;\n      }\n\n      case AlignmentType.Top: {\n        const topMost = Math.min(...bounds.map((b) => b.bounds.minY));\n        bounds.forEach(({ element, bounds: elementBounds }) => {\n          const offsetY = topMost - elementBounds.minY;\n          if (offsetY !== 0) {\n            updates.push({\n              id: element.id,\n              y: element.y + offsetY,\n            });\n          }\n        });\n        break;\n      }\n\n      case AlignmentType.Middle: {\n        const centerY = bounds.reduce((acc, b) => acc + (b.bounds.minY + b.bounds.height / 2), 0) / bounds.length;\n        bounds.forEach(({ element, bounds: elementBounds }) => {\n          const elementCenterY = elementBounds.minY + elementBounds.height / 2;\n          const offsetY = centerY - elementCenterY;\n          if (offsetY !== 0) {\n            updates.push({\n              id: element.id,\n              y: element.y + offsetY,\n            });\n          }\n        });\n        break;\n      }\n\n      case AlignmentType.Bottom: {\n        const bottomMost = Math.max(...bounds.map((b) => b.bounds.maxY));\n        bounds.forEach(({ element, bounds: elementBounds }) => {\n          const offsetY = bottomMost - elementBounds.maxY;\n          if (offsetY !== 0) {\n            updates.push({\n              id: element.id,\n              y: element.y + offsetY,\n            });\n          }\n        });\n        break;\n      }\n\n      case AlignmentType.DistributeHorizontally: {\n        if (elements.length < 3) return []; // Need at least 3 elements to distribute\n\n        // Sort elements by their left position\n        const sortedByX = bounds.sort((a, b) => a.bounds.minX - b.bounds.minX);\n        const leftmostX = sortedByX[0].bounds.minX;\n        const rightmostX = sortedByX[sortedByX.length - 1].bounds.maxX;\n        const totalWidth = rightmostX - leftmostX;\n\n        // Calculate total width of all elements\n        const elementsWidth = sortedByX.reduce((acc, b) => acc + b.bounds.width, 0);\n        const availableSpaceH = totalWidth - elementsWidth;\n        const spacingH = availableSpaceH / (sortedByX.length - 1);\n\n        let currentX = leftmostX;\n        sortedByX.forEach(({ element, bounds: elementBounds }, index) => {\n          if (index === 0) {\n            // Keep the leftmost element in place\n            currentX += elementBounds.width;\n          } else if (index === sortedByX.length - 1) {\n            // Keep the rightmost element in place\n            return;\n          } else {\n            // Position middle elements with equal spacing\n            currentX += spacingH;\n            const offsetX = currentX - elementBounds.minX;\n            if (offsetX !== 0) {\n              updates.push({\n                id: element.id,\n                x: element.x + offsetX,\n              });\n            }\n            currentX += elementBounds.width;\n          }\n        });\n        break;\n      }\n\n      case AlignmentType.DistributeVertically: {\n        if (elements.length < 3) return []; // Need at least 3 elements to distribute\n\n        // Sort elements by their top position\n        const sortedByY = bounds.sort((a, b) => a.bounds.minY - b.bounds.minY);\n        const topmostY = sortedByY[0].bounds.minY;\n        const bottommostY = sortedByY[sortedByY.length - 1].bounds.maxY;\n        const totalHeight = bottommostY - topmostY;\n\n        // Calculate total height of all elements\n        const elementsHeight = sortedByY.reduce((acc, b) => acc + b.bounds.height, 0);\n        const availableSpaceV = totalHeight - elementsHeight;\n        const spacingV = availableSpaceV / (sortedByY.length - 1);\n\n        let currentY = topmostY;\n        sortedByY.forEach(({ element, bounds: elementBounds }, index) => {\n          if (index === 0) {\n            // Keep the topmost element in place\n            currentY += elementBounds.height;\n          } else if (index === sortedByY.length - 1) {\n            // Keep the bottommost element in place\n            return;\n          } else {\n            // Position middle elements with equal spacing\n            currentY += spacingV;\n            const offsetY = currentY - elementBounds.minY;\n            if (offsetY !== 0) {\n              updates.push({\n                id: element.id,\n                y: element.y + offsetY,\n              });\n            }\n            currentY += elementBounds.height;\n          }\n        });\n        break;\n      }\n\n      default:\n        console.warn('Unsupported alignment type:', alignment);\n        return [];\n    }\n\n    return updates;\n  }\n\n  // TRANSFORM OPERATIONS\n\n  /**\n   * Flip selected elements horizontally\n   */\n  flipHorizontal(): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0 || !this.updateElementsFn) return;\n\n    const updates = selectedElements.map((element) => {\n      // Toggle horizontal flip by inverting scaleX\n      const currentScaleX = element.scaleX ?? 1;\n      return {\n        id: element.id,\n        scaleX: -currentScaleX,\n      };\n    });\n\n    this.updateElementsFn(updates, true);\n    this.updateBoundingBox();\n  }\n\n  /**\n   * Flip selected elements vertically\n   */\n  flipVertical(): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0 || !this.updateElementsFn) return;\n\n    const updates = selectedElements.map((element) => {\n      // Toggle vertical flip by inverting scaleY\n      const currentScaleY = element.scaleY ?? 1;\n      return {\n        id: element.id,\n        scaleY: -currentScaleY,\n      };\n    });\n\n    this.updateElementsFn(updates, true);\n    this.updateBoundingBox();\n  }\n\n  /**\n   * Move selected elements by a given offset\n   */\n  moveSelectedElements(dx: number, dy: number): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0 || !this.updateElementsFn) return;\n\n    const updates = selectedElements.map((element) => ({\n      id: element.id,\n      x: element.x + dx,\n      y: element.y + dy,\n    }));\n\n    this.updateElementsFn(updates, true);\n    this.updateBoundingBox();\n  }\n\n  /**\n   * Rotate selected elements by a given angle (in degrees)\n   */\n  rotateSelectedElements(angle: number): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0 || !this.updateElementsFn) return;\n\n    const updates = selectedElements.map((element) => ({\n      id: element.id,\n      rotation: (element.rotation || 0) + angle,\n    }));\n\n    this.updateElementsFn(updates, true);\n    this.updateBoundingBox();\n  }\n\n  /**\n   * Scale selected elements by a given factor\n   */\n  scaleSelectedElements(factor: number): void {\n    const selectedElements = this.getSelectedElements();\n    if (selectedElements.length === 0 || !this.updateElementsFn) return;\n\n    const updates = selectedElements\n      .map((element) => {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const update: any = { id: element.id };\n\n        // Scale width and height if they exist (use 'in' operator for type checking)\n        if ('width' in element && element.width !== undefined) {\n          update.width = element.width * factor;\n        }\n        if ('height' in element && element.height !== undefined) {\n          update.height = element.height * factor;\n        }\n\n        // Scale stroke width if it exists\n        if (element.style?.strokeWidth !== undefined) {\n          update.style = {\n            ...element.style,\n            strokeWidth: element.style.strokeWidth * factor,\n          };\n        }\n\n        // For rectangles and ellipses, also scale radii if they exist\n        if ('rx' in element && element.rx !== undefined) {\n          update.rx = element.rx * factor;\n        }\n        if ('ry' in element && element.ry !== undefined) {\n          update.ry = element.ry * factor;\n        }\n\n        return update;\n      })\n      .filter((update) => Object.keys(update).length > 1); // Only include updates with more than just id\n\n    if (updates.length > 0) {\n      this.updateElementsFn(updates, true);\n      this.updateBoundingBox();\n    }\n  }\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { ConfigService } from '../config/config.service';\nimport { DEFAULT_ZOOM, MAX_ZOOM, MIN_ZOOM, ZOOM_STEP } from '../constants';\nimport { WhiteboardConfig, WhiteboardElement, WhiteboardEvent } from '../types';\nimport { CanvasService } from '../canvas/canvas.service';\nimport { ElementsService } from '../elements/elements.service';\nimport { SelectionService } from '../elements/selection.service';\nimport { EventBusService } from '../event-bus/event-bus.service';\nimport { Subscription } from 'rxjs';\n\n/**\n * Manages zoom operations for the whiteboard canvas including zoom in/out,\n * zoom to fit, zoom to selection, and zoom bounds management.\n */\n@Injectable({ providedIn: 'root' })\nexport class ZoomService implements OnDestroy {\n  private canvasService = inject(CanvasService);\n  private elementsService = inject(ElementsService);\n  private selectionService = inject(SelectionService);\n  private configService = inject(ConfigService);\n  private eventBusService = inject(EventBusService);\n  private readonly DEFAULT_FIT_MARGIN = 0.9;\n  private zoomSubscription: Subscription;\n\n  constructor() {\n    this.zoomSubscription = this.eventBusService.on(WhiteboardEvent.ZoomChange).subscribe(() => {\n      const { center, fullScreen, zoom } = this.getConfig();\n      if (center && !fullScreen) {\n        this.centerCanvas(zoom);\n      }\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.zoomSubscription?.unsubscribe();\n  }\n\n  private emitZoomChangeEvent(): void {\n    const { zoom } = this.getConfig();\n    this.eventBusService.emit(WhiteboardEvent.ZoomChange, {\n      zoom,\n    });\n  }\n\n  private getConfig(): WhiteboardConfig {\n    return this.configService.getConfig();\n  }\n\n  private centerCanvas(zoom: number): { x: number; y: number } {\n    const { canvasWidth, canvasHeight } = this.getConfig();\n    const containerDimensions = this.canvasService.getContainerDimensions();\n    const newCanvasX = (containerDimensions.width - canvasWidth * zoom) / 2;\n    const newCanvasY = (containerDimensions.height - canvasHeight * zoom) / 2;\n    this.configService.updateConfig({ canvasX: newCanvasX, canvasY: newCanvasY }, false);\n    return { x: newCanvasX, y: newCanvasY };\n  }\n\n  /**\n   * Set zoom level with optional animation.\n   */\n  zoom(zoom: number, animated = true, duration = 300): void {\n    if (zoom <= 0) {\n      return;\n    }\n\n    const roundedZoom = Math.round(this.clampZoom(zoom) * 100) / 100;\n\n    if (animated) {\n      this.animateToTarget(roundedZoom, duration);\n    } else {\n      this.setInstant(roundedZoom);\n    }\n  }\n\n  /**\n   * Zoom in by step amount.\n   */\n  zoomIn(animated = true, duration = 300): void {\n    const { zoom } = this.getConfig();\n    const newZoom = Math.round((zoom + ZOOM_STEP) * 100) / 100;\n\n    if (newZoom <= MAX_ZOOM) {\n      this.zoom(newZoom, animated, duration);\n    }\n  }\n\n  /**\n   * Zoom out by step amount.\n   */\n  zoomOut(animated = true, duration = 300): void {\n    const { zoom } = this.getConfig();\n    const newZoom = Math.round((zoom - ZOOM_STEP) * 100) / 100;\n\n    if (newZoom >= MIN_ZOOM) {\n      this.zoom(newZoom, animated, duration);\n    }\n  }\n\n  /**\n   * Reset zoom to 100%.\n   */\n  resetZoom(animated = true, duration = 300): void {\n    if (animated) {\n      this.animateToTarget(DEFAULT_ZOOM, duration);\n    } else {\n      this.setInstant(DEFAULT_ZOOM);\n    }\n  }\n\n  /**\n   * Get current zoom level.\n   */\n  getZoomLevel(): number {\n    return this.getConfig().zoom;\n  }\n\n  /**\n   * Get current zoom level as percentage.\n   */\n  getZoomPercentage(): number {\n    return Math.round(this.getConfig().zoom * 100);\n  }\n\n  /**\n   * Zoom to fit all elements in the viewport.\n   */\n  zoomToFit(margin = this.DEFAULT_FIT_MARGIN, animated = true, duration = 300): void {\n    const elements = this.elementsService.getElements();\n\n    if (elements.length === 0) {\n      // No elements to fit, reset zoom\n      this.resetZoom(animated, duration);\n      return;\n    }\n\n    this.zoomToElements(elements, margin, animated, duration);\n  }\n\n  /**\n   * Zoom to fit selected elements.\n   */\n  zoomToSelection(margin = this.DEFAULT_FIT_MARGIN, animated = true, duration = 300): void {\n    const selectedElements = this.selectionService.getSelectedElements();\n\n    if (selectedElements.length === 0) {\n      return;\n    }\n\n    this.zoomToElements(selectedElements, margin, animated, duration);\n  }\n\n  /**\n   * Zoom to fit specific elements.\n   */\n  zoomToElements(\n    elements: WhiteboardElement[],\n    margin = this.DEFAULT_FIT_MARGIN,\n    animated = true,\n    duration = 300\n  ): void {\n    if (elements.length === 0) {\n      return;\n    }\n\n    const bounds = this.elementsService.calculateElementsBounds(elements);\n    if (!bounds) {\n      return;\n    }\n\n    const { fullScreen } = this.getConfig();\n    const dimensions = fullScreen\n      ? this.canvasService.getContainerDimensions()\n      : this.canvasService.getCanvasDimensions();\n\n    // Calculate zoom level to fit elements with padding\n    const zoomX = (dimensions.width * margin) / bounds.width;\n    const zoomY = (dimensions.height * margin) / bounds.height;\n    const targetZoom = this.clampZoom(Math.min(zoomX, zoomY));\n\n    if (animated) {\n      this.animateToTarget(targetZoom, duration);\n    } else {\n      this.setInstant(targetZoom);\n    }\n    // Pan so the elements are centred — setting the zoom level alone leaves the target\n    // anchored at the origin (most visible in fullScreen, where nothing repositions it).\n    this.panToCentre(bounds.centerX, bounds.centerY, targetZoom);\n  }\n\n  /**\n   * Zoom to fit a specific rectangular area, centred in the viewport.\n   */\n  zoomToArea(\n    x: number,\n    y: number,\n    width: number,\n    height: number,\n    margin = this.DEFAULT_FIT_MARGIN,\n    animated = true,\n    duration = 300\n  ): void {\n    if (width <= 0 || height <= 0) {\n      return;\n    }\n\n    const { fullScreen } = this.getConfig();\n    const dimensions = fullScreen\n      ? this.canvasService.getContainerDimensions()\n      : this.canvasService.getCanvasDimensions();\n    const zoomX = (dimensions.width * margin) / width;\n    const zoomY = (dimensions.height * margin) / height;\n    const targetZoom = this.clampZoom(Math.min(zoomX, zoomY));\n\n    if (animated) {\n      this.animateToTarget(targetZoom, duration);\n    } else {\n      this.setInstant(targetZoom);\n    }\n    this.panToCentre(x + width / 2, y + height / 2, targetZoom);\n  }\n\n  /**\n   * Pan so a world-space point lands at the centre of the viewport, at the given zoom.\n   *\n   * The two render modes need different math:\n   * - **fullScreen**: the viewBox is `0 0 W/zoom H/zoom` and only the content-level pan\n   *   (`config.x/y`) moves the view → `x = W/(2·zoom) − centreX`.\n   * - **non-fullScreen**: the canvas page is a zoom-scaled box at `(canvasX, canvasY)` in\n   *   the container, so the on-screen position combines that page offset with the content\n   *   pan → solve `canvasX + (centreX + x)·zoom = containerWidth/2` for `x`.\n   */\n  private panToCentre(centreX: number, centreY: number, zoom: number): void {\n    const { fullScreen, canvasWidth, canvasHeight, canvasX, canvasY } = this.getConfig();\n\n    if (fullScreen) {\n      this.configService.updateConfig({\n        x: canvasWidth / (2 * zoom) - centreX,\n        y: canvasHeight / (2 * zoom) - centreY,\n      });\n    } else {\n      const { width, height } = this.canvasService.getContainerDimensions();\n      this.configService.updateConfig({\n        x: (width / 2 - canvasX) / zoom - centreX,\n        y: (height / 2 - canvasY) / zoom - centreY,\n      });\n    }\n  }\n\n  /**\n   * Zoom into a rectangular region and centre it — the building block for a \"marquee zoom\"\n   * (drag a rectangle → zoom into it). Thin wrapper over `zoomToArea` (instant, so the pan\n   * matches the final zoom); ignores degenerate (zero-size) regions.\n   */\n  zoomToRegion(x: number, y: number, width: number, height: number, margin = this.DEFAULT_FIT_MARGIN): void {\n    if (width <= 0 || height <= 0) {\n      return;\n    }\n    this.zoomToArea(x, y, width, height, margin, false);\n  }\n\n  /**\n   * Get optimal zoom level for given dimensions.\n   */\n  getOptimalZoom(contentWidth: number, contentHeight: number, margin = this.DEFAULT_FIT_MARGIN): number {\n    const canvasDimensions = this.canvasService.getCanvasDimensions();\n\n    const zoomX = canvasDimensions.width / contentWidth;\n    const zoomY = canvasDimensions.height / contentHeight;\n\n    return this.clampZoom(Math.min(zoomX, zoomY) * margin);\n  }\n\n  /**\n   * Clamp zoom value to valid range.\n   */\n  clampZoom(zoom: number): number {\n    return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, zoom));\n  }\n\n  /**\n   * Check if zoom level is valid.\n   */\n  isValidZoom(zoom: number): boolean {\n    return zoom >= MIN_ZOOM && zoom <= MAX_ZOOM;\n  }\n\n  /**\n   * Get zoom limits.\n   */\n  getZoomLimits(): { min: number; max: number } {\n    return {\n      min: MIN_ZOOM,\n      max: MAX_ZOOM,\n    };\n  }\n\n  private easeInOutCubic(t: number): number {\n    return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n  }\n\n  private setInstant(targetZoom: number): void {\n    const { fullScreen, center } = this.getConfig();\n    const validatedZoom = this.clampZoom(targetZoom);\n\n    if (!fullScreen && center) {\n      this.centerCanvas(validatedZoom);\n    }\n    this.configService.updateConfig({ zoom: validatedZoom });\n    this.emitZoomChangeEvent();\n  }\n\n  private animateToTarget(targetZoom: number, duration = 300): void {\n    const { zoom: startZoom, fullScreen, center } = this.getConfig();\n    const validatedZoom = this.clampZoom(targetZoom);\n\n    if (!fullScreen && center) {\n      this.centerCanvas(validatedZoom);\n    }\n    // Animation\n    const startTime = performance.now();\n    const animate = (currentTime: number) => {\n      const elapsed = currentTime - startTime;\n      const progress = Math.min(elapsed / duration, 1);\n      const easedProgress = this.easeInOutCubic(progress);\n\n      const currentZoom = startZoom + (validatedZoom - startZoom) * easedProgress;\n      this.configService.updateConfig({ zoom: currentZoom });\n\n      if (progress < 1) {\n        requestAnimationFrame(animate);\n      } else {\n        this.emitZoomChangeEvent();\n      }\n    };\n\n    requestAnimationFrame(animate);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiService } from '../api/api.service';\nimport { ConfigService } from '../config/config.service';\nimport { WhiteboardElement, ElementType } from '../types';\nimport { createElement } from '../elements/element.utils';\nimport { getCanvasCoordinates } from '../utils/geometry';\nimport { FILE_TYPE_PREFIX } from '../constants';\n\n@Injectable({ providedIn: 'root' })\nexport class DragDropService {\n  constructor(private apiService: ApiService, private configService: ConfigService) {}\n\n  handleFiles(files: FileList): void {\n    Array.from(files).forEach((file) => {\n      if (file.type.startsWith(FILE_TYPE_PREFIX.IMAGE)) {\n        const reader = new FileReader();\n        reader.onload = (e) => {\n          const src = e.target?.result as string;\n          if (src) {\n            const imageElement = createElement(\n              ElementType.Image,\n              {\n                src,\n                x: 100,\n                y: 100,\n                width: 200,\n                height: 200,\n                zIndex: this.apiService.getNextZIndex(),\n              },\n              this.apiService.getActiveLayerId()\n            );\n            this.apiService.addElements([imageElement]);\n          }\n        };\n        reader.readAsDataURL(file);\n      }\n    });\n  }\n\n  handleText(content: string, event: DragEvent, isHtml = false): void {\n    const config = this.configService.getConfig();\n    const { x, y } = getCanvasCoordinates(config, {\n      x: event.clientX,\n      y: event.clientY,\n    });\n\n    let text = content;\n    let style = {\n      color: config.strokeColor,\n      fontSize: config.fontSize,\n      fontFamily: config.fontFamily,\n      fontWeight: 'normal' as 'normal' | 'bold',\n      fontStyle: 'normal' as 'normal' | 'italic',\n    };\n\n    if (isHtml) {\n      const parser = new DOMParser();\n      const doc = parser.parseFromString(content, 'text/html');\n      const textContent = doc.body.textContent || '';\n      text = textContent.trim();\n\n      const firstElement = doc.body.firstElementChild;\n      if (firstElement) {\n        const computedStyle = window.getComputedStyle(firstElement);\n        style = {\n          color: computedStyle.color || style.color,\n          fontSize: parseInt(computedStyle.fontSize) || style.fontSize,\n          fontFamily: computedStyle.fontFamily || style.fontFamily,\n          fontWeight:\n            computedStyle.fontWeight === 'bold' || parseInt(computedStyle.fontWeight) >= 700 ? 'bold' : 'normal',\n          fontStyle: computedStyle.fontStyle === 'italic' ? 'italic' : 'normal',\n        };\n      }\n    }\n\n    if (text) {\n      const textElement = createElement(\n        ElementType.Text,\n        {\n          x,\n          y: y + style.fontSize * 0.8,\n          text,\n          style,\n          zIndex: this.apiService.getNextZIndex(),\n        },\n        this.apiService.getActiveLayerId()\n      );\n      this.apiService.addElements([textElement]);\n    }\n  }\n\n  handleElements(elements: WhiteboardElement[], event: DragEvent): void {\n    const config = this.configService.getConfig();\n    const dropPosition = getCanvasCoordinates(config, {\n      x: event.clientX,\n      y: event.clientY,\n    });\n\n    const copiedElements = elements.map((el) => ({\n      ...el,\n      x: dropPosition.x + (el.x || 0),\n      y: dropPosition.y + (el.y || 0),\n      zIndex: this.apiService.getNextZIndex(),\n    }));\n\n    this.apiService.addElements(copiedElements);\n  }\n}\n","import { FormatType } from '../../types';\n\n/**\n * Converts an SVG node to a string representation.\n */\nexport function toSvgString(svgNode: SVGSVGElement): string {\n  const serializer = new XMLSerializer();\n  let svgString = serializer.serializeToString(svgNode);\n\n  if (!svgString.includes('xmlns:xlink=')) {\n    svgString = svgString.replace('<svg', '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"');\n  }\n\n  svgString = svgString.replace(/(?:NS\\d+|ns\\d+|xmlns):href/g, 'xlink:href');\n  return svgString;\n}\n\n/**\n * Converts an SVG string to a Base64 encoded image.\n */\nexport function svgToBase64(\n  svgString: string,\n  width: number,\n  height: number,\n  format = FormatType.Png\n): Promise<string> {\n  return new Promise((resolve, reject) => {\n    const canvas = document.createElement('canvas');\n    canvas.width = width;\n    canvas.height = height;\n    const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;\n\n    const img = new Image();\n    \n    const encodedSvg = encodeURIComponent(svgString);\n    img.src = `data:image/svg+xml;charset=utf-8,${encodedSvg}`;\n\n    img.onload = () => {\n      ctx.drawImage(img, 0, 0, width, height);\n      const base64 = canvas.toDataURL(`image/${format}`);\n      resolve(base64);\n    };\n    img.onerror = (err) => {\n      reject(err);\n    };\n  });\n}\n","import { Injectable } from '@angular/core';\nimport { createElement } from '../elements/element.utils';\nimport { EventBusService } from '../event-bus/event-bus.service';\nimport { AddImage, ElementType, FormatType, WhiteboardConfig, EditorConfig } from '../types';\nimport { WhiteboardEvent } from '../types/events';\nimport { downloadFile } from '../utils/common';\nimport { svgToBase64 } from '../utils/svg';\nimport { CanvasService } from '../canvas/canvas.service';\nimport { ElementsService } from '../elements/elements.service';\nimport { SelectionService } from '../elements/selection.service';\nimport { FILE_TYPE_PREFIX } from '../constants';\nimport { PanService } from '../viewport/pan.service';\nimport { ZoomService } from '../viewport/zoom.service';\nimport { LayerManagementService } from '../elements/layer-management.service';\nimport { ConfigService } from '../config/config.service';\n\n/**\n * Handles import/export operations for the whiteboard including images, state serialization, and various export formats.\n */\n@Injectable({ providedIn: 'root' })\nexport class IOService {\n  constructor(\n    private elementsService: ElementsService,\n    private canvasService: CanvasService,\n    private zoomService: ZoomService,\n    private panService: PanService,\n    private eventBusService: EventBusService,\n    private selectionService: SelectionService,\n    private layerManagementService: LayerManagementService,\n    private configService: ConfigService\n  ) {}\n\n  addImage(imageInfo: AddImage): void {\n    const tempImg = new Image();\n\n    tempImg.onload = () => {\n      const { canvasHeight } = this.canvasService.getConfig();\n      const imageWidth = tempImg.width;\n      const imageHeight = tempImg.height;\n      const aspectRatio = tempImg.width / tempImg.height;\n\n      const height = imageHeight > canvasHeight ? canvasHeight - 40 : imageHeight;\n      const width = height === canvasHeight - 40 ? (canvasHeight - 40) * aspectRatio : imageWidth;\n\n      let x = imageInfo.x || 0;\n      let y = imageInfo.y || 0;\n\n      if (x < 0) x = 0;\n      if (y < 0) y = 0;\n\n      const element = createElement(ElementType.Image, {\n        src: imageInfo.image,\n        width,\n        height,\n        x,\n        y,\n        zIndex: this.elementsService.getNextZIndex(),\n      });\n\n      this.elementsService.addElements([element]);\n\n      // Config-aware select-after-draw (see ConfigService.resolveSelectAfterDraw). Selection no\n      // longer forces the Select tool — selecting is selection state only now.\n      if (this.configService.resolveSelectAfterDraw(element.type, element.selectAfterDraw ?? false)) {\n        this.selectionService.selectElements([element.id]);\n      }\n\n      this.eventBusService.emit(WhiteboardEvent.ImageAdded, element.src);\n    };\n\n    tempImg.onerror = () => {\n      console.error('Failed to load image');\n    };\n\n    tempImg.src = imageInfo.image as string;\n  }\n\n  importImageFile(file: File, x?: number, y?: number): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if (!file.type.startsWith(FILE_TYPE_PREFIX.IMAGE)) {\n        reject(new Error('Invalid file type. Only images are supported.'));\n        return;\n      }\n\n      const reader = new FileReader();\n\n      reader.onload = (event) => {\n        const result = event.target?.result;\n        if (result) {\n          this.addImage({\n            image: result,\n            x,\n            y,\n          });\n          resolve();\n        } else {\n          reject(new Error('Failed to read file'));\n        }\n      };\n\n      reader.onerror = () => {\n        reject(new Error('Failed to read file'));\n      };\n\n      reader.readAsDataURL(file);\n    });\n  }\n\n  async importImageFromUrl(url: string, x?: number, y?: number): Promise<void> {\n    try {\n      const response = await fetch(url);\n      const blob = await response.blob();\n\n      return new Promise((resolve, reject) => {\n        const reader = new FileReader();\n\n        reader.onload = (event) => {\n          const result = event.target?.result;\n          if (result) {\n            this.addImage({\n              image: result,\n              x,\n              y,\n            });\n            resolve();\n          } else {\n            reject(new Error('Failed to process URL'));\n          }\n        };\n\n        reader.onerror = () => {\n          reject(new Error('Failed to process URL'));\n        };\n\n        reader.readAsDataURL(blob);\n      });\n    } catch (error) {\n      throw new Error(`Failed to load image from URL: ${error}`);\n    }\n  }\n\n  async save(format: FormatType = FormatType.Base64, name = 'New board'): Promise<string> {\n    const canvas = this.canvasService.getCanvas();\n    const svgElement = canvas.getElementById('svgcontent') as SVGSVGElement;\n\n    if (!svgElement) {\n      throw new Error('SVG content not found');\n    }\n\n    const svgClone = this.prepareSvgForExport(svgElement);\n    const svgString = new XMLSerializer().serializeToString(svgClone);\n\n    const { canvasWidth, canvasHeight } = this.canvasService.getConfig();\n\n    try {\n      const imageString = await svgToBase64(svgString, canvasWidth, canvasHeight, format);\n\n      switch (format) {\n        case FormatType.Base64:\n          this.eventBusService.emit(WhiteboardEvent.Save, imageString);\n          break;\n\n        case FormatType.Svg: {\n          const imgSrc = 'data:image/svg+xml;base64,' + btoa(unescape(encodeURIComponent(svgString)));\n          this.downloadFile(imgSrc, name, 'svg');\n          this.eventBusService.emit(WhiteboardEvent.Save, imgSrc);\n          break;\n        }\n\n        default:\n          this.downloadFile(imageString, name, this.getFileExtension(format));\n          this.eventBusService.emit(WhiteboardEvent.Save, imageString);\n          break;\n      }\n\n      return imageString;\n    } catch (error) {\n      console.error('Failed to save whiteboard:', error);\n      throw error;\n    }\n  }\n\n  async exportAsPng(name = 'whiteboard'): Promise<string> {\n    return this.save(FormatType.Png, name);\n  }\n\n  async exportAsJpeg(name = 'whiteboard'): Promise<string> {\n    return this.save(FormatType.Jpeg, name);\n  }\n\n  async exportAsSvg(name = 'whiteboard'): Promise<string> {\n    return this.save(FormatType.Svg, name);\n  }\n\n  async exportAsBase64(): Promise<string> {\n    return this.save(FormatType.Base64);\n  }\n\n  exportData(): string {\n    const elements = this.elementsService.getElements();\n    const canvasConfig = this.canvasService.getConfig();\n    const layerState = this.layerManagementService.exportLayerState();\n    const editorConfig = this.configService.getEditorConfig();\n\n    const exportData = {\n      version: '1.0',\n      timestamp: new Date().toISOString(),\n      elements: elements,\n      layers: layerState,\n      canvas: {\n        width: canvasConfig.canvasWidth,\n        height: canvasConfig.canvasHeight,\n        backgroundColor: canvasConfig.backgroundColor,\n        fullScreen: canvasConfig.fullScreen,\n        center: canvasConfig.center,\n      },\n      viewport: {\n        zoom: canvasConfig.zoom,\n        x: canvasConfig.x,\n        y: canvasConfig.y,\n        canvasX: canvasConfig.canvasX,\n        canvasY: canvasConfig.canvasY,\n      },\n      drawing: {\n        strokeColor: canvasConfig.strokeColor,\n        strokeWidth: canvasConfig.strokeWidth,\n        fill: canvasConfig.fill,\n        lineJoin: canvasConfig.lineJoin,\n        lineCap: canvasConfig.lineCap,\n        dasharray: canvasConfig.dasharray,\n        dashoffset: canvasConfig.dashoffset,\n        penType: canvasConfig.penType,\n      },\n      grid: {\n        enabled: canvasConfig.enableGrid,\n        size: canvasConfig.gridSize,\n        snapToGrid: canvasConfig.snapToGrid,\n      },\n      text: {\n        fontFamily: canvasConfig.fontFamily,\n        fontSize: canvasConfig.fontSize,\n      },\n      editor: editorConfig,\n      settings: {\n        drawingEnabled: canvasConfig.drawingEnabled,\n        keyboardShortcutsEnabled: canvasConfig.keyboardShortcutsEnabled,\n      },\n    };\n\n    return JSON.stringify(exportData, null, 2);\n  }\n\n  exportDataAsFile(filename = 'whiteboard-export'): void {\n    const jsonData = this.exportData();\n    const dataUrl = 'data:application/json;charset=utf-8,' + encodeURIComponent(jsonData);\n    this.downloadFile(dataUrl, filename, 'json');\n    this.eventBusService.emit(WhiteboardEvent.Save, jsonData);\n  }\n\n  importData(jsonData: string): void {\n    try {\n      const data = JSON.parse(jsonData);\n\n      if (!data.elements || !Array.isArray(data.elements)) {\n        throw new Error('Invalid data format: elements array not found');\n      }\n\n      this.elementsService.clear();\n\n      if (data.layers) {\n        this.layerManagementService.importLayerState(data.layers);\n      }\n\n      this.elementsService.setElements(data.elements);\n\n      if (data.canvas) {\n        const { canvas } = data;\n\n        if (canvas.width && canvas.height) {\n          this.canvasService.setCanvasDimensions(canvas.width, canvas.height);\n        }\n\n        if (canvas.backgroundColor !== undefined) {\n          this.configService.updateConfig({ backgroundColor: canvas.backgroundColor }, false);\n        }\n\n        if (canvas.fullScreen !== undefined) {\n          this.configService.updateConfig({ fullScreen: canvas.fullScreen }, false);\n        }\n\n        if (canvas.center !== undefined) {\n          this.configService.updateConfig({ center: canvas.center }, false);\n        }\n      }\n\n      if (data.viewport) {\n        const { viewport } = data;\n\n        if (viewport.zoom !== undefined) {\n          this.zoomService.zoom(viewport.zoom);\n        }\n\n        if (viewport.x !== undefined && viewport.y !== undefined) {\n          this.panService.panTo(viewport.x, viewport.y);\n        }\n\n        if (viewport.canvasX !== undefined && viewport.canvasY !== undefined) {\n          this.configService.updateConfig(\n            {\n              canvasX: viewport.canvasX,\n              canvasY: viewport.canvasY,\n            },\n            false\n          );\n        }\n      }\n\n      if (data.drawing) {\n        const { drawing } = data;\n        const drawingConfig: Partial<WhiteboardConfig> = {};\n\n        if (drawing.strokeColor !== undefined) drawingConfig.strokeColor = drawing.strokeColor;\n        if (drawing.strokeWidth !== undefined) drawingConfig.strokeWidth = drawing.strokeWidth;\n        if (drawing.fill !== undefined) drawingConfig.fill = drawing.fill;\n        if (drawing.lineJoin !== undefined) drawingConfig.lineJoin = drawing.lineJoin;\n        if (drawing.lineCap !== undefined) drawingConfig.lineCap = drawing.lineCap;\n        if (drawing.dasharray !== undefined) drawingConfig.dasharray = drawing.dasharray;\n        if (drawing.dashoffset !== undefined) drawingConfig.dashoffset = drawing.dashoffset;\n        if (drawing.penType !== undefined) drawingConfig.penType = drawing.penType;\n\n        this.configService.updateConfig(drawingConfig, false);\n      }\n\n      if (data.grid) {\n        const { grid } = data;\n        const gridConfig: Partial<WhiteboardConfig> = {};\n\n        if (grid.enabled !== undefined) gridConfig.enableGrid = grid.enabled;\n        if (grid.size !== undefined) gridConfig.gridSize = grid.size;\n        if (grid.snapToGrid !== undefined) gridConfig.snapToGrid = grid.snapToGrid;\n\n        this.configService.updateConfig(gridConfig, false);\n      }\n\n      if (data.text) {\n        const { text } = data;\n        const textConfig: Partial<WhiteboardConfig> = {};\n\n        if (text.fontFamily !== undefined) textConfig.fontFamily = text.fontFamily;\n        if (text.fontSize !== undefined) textConfig.fontSize = text.fontSize;\n\n        this.configService.updateConfig(textConfig, false);\n      }\n\n      if (data.editor) {\n        const editorKeys = Object.keys(data.editor) as Array<keyof EditorConfig>;\n        editorKeys.forEach((key) => {\n          this.configService.updateEditorConfigValue(key, data.editor[key]);\n        });\n      }\n\n      if (data.settings) {\n        const { settings } = data;\n        const settingsConfig: Partial<WhiteboardConfig> = {};\n\n        if (settings.drawingEnabled !== undefined) settingsConfig.drawingEnabled = settings.drawingEnabled;\n        if (settings.keyboardShortcutsEnabled !== undefined) {\n          settingsConfig.keyboardShortcutsEnabled = settings.keyboardShortcutsEnabled;\n        }\n\n        this.configService.updateConfig(settingsConfig, false);\n      }\n\n      this.configService.updateConfig({}, true);\n      this.eventBusService.emit(WhiteboardEvent.ElementsAdded, data.elements);\n    } catch (error) {\n      console.error('Failed to import data:', error);\n      throw new Error(`Failed to import data: ${error}`);\n    }\n  }\n\n  importDataFromFile(file: File): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if (!file.type.includes('json')) {\n        reject(new Error('Invalid file type. Only JSON files are supported.'));\n        return;\n      }\n\n      const reader = new FileReader();\n\n      reader.onload = (event) => {\n        const result = event.target?.result;\n        if (result && typeof result === 'string') {\n          try {\n            this.importData(result);\n            resolve();\n          } catch (error) {\n            reject(error);\n          }\n        } else {\n          reject(new Error('Failed to read file'));\n        }\n      };\n\n      reader.onerror = () => {\n        reject(new Error('Failed to read file'));\n      };\n\n      reader.readAsText(file);\n    });\n  }\n\n  private downloadFile(dataUrl: string, name: string, extension: string): void {\n    const fileName = `${name}.${extension}`;\n    downloadFile(dataUrl, fileName);\n  }\n\n  private getFileExtension(format: FormatType): string {\n    switch (format) {\n      case FormatType.Png:\n        return 'png';\n      case FormatType.Jpeg:\n        return 'jpg';\n      case FormatType.Svg:\n        return 'svg';\n      case FormatType.Base64:\n        return 'txt';\n      default:\n        return 'png';\n    }\n  }\n\n  private prepareSvgForExport(svgElement: SVGSVGElement): SVGSVGElement {\n    const svgClone = svgElement.cloneNode(true) as SVGSVGElement;\n\n    // Elements render with `transform-box: fill-box; transform-origin: center`\n    // via the component stylesheet, so rotation and scale pivot around each\n    // element's geometry center. That stylesheet is not part of the serialized\n    // SVG, so without these rules the export pivots around the local origin and\n    // rotated/scaled elements drift. Inline the rules to match the live render.\n    const style = document.createElementNS('http://www.w3.org/2000/svg', 'style');\n    style.textContent = '.wb_element { transform-box: fill-box; transform-origin: center; }';\n    svgClone.insertBefore(style, svgClone.firstChild);\n\n    const selectorParentGroup = svgClone.querySelector('#selectorParentGroup');\n    if (selectorParentGroup) {\n      selectorParentGroup.remove();\n    }\n\n    const contentBackground = svgClone.querySelector('#contentBackground');\n    if (contentBackground) {\n      contentBackground.removeAttribute('opacity');\n    }\n\n    svgClone.setAttribute('x', '0');\n    svgClone.setAttribute('y', '0');\n\n    return svgClone;\n  }\n\n  async importMultipleImages(files: FileList, spacing = 50): Promise<void> {\n    const promises: Promise<void>[] = [];\n    let currentX = 0;\n    let currentY = 0;\n\n    for (let i = 0; i < files.length; i++) {\n      const file = files[i];\n\n      promises.push(this.importImageFile(file, currentX, currentY));\n\n      currentX += 200 + spacing;\n      if (currentX > 800) {\n        currentX = 0;\n        currentY += 200 + spacing;\n      }\n    }\n\n    await Promise.all(promises);\n  }\n\n  protected processImage(imageData: string): string {\n    return imageData;\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { ApiService } from '../api';\nimport { ConfigService } from '../config/config.service';\nimport { KEY_LOWER, MOVEMENT } from '../constants';\nimport { AlignmentType, ToolType } from '../types';\n\n@Injectable({ providedIn: 'root' })\nexport class KeyboardShortcutService {\n  private configService = inject(ConfigService);\n  private apiService = inject(ApiService);\n\n  toggleKeyboardShortcuts() {\n    const currentConfig = this.configService.getConfig();\n    this.configService.updateConfigValue('keyboardShortcutsEnabled', !currentConfig.keyboardShortcutsEnabled);\n  }\n\n  handleKeyDown(event: KeyboardEvent) {\n    if (this.isInputFocused()) {\n      return;\n    }\n\n    const key = event.key.toLowerCase();\n    const ctrl = event.ctrlKey || event.metaKey;\n    const shift = event.shiftKey;\n    const alt = event.altKey;\n\n    // Prevent default browser behavior for our shortcuts\n    if (this.handleKeyDownShortcuts(key, ctrl, shift, alt)) {\n      event.preventDefault();\n      event.stopPropagation();\n    }\n  }\n\n  handleKeyUp(event: KeyboardEvent) {\n    // No specific keyup shortcuts for now\n  }\n\n  private isInputFocused(): boolean {\n    const activeElement = document.activeElement;\n    return (\n      activeElement instanceof HTMLInputElement ||\n      activeElement instanceof HTMLTextAreaElement ||\n      activeElement?.getAttribute('contenteditable') === 'true'\n    );\n  }\n\n  private handleKeyDownShortcuts(key: string, ctrl: boolean, shift: boolean, alt: boolean): boolean {\n    // Tool Shortcuts\n    if (!ctrl && !shift && !alt) {\n      if (key === 'v') {\n        this.apiService.setActiveTool(ToolType.Select);\n        return true;\n      }\n      if (key === 'd') {\n        this.apiService.setActiveTool(ToolType.Pen);\n        return true;\n      }\n      if (key === 'e') {\n        this.apiService.setActiveTool(ToolType.Eraser);\n        return true;\n      }\n      if (key === 'h') {\n        this.apiService.setActiveTool(ToolType.Hand);\n        return true;\n      }\n      if (key === 'r') {\n        this.apiService.setActiveTool(ToolType.Rectangle);\n        return true;\n      }\n      if (key === 'o') {\n        this.apiService.setActiveTool(ToolType.Ellipse);\n        return true;\n      }\n      if (key === 'a') {\n        this.apiService.setActiveTool(ToolType.Arrow);\n        return true;\n      }\n      if (key === 'l') {\n        this.apiService.setActiveTool(ToolType.Line);\n        return true;\n      }\n      if (key === 't') {\n        this.apiService.setActiveTool(ToolType.Text);\n        return true;\n      }\n    }\n\n    // Undo/Redo\n    if (ctrl && key === 'z' && !shift) {\n      return this.apiService.undo();\n    }\n    if (ctrl && (key === 'y' || (key === 'z' && shift))) {\n      return this.apiService.redo();\n    }\n\n    // Selection\n    if (ctrl && key === 'a') {\n      this.apiService.selectAll();\n      return true;\n    }\n    if (key === KEY_LOWER.ESCAPE) {\n      this.apiService.clearSelection();\n      return true;\n    }\n\n    // Clipboard\n    if (ctrl && key === 'c') {\n      this.apiService.copyElements();\n      return true;\n    }\n    if (ctrl && key === 'x') {\n      this.apiService.cutElements();\n      return true;\n    }\n    if (ctrl && key === 'v') {\n      this.apiService.pasteElements();\n      return true;\n    }\n    if (ctrl && key === 'd') {\n      this.apiService.duplicateElements();\n      return true;\n    }\n\n    // Delete\n    if (key === KEY_LOWER.DELETE || key === KEY_LOWER.BACKSPACE) {\n      this.apiService.deleteSelectedElements();\n      return true;\n    }\n\n    // Grouping\n    if (ctrl && key === 'g' && !shift) {\n      this.apiService.groupSelectedElements();\n      return true;\n    }\n    if (ctrl && key === 'g' && shift) {\n      this.apiService.ungroupSelectedElements();\n      return true;\n    }\n\n    // Layer Order (Z-index)\n    if (!ctrl && !shift && !alt && key === ']') {\n      this.apiService.bringToFront();\n      return true;\n    }\n    if (alt && !ctrl && !shift && key === ']') {\n      this.apiService.bringForward();\n      return true;\n    }\n    if (alt && !ctrl && !shift && key === '[') {\n      this.apiService.sendBackward();\n      return true;\n    }\n    if (!ctrl && !shift && !alt && key === '[') {\n      this.apiService.sendToBack();\n      return true;\n    }\n\n    // Flip\n    if (shift && !ctrl && !alt && key === 'h') {\n      this.apiService.flipHorizontal();\n      return true;\n    }\n    if (shift && !ctrl && !alt && key === 'v') {\n      this.apiService.flipVertical();\n      return true;\n    }\n\n    // Alignment\n    if (alt && !ctrl && !shift && key === 'w') {\n      this.apiService.alignElements(AlignmentType.Top);\n      return true;\n    }\n    if (alt && !ctrl && !shift && key === 'v') {\n      this.apiService.alignElements(AlignmentType.Middle);\n      return true;\n    }\n    if (alt && !ctrl && !shift && key === 's') {\n      this.apiService.alignElements(AlignmentType.Bottom);\n      return true;\n    }\n    if (alt && !ctrl && !shift && key === 'a') {\n      this.apiService.alignElements(AlignmentType.Left);\n      return true;\n    }\n    if (alt && !ctrl && !shift && key === 'h') {\n      this.apiService.alignElements(AlignmentType.Center);\n      return true;\n    }\n    if (alt && !ctrl && !shift && key === 'd') {\n      this.apiService.alignElements(AlignmentType.Right);\n      return true;\n    }\n\n    // Zoom\n    if ((ctrl && key === '=') || (ctrl && key === '+')) {\n      this.apiService.zoomIn();\n      return true;\n    }\n    if (ctrl && key === '-') {\n      this.apiService.zoomOut();\n      return true;\n    }\n    if (shift && !ctrl && !alt && key === '0') {\n      this.apiService.resetZoom(); // Zoom to 100%\n      return true;\n    }\n    if (shift && !ctrl && !alt && key === '1') {\n      this.apiService.zoomToFit(); // Zoom to fit\n      return true;\n    }\n    if (shift && !ctrl && !alt && key === '2') {\n      this.apiService.zoomToSelection(); // Zoom to selection\n      return true;\n    }\n\n    // Grid\n    if (ctrl && key === \"'\" && !shift) {\n      this.apiService.toggleGrid();\n      return true;\n    }\n    if (ctrl && key === ';' && shift) {\n      this.apiService.toggleSnapToGrid();\n      return true;\n    }\n\n    // Arrow key navigation for moving selected elements\n    if (\n      !ctrl &&\n      !shift &&\n      !alt &&\n      (key === KEY_LOWER.ARROW_UP ||\n        key === KEY_LOWER.ARROW_DOWN ||\n        key === KEY_LOWER.ARROW_LEFT ||\n        key === KEY_LOWER.ARROW_RIGHT)\n    ) {\n      // Move selected elements by 1 pixel\n      const dx =\n        key === KEY_LOWER.ARROW_RIGHT ? MOVEMENT.SMALL_STEP : key === KEY_LOWER.ARROW_LEFT ? -MOVEMENT.SMALL_STEP : 0;\n      const dy =\n        key === KEY_LOWER.ARROW_DOWN ? MOVEMENT.SMALL_STEP : key === KEY_LOWER.ARROW_UP ? -MOVEMENT.SMALL_STEP : 0;\n      this.apiService.moveSelectedElements(dx, dy);\n      return true;\n    }\n\n    // Arrow key navigation for moving selected elements faster\n    if (\n      !ctrl &&\n      shift &&\n      !alt &&\n      (key === KEY_LOWER.ARROW_UP ||\n        key === KEY_LOWER.ARROW_DOWN ||\n        key === KEY_LOWER.ARROW_LEFT ||\n        key === KEY_LOWER.ARROW_RIGHT)\n    ) {\n      // Move selected elements by 10 pixels\n      const dx =\n        key === KEY_LOWER.ARROW_RIGHT ? MOVEMENT.LARGE_STEP : key === KEY_LOWER.ARROW_LEFT ? -MOVEMENT.LARGE_STEP : 0;\n      const dy =\n        key === KEY_LOWER.ARROW_DOWN ? MOVEMENT.LARGE_STEP : key === KEY_LOWER.ARROW_UP ? -MOVEMENT.LARGE_STEP : 0;\n      this.apiService.moveSelectedElements(dx, dy);\n      return true;\n    }\n\n    return false;\n  }\n}\n","import { Injectable, Signal, computed, inject } from '@angular/core';\nimport { ConfigService } from '../config/config.service';\nimport { EventBusService } from '../event-bus/event-bus.service';\nimport { CanvasService } from '../canvas/canvas.service';\nimport { ElementsService } from '../elements/elements.service';\nimport { LayerManagementService } from '../elements/layer-management.service';\nimport { PanService } from '../viewport/pan.service';\nimport { SelectionService } from '../elements/selection.service';\nimport { ToolsService } from '../tools/tools.service';\nimport { BatchHandle, HistoryService } from '../history/history.service';\nimport { ZoomService } from '../viewport/zoom.service';\nimport {\n  AddImage,\n  AlignmentType,\n  BoundingBox,\n  FormatType,\n  SelectionBox,\n  ToolType,\n  WhiteboardConfig,\n  WhiteboardElement,\n  BlendMode,\n} from '../types';\nimport { WhiteboardEvent } from '../types/events';\nimport { CursorType } from '../types/cursors';\nimport { ClipboardService, IOService } from '../input';\n\n@Injectable()\nexport class ApiService {\n  private elementsService = inject(ElementsService);\n  private canvasService = inject(CanvasService);\n  private selectionService = inject(SelectionService);\n  private toolsService = inject(ToolsService);\n  private ioService = inject(IOService);\n  private historyService = inject(HistoryService);\n  private zoomService = inject(ZoomService);\n  private panService = inject(PanService);\n  private layerService = inject(LayerManagementService);\n  private configService = inject(ConfigService);\n  private clipboardService = inject(ClipboardService);\n  private eventBusService = inject(EventBusService);\n\n  readonly elements: Signal<WhiteboardElement[]> = this.elementsService.elements;\n\n  readonly draftElements: Signal<WhiteboardElement[]> = this.elementsService.draftElements;\n\n  readonly allElements: Signal<WhiteboardElement[]> = this.elementsService.allElements;\n\n  readonly selectedElements: Signal<WhiteboardElement[]> = this.selectionService.getSelectedElementsSignal();\n\n  readonly config: Signal<WhiteboardConfig> = computed(() => this.configService.getConfig());\n\n  readonly elementsCount: Signal<number> = this.elementsService.elementsCount;\n\n  readonly hasElements: Signal<boolean> = this.elementsService.hasElements;\n\n  readonly selectedTool: Signal<ToolType> = this.toolsService.selectedTool;\n\n  readonly availableTools = this.toolsService.availableTools;\n\n  readonly layers = this.layerService.layers;\n\n  readonly activeLayerId = this.layerService.activeLayerId;\n\n  readonly activeLayer = this.layerService.activeLayer;\n\n  setElements(elements: WhiteboardElement[]): void {\n    this.elementsService.setElements(elements);\n  }\n\n  getElements(): WhiteboardElement[] {\n    return this.elementsService.getElements();\n  }\n\n  addElements(elements: WhiteboardElement[]): void {\n    this.elementsService.addElements(elements);\n  }\n\n  updateElements(elements: Array<Partial<WhiteboardElement> & { id: string }>): void {\n    const updates = elements.map((el) => ({ ...el, id: el.id }));\n    this.elementsService.updateElements(updates);\n  }\n\n  removeElements(elements: WhiteboardElement[]): void {\n    this.elementsService.removeElements(elements);\n  }\n\n  clear(): void {\n    this.elementsService.clear();\n  }\n\n  clearAll(): void {\n    this.elementsService.clear();\n    this.selectionService.clearSelection();\n  }\n\n  addElement(element: WhiteboardElement): void {\n    this.addElements([element]);\n  }\n\n  updateElement(element: WhiteboardElement): void {\n    this.updateElements([element]);\n  }\n\n  removeElementsByIds(elementIds: string[]): void {\n    this.elementsService.removeElementsByIds(elementIds);\n  }\n\n  getElementById(id: string): WhiteboardElement | undefined {\n    return this.elementsService.getElementById(id);\n  }\n\n  getElementsByIds(ids: string[]): WhiteboardElement[] {\n    return this.elementsService.getElementsByIds(ids);\n  }\n\n  getNextZIndex(): number {\n    return this.elementsService.getNextZIndex();\n  }\n\n  getAllElements(): WhiteboardElement[] {\n    return this.elementsService.getElements();\n  }\n\n  getDraftElements(): WhiteboardElement[] {\n    return this.elementsService.getDraftElements();\n  }\n\n  addDraftElements(elements: WhiteboardElement[]): void {\n    this.elementsService.addDraftElements(elements);\n  }\n\n  updateDraftElements(elements: Partial<WhiteboardElement>[]): void {\n    this.elementsService.updateDraftElements(elements);\n  }\n\n  removeDraftElements(elementIds: string[]): void {\n    this.elementsService.removeDraftElements(elementIds);\n  }\n\n  commitDraftElements(): void {\n    this.elementsService.commitDraftElements();\n  }\n\n  elementExists(elementId: string): boolean {\n    return this.elementsService.elementExists(elementId);\n  }\n\n  selectElements(elementsOrIds: WhiteboardElement | WhiteboardElement[] | string | string[], append = false): void {\n    this.selectionService.selectElements(elementsOrIds, append);\n  }\n\n  /**\n   * Apply the post-draw behaviour for a freshly drawn element: when `selectAfterDraw` resolves\n   * true (config override or the element's own default), select it and activate the Select tool;\n   * when false, leave it unselected so the drawing tool stays active. Called by the tools on\n   * pointer-up — the single place the \"select + switch to Select vs keep drawing\" decision lives.\n   */\n  finalizeDraw(element: WhiteboardElement): void {\n    const select = this.configService.resolveSelectAfterDraw(element.type, element.selectAfterDraw ?? false);\n    if (select) {\n      this.selectionService.selectElements([element.id]);\n      this.toolsService.setActiveTool(ToolType.Select);\n    }\n  }\n\n  deselectElement(elementOrId: WhiteboardElement | string): void {\n    this.selectionService.deselectElement(elementOrId);\n  }\n\n  toggleSelection(elementOrId: WhiteboardElement | string): void {\n    this.selectionService.toggleSelection(elementOrId);\n  }\n\n  clearSelection(): void {\n    this.selectionService.clearSelection();\n  }\n\n  selectAll(): void {\n    this.selectionService.selectAll();\n  }\n\n  getSelectedElements(): WhiteboardElement[] {\n    return this.selectionService.getSelectedElements();\n  }\n\n  updateSelectedElements(partialElement: Partial<WhiteboardElement>): void {\n    this.selectionService.updateSelectedElements(partialElement);\n  }\n\n  removeSelectedElements(): void {\n    this.selectionService.removeSelectedElements();\n  }\n\n  isSelected(elementOrId: WhiteboardElement | string): boolean {\n    return this.selectionService.isSelected(elementOrId);\n  }\n\n  clearSelectionBox(): void {\n    this.selectionService.clearSelectionBox();\n  }\n\n  transformSelectedElements(transformFn: (elements: WhiteboardElement[]) => WhiteboardElement[]): void {\n    this.selectionService.transformSelectedElements(transformFn);\n  }\n\n  setSelectionBox(selectionBox: SelectionBox): void {\n    this.selectionService.setSelectionBox(selectionBox);\n  }\n\n  updateBoundingBox(): void {\n    this.selectionService.updateBoundingBox();\n  }\n\n  getBoundingBox(): BoundingBox | null {\n    return this.selectionService.getBoundingBox();\n  }\n\n  setBoundingBox(bbox: BoundingBox | null): void {\n    this.selectionService.setBoundingBox(bbox);\n  }\n\n  getClipboardInfo() {\n    return this.clipboardService.getClipboardInfo();\n  }\n\n  copyElements(): void {\n    this.selectionService.copyElements();\n  }\n\n  cutElements(): void {\n    this.selectionService.cutElements();\n  }\n\n  pasteElements(): void {\n    this.selectionService.pasteElements();\n  }\n\n  duplicateElements(): void {\n    this.selectionService.duplicateElements();\n  }\n\n  deleteSelectedElements(): void {\n    this.selectionService.deleteSelectedElements();\n  }\n\n  bringToFront(): void {\n    this.selectionService.bringToFront();\n  }\n\n  bringForward(): void {\n    this.selectionService.bringForward();\n  }\n\n  sendBackward(): void {\n    this.selectionService.sendBackward();\n  }\n\n  sendToBack(): void {\n    this.selectionService.sendToBack();\n  }\n\n  groupSelectedElements(): void {\n    this.selectionService.groupSelectedElements();\n  }\n\n  ungroupSelectedElements(): void {\n    this.selectionService.ungroupSelectedElements();\n  }\n\n  lockElements(): void {\n    this.selectionService.lockElements();\n  }\n\n  unlockElements(): void {\n    this.selectionService.unlockElements();\n  }\n\n  alignElements(alignment: AlignmentType): void {\n    this.selectionService.alignElements(alignment);\n  }\n\n  distributeHorizontally(): void {\n    this.selectionService.distributeHorizontally();\n  }\n\n  distributeVertically(): void {\n    this.selectionService.distributeVertically();\n  }\n\n  flipHorizontal(): void {\n    this.selectionService.flipHorizontal();\n  }\n\n  flipVertical(): void {\n    this.selectionService.flipVertical();\n  }\n\n  moveSelectedElements(dx: number, dy: number): void {\n    this.selectionService.moveSelectedElements(dx, dy);\n  }\n\n  rotateSelectedElements(angle: number): void {\n    this.selectionService.rotateSelectedElements(angle);\n  }\n\n  scaleSelectedElements(factor: number): void {\n    this.selectionService.scaleSelectedElements(factor);\n  }\n\n  initializeWhiteboard(svgContainer: SVGSVGElement): void {\n    this.canvasService.initializeCanvas(svgContainer);\n    this.toolsService.setApiService(this);\n  }\n\n  getCanvas(): SVGSVGElement {\n    return this.canvasService.getCanvas();\n  }\n\n  setCanvasDimensions(width: number, height: number): void {\n    this.canvasService.setCanvasDimensions(width, height);\n  }\n\n  centerCanvas(): void {\n    this.canvasService.centerCanvas();\n  }\n\n  fullScreen(): void {\n    this.canvasService.fullScreen();\n  }\n\n  exitFullScreen(defaultWidth?: number, defaultHeight?: number): void {\n    this.canvasService.exitFullScreen(defaultWidth, defaultHeight);\n  }\n\n  resetCanvas(): void {\n    this.canvasService.resetCanvas();\n  }\n\n  setZoom(zoom: number): void {\n    this.zoomService.zoom(zoom);\n  }\n\n  zoomIn(): void {\n    this.zoomService.zoomIn();\n  }\n\n  zoomOut(): void {\n    this.zoomService.zoomOut();\n  }\n\n  resetZoom(): void {\n    this.zoomService.resetZoom();\n  }\n\n  zoomToFit(): void {\n    this.zoomService.zoomToFit();\n  }\n\n  zoomToSelection(): void {\n    this.zoomService.zoomToSelection();\n  }\n\n  zoomToRegion(x: number, y: number, width: number, height: number): void {\n    this.zoomService.zoomToRegion(x, y, width, height);\n  }\n\n  pan(dx: number, dy: number): void {\n    this.panService.pan(dx, dy);\n  }\n\n  panTo(x: number, y: number): void {\n    this.panService.panTo(x, y);\n  }\n\n  resetPan(): void {\n    this.panService.resetPan();\n  }\n\n  async save(format: FormatType = FormatType.Base64, name = 'whiteboard'): Promise<string> {\n    return this.ioService.save(format, name);\n  }\n\n  addImage(imageInfo: AddImage): void {\n    this.ioService.addImage(imageInfo);\n  }\n\n  async importImageFile(file: File, x?: number, y?: number): Promise<void> {\n    return this.ioService.importImageFile(file, x, y);\n  }\n\n  exportData(): string {\n    return this.ioService.exportData();\n  }\n\n  importData(jsonData: string): void {\n    this.ioService.importData(jsonData);\n  }\n\n  async exportAsPNG(name = 'whiteboard'): Promise<string> {\n    return this.ioService.exportAsPng(name);\n  }\n\n  async exportAsSVG(name = 'whiteboard'): Promise<string> {\n    return this.ioService.exportAsSvg(name);\n  }\n\n  exportAsJSON(name = 'whiteboard'): void {\n    const jsonData = this.ioService.exportData();\n    const blob = new Blob([jsonData], { type: 'application/json' });\n    const url = URL.createObjectURL(blob);\n    const link = document.createElement('a');\n    link.href = url;\n    link.download = `${name}.json`;\n    link.click();\n    URL.revokeObjectURL(url);\n  }\n\n  undo(): boolean {\n    const elements = this.historyService.undo();\n    if (elements) {\n      this.elementsService.setElements(elements);\n      this.selectionService.clearSelection();\n      this.eventBusService.emit(WhiteboardEvent.Undo, undefined);\n      return true;\n    }\n    return false;\n  }\n\n  redo(): boolean {\n    const elements = this.historyService.redo();\n    if (elements) {\n      this.elementsService.setElements(elements);\n      this.selectionService.clearSelection();\n      this.eventBusService.emit(WhiteboardEvent.Redo, undefined);\n      return true;\n    }\n    return false;\n  }\n\n  getCanUndoSignal(): Signal<boolean> {\n    return this.historyService.getCanUndoSignal();\n  }\n\n  getCanRedoSignal(): Signal<boolean> {\n    return this.historyService.getCanRedoSignal();\n  }\n\n  clearHistory(): void {\n    this.historyService.clearHistory();\n  }\n\n  recordElementCreation(before: WhiteboardElement[], after: WhiteboardElement[]): void {\n    this.historyService.recordElementCreation(before, after);\n  }\n\n  /**\n   * Begin a history batch: while active, element-change recordings are coalesced\n   * so a multi-step gesture (e.g. a drag, resize or rotate spanning many frames)\n   * is committed as a single undo entry. Pair every call with the returned\n   * handle's execute()/clear().\n   */\n  startBatch(description: string, before: WhiteboardElement[]): BatchHandle {\n    return this.historyService.startBatch(description, before);\n  }\n\n  /**\n   * Record the final state of an in-progress history batch. Call before the\n   * handle's execute().\n   */\n  completeBatch(after: WhiteboardElement[]): void {\n    this.historyService.completeBatch(after);\n  }\n\n  recordElementUpdate(before: WhiteboardElement[], after: WhiteboardElement[]): void {\n    this.historyService.recordElementUpdate(before, after);\n  }\n\n  recordElementDeletion(before: WhiteboardElement[], after: WhiteboardElement[]): void {\n    this.historyService.recordElementDeletion(before, after);\n  }\n\n  recordClear(before: WhiteboardElement[], after: WhiteboardElement[]): void {\n    this.historyService.recordClear(before, after);\n  }\n\n  recordChange(before: WhiteboardElement[], after: WhiteboardElement[], description: string): void {\n    this.historyService.recordChange(before, after, description);\n  }\n\n  getConfig(): WhiteboardConfig {\n    return this.configService.getConfig();\n  }\n\n  updateConfig(config: Partial<WhiteboardConfig>): void {\n    this.configService.updateConfig(config);\n  }\n\n  updateConfigValue<K extends keyof WhiteboardConfig>(key: K, value: WhiteboardConfig[K]): void {\n    this.configService.updateConfigValue(key, value);\n  }\n\n  addLayer(name?: string) {\n    return this.layerService.addLayer(name);\n  }\n\n  removeLayer(id: string): boolean {\n    return this.layerService.removeLayer(id);\n  }\n\n  duplicateLayer(id: string): void {\n    const currentElements = this.elementsService.elements();\n    const result = this.layerService.duplicateLayer(id, currentElements);\n\n    if (result.layer && result.elementMap.size > 0) {\n      const beforeElements = [...currentElements];\n\n      // Duplicate all elements from the original layer\n      const newElements: WhiteboardElement[] = [];\n\n      result.elementMap.forEach((newElementId, oldElementId) => {\n        const originalElement = currentElements.find((el: WhiteboardElement) => el.id === oldElementId);\n        if (originalElement) {\n          const layer = result.layer;\n          if (!layer) {\n            return;\n          }\n          const duplicatedElement: WhiteboardElement = {\n            ...originalElement,\n            id: newElementId,\n            layerId: layer.id,\n          };\n          newElements.push(duplicatedElement);\n        }\n      });\n\n      // Add all duplicated elements as new elements\n      this.elementsService.addElements(newElements);\n\n      const afterElements = this.elementsService.elements();\n      this.historyService.recordChange(beforeElements, afterElements, `Duplicate layer: ${result.layer.name}`);\n    }\n  }\n\n  setActiveLayer(id: string): boolean {\n    return this.layerService.setActiveLayer(id);\n  }\n\n  getActiveLayerId(): string {\n    return this.layerService.getActiveLayerId();\n  }\n\n  toggleLayerVisibility(id: string): boolean {\n    return this.layerService.toggleLayerVisibility(id);\n  }\n\n  toggleLayerLock(id: string): boolean {\n    return this.layerService.toggleLayerLock(id);\n  }\n\n  renameLayer(id: string, name: string): boolean {\n    return this.layerService.renameLayer(id, name);\n  }\n\n  setLayerOpacity(id: string, opacity: number): boolean {\n    return this.layerService.setLayerOpacity(id, opacity);\n  }\n\n  setLayerBlendMode(id: string, blendMode: BlendMode): boolean {\n    return this.layerService.setLayerBlendMode(id, blendMode);\n  }\n\n  moveLayerUp(id: string): boolean {\n    return this.layerService.moveLayerUp(id);\n  }\n\n  moveLayerDown(id: string): boolean {\n    return this.layerService.moveLayerDown(id);\n  }\n\n  reorderLayersByIndex(previousIndex: number, currentIndex: number): boolean {\n    return this.layerService.reorderLayersByIndex(previousIndex, currentIndex);\n  }\n\n  toggleGrid(): void {\n    this.canvasService.toggleGrid();\n  }\n\n  toggleSnapToGrid(): void {\n    this.canvasService.toggleSnapToGrid();\n  }\n\n  setGridSize(size: number): void {\n    this.canvasService.setGridSize(size);\n  }\n\n  setActiveTool(tool: ToolType): void {\n    this.toolsService.setActiveTool(tool);\n  }\n\n  getActiveTool(): ToolType {\n    return this.toolsService.getActiveToolType();\n  }\n\n  setToolEnabled(toolType: ToolType, enabled: boolean): boolean {\n    return this.toolsService.setToolEnabledByType(toolType, enabled);\n  }\n\n  setEnabledTools(toolTypes: ToolType[]): void {\n    this.toolsService.setEnabledTools(toolTypes);\n  }\n\n  setCursor(cursor: CursorType): void {\n    this.toolsService.setCursor(cursor);\n  }\n\n  resetCursor(): void {\n    this.toolsService.resetCursor();\n  }\n\n  screenToCanvas(screenX: number, screenY: number): { x: number; y: number } {\n    return this.canvasService.screenToCanvas(screenX, screenY);\n  }\n\n  canvasToScreen(canvasX: number, canvasY: number): { x: number; y: number } {\n    return this.canvasService.canvasToScreen(canvasX, canvasY);\n  }\n\n  getSelectionBoxSignal(): Signal<SelectionBox> {\n    return this.selectionService.getSelectionBoxSignal();\n  }\n\n  getBoundingBoxSignal(): Signal<BoundingBox | null> {\n    return this.selectionService.getBoundingBoxSignal();\n  }\n}\n","import { Injectable, Signal, signal } from '@angular/core';\nimport { ApiService } from '../api/api.service';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class InstanceService {\n  private readonly instances = new Map<string, ApiService>();\n\n  private readonly _activeId = signal<string | null>(null);\n\n  readonly activeId: Signal<string | null> = this._activeId.asReadonly();\n\n  private readonly _registryVersion = signal(0);\n\n  readonly registryVersion: Signal<number> = this._registryVersion.asReadonly();\n\n  register(id: string, instance: ApiService): void {\n    if (!id || id.trim().length === 0) {\n      throw new Error('Whiteboard instance ID cannot be empty.');\n    }\n\n    if (!(instance instanceof ApiService)) {\n      throw new Error('Instance must be an ApiService instance.');\n    }\n\n    this.instances.set(id, instance);\n    this._registryVersion.update((v) => v + 1);\n  }\n\n  unregister(id: string): boolean {\n    const result = this.instances.delete(id);\n\n    if (result) {\n      if (this._activeId() === id) {\n        this._activeId.set(null);\n      }\n      this._registryVersion.update((v) => v + 1);\n    }\n\n    return result;\n  }\n\n  getInstance(id: string): ApiService | undefined {\n    return this.instances.get(id);\n  }\n\n  hasInstance(id: string): boolean {\n    return this.instances.has(id);\n  }\n\n  getAllInstanceIds(): ReadonlyArray<string> {\n    return Array.from(this.instances.keys());\n  }\n\n  getInstanceCount(): number {\n    return this.instances.size;\n  }\n\n  setActive(id: string): void {\n    if (!this.hasInstance(id)) {\n      throw new Error(`Whiteboard with ID \"${id}\" not found in registry. Cannot set as active.`);\n    }\n    this._activeId.set(id);\n  }\n\n  clearActive(): void {\n    this._activeId.set(null);\n  }\n\n  getActiveInstance(): ApiService | undefined {\n    const id = this._activeId();\n    return id ? this.instances.get(id) : undefined;\n  }\n\n  clearAll(): void {\n    this.instances.clear();\n    this._activeId.set(null);\n    this._registryVersion.update((v) => v + 1);\n  }\n}\n","import { Injectable, Signal, computed, inject, signal } from '@angular/core';\nimport { InstanceService } from './core/canvas/instance.service';\nimport {\n  AddImage,\n  AlignmentType,\n  BoundingBox,\n  FormatType,\n  SelectionBox,\n  ToolType,\n  WhiteboardConfig,\n  WhiteboardElement,\n  BlendMode,\n  CursorType,\n  ClipboardInfo,\n} from './core/types';\n\n/**\n * Service providing a clean API for interacting with whiteboard instances.\n *\n * Key concepts:\n * - Each whiteboard component has a unique boardId\n * - Methods accept an optional boardId parameter to target a specific board\n * - Use signals(boardId) to get reactive signals for a specific board\n *\n * @example\n * ```typescript\n * class MyComponent {\n *   boardId = 'my-board';\n *   layers = this.whiteboardService.signals(this.boardId).layers;\n *   elements = this.whiteboardService.signals(this.boardId).elements;\n *\n *   clear() {\n *     this.whiteboardService.clear(this.boardId);\n *   }\n * }\n * ```\n */\n@Injectable()\nexport class NgWhiteboardService {\n  private readonly instanceService = inject(InstanceService);\n  private activeBoardId = signal<string | null>(null);\n\n  /**\n   * Set the active board. Methods without boardId parameter will use this board.\n   * @param boardId - The ID of the board to make active, or null to clear active board\n   */\n  setActiveBoard(boardId: string | null): void {\n    this.activeBoardId.set(boardId);\n  }\n\n  /**\n   * Get the currently active board ID\n   */\n  getActiveBoard(): string | null {\n    return this.activeBoardId();\n  }\n\n  /**\n   * Get the API instance for a specific board, or the active board if no boardId provided.\n   * @param boardId - Optional board ID. If not provided, uses the active board.\n   * @throws Error if boardId is not provided and no active board is set.\n   * @throws Error if the specified board is not found.\n   */\n  private getApi(boardId?: string) {\n    const targetBoardId = boardId || this.activeBoardId();\n    if (!targetBoardId) {\n      throw new Error(\n        'NgWhiteboardService: No boardId provided and no active board set. Call setActiveBoard() first or pass boardId parameter.'\n      );\n    }\n    const instance = this.instanceService.getInstance(targetBoardId);\n    if (!instance) {\n      throw new Error(\n        `NgWhiteboardService: Board \"${targetBoardId}\" not found. Ensure the whiteboard component is initialized.`\n      );\n    }\n    return instance;\n  }\n\n  /**\n   * Get reactive signals for a specific board.\n   * These signals are bound to the specified board and will update when that board's data changes.\n   * Signals are lazy and won't throw errors until actually accessed.\n   *\n   * @param boardId - The unique identifier of the whiteboard\n   * @returns Object containing all reactive signals for the board\n   *\n   * @example\n   * ```typescript\n   * class MyComponent {\n   *   boardId = 'my-board';\n   *   private signals = this.whiteboardService.signals(this.boardId);\n   *   layers = this.signals.layers;\n   *   elements = this.signals.elements;\n   * }\n   * ```\n   */\n  public signals(boardId: string) {\n    return {\n      elements: computed(() => {\n        this.instanceService.registryVersion();\n        const api = this.instanceService.getInstance(boardId);\n        return api ? api.elements() : [];\n      }),\n      selectedElements: computed(() => {\n        this.instanceService.registryVersion();\n        const api = this.instanceService.getInstance(boardId);\n        return api ? api.selectedElements() : [];\n      }),\n      config: computed(() => {\n        this.instanceService.registryVersion();\n        const api = this.instanceService.getInstance(boardId);\n        return api ? api.config() : ({} as WhiteboardConfig);\n      }),\n      elementsCount: computed(() => {\n        this.instanceService.registryVersion();\n        const api = this.instanceService.getInstance(boardId);\n        return api ? api.elementsCount() : 0;\n      }),\n      hasElements: computed(() => {\n        this.instanceService.registryVersion();\n        const api = this.instanceService.getInstance(boardId);\n        return api ? api.hasElements() : false;\n      }),\n      selectedTool: computed(() => {\n        this.instanceService.registryVersion();\n        const api = this.instanceService.getInstance(boardId);\n        return api ? api.selectedTool() : ToolType.Pen;\n      }),\n      availableTools: computed(() => {\n        this.instanceService.registryVersion();\n        const api = this.instanceService.getInstance(boardId);\n        return api ? api.availableTools() : [];\n      }),\n      layers: computed(() => {\n        this.instanceService.registryVersion();\n        const api = this.instanceService.getInstance(boardId);\n        return api ? api.layers() : [];\n      }),\n      activeLayerId: computed(() => {\n        this.instanceService.registryVersion();\n        const api = this.instanceService.getInstance(boardId);\n        return api ? api.activeLayerId() : null;\n      }),\n      activeLayer: computed(() => {\n        this.instanceService.registryVersion();\n        const api = this.instanceService.getInstance(boardId);\n        return api ? api.activeLayer() : null;\n      }),\n      canUndo: computed(() => {\n        this.instanceService.registryVersion();\n        const api = this.instanceService.getInstance(boardId);\n        return api ? api.getCanUndoSignal()() : false;\n      }),\n      canRedo: computed(() => {\n        this.instanceService.registryVersion();\n        const api = this.instanceService.getInstance(boardId);\n        return api ? api.getCanRedoSignal()() : false;\n      }),\n      selectionBox: computed(() => {\n        this.instanceService.registryVersion();\n        const api = this.instanceService.getInstance(boardId);\n        return api ? api.getSelectionBoxSignal()() : { x: 0, y: 0, width: 0, height: 0 };\n      }),\n      boundingBox: computed(() => {\n        this.instanceService.registryVersion();\n        const api = this.instanceService.getInstance(boardId);\n        return api ? api.getBoundingBoxSignal()() : null;\n      }),\n    };\n  }\n\n  /**\n   * Get all registered whiteboard instance IDs.\n   */\n  public getAllBoards(): ReadonlyArray<string> {\n    return this.instanceService.getAllInstanceIds();\n  }\n\n  /**\n   * Get the total number of registered whiteboard instances.\n   */\n  public getBoardCount(): number {\n    return this.instanceService.getInstanceCount();\n  }\n\n  /**\n   * Check if a whiteboard with the given ID exists.\n   */\n  public hasBoard(boardId: string): boolean {\n    return this.instanceService.hasInstance(boardId);\n  }\n\n  /**\n   * Set elements for the whiteboard.\n   */\n  public setElements(elements: WhiteboardElement[]): void {\n    const instance = this.getApi();\n    instance.setElements(elements);\n  }\n\n  /**\n   * Get all elements from the whiteboard.\n   */\n  public getElements(): WhiteboardElement[] {\n    const instance = this.getApi();\n    return instance.getElements();\n  }\n\n  /**\n   * Add new elements to the whiteboard.\n   */\n  public addElements(elements: WhiteboardElement[]): void {\n    const instance = this.getApi();\n    instance.addElements(elements);\n  }\n\n  /**\n   * Update multiple elements.\n   */\n  public updateElements(elements: Array<Partial<WhiteboardElement> & { id: string }>): void {\n    const instance = this.getApi();\n    instance.updateElements(elements);\n  }\n\n  /**\n   * Remove elements from the whiteboard.\n   */\n  public removeElements(elements: WhiteboardElement[]): void {\n    const instance = this.getApi();\n    instance.removeElements(elements);\n  }\n\n  /**\n   * Clear all elements from the whiteboard.\n   */\n  public clear(): void {\n    const instance = this.getApi();\n    instance.clear();\n  }\n\n  /**\n   * Clear all elements and selection.\n   */\n  public clearAll(): void {\n    const instance = this.getApi();\n    instance.clearAll();\n  }\n\n  /**\n   * Add a single element to the whiteboard.\n   */\n  public addElement(element: WhiteboardElement): void {\n    const instance = this.getApi();\n    instance.addElement(element);\n  }\n\n  /**\n   * Update an existing element.\n   */\n  public updateElement(element: WhiteboardElement): void {\n    const instance = this.getApi();\n    instance.updateElement(element);\n  }\n\n  /**\n   * Remove elements by their IDs.\n   */\n  public removeElementsByIds(elementIds: string[]): void {\n    const instance = this.getApi();\n    instance.removeElementsByIds(elementIds);\n  }\n\n  /**\n   * Get element by ID.\n   */\n  public getElementById(id: string): WhiteboardElement | undefined {\n    const instance = this.getApi();\n    return instance.getElementById(id);\n  }\n\n  /**\n   * Get multiple elements by their IDs.\n   */\n  public getElementsByIds(ids: string[]): WhiteboardElement[] {\n    const instance = this.getApi();\n    return instance.getElementsByIds(ids);\n  }\n\n  /**\n   * Get next available Z-index.\n   */\n  public getNextZIndex(): number {\n    const instance = this.getApi();\n    return instance.getNextZIndex();\n  }\n\n  /**\n   * Check if an element exists.\n   */\n  public elementExists(elementId: string): boolean {\n    const instance = this.getApi();\n    return instance.elementExists(elementId);\n  }\n\n  /**\n   * Select elements on the whiteboard.\n   */\n  public selectElements(\n    elementsOrIds: WhiteboardElement | WhiteboardElement[] | string | string[],\n    append = false\n  ): void {\n    const instance = this.getApi();\n    instance.selectElements(elementsOrIds, append);\n  }\n\n  /**\n   * Deselect an element.\n   */\n  public deselectElement(elementOrId: WhiteboardElement | string): void {\n    const instance = this.getApi();\n    instance.deselectElement(elementOrId);\n  }\n\n  /**\n   * Toggle element selection.\n   */\n  public toggleSelection(elementOrId: WhiteboardElement | string): void {\n    const instance = this.getApi();\n    instance.toggleSelection(elementOrId);\n  }\n\n  /**\n   * Clear the selection.\n   */\n  public clearSelection(): void {\n    const instance = this.getApi();\n    instance.clearSelection();\n  }\n\n  /**\n   * Select all elements.\n   */\n  public selectAll(): void {\n    const instance = this.getApi();\n    instance.selectAll();\n  }\n\n  /**\n   * Get currently selected elements.\n   */\n  public getSelectedElements(): WhiteboardElement[] {\n    const instance = this.getApi();\n    return instance.getSelectedElements();\n  }\n\n  /**\n   * Update selected elements with partial properties.\n   */\n  public updateSelectedElements(partialElement: Partial<WhiteboardElement>): void {\n    const instance = this.getApi();\n    instance.updateSelectedElements(partialElement);\n  }\n\n  /**\n   * Remove selected elements.\n   */\n  public removeSelectedElements(): void {\n    const instance = this.getApi();\n    instance.removeSelectedElements();\n  }\n\n  /**\n   * Check if an element is selected.\n   */\n  public isSelected(elementOrId: WhiteboardElement | string): boolean {\n    const instance = this.getApi();\n    return instance.isSelected(elementOrId);\n  }\n\n  /**\n   * Clear the selection box.\n   */\n  public clearSelectionBox(): void {\n    const instance = this.getApi();\n    instance.clearSelectionBox();\n  }\n\n  /**\n   * Transform selected elements using a transformation function.\n   */\n  public transformSelectedElements(transformFn: (elements: WhiteboardElement[]) => WhiteboardElement[]): void {\n    const instance = this.getApi();\n    instance.transformSelectedElements(transformFn);\n  }\n\n  /**\n   * Set the selection box.\n   */\n  public setSelectionBox(selectionBox: SelectionBox): void {\n    const instance = this.getApi();\n    instance.setSelectionBox(selectionBox);\n  }\n\n  /**\n   * Update bounding box for selected elements.\n   */\n  public updateBoundingBox(): void {\n    const instance = this.getApi();\n    instance.updateBoundingBox();\n  }\n\n  /**\n   * Get clipboard information.\n   */\n  public getClipboardInfo(): ClipboardInfo | null {\n    const instance = this.getApi();\n    return instance.getClipboardInfo();\n  }\n\n  /**\n   * Copy selected elements to clipboard.\n   */\n  public copyElements(): void {\n    const instance = this.getApi();\n    instance.copyElements();\n  }\n\n  /**\n   * Cut selected elements.\n   */\n  public cutElements(): void {\n    const instance = this.getApi();\n    instance.cutElements();\n  }\n\n  /**\n   * Paste elements from clipboard.\n   */\n  public pasteElements(): void {\n    const instance = this.getApi();\n    instance.pasteElements();\n  }\n\n  /**\n   * Duplicate selected elements.\n   */\n  public duplicateElements(): void {\n    const instance = this.getApi();\n    instance.duplicateElements();\n  }\n\n  /**\n   * Delete selected elements.\n   */\n  public deleteSelectedElements(): void {\n    const instance = this.getApi();\n    instance.deleteSelectedElements();\n  }\n\n  /**\n   * Bring selected elements to front.\n   */\n  public bringToFront(): void {\n    const instance = this.getApi();\n    instance.bringToFront();\n  }\n\n  /**\n   * Bring selected elements forward by one level.\n   */\n  public bringForward(): void {\n    const instance = this.getApi();\n    instance.bringForward();\n  }\n\n  /**\n   * Send selected elements backward by one level.\n   */\n  public sendBackward(): void {\n    const instance = this.getApi();\n    instance.sendBackward();\n  }\n\n  /**\n   * Send selected elements to back.\n   */\n  public sendToBack(): void {\n    const instance = this.getApi();\n    instance.sendToBack();\n  }\n\n  /**\n   * Group selected elements.\n   */\n  public groupSelectedElements(): void {\n    const instance = this.getApi();\n    instance.groupSelectedElements();\n  }\n\n  /**\n   * Ungroup selected elements.\n   */\n  public ungroupSelectedElements(): void {\n    const instance = this.getApi();\n    instance.ungroupSelectedElements();\n  }\n\n  /**\n   * Lock selected elements.\n   */\n  public lockElements(): void {\n    const instance = this.getApi();\n    instance.lockElements();\n  }\n\n  /**\n   * Unlock selected elements.\n   */\n  public unlockElements(): void {\n    const instance = this.getApi();\n    instance.unlockElements();\n  }\n\n  /**\n   * Align selected elements.\n   */\n  public alignElements(alignment: AlignmentType): void {\n    const instance = this.getApi();\n    instance.alignElements(alignment);\n  }\n\n  /**\n   * Get the canvas SVG element.\n   */\n  public getCanvas(): SVGSVGElement {\n    const instance = this.getApi();\n    return instance.getCanvas();\n  }\n\n  /**\n   * Set canvas dimensions.\n   */\n  public setCanvasDimensions(width: number, height: number): void {\n    const instance = this.getApi();\n    instance.setCanvasDimensions(width, height);\n  }\n\n  /**\n   * Center the canvas.\n   */\n  public centerCanvas(): void {\n    const instance = this.getApi();\n    instance.centerCanvas();\n  }\n\n  /**\n   * Toggle fullscreen mode.\n   */\n  public fullScreen(): void {\n    const instance = this.getApi();\n    instance.fullScreen();\n  }\n\n  /**\n   * Exit fullscreen mode.\n   */\n  public exitFullScreen(defaultWidth?: number, defaultHeight?: number): void {\n    const instance = this.getApi();\n    instance.exitFullScreen(defaultWidth, defaultHeight);\n  }\n\n  /**\n   * Reset canvas to default state.\n   */\n  public resetCanvas(): void {\n    const instance = this.getApi();\n    instance.resetCanvas();\n  }\n\n  /**\n   * Set zoom level.\n   */\n  public setZoom(zoom: number): void {\n    const instance = this.getApi();\n    instance.setZoom(zoom);\n  }\n\n  /**\n   * Zoom in.\n   */\n  public zoomIn(): void {\n    const instance = this.getApi();\n    instance.zoomIn();\n  }\n\n  /**\n   * Zoom out.\n   */\n  public zoomOut(): void {\n    const instance = this.getApi();\n    instance.zoomOut();\n  }\n\n  /**\n   * Reset zoom to default.\n   */\n  public resetZoom(): void {\n    const instance = this.getApi();\n    instance.resetZoom();\n  }\n\n  /**\n   * Zoom to fit all elements.\n   */\n  public zoomToFit(): void {\n    const instance = this.getApi();\n    instance.zoomToFit();\n  }\n\n  /**\n   * Zoom to fit selected elements.\n   */\n  public zoomToSelection(): void {\n    const instance = this.getApi();\n    instance.zoomToSelection();\n  }\n\n  /**\n   * Pan the canvas by delta values.\n   */\n  public pan(dx: number, dy: number): void {\n    const instance = this.getApi();\n    instance.pan(dx, dy);\n  }\n\n  /**\n   * Pan to a specific position.\n   */\n  public panTo(x: number, y: number): void {\n    const instance = this.getApi();\n    instance.panTo(x, y);\n  }\n\n  /**\n   * Reset pan to default.\n   */\n  public resetPan(): void {\n    const instance = this.getApi();\n    instance.resetPan();\n  }\n\n  /**\n   * Save the whiteboard in the specified format.\n   */\n  public async save(format: FormatType = FormatType.Base64, name = 'whiteboard'): Promise<string> {\n    const instance = this.getApi();\n    return instance.save(format, name);\n  }\n\n  /**\n   * Add an image to the whiteboard.\n   */\n  public addImage(imageInfo: AddImage): void {\n    const instance = this.getApi();\n    instance.addImage(imageInfo);\n  }\n\n  /**\n   * Import an image from a file.\n   */\n  public async importImageFile(file: File, x?: number, y?: number): Promise<void> {\n    const instance = this.getApi();\n    return instance.importImageFile(file, x, y);\n  }\n\n  /**\n   * Export whiteboard data as JSON.\n   */\n  public exportData(): string {\n    const instance = this.getApi();\n    return instance.exportData();\n  }\n\n  /**\n   * Import whiteboard data from JSON.\n   */\n  public importData(jsonData: string): void {\n    const instance = this.getApi();\n    instance.importData(jsonData);\n  }\n\n  /**\n   * Undo the last action.\n   */\n  public undo(): boolean {\n    const instance = this.getApi();\n    return instance.undo();\n  }\n\n  /**\n   * Redo the last undone action.\n   */\n  public redo(): boolean {\n    const instance = this.getApi();\n    return instance.redo();\n  }\n\n  /**\n   * Get signal for undo availability.\n   */\n  public getCanUndoSignal(): Signal<boolean> {\n    const instance = this.getApi();\n    return instance.getCanUndoSignal();\n  }\n\n  /**\n   * Get signal for redo availability.\n   */\n  public getCanRedoSignal(): Signal<boolean> {\n    const instance = this.getApi();\n    return instance.getCanRedoSignal();\n  }\n\n  /**\n   * Clear undo/redo history.\n   */\n  public clearHistory(): void {\n    const instance = this.getApi();\n    instance.clearHistory();\n  }\n\n  /**\n   * Get current whiteboard configuration.\n   */\n  public getConfig(): WhiteboardConfig {\n    const instance = this.getApi();\n    return instance.getConfig();\n  }\n\n  /**\n   * Update whiteboard configuration.\n   */\n  public updateConfig(config: Partial<WhiteboardConfig>): void {\n    const instance = this.getApi();\n    instance.updateConfig(config);\n  }\n\n  /**\n   * Update a single configuration value.\n   */\n  public updateConfigValue<K extends keyof WhiteboardConfig>(key: K, value: WhiteboardConfig[K]): void {\n    const instance = this.getApi();\n    instance.updateConfigValue(key, value);\n  }\n\n  /**\n   * Add a new layer.\n   */\n  public addLayer(name?: string): void {\n    const instance = this.getApi();\n    instance.addLayer(name);\n  }\n\n  /**\n   * Remove a layer by ID.\n   */\n  public removeLayer(id: string): boolean {\n    const instance = this.getApi();\n    return instance.removeLayer(id);\n  }\n\n  /**\n   * Duplicate a layer with all its elements and properties.\n   */\n  public duplicateLayer(id: string): void {\n    const instance = this.getApi();\n    instance.duplicateLayer(id);\n  }\n\n  /**\n   * Set the active layer.\n   */\n  public setActiveLayer(id: string): boolean {\n    const instance = this.getApi();\n    return instance.setActiveLayer(id);\n  }\n\n  /**\n   * Get the active layer ID.\n   */\n  public getActiveLayerId(): string {\n    const instance = this.getApi();\n    return instance.getActiveLayerId();\n  }\n\n  /**\n   * Toggle layer visibility.\n   */\n  public toggleLayerVisibility(id: string): boolean {\n    const instance = this.getApi();\n    return instance.toggleLayerVisibility(id);\n  }\n\n  /**\n   * Toggle layer lock state.\n   */\n  public toggleLayerLock(id: string): boolean {\n    const instance = this.getApi();\n    return instance.toggleLayerLock(id);\n  }\n\n  /**\n   * Rename a layer.\n   */\n  public renameLayer(id: string, name: string): boolean {\n    const instance = this.getApi();\n    return instance.renameLayer(id, name);\n  }\n\n  /**\n   * Set layer opacity (0-1).\n   */\n  public setLayerOpacity(id: string, opacity: number): boolean {\n    const instance = this.getApi();\n    return instance.setLayerOpacity(id, opacity);\n  }\n\n  /**\n   * Set layer blend mode.\n   */\n  public setLayerBlendMode(id: string, blendMode: BlendMode): boolean {\n    const instance = this.getApi();\n    return instance.setLayerBlendMode(id, blendMode);\n  }\n\n  /**\n   * Move layer up in z-order.\n   */\n  public moveLayerUp(id: string): boolean {\n    const instance = this.getApi();\n    return instance.moveLayerUp(id);\n  }\n\n  /**\n   * Move layer down in z-order.\n   */\n  public moveLayerDown(id: string): boolean {\n    const instance = this.getApi();\n    return instance.moveLayerDown(id);\n  }\n\n  /**\n   * Reorder layers by index position.\n   *\n   * @example\n   * ```typescript\n   * this.whiteboardService.reorderLayersByIndex(2, 0);\n   * ```\n   */\n  public reorderLayersByIndex(previousIndex: number, currentIndex: number): boolean {\n    const instance = this.getApi();\n    return instance.reorderLayersByIndex(previousIndex, currentIndex);\n  }\n\n  /**\n   * Toggle grid visibility.\n   */\n  public toggleGrid(): void {\n    const instance = this.getApi();\n    instance.toggleGrid();\n  }\n\n  /**\n   * Toggle snap to grid.\n   */\n  public toggleSnapToGrid(): void {\n    const instance = this.getApi();\n    instance.toggleSnapToGrid();\n  }\n\n  /**\n   * Set grid size.\n   */\n  public setGridSize(size: number): void {\n    const instance = this.getApi();\n    instance.setGridSize(size);\n  }\n\n  /**\n   * Set the active drawing tool.\n   */\n  public setActiveTool(tool: ToolType): void {\n    const instance = this.getApi();\n    instance.setActiveTool(tool);\n  }\n\n  /**\n   * Get the currently active tool.\n   */\n  public getActiveTool(): ToolType {\n    const instance = this.getApi();\n    return instance.getActiveTool();\n  }\n\n  /**\n   * Enable or disable a specific tool.\n   */\n  public setToolEnabled(toolType: ToolType, enabled: boolean): boolean {\n    const instance = this.getApi();\n    return instance.setToolEnabled(toolType, enabled);\n  }\n\n  /**\n   * Set which tools should be enabled.\n   */\n  public setEnabledTools(toolTypes: ToolType[]): void {\n    const instance = this.getApi();\n    instance.setEnabledTools(toolTypes);\n  }\n\n  /**\n   * Set cursor explicitly.\n   */\n  public setCursor(cursor: CursorType): void {\n    const instance = this.getApi();\n    instance.setCursor(cursor);\n  }\n\n  /**\n   * Reset cursor to default.\n   */\n  public resetCursor(): void {\n    const instance = this.getApi();\n    instance.resetCursor();\n  }\n\n  /**\n   * Convert screen coordinates to canvas coordinates.\n   */\n  public screenToCanvas(screenX: number, screenY: number): { x: number; y: number } {\n    const instance = this.getApi();\n    return instance.screenToCanvas(screenX, screenY);\n  }\n\n  /**\n   * Convert canvas coordinates to screen coordinates.\n   */\n  public canvasToScreen(canvasX: number, canvasY: number): { x: number; y: number } {\n    const instance = this.getApi();\n    return instance.canvasToScreen(canvasX, canvasY);\n  }\n\n  /**\n   * Get selection box signal.\n   */\n  public getSelectionBoxSignal(): Signal<SelectionBox> {\n    const instance = this.getApi();\n    return instance.getSelectionBoxSignal();\n  }\n\n  /**\n   * Get bounding box signal.\n   */\n  public getBoundingBoxSignal(): Signal<BoundingBox | null> {\n    const instance = this.getApi();\n    return instance.getBoundingBoxSignal();\n  }\n}\n","import { Directive, ElementRef, EventEmitter, inject, OnDestroy, OnInit, Output } from '@angular/core';\nimport { MOUSE_BUTTON, KEY } from '../constants';\n\nexport interface ContextMenuEvent {\n  x: number;\n  y: number;\n  originalEvent: MouseEvent;\n}\n\n@Directive({\n  selector: '[contextMenuCapture]',\n  standalone: true,\n})\nexport class ContextMenuDirective implements OnInit, OnDestroy {\n  private elementRef = inject(ElementRef);\n\n  @Output() contextMenuTriggered = new EventEmitter<ContextMenuEvent>();\n  @Output() contextMenuHidden = new EventEmitter<void>();\n\n  private contextMenuListener?: (event: MouseEvent) => void;\n  private clickListener?: (event: MouseEvent) => void;\n  private keydownListener?: (event: KeyboardEvent) => void;\n\n  ngOnInit() {\n    this.setupEventListeners();\n  }\n\n  ngOnDestroy() {\n    this.removeEventListeners();\n  }\n\n  private setupEventListeners() {\n    const element = this.elementRef.nativeElement;\n\n    this.contextMenuListener = (event: MouseEvent) => {\n      event.preventDefault();\n      event.stopPropagation();\n\n      this.contextMenuTriggered.emit({\n        x: event.clientX,\n        y: event.clientY,\n        originalEvent: event,\n      });\n    };\n\n    this.clickListener = (event: MouseEvent) => {\n      if (event.button === MOUSE_BUTTON.LEFT) {\n        this.contextMenuHidden.emit();\n      }\n    };\n\n    this.keydownListener = (event: KeyboardEvent) => {\n      if (event.key === KEY.ESCAPE) {\n        this.contextMenuHidden.emit();\n      }\n    };\n\n    element.addEventListener('contextmenu', this.contextMenuListener);\n    element.addEventListener('click', this.clickListener);\n    document.addEventListener('keydown', this.keydownListener);\n  }\n\n  private removeEventListeners() {\n    const element = this.elementRef.nativeElement;\n\n    if (this.contextMenuListener) {\n      element.removeEventListener('contextmenu', this.contextMenuListener);\n    }\n    if (this.clickListener) {\n      element.removeEventListener('click', this.clickListener);\n    }\n    if (this.keydownListener) {\n      document.removeEventListener('keydown', this.keydownListener);\n    }\n  }\n}\n","import { ChangeDetectorRef, Directive, ElementRef, OnDestroy, OnInit } from '@angular/core';\nimport { ApiService } from '../api/api.service';\n\n@Directive({\n  selector: '[resizeHandler]',\n  standalone: true,\n})\nexport class ResizeHandlerDirective implements OnInit, OnDestroy {\n  private resizeObserver!: ResizeObserver;\n\n  constructor(private elementRef: ElementRef, private apiService: ApiService, private _cd: ChangeDetectorRef) {}\n\n  ngOnInit() {\n    this.resizeObserver = new ResizeObserver(([entry]) => {\n      if (entry.target === this.elementRef.nativeElement) {\n        const { fullScreen, center } = this.apiService.getConfig();\n\n        setTimeout(() => {\n          if (fullScreen) {\n            this.apiService.fullScreen();\n          }\n          if (center && !fullScreen) {\n            this.apiService.centerCanvas();\n          }\n          this._cd.detectChanges();\n        }, 0);\n      }\n    });\n    this.resizeObserver.observe(this.elementRef.nativeElement);\n  }\n\n  ngOnDestroy() {\n    this.resizeObserver?.disconnect();\n  }\n}\n","import { Injectable, Signal, computed, signal } from '@angular/core';\nimport { ApiService } from '../../api/api.service';\nimport { AlignmentType } from '../../types';\n\nexport const CONTEXT_MENU_ICONS: Record<string, string> = {\n  // Clipboard\n  cut: '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M3.5 2.5a.5.5 0 0 0-1 0v11a.5.5 0 0 0 1 0v-11Zm9 0a.5.5 0 0 0-1 0v11a.5.5 0 0 0 1 0v-11ZM5 1a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v1h.5A1.5 1.5 0 0 1 13 3.5V12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3.5A1.5 1.5 0 0 1 4.5 2H5V1Zm1 0v1h4V1H6Z\"/></svg>',\n  copy: '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M4 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V2Zm2-1a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H6ZM2 5a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1v-1h1v1a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h1v1H2Z\"/></svg>',\n  paste:\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M4.5 3a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h7a.5.5 0 0 0 .5-.5v-9a.5.5 0 0 0-.5-.5h-7Zm-1.5.5A1.5 1.5 0 0 1 4.5 2h7A1.5 1.5 0 0 1 13 3.5v9a1.5 1.5 0 0 1-1.5 1.5h-7A1.5 1.5 0 0 1 3 12.5v-9ZM6 1a1 1 0 0 0-1 1h6a1 1 0 0 0-1-1H6Z\"/></svg>',\n  duplicate:\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M11 2a2 2 0 0 1 2 2v6.5a.5.5 0 0 1-1 0V4a1 1 0 0 0-1-1H4a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h6.5a.5.5 0 0 1 0 1H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h7Zm4.854 5.146a.5.5 0 0 1 0 .708l-3 3a.5.5 0 0 1-.708 0l-1.5-1.5a.5.5 0 0 1 .708-.708L12.5 9.793l2.646-2.647a.5.5 0 0 1 .708 0Z\"/></svg>',\n\n  // Selection\n  'select-all':\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M1.5 2A1.5 1.5 0 0 0 0 3.5v9A1.5 1.5 0 0 0 1.5 14h13a1.5 1.5 0 0 0 1.5-1.5v-9A1.5 1.5 0 0 0 14.5 2h-13ZM1 3.5a.5.5 0 0 1 .5-.5h13a.5.5 0 0 1 .5.5V13a.5.5 0 0 1-.5.5h-13A.5.5 0 0 1 1 13V3.5Z\"/></svg>',\n  delete:\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5Zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5Zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6Z\"/><path d=\"M14.5 3a1 1 0 0 1-1 1H13v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4h-.5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1H6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1h3.5a1 1 0 0 1 1 1v1ZM4.118 4 4 4.059V13a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4.059L11.882 4H4.118ZM2.5 3h11V2h-11v1Z\"/></svg>',\n\n  // Order\n  order:\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M8 3a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.5.5H6a.5.5 0 0 1 0-1h1.5V3.5A.5.5 0 0 1 8 3Zm0 7a.5.5 0 0 1 .5.5V12H10a.5.5 0 0 1 0 1H8a.5.5 0 0 1-.5-.5v-2A.5.5 0 0 1 8 10Zm-5-3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm5 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm5 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\"/></svg>',\n  'bring-to-front':\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M2 0a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h4a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2Zm6 9v5a2 2 0 0 0 2 2h4a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2H9Z\"/></svg>',\n  'bring-forward':\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M1 2a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2Zm1 0v4h6V2H2Zm6 6v6a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1Zm6-6v4a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h5a1 1 0 0 1 1 1Zm-1 0H9v4h5V2Z\"/></svg>',\n  'send-backward':\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M0 2a1 1 0 0 1 1-1h5a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V2Zm1 0v4h5V2H1Zm0 6v6a1 1 0 0 1 1 1h6a1 1 0 0 1-1-1V8a1 1 0 0 1-1-1H1Zm8-6v4a1 1 0 0 1 1 1h5a1 1 0 0 1 1-1V2a1 1 0 0 1-1-1H9a1 1 0 0 1 1 1Z\"/></svg>',\n  'send-to-back':\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M0 2a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2Zm8 7h6a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2V9Z\"/></svg>',\n\n  // Align\n  align:\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M1.5 0A1.5 1.5 0 0 0 0 1.5v13A1.5 1.5 0 0 0 1.5 16h13a1.5 1.5 0 0 0 1.5-1.5v-13A1.5 1.5 0 0 0 14.5 0h-13ZM1 1.5a.5.5 0 0 1 .5-.5H4v3.5H1V1.5ZM5 4.5h6V1H5v3.5ZM12 5h3v6h-3V5Zm-1 6H5V5h6v6Zm-7-6H1v6h3V5Z\"/></svg>',\n  'align-left':\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M1.5 1a.5.5 0 0 0-1 0v14a.5.5 0 0 0 1 0V1Zm3 0a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 .5.5v3a.5.5 0 0 1-.5.5H5a.5.5 0 0 1-.5-.5V1Zm0 7a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 .5.5v3a.5.5 0 0 1-.5.5H5a.5.5 0 0 1-.5-.5V8Z\"/></svg>',\n  'align-center':\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M8 1a.5.5 0 0 0-.5.5v13a.5.5 0 0 0 1 0v-13A.5.5 0 0 0 8 1ZM2 4.5a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-11a.5.5 0 0 1-.5-.5v-1Zm2 5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-7a.5.5 0 0 1-.5-.5v-1Z\"/></svg>',\n  'align-right':\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M14.5 1a.5.5 0 0 1 1 0v14a.5.5 0 0 1-1 0V1Zm-2.5 0a.5.5 0 0 1 .5-.5H5a.5.5 0 0 1 .5.5v3a.5.5 0 0 1-.5.5h7a.5.5 0 0 1-.5-.5V1Zm0 7a.5.5 0 0 1 .5-.5H2a.5.5 0 0 1 .5.5v3a.5.5 0 0 1-.5.5h10a.5.5 0 0 1-.5-.5V8Z\"/></svg>',\n  'align-top':\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M1 1.5a.5.5 0 0 0 1 0V1h13v.5a.5.5 0 0 0 1 0V1a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v.5Zm4 1a.5.5 0 0 1 .5.5v10a.5.5 0 0 1-1 0V3a.5.5 0 0 1 .5-.5Zm6 0a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-1 0V3a.5.5 0 0 1 .5-.5Z\"/></svg>',\n  'align-middle':\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M1 8a.5.5 0 0 0 .5.5H15a.5.5 0 0 0 0-1H1.5A.5.5 0 0 0 1 8Zm3.5-5a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-1 0v-9a.5.5 0 0 1 .5-.5Zm7 0a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-1 0v-9a.5.5 0 0 1 .5-.5Z\"/></svg>',\n  'align-bottom':\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M1 14.5a.5.5 0 0 1 1 0V15h13v-.5a.5.5 0 0 1 1 0V15a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1v-.5Zm4-1a.5.5 0 0 0 .5-.5V3a.5.5 0 0 0-1 0v10a.5.5 0 0 0 .5.5Zm6 0a.5.5 0 0 0 .5-.5V6a.5.5 0 0 0-1 0v7a.5.5 0 0 0 .5.5Z\"/></svg>',\n\n  // Distribute\n  distribute:\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M1 1.5a.5.5 0 0 1 1 0v13a.5.5 0 0 1-1 0v-13Zm14 0a.5.5 0 0 0-1 0v13a.5.5 0 0 0 1 0v-13ZM5 5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V5Z\"/></svg>',\n  'distribute-horizontal':\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M1 1.5a.5.5 0 0 1 1 0v13a.5.5 0 0 1-1 0v-13Zm14 0a.5.5 0 0 0-1 0v13a.5.5 0 0 0 1 0v-13ZM4 5a1 1 0 0 1 1-1h1a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5Zm5 0a1 1 0 0 1 1-1h1a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1h-1a1 1 0 0 1-1-1V5Z\"/></svg>',\n  'distribute-vertical':\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M1.5 1a.5.5 0 0 0 0 1h13a.5.5 0 0 0 0-1h-13Zm0 14a.5.5 0 0 1 0-1h13a.5.5 0 0 1 0 1h-13ZM5 4a1 1 0 0 0-1 1v1a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1H5Zm0 5a1 1 0 0 0-1 1v1a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1v-1a1 1 0 0 0-1-1H5Z\"/></svg>',\n\n  // Flip\n  flip: '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M8 0a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-1 0V.5A.5.5 0 0 1 8 0ZM2.5 2A1.5 1.5 0 0 0 1 3.5v9A1.5 1.5 0 0 0 2.5 14h4a.5.5 0 0 0 0-1h-4a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5h4a.5.5 0 0 0 0-1h-4Zm7 0a.5.5 0 0 0 0 1h4a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-4a.5.5 0 0 0 0 1h4a1.5 1.5 0 0 0 1.5-1.5v-9A1.5 1.5 0 0 0 13.5 2h-4Z\"/></svg>',\n  'flip-horizontal':\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M8 0a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-1 0V.5A.5.5 0 0 1 8 0ZM2.5 2A1.5 1.5 0 0 0 1 3.5v9A1.5 1.5 0 0 0 2.5 14h4a.5.5 0 0 0 0-1h-4a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5h4a.5.5 0 0 0 0-1h-4Zm7 0a.5.5 0 0 0 0 1h4a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-4a.5.5 0 0 0 0 1h4a1.5 1.5 0 0 0 1.5-1.5v-9A1.5 1.5 0 0 0 13.5 2h-4Z\"/></svg>',\n  'flip-vertical':\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M.5 8a.5.5 0 0 0 .5.5h15a.5.5 0 0 0 0-1H1A.5.5 0 0 0 .5 8ZM2 2.5A1.5 1.5 0 0 1 3.5 1h9A1.5 1.5 0 0 1 14 2.5v4a.5.5 0 0 1-1 0v-4a.5.5 0 0 0-.5-.5h-9a.5.5 0 0 0-.5.5v4a.5.5 0 0 1-1 0v-4Zm0 11v-4a.5.5 0 0 1 1 0v4a.5.5 0 0 0 .5.5h9a.5.5 0 0 0 .5-.5v-4a.5.5 0 0 1 1 0v4a1.5 1.5 0 0 1-1.5 1.5h-9A1.5 1.5 0 0 1 2 13.5Z\"/></svg>',\n\n  // Group\n  group:\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M1.5 3A1.5 1.5 0 0 0 0 4.5v7A1.5 1.5 0 0 0 1.5 13H7a.5.5 0 0 0 0-1H1.5a.5.5 0 0 1-.5-.5v-7a.5.5 0 0 1 .5-.5H7a.5.5 0 0 0 0-1H1.5ZM9 4a.5.5 0 0 0 0 1h5.5a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-.5.5H9a.5.5 0 0 0 0 1h5.5a1.5 1.5 0 0 0 1.5-1.5v-7A1.5 1.5 0 0 0 14.5 3H9Z\"/></svg>',\n  ungroup:\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M0 1.5A1.5 1.5 0 0 1 1.5 0h5A1.5 1.5 0 0 1 8 1.5V7H1.5A1.5 1.5 0 0 1 0 5.5v-4Zm8 0V7h6.5A1.5 1.5 0 0 0 16 5.5v-4A1.5 1.5 0 0 0 14.5 0h-5A1.5 1.5 0 0 0 8 1.5Zm-8 8A1.5 1.5 0 0 1 1.5 8H8v6.5A1.5 1.5 0 0 1 6.5 16h-5A1.5 1.5 0 0 1 0 14.5v-5Zm8 0V16h6a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 14 8H8Z\"/></svg>',\n  lock: '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2zm3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2zM5 8h6a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1z\"/></svg>',\n  unlock:\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M11 1a2 2 0 0 0-2 2v4a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h5V3a3 3 0 0 1 6 0v4a.5.5 0 0 1-1 0V3a2 2 0 0 0-2-2zM3 8a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V9a1 1 0 0 0-1-1H3z\"/></svg>',\n\n  // Submenu arrow\n  'arrow-right':\n    '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/></svg>',\n};\n\nexport interface ContextMenuItem {\n  id: string;\n  label: string;\n  icon?: string;\n  shortcut?: string;\n  enabled: boolean;\n  visible: boolean;\n  action?: () => void;\n  divider?: boolean;\n  submenu?: ContextMenuItem[];\n}\n\nexport interface ContextMenuSection {\n  id: string;\n  items: ContextMenuItem[];\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ContextMenuService {\n  private readonly contextMenuVisibleSignal = signal(false);\n  private readonly contextMenuPositionSignal = signal({ x: 0, y: 0 });\n  private readonly containerBoundsSignal = signal<DOMRect | null>(null);\n\n  // Keyboard navigation state\n  private readonly focusedItemIndexSignal = signal<number>(-1);\n  private readonly focusedSubmenuIdSignal = signal<string | null>(null);\n\n  constructor(private apiService: ApiService) {}\n\n  // Computed cache of all menu items for keyboard navigation\n  private readonly allMenuItemsCache = computed(() => {\n    const sections = this.getContextMenuSections()();\n    const allItems: ContextMenuItem[] = [];\n    sections.forEach((section) => {\n      section.items.forEach((item) => {\n        allItems.push(item);\n        if (item.submenu && this.focusedSubmenuIdSignal() === item.id) {\n          item.submenu.forEach((subItem) => {\n            allItems.push(subItem);\n          });\n        }\n      });\n    });\n    return allItems;\n  });\n\n  // Getters for context menu state\n  getContextMenuVisible(): Signal<boolean> {\n    return this.contextMenuVisibleSignal.asReadonly();\n  }\n\n  getContextMenuPosition(): Signal<{ x: number; y: number }> {\n    return this.contextMenuPositionSignal.asReadonly();\n  }\n\n  getContainerBounds(): Signal<DOMRect | null> {\n    return this.containerBoundsSignal.asReadonly();\n  }\n\n  getFocusedItemIndex(): Signal<number> {\n    return this.focusedItemIndexSignal.asReadonly();\n  }\n\n  getFocusedSubmenuId(): Signal<string | null> {\n    return this.focusedSubmenuIdSignal.asReadonly();\n  }\n\n  // Context menu control methods\n  showContextMenu(x: number, y: number, containerBounds?: DOMRect): void {\n    this.contextMenuPositionSignal.set({ x, y });\n    this.containerBoundsSignal.set(containerBounds || null);\n    this.contextMenuVisibleSignal.set(true);\n    this.focusedItemIndexSignal.set(-1);\n    this.focusedSubmenuIdSignal.set(null);\n  }\n\n  hideContextMenu(): void {\n    this.contextMenuVisibleSignal.set(false);\n    this.focusedItemIndexSignal.set(-1);\n    this.focusedSubmenuIdSignal.set(null);\n  }\n\n  // Get context menu sections with dynamic enable/disable logic\n  getContextMenuSections(): Signal<ContextMenuSection[]> {\n    return computed(() => {\n      const selectedElements = this.apiService.getSelectedElements();\n      const hasSelection = selectedElements.length > 0;\n      const hasMultipleSelection = selectedElements.length > 1;\n      const canDistribute = selectedElements.length > 2;\n      const clipboardInfo = this.apiService.getClipboardInfo();\n      const hasClipboardData = clipboardInfo !== null && clipboardInfo.elementCount > 0;\n      const hasGroupedElements = hasSelection && selectedElements.some((el) => el.groupId);\n      const hasLockedElements = hasSelection && selectedElements.some((el) => el.locked);\n      const hasUnlockedElements = hasSelection && selectedElements.some((el) => !el.locked);\n\n      const sections: ContextMenuSection[] = [\n        // 📋 CLIPBOARD\n        {\n          id: 'clipboard',\n          items: [\n            {\n              id: 'cut',\n              label: 'Cut',\n              shortcut: 'Ctrl+X',\n              enabled: hasSelection,\n              visible: hasSelection,\n              action: () => this.apiService.cutElements(),\n            },\n            {\n              id: 'copy',\n              label: 'Copy',\n              shortcut: 'Ctrl+C',\n              enabled: hasSelection,\n              visible: hasSelection,\n              action: () => this.apiService.copyElements(),\n            },\n            {\n              id: 'paste',\n              label: 'Paste',\n              shortcut: 'Ctrl+V',\n              enabled: hasClipboardData,\n              visible: hasClipboardData,\n              action: () => this.apiService.pasteElements(),\n            },\n            {\n              id: 'duplicate',\n              label: 'Duplicate',\n              shortcut: 'Ctrl+D',\n              enabled: hasSelection,\n              visible: hasSelection,\n              divider: true,\n              action: () => this.apiService.duplicateElements(),\n            },\n          ],\n        },\n\n        // 🎯 SELECTION\n        {\n          id: 'selection',\n          items: [\n            {\n              id: 'select-all',\n              label: 'Select All',\n              shortcut: 'Ctrl+A',\n              enabled: true,\n              visible: true,\n              action: () => this.apiService.selectAll(),\n            },\n            {\n              id: 'delete',\n              label: 'Delete',\n              shortcut: 'Del',\n              enabled: hasSelection,\n              visible: hasSelection,\n              divider: true,\n              action: () => this.apiService.deleteSelectedElements(),\n            },\n          ],\n        },\n\n        // 🎨 ARRANGE\n        {\n          id: 'arrange',\n          items: [\n            {\n              id: 'order',\n              label: 'Order',\n              enabled: hasSelection,\n              visible: hasSelection,\n              submenu: [\n                {\n                  id: 'bring-to-front',\n                  label: 'Bring to Front',\n                  shortcut: 'Ctrl+Shift+]',\n                  enabled: true,\n                  visible: true,\n                  action: () => this.apiService.bringToFront(),\n                },\n                {\n                  id: 'bring-forward',\n                  label: 'Bring Forward',\n                  shortcut: 'Ctrl+]',\n                  enabled: true,\n                  visible: true,\n                  action: () => this.apiService.bringForward(),\n                },\n                {\n                  id: 'send-backward',\n                  label: 'Send Backward',\n                  shortcut: 'Ctrl+[',\n                  enabled: true,\n                  visible: true,\n                  action: () => this.apiService.sendBackward(),\n                },\n                {\n                  id: 'send-to-back',\n                  label: 'Send to Back',\n                  shortcut: 'Ctrl+Shift+[',\n                  enabled: true,\n                  visible: true,\n                  action: () => this.apiService.sendToBack(),\n                },\n              ],\n            },\n            {\n              id: 'transform',\n              label: 'Transform',\n              enabled: hasSelection,\n              visible: hasSelection,\n              submenu: [\n                {\n                  id: 'align-left',\n                  label: 'Align Left',\n                  enabled: true,\n                  visible: true,\n                  action: () => this.apiService.alignElements(AlignmentType.Left),\n                },\n                {\n                  id: 'align-center',\n                  label: 'Align Center',\n                  enabled: true,\n                  visible: true,\n                  action: () => this.apiService.alignElements(AlignmentType.Center),\n                },\n                {\n                  id: 'align-right',\n                  label: 'Align Right',\n                  enabled: true,\n                  visible: true,\n                  divider: true,\n                  action: () => this.apiService.alignElements(AlignmentType.Right),\n                },\n                {\n                  id: 'align-top',\n                  label: 'Align Top',\n                  enabled: true,\n                  visible: true,\n                  action: () => this.apiService.alignElements(AlignmentType.Top),\n                },\n                {\n                  id: 'align-middle',\n                  label: 'Align Middle',\n                  enabled: true,\n                  visible: true,\n                  action: () => this.apiService.alignElements(AlignmentType.Middle),\n                },\n                {\n                  id: 'align-bottom',\n                  label: 'Align Bottom',\n                  enabled: true,\n                  visible: true,\n                  divider: true,\n                  action: () => this.apiService.alignElements(AlignmentType.Bottom),\n                },\n                {\n                  id: 'distribute-horizontal',\n                  label: 'Distribute Horizontally',\n                  enabled: canDistribute,\n                  visible: canDistribute,\n                  action: () => this.apiService.distributeHorizontally(),\n                },\n                {\n                  id: 'distribute-vertical',\n                  label: 'Distribute Vertically',\n                  enabled: canDistribute,\n                  visible: canDistribute,\n                  divider: true,\n                  action: () => this.apiService.distributeVertically(),\n                },\n                {\n                  id: 'flip-horizontal',\n                  label: 'Flip Horizontal',\n                  enabled: true,\n                  visible: true,\n                  action: () => this.apiService.flipHorizontal(),\n                },\n                {\n                  id: 'flip-vertical',\n                  label: 'Flip Vertical',\n                  enabled: true,\n                  visible: true,\n                  action: () => this.apiService.flipVertical(),\n                },\n              ],\n            },\n          ],\n        },\n\n        // � OBJECT\n        {\n          id: 'object',\n          items: [\n            {\n              id: 'group',\n              label: 'Group',\n              shortcut: 'Ctrl+G',\n              enabled: hasMultipleSelection,\n              visible: hasMultipleSelection,\n              action: () => this.apiService.groupSelectedElements(),\n            },\n            {\n              id: 'ungroup',\n              label: 'Ungroup',\n              shortcut: 'Ctrl+Shift+G',\n              enabled: hasGroupedElements,\n              visible: hasGroupedElements,\n              action: () => this.apiService.ungroupSelectedElements(),\n            },\n            {\n              id: 'lock',\n              label: 'Lock',\n              shortcut: 'Ctrl+L',\n              enabled: hasUnlockedElements,\n              visible: hasUnlockedElements,\n              action: () => this.apiService.lockElements(),\n            },\n            {\n              id: 'unlock',\n              label: 'Unlock',\n              shortcut: 'Ctrl+Shift+L',\n              enabled: hasLockedElements,\n              visible: hasLockedElements,\n              action: () => this.apiService.unlockElements(),\n            },\n          ],\n        },\n      ];\n\n      // Filter out empty sections (sections with no visible items)\n      const filteredSections = sections\n        .map((section) => ({\n          ...section,\n          items: section.items.filter((item) => item.visible),\n        }))\n        .filter((section) => section.items.length > 0);\n\n      return filteredSections;\n    });\n  }\n\n  // Execute action and hide menu\n  executeAction(action: () => void): void {\n    try {\n      action();\n    } catch (error) {\n      console.error('Error executing context menu action:', error);\n    } finally {\n      this.hideContextMenu();\n    }\n  }\n\n  // Keyboard navigation methods\n  focusNextItem(): void {\n    const allItems = this.allMenuItemsCache();\n    const enabledItems = allItems.filter((item) => item.enabled);\n    if (enabledItems.length === 0) return;\n\n    const currentIndex = this.focusedItemIndexSignal();\n    const currentItem = currentIndex >= 0 ? allItems[currentIndex] : null;\n    const currentEnabledIndex = currentItem ? enabledItems.indexOf(currentItem) : -1;\n\n    const nextEnabledIndex = (currentEnabledIndex + 1) % enabledItems.length;\n    const nextItem = enabledItems[nextEnabledIndex];\n    const nextIndex = allItems.indexOf(nextItem);\n\n    this.focusedItemIndexSignal.set(nextIndex);\n  }\n\n  focusPreviousItem(): void {\n    const allItems = this.allMenuItemsCache();\n    const enabledItems = allItems.filter((item) => item.enabled);\n    if (enabledItems.length === 0) return;\n\n    const currentIndex = this.focusedItemIndexSignal();\n    const currentItem = currentIndex >= 0 ? allItems[currentIndex] : null;\n    const currentEnabledIndex = currentItem ? enabledItems.indexOf(currentItem) : -1;\n\n    const prevEnabledIndex = currentEnabledIndex <= 0 ? enabledItems.length - 1 : currentEnabledIndex - 1;\n    const prevItem = enabledItems[prevEnabledIndex];\n    const prevIndex = allItems.indexOf(prevItem);\n\n    this.focusedItemIndexSignal.set(prevIndex);\n  }\n\n  focusFirstItem(): void {\n    const allItems = this.allMenuItemsCache();\n    const enabledItems = allItems.filter((item) => item.enabled);\n    if (enabledItems.length === 0) return;\n\n    const firstItem = enabledItems[0];\n    const firstIndex = allItems.indexOf(firstItem);\n    this.focusedItemIndexSignal.set(firstIndex);\n  }\n\n  focusLastItem(): void {\n    const allItems = this.allMenuItemsCache();\n    const enabledItems = allItems.filter((item) => item.enabled);\n    if (enabledItems.length === 0) return;\n\n    const lastItem = enabledItems[enabledItems.length - 1];\n    const lastIndex = allItems.indexOf(lastItem);\n    this.focusedItemIndexSignal.set(lastIndex);\n  }\n\n  openFocusedSubmenu(): void {\n    const allItems = this.allMenuItemsCache();\n    const currentIndex = this.focusedItemIndexSignal();\n    if (currentIndex < 0 || currentIndex >= allItems.length) return;\n\n    const item = allItems[currentIndex];\n    if (item.submenu && item.enabled) {\n      this.focusedSubmenuIdSignal.set(item.id);\n    }\n  }\n\n  closeFocusedSubmenu(): void {\n    this.focusedSubmenuIdSignal.set(null);\n  }\n\n  executeFocusedAction(): void {\n    const allItems = this.allMenuItemsCache();\n    const currentIndex = this.focusedItemIndexSignal();\n    if (currentIndex < 0 || currentIndex >= allItems.length) return;\n\n    const item = allItems[currentIndex];\n    if (item.enabled && item.action) {\n      this.executeAction(item.action);\n    } else if (item.submenu && item.enabled) {\n      this.openFocusedSubmenu();\n    }\n  }\n\n  // Get icon SVG\n  getIcon(iconName?: string): string {\n    if (!iconName) return '';\n    return CONTEXT_MENU_ICONS[iconName] || '';\n  }\n\n  // Get all menu items (for keyboard navigation)\n  getAllMenuItems(): ContextMenuItem[] {\n    return this.allMenuItemsCache();\n  }\n}\n","import { Component, computed, ElementRef, HostListener, OnDestroy, OnInit, Signal, ViewChild } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ContextMenuService, ContextMenuItem, ContextMenuSection } from './context-menu.service';\n\n@Component({\n  selector: 'wb-context-menu',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div\n      #contextMenu\n      class=\"context-menu\"\n      [class.visible]=\"isVisible()\"\n      [style.left.px]=\"position().x\"\n      [style.top.px]=\"position().y\"\n      (click)=\"$event.stopPropagation()\"\n    >\n      <div class=\"context-menu-content\">\n        @for (section of sections(); track section.id) {\n        <div class=\"context-menu-section\">\n          @for (item of section.items; track item.id) {\n          <div\n            class=\"context-menu-item\"\n            [class.disabled]=\"!item.enabled\"\n            [class.divider-after]=\"item.divider\"\n            [class.has-submenu]=\"item.submenu\"\n            [class.active]=\"hoveredItem === item\"\n            [class.focused]=\"isFocused(item)\"\n            (click)=\"onItemClick(item, $event)\"\n            (mouseenter)=\"onItemHover(item, $event)\"\n            (mouseleave)=\"onItemLeave()\"\n            [attr.title]=\"item.shortcut || null\"\n          >\n            <div class=\"item-content\">\n              <span class=\"item-label\">{{ item.label }}</span>\n              @if (item.shortcut) {\n              <span class=\"item-shortcut\">{{ item.shortcut }}</span>\n              } @if (item.submenu) {\n              <span class=\"item-arrow\">›</span>\n              }\n            </div>\n          </div>\n          }\n        </div>\n        }\n      </div>\n    </div>\n\n    <!-- Submenu rendered separately outside main menu -->\n    @if (hoveredItem && hoveredItem.submenu) {\n    <div\n      class=\"submenu\"\n      [style.left.px]=\"submenuPosition.left\"\n      [style.top.px]=\"submenuPosition.top\"\n      (mouseenter)=\"onSubmenuEnter()\"\n      (mouseleave)=\"onSubmenuLeave()\"\n      (click)=\"$event.stopPropagation()\"\n    >\n      @for (subitem of hoveredItem.submenu; track subitem.id) {\n      <div\n        class=\"context-menu-item submenu-item\"\n        [class.disabled]=\"!subitem.enabled\"\n        [class.divider-after]=\"subitem.divider\"\n        [class.focused]=\"isFocused(subitem)\"\n        (click)=\"onItemClick(subitem, $event)\"\n        [attr.title]=\"subitem.shortcut || null\"\n      >\n        <div class=\"item-content\">\n          <span class=\"item-label\">{{ subitem.label }}</span>\n          @if (subitem.shortcut) {\n          <span class=\"item-shortcut\">{{ subitem.shortcut }}</span>\n          }\n        </div>\n      </div>\n      }\n    </div>\n    }\n  `,\n  styles: [\n    `\n      .context-menu {\n        position: absolute;\n        z-index: 10000;\n        opacity: 0;\n        visibility: hidden;\n        transform: scale(0.95);\n        transition: all 0.1s ease-out;\n        pointer-events: none;\n      }\n\n      .context-menu.visible {\n        opacity: 1;\n        visibility: visible;\n        transform: scale(1);\n        pointer-events: auto;\n      }\n\n      .context-menu-content {\n        background: #ffffff;\n        border: 1px solid #e0e0e0;\n        border-radius: 6px;\n        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n        padding: 4px 0;\n        min-width: 200px;\n        max-width: 300px;\n        max-height: 400px;\n        overflow-y: auto;\n        user-select: none;\n      }\n\n      /* Custom scrollbar for context menu */\n      .context-menu-content::-webkit-scrollbar {\n        width: 6px;\n      }\n\n      .context-menu-content::-webkit-scrollbar-track {\n        background: #f1f1f1;\n        border-radius: 3px;\n      }\n\n      .context-menu-content::-webkit-scrollbar-thumb {\n        background: #c1c1c1;\n        border-radius: 3px;\n      }\n\n      .context-menu-content::-webkit-scrollbar-thumb:hover {\n        background: #a8a8a8;\n      }\n\n      .context-menu-section:not(:last-child) {\n        border-bottom: 1px solid #f0f0f0;\n        margin-bottom: 4px;\n        padding-bottom: 4px;\n      }\n\n      .context-menu-item {\n        padding: 8px 16px;\n        cursor: pointer;\n        transition: background-color 0.1s ease;\n        position: relative;\n      }\n\n      .context-menu-item:hover:not(.disabled) {\n        background-color: #f5f5f5;\n      }\n\n      .context-menu-item.focused:not(.disabled) {\n        background-color: #e3f2fd;\n        outline: 2px solid #2196f3;\n        outline-offset: -2px;\n      }\n\n      .context-menu-item.disabled {\n        opacity: 0.5;\n        cursor: not-allowed;\n      }\n\n      .context-menu-item.divider-after::after {\n        content: '';\n        position: absolute;\n        bottom: 0;\n        left: 16px;\n        right: 16px;\n        height: 1px;\n        background-color: #e0e0e0;\n        margin-bottom: -4px;\n      }\n\n      .item-content {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        width: 100%;\n      }\n\n      .item-label {\n        flex: 1;\n        font-size: 14px;\n        color: #333;\n        font-weight: 400;\n      }\n\n      .item-shortcut {\n        font-size: 12px;\n        color: #666;\n        margin-left: 16px;\n        font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n      }\n\n      .item-arrow {\n        margin-left: 8px;\n        font-size: 16px;\n        color: #999;\n      }\n\n      .context-menu-item.has-submenu {\n        position: relative;\n      }\n\n      .context-menu-item.has-submenu.active {\n        background-color: #f5f5f5;\n      }\n\n      .submenu {\n        position: absolute;\n        background: #ffffff;\n        border: 1px solid #e0e0e0;\n        border-radius: 6px;\n        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n        padding: 4px 0;\n        min-width: 200px;\n        max-width: 300px;\n        user-select: none;\n        z-index: 10001;\n        opacity: 1;\n        transform: scale(1);\n        transition: opacity 0.1s ease, transform 0.1s ease;\n      }\n\n      .submenu-item {\n        padding: 8px 16px;\n      }\n\n      .submenu-item:hover:not(.disabled) {\n        background-color: #f5f5f5;\n      }\n\n      .context-menu-item.disabled .item-label,\n      .context-menu-item.disabled .item-shortcut,\n      .context-menu-item.disabled .item-arrow {\n        color: #999;\n      }\n\n      /* Dark theme support */\n      @media (prefers-color-scheme: dark) {\n        .context-menu-content,\n        .submenu {\n          background: #2a2a2a;\n          border-color: #404040;\n        }\n\n        .context-menu-content::-webkit-scrollbar-track {\n          background: #3a3a3a;\n        }\n\n        .context-menu-content::-webkit-scrollbar-thumb {\n          background: #666666;\n        }\n\n        .context-menu-content::-webkit-scrollbar-thumb:hover {\n          background: #777777;\n        }\n\n        .context-menu-item:hover:not(.disabled) {\n          background-color: #404040;\n        }\n\n        .context-menu-item.focused:not(.disabled) {\n          background-color: #1e3a5f;\n          outline: 2px solid #1976d2;\n        }\n\n        .context-menu-item.has-submenu.active {\n          background-color: #404040;\n        }\n\n        .submenu-item:hover:not(.disabled) {\n          background-color: #404040;\n        }\n\n        .item-label {\n          color: #e0e0e0;\n        }\n\n        .item-shortcut {\n          color: #a0a0a0;\n        }\n\n        .item-arrow {\n          color: #666;\n        }\n\n        .context-menu-item.disabled .item-label,\n        .context-menu-item.disabled .item-shortcut,\n        .context-menu-item.disabled .item-arrow {\n          color: #666;\n        }\n\n        .context-menu-section:not(:last-child) {\n          border-bottom-color: #404040;\n        }\n\n        .context-menu-item.divider-after::after {\n          background-color: #404040;\n        }\n      }\n    `,\n  ],\n})\nexport class ContextMenuComponent implements OnInit, OnDestroy {\n  @ViewChild('contextMenu', { static: true }) contextMenu!: ElementRef<HTMLDivElement>;\n\n  isVisible: Signal<boolean>;\n  position: Signal<{ x: number; y: number }>;\n  sections: Signal<ContextMenuSection[]>;\n  containerBounds: Signal<DOMRect | null>;\n  focusedItem: Signal<ContextMenuItem | null>;\n\n  hoveredItem: ContextMenuItem | null = null;\n  submenuPosition = { left: 0, top: 0 };\n  private submenuTimeout: ReturnType<typeof setTimeout> | null = null;\n\n  constructor(private contextMenuService: ContextMenuService) {\n    this.isVisible = this.contextMenuService.getContextMenuVisible();\n    this.position = this.contextMenuService.getContextMenuPosition();\n    this.sections = this.contextMenuService.getContextMenuSections();\n    this.containerBounds = this.contextMenuService.getContainerBounds();\n\n    // Create a computed signal that returns the focused item directly\n    this.focusedItem = computed(() => {\n      const focusedIndex = this.contextMenuService.getFocusedItemIndex()();\n      const allItems = this.contextMenuService.getAllMenuItems();\n      return allItems[focusedIndex] || null;\n    });\n  }\n\n  ngOnInit(): void {\n    this.position = computed(() => {\n      const pos = this.contextMenuService.getContextMenuPosition()();\n      const containerBounds = this.containerBounds();\n\n      let x = pos.x;\n      let y = pos.y;\n\n      if (containerBounds) {\n        x = pos.x - containerBounds.left;\n        y = pos.y - containerBounds.top;\n      }\n\n      return this.adjustPosition(x, y);\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.contextMenuService.hideContextMenu();\n    if (this.submenuTimeout) {\n      clearTimeout(this.submenuTimeout);\n    }\n  }\n\n  onItemClick(item: ContextMenuItem, event: MouseEvent): void {\n    if (!item.enabled) return;\n\n    if (item.submenu) {\n      event.stopPropagation();\n      return;\n    }\n\n    if (item.action) {\n      this.contextMenuService.executeAction(item.action);\n    }\n  }\n\n  onItemHover(item: ContextMenuItem, event: MouseEvent): void {\n    if (this.submenuTimeout) {\n      clearTimeout(this.submenuTimeout);\n      this.submenuTimeout = null;\n    }\n\n    if (item.submenu && item.enabled) {\n      this.hoveredItem = item;\n      const target = event.currentTarget as HTMLElement;\n      this.calculateSubmenuPosition(target);\n    } else {\n      this.hoveredItem = null;\n    }\n  }\n\n  onItemLeave(): void {\n    if (this.submenuTimeout) {\n      clearTimeout(this.submenuTimeout);\n    }\n    this.submenuTimeout = setTimeout(() => {\n      this.hoveredItem = null;\n    }, 100);\n  }\n\n  onSubmenuEnter(): void {\n    if (this.submenuTimeout) {\n      clearTimeout(this.submenuTimeout);\n      this.submenuTimeout = null;\n    }\n  }\n\n  onSubmenuLeave(): void {\n    if (this.submenuTimeout) {\n      clearTimeout(this.submenuTimeout);\n    }\n    this.submenuTimeout = setTimeout(() => {\n      this.hoveredItem = null;\n    }, 100);\n  }\n\n  private calculateSubmenuPosition(itemElement: HTMLElement): void {\n    const itemRect = itemElement.getBoundingClientRect();\n    const containerBounds = this.containerBounds();\n\n    if (!containerBounds) {\n      this.submenuPosition = {\n        left: itemRect.right + 4,\n        top: itemRect.top - 4,\n      };\n      return;\n    }\n\n    const submenuWidth = 200;\n    const padding = 4;\n\n    const itemRelativeLeft = itemRect.left - containerBounds.left;\n    const itemRelativeRight = itemRect.right - containerBounds.left;\n    const itemRelativeTop = itemRect.top - containerBounds.top;\n\n    const contextMenuElement = this.contextMenu?.nativeElement;\n    const contextMenuRect = contextMenuElement?.getBoundingClientRect();\n    const contextMenuTop = contextMenuRect ? contextMenuRect.top - containerBounds.top : padding;\n    const contextMenuBottom = contextMenuRect\n      ? contextMenuRect.bottom - containerBounds.top\n      : containerBounds.height - padding;\n\n    // Calculate horizontal position\n    let left = itemRelativeRight + padding;\n\n    const spaceOnRight = containerBounds.width - itemRelativeRight - padding;\n    const spaceOnLeft = itemRelativeLeft - padding;\n\n    if (spaceOnRight < submenuWidth && spaceOnLeft > spaceOnRight) {\n      left = itemRelativeLeft - submenuWidth - padding;\n    }\n\n    // Calculate vertical position - align with item initially\n    let top = itemRelativeTop;\n\n    // Estimate submenu height (will be calculated dynamically based on items)\n    const estimatedItemHeight = 32; // Approximate height per item\n    const submenuItemCount = this.hoveredItem?.submenu?.length || 0;\n    const submenuHeight = submenuItemCount * estimatedItemHeight + 8; // +8 for padding\n\n    // Ensure submenu doesn't exceed context menu bottom\n    const submenuBottom = top + submenuHeight;\n    if (submenuBottom > contextMenuBottom) {\n      top = contextMenuBottom - submenuHeight;\n    }\n\n    // Ensure submenu doesn't go above context menu top\n    if (top < contextMenuTop) {\n      top = contextMenuTop;\n    }\n\n    // Final horizontal bounds check\n    if (left < padding) {\n      left = padding;\n    }\n    if (left + submenuWidth > containerBounds.width - padding) {\n      left = containerBounds.width - submenuWidth - padding;\n    }\n\n    this.submenuPosition = { left, top };\n  }\n\n  @HostListener('document:keydown', ['$event'])\n  onKeyDown(event: KeyboardEvent): void {\n    if (!this.isVisible()) return;\n\n    switch (event.key) {\n      case 'Escape':\n        event.preventDefault();\n        this.contextMenuService.hideContextMenu();\n        break;\n      case 'ArrowDown':\n        event.preventDefault();\n        this.contextMenuService.focusNextItem();\n        break;\n      case 'ArrowUp':\n        event.preventDefault();\n        this.contextMenuService.focusPreviousItem();\n        break;\n      case 'ArrowRight':\n        event.preventDefault();\n        this.contextMenuService.openFocusedSubmenu();\n        break;\n      case 'ArrowLeft':\n        event.preventDefault();\n        this.contextMenuService.closeFocusedSubmenu();\n        break;\n      case 'Enter':\n        event.preventDefault();\n        this.contextMenuService.executeFocusedAction();\n        break;\n      case 'Home':\n        event.preventDefault();\n        this.contextMenuService.focusFirstItem();\n        break;\n      case 'End':\n        event.preventDefault();\n        this.contextMenuService.focusLastItem();\n        break;\n    }\n  }\n\n  @HostListener('document:click', ['$event'])\n  onDocumentClick(event: MouseEvent): void {\n    if (this.isVisible() && this.contextMenu?.nativeElement) {\n      const contextMenuElement = this.contextMenu.nativeElement;\n      const target = event.target as Node;\n\n      if (!contextMenuElement.contains(target)) {\n        this.contextMenuService.hideContextMenu();\n      }\n    }\n  }\n\n  private adjustPosition(x: number, y: number): { x: number; y: number } {\n    if (!this.contextMenu?.nativeElement) {\n      return { x, y };\n    }\n\n    const menu = this.contextMenu.nativeElement;\n    const menuRect = menu.getBoundingClientRect();\n    const containerBounds = this.containerBounds();\n\n    if (!containerBounds) {\n      return { x, y };\n    }\n\n    let adjustedX = x;\n    let adjustedY = y;\n\n    const padding = 10;\n    const maxMenuHeight = 400;\n\n    if (x + menuRect.width > containerBounds.width - padding) {\n      adjustedX = Math.max(padding, x - menuRect.width);\n    }\n    if (adjustedX < padding) {\n      adjustedX = padding;\n    }\n\n    const availableHeight = containerBounds.height - y - padding;\n    const requiredHeight = Math.min(menuRect.height, maxMenuHeight);\n\n    if (requiredHeight > availableHeight) {\n      const availableHeightAbove = y - padding;\n      if (requiredHeight <= availableHeightAbove) {\n        adjustedY = y - requiredHeight;\n      } else {\n        if (availableHeightAbove > availableHeight) {\n          adjustedY = y - Math.min(requiredHeight, availableHeightAbove);\n        } else {\n          adjustedY = Math.max(padding, containerBounds.height - requiredHeight - padding);\n        }\n      }\n    }\n\n    if (adjustedY < padding) {\n      adjustedY = padding;\n    }\n    if (adjustedY + requiredHeight > containerBounds.height - padding) {\n      adjustedY = containerBounds.height - requiredHeight - padding;\n    }\n\n    return { x: adjustedX, y: adjustedY };\n  }\n\n  isFocused(item: ContextMenuItem): boolean {\n    return this.focusedItem() === item;\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ApiService } from '../api/api.service';\nimport { PAN_SENSITIVITY } from '../constants';\n\n/**\n * Handles mouse wheel events for zoom and pan operations.\n */\n@Injectable()\nexport class WheelHandlerService {\n  private apiService = inject(ApiService);\n\n  handleWheel(event: WheelEvent): void {\n    event.preventDefault();\n\n    if (event.ctrlKey) {\n      this.handleZoom(event);\n    } else if (event.shiftKey) {\n      this.handleHorizontalPan(event);\n    } else {\n      this.handleVerticalPan(event);\n    }\n  }\n\n  private handleZoom(event: WheelEvent): void {\n    const zoomDirection = event.deltaY < 0 ? 1 : -1;\n\n    if (zoomDirection > 0) {\n      this.apiService.zoomIn();\n    } else {\n      this.apiService.zoomOut();\n    }\n  }\n\n  private handleHorizontalPan(event: WheelEvent): void {\n    const config = this.apiService.getConfig();\n    const panDelta = (event.deltaY * PAN_SENSITIVITY) / config.zoom;\n    this.apiService.pan(panDelta, 0);\n  }\n\n  private handleVerticalPan(event: WheelEvent): void {\n    const config = this.apiService.getConfig();\n    const panDelta = (event.deltaY * PAN_SENSITIVITY) / config.zoom;\n    this.apiService.pan(0, panDelta);\n  }\n}\n","import { Injectable, signal, WritableSignal } from '@angular/core';\nimport { ApiService } from '../api/api.service';\nimport { ContextMenuService } from '../components/context-menu';\nimport { ConfigService } from '../config/config.service';\nimport {\n  DROP_EFFECT,\n  KEY,\n  MIME_TYPE,\n  MOUSE_BUTTON,\n  SELECTOR_BOX,\n  SELECTOR_GRIP_RESIZE,\n  SELECTOR_GRIP_ROTATE,\n  TEMPORARY_TOOL_ID,\n} from '../constants';\nimport { EventBusService } from '../event-bus/event-bus.service';\nimport { DragDropService } from '../input/drag-drop.service';\nimport { KeyboardShortcutService } from '../input/keyboard-shortcut.service';\nimport { ToolsService } from '../tools/tools.service';\nimport { PointerInfo, WhiteboardEvent } from '../types';\nimport { Tool, ToolType } from '../types/tools';\nimport { getMouseTarget, getTargetElement } from '../utils/dom/target';\nimport { WheelHandlerService } from '../viewport/wheel-handler.service';\n\n@Injectable({ providedIn: 'root' })\nexport class SvgService {\n  private readonly pointerDownSig: WritableSignal<PointerInfo | null> = signal<PointerInfo | null>(null);\n  private readonly pointerMoveSig: WritableSignal<PointerInfo | null> = signal<PointerInfo | null>(null);\n  private readonly pointerUpSig: WritableSignal<PointerInfo | null> = signal<PointerInfo | null>(null);\n\n  private isSpaceHeld = false;\n  /** True while a pointer gesture is manipulating the selection (move/resize/rotate) even though\n   *  a non-Select tool is active — see {@link tryBeginSelectionGesture}. */\n  private selectionGesture = false;\n\n  constructor(\n    private toolsService: ToolsService,\n    private configService: ConfigService,\n    private EventBusService: EventBusService,\n    private keyboardShortcutService: KeyboardShortcutService,\n    private apiService: ApiService,\n    private contextMenuService: ContextMenuService,\n    private dragDropService: DragDropService,\n    private wheelHandlerService: WheelHandlerService\n  ) {}\n\n  onPointerDown(info: PointerInfo) {\n    if (info.button === MOUSE_BUTTON.MIDDLE) {\n      this.toolsService.pushTemporaryTool(ToolType.Hand, TEMPORARY_TOOL_ID.PAN_MIDDLE);\n      const hand = this.safeGetHandTool();\n      hand?.handlePointerDown?.(info);\n      return;\n    }\n    if (info.button === MOUSE_BUTTON.RIGHT) {\n      return;\n    }\n\n    if (this.toolsService.hasTemporaryOverride()) return;\n\n    if (!this.canDraw()) return;\n\n    // Selection handles take pointer priority over the active drawing tool: if the gesture\n    // starts on the current selection's own UI (box / resize / rotate / endpoint handles),\n    // drive the Select tool so the element can be moved/resized/rotated WITHOUT switching away\n    // from the drawing tool. Lets a just-drawn element stay fully editable while you keep drawing.\n    if (this.tryBeginSelectionGesture(info)) return;\n\n    this.EventBusService.emit(WhiteboardEvent.DrawStart, info);\n\n    const currentTool = this.toolsService.getActiveToolInstance();\n    currentTool?.handlePointerDown?.(info);\n\n    if (info.isDoubleClick) {\n      this.EventBusService.emit(WhiteboardEvent.ElementDoubleClicked, {\n        target: info.target,\n        clientX: info.clientX,\n        clientY: info.clientY,\n      });\n    }\n\n    this.pointerDownSig.set(info);\n  }\n\n  onPointerMove(info: PointerInfo) {\n    if (this.toolsService.hasTemporaryOverride()) {\n      this.safeGetHandTool()?.handlePointerMove?.(info);\n      return;\n    }\n\n    if (this.selectionGesture) {\n      this.EventBusService.emit(WhiteboardEvent.Drawing, info);\n      this.safeGetToolInstance(ToolType.Select)?.handlePointerMove?.(info);\n      this.pointerMoveSig.set(info);\n      return;\n    }\n\n    if (!this.canDraw()) return;\n\n    this.EventBusService.emit(WhiteboardEvent.Drawing, info);\n    const currentTool = this.toolsService.getActiveToolInstance();\n    currentTool?.handlePointerMove?.(info);\n    this.pointerMoveSig.set(info);\n  }\n\n  onPointerUp(info: PointerInfo) {\n    if (info.button === MOUSE_BUTTON.MIDDLE && this.toolsService.hasTemporaryOverride()) {\n      this.safeGetHandTool()?.handlePointerUp?.(info);\n      this.toolsService.popTemporaryTool(TEMPORARY_TOOL_ID.PAN_MIDDLE);\n      return;\n    }\n\n    if (this.selectionGesture) {\n      this.endSelectionGesture(info);\n      return;\n    }\n\n    if (!this.canDraw()) return;\n\n    this.EventBusService.emit(WhiteboardEvent.DrawEnd);\n    const currentTool = this.toolsService.getActiveToolInstance();\n    currentTool?.handlePointerUp?.(info);\n    this.pointerUpSig.set(info);\n  }\n\n  /**\n   * Pointer interaction cut short (pointercancel / pointerleave): if a selection gesture is in\n   * flight, finalize it cleanly so the flag never sticks. `SelectTool.handlePointerUp` commits any\n   * open batch and resets its own state, so this leaves nothing dangling.\n   */\n  onPointerCancel(info: PointerInfo): void {\n    if (this.selectionGesture) {\n      this.endSelectionGesture(info);\n    }\n  }\n\n  /** Hand the up/cancel to the Select tool and clear the capture flag. */\n  private endSelectionGesture(info: PointerInfo): void {\n    this.EventBusService.emit(WhiteboardEvent.DrawEnd);\n    this.safeGetToolInstance(ToolType.Select)?.handlePointerUp?.(info);\n    this.pointerUpSig.set(info);\n    this.selectionGesture = false;\n  }\n\n  onKeyDown(event: KeyboardEvent) {\n    if (event.code === KEY.SPACE && !this.isSpaceHeld && !this.isTextToolEditing()) {\n      this.isSpaceHeld = true;\n      this.toolsService.pushTemporaryTool(ToolType.Hand, TEMPORARY_TOOL_ID.PAN_SPACE);\n      event.preventDefault();\n      return;\n    }\n\n    const currentTool = this.toolsService.getActiveToolInstance();\n    currentTool?.handleKeyDown?.(event);\n\n    if (!this.canUseKeyboardShortcuts()) return;\n    this.keyboardShortcutService.handleKeyDown(event);\n  }\n\n  onKeyUp(event: KeyboardEvent) {\n    if (event.code === KEY.SPACE && this.isSpaceHeld && !this.isTextToolEditing()) {\n      this.isSpaceHeld = false;\n      this.toolsService.popTemporaryTool(TEMPORARY_TOOL_ID.PAN_SPACE);\n      event.preventDefault();\n      return;\n    }\n\n    const currentTool = this.toolsService.getActiveToolInstance();\n    currentTool?.handleKeyUp?.(event);\n\n    if (!this.canUseKeyboardShortcuts()) return;\n    this.keyboardShortcutService.handleKeyUp(event);\n  }\n\n  /**\n   * Handles wheel events for zooming and scrolling.\n   */\n  onWheel(event: WheelEvent) {\n    if (!this.canDraw()) return;\n    this.wheelHandlerService.handleWheel(event);\n  }\n\n  onDragOver(event: DragEvent) {\n    if (!this.canDraw()) return;\n    if (event.dataTransfer) {\n      event.dataTransfer.dropEffect = DROP_EFFECT.COPY;\n    }\n  }\n\n  onDrop(event: DragEvent) {\n    if (!this.canDraw()) return;\n\n    const files = event.dataTransfer?.files;\n    if (files && files.length > 0) {\n      this.dragDropService.handleFiles(files);\n      return;\n    }\n\n    const html = event.dataTransfer?.getData(MIME_TYPE.HTML);\n    if (html) {\n      this.dragDropService.handleText(html, event, true);\n      return;\n    }\n\n    const text = event.dataTransfer?.getData(MIME_TYPE.PLAIN);\n    if (text) {\n      this.dragDropService.handleText(text, event, false);\n      return;\n    }\n\n    const json = event.dataTransfer?.getData(MIME_TYPE.JSON);\n    if (json) {\n      try {\n        const elements = JSON.parse(json);\n        if (Array.isArray(elements)) {\n          this.dragDropService.handleElements(elements, event);\n        }\n      } catch (e) {\n        console.warn('Failed to parse dropped JSON:', e);\n      }\n    }\n  }\n\n  // CONTEXT MENU HANDLING\n  onContextMenu(info: PointerInfo, containerBounds?: DOMRect) {\n    if (!this.canDraw()) return;\n\n    // First, try to detect if we right-clicked on an element\n    const targetElement = this.getTargetElementFromPointer(info);\n\n    // Check if we have any selected elements\n    const currentSelection = this.apiService.selectedElements();\n    const hasSelection = currentSelection.length > 0;\n\n    if (targetElement) {\n      const isAlreadySelected = currentSelection.some((el) => el.id === targetElement.id);\n\n      if (!isAlreadySelected) {\n        this.apiService.selectElements(targetElement);\n      }\n    } else if (!hasSelection) {\n      this.apiService.clearSelection();\n    }\n\n    this.contextMenuService.showContextMenu(info.clientX, info.clientY, containerBounds);\n  }\n\n  private canDraw(): boolean {\n    return this.configService.getConfig().drawingEnabled;\n  }\n  private canUseKeyboardShortcuts(): boolean {\n    return this.configService.getConfig().keyboardShortcutsEnabled;\n  }\n\n  private isTextToolEditing(): boolean {\n    const activeToolType = this.toolsService.getActiveToolType();\n    if (activeToolType !== ToolType.Text) return false;\n\n    const activeToolInstance = this.toolsService.getActiveToolInstance();\n    return activeToolInstance?.isEditing === true;\n  }\n\n  private safeGetHandTool(): Tool | null {\n    return this.safeGetToolInstance(ToolType.Hand);\n  }\n\n  private safeGetToolInstance(type: ToolType): Tool | null {\n    try {\n      return this.toolsService.getToolInstance(type);\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * True when the pointer landed on the current selection's own UI — its bounding box, the\n   * resize/rotate grips, or an arrow endpoint/curve handle. These imply \"manipulate the\n   * selection\", as opposed to drawing on empty canvas.\n   */\n  private isSelectionHandleTarget(target: SVGGraphicsElement | null): boolean {\n    if (!target) return false;\n    const id = target.id ?? '';\n    if (id.includes(SELECTOR_GRIP_RESIZE) || id.includes(SELECTOR_GRIP_ROTATE) || id.includes(SELECTOR_BOX)) {\n      return true;\n    }\n    const handle = typeof target.getAttribute === 'function' ? target.getAttribute('data-handle') : null;\n    return handle === 'start' || handle === 'end' || handle === 'curve';\n  }\n\n  /**\n   * If a non-Select tool is active, something is selected, and the gesture starts on that\n   * selection's UI, route the whole gesture (down → move → up) to the Select tool instead of\n   * the active drawing tool. Returns true when the gesture was captured.\n   */\n  private tryBeginSelectionGesture(info: PointerInfo): boolean {\n    if (this.toolsService.getActiveToolType() === ToolType.Select) return false;\n    if (!this.apiService.getBoundingBox()) return false;\n    if (!this.isSelectionHandleTarget(getMouseTarget(info))) return false;\n\n    const selectTool = this.safeGetToolInstance(ToolType.Select);\n    if (!selectTool) return false;\n\n    this.selectionGesture = true;\n    this.EventBusService.emit(WhiteboardEvent.DrawStart, info);\n    selectTool.handlePointerDown?.(info);\n    this.pointerDownSig.set(info);\n    return true;\n  }\n\n  /**\n   * Get the whiteboard element that was clicked on, if any\n   */\n  private getTargetElementFromPointer(info: PointerInfo) {\n    const allElements = this.apiService.getElements();\n    return getTargetElement(info, allElements);\n  }\n}\n","import { Directive, ElementRef, HostListener, inject, OnDestroy, OnInit } from '@angular/core';\nimport { ConfigService } from '../config/config.service';\nimport { SvgService } from '../svg/svg.service';\n\n@Directive({\n  selector: '[globalKeyboard]',\n  standalone: true,\n})\nexport class GlobalKeyboardDirective implements OnInit, OnDestroy {\n  private configService = inject(ConfigService);\n  private svgService = inject(SvgService);\n  private elementRef = inject(ElementRef);\n\n  private isHovered = false;\n  private lastInteractionTime = 0;\n  private readonly INTERACTION_TIMEOUT = 500;\n\n  private static activeDirective: GlobalKeyboardDirective | null = null;\n\n  ngOnInit(): void {\n    const element = this.elementRef.nativeElement;\n    element.addEventListener('mouseenter', this.handleMouseEnter);\n    element.addEventListener('mouseleave', this.handleMouseLeave);\n    element.addEventListener('pointerdown', this.handleInteraction);\n    element.addEventListener('pointerup', this.handleInteraction);\n  }\n\n  ngOnDestroy(): void {\n    const element = this.elementRef.nativeElement;\n    element.removeEventListener('mouseenter', this.handleMouseEnter);\n    element.removeEventListener('mouseleave', this.handleMouseLeave);\n    element.removeEventListener('pointerdown', this.handleInteraction);\n    element.removeEventListener('pointerup', this.handleInteraction);\n\n    if (GlobalKeyboardDirective.activeDirective === this) {\n      GlobalKeyboardDirective.activeDirective = null;\n    }\n  }\n\n  private handleMouseEnter = (): void => {\n    this.isHovered = true;\n    GlobalKeyboardDirective.activeDirective = this;\n  };\n\n  private handleMouseLeave = (): void => {\n    this.isHovered = false;\n  };\n\n  private handleInteraction = (): void => {\n    this.lastInteractionTime = Date.now();\n    GlobalKeyboardDirective.activeDirective = this;\n  };\n\n  private isActiveWhiteboard(): boolean {\n    const recentlyInteracted = Date.now() - this.lastInteractionTime < this.INTERACTION_TIMEOUT;\n    return this.isHovered || recentlyInteracted || GlobalKeyboardDirective.activeDirective === this;\n  }\n\n  @HostListener('window:keydown', ['$event'])\n  onGlobalKeyDown(event: KeyboardEvent): void {\n    if (!this.configService.getConfig().keyboardShortcutsEnabled) {\n      return;\n    }\n\n    if (!this.isActiveWhiteboard()) {\n      return;\n    }\n\n    this.svgService.onKeyDown(event);\n  }\n\n  @HostListener('window:keyup', ['$event'])\n  onGlobalKeyUp(event: KeyboardEvent): void {\n    if (!this.configService.getConfig().keyboardShortcutsEnabled) {\n      return;\n    }\n\n    if (!this.isActiveWhiteboard()) {\n      return;\n    }\n\n    this.svgService.onKeyUp(event);\n  }\n}\n","// Context menu functionality\nexport * from './context-menu.directive';\n\n// Resize handling\nexport * from './resize-handler.directive';\n\n// Global keyboard handling\nexport * from './global-keyboard.directive';\n","import { Directive, HostListener, ElementRef, inject } from '@angular/core';\nimport { SvgService } from './svg.service';\nimport { PointerInfo } from '../types';\nimport { MOUSE_BUTTON } from '../constants';\n\n@Directive({\n  selector: '[svg]',\n  standalone: true,\n})\nexport class SvgDirective {\n  private elementRef = inject(ElementRef);\n  lastX!: number;\n  lastY!: number;\n\n  private lastClickTime = 0;\n  private lastClickX = 0;\n  private lastClickY = 0;\n  private readonly DOUBLE_CLICK_THRESHOLD = 300;\n  private readonly DOUBLE_CLICK_DISTANCE = 10;\n\n  constructor(private svgService: SvgService) {}\n\n  @HostListener('pointerdown', ['$event'])\n  onPointerDown(event: PointerEvent): void {\n    if (event.button !== MOUSE_BUTTON.RIGHT) {\n      event.preventDefault();\n    }\n\n    if (event.currentTarget) {\n      (event.currentTarget as Element).setPointerCapture(event.pointerId);\n    }\n\n    if (event.button === MOUSE_BUTTON.RIGHT) return;\n\n    const currentTime = Date.now();\n    const currentX = event.clientX;\n    const currentY = event.clientY;\n\n    if (\n      this.lastClickTime &&\n      currentTime - this.lastClickTime < this.DOUBLE_CLICK_THRESHOLD &&\n      Math.abs(currentX - this.lastClickX) < this.DOUBLE_CLICK_DISTANCE &&\n      Math.abs(currentY - this.lastClickY) < this.DOUBLE_CLICK_DISTANCE\n    ) {\n      const pointerInfo = this.createPointerInfo(event);\n      pointerInfo.isDoubleClick = true;\n      this.svgService.onPointerDown(pointerInfo);\n      this.lastClickTime = 0;\n      return;\n    }\n\n    this.lastClickTime = currentTime;\n    this.lastClickX = currentX;\n    this.lastClickY = currentY;\n\n    const pointerInfo = this.createPointerInfo(event);\n    this.svgService.onPointerDown(pointerInfo);\n  }\n\n  @HostListener('pointermove', ['$event'])\n  onPointerMove(event: PointerEvent): void {\n    if (event.clientX === this.lastX && event.clientY === this.lastY) return;\n    this.lastX = event.clientX;\n    this.lastY = event.clientY;\n\n    if (event.buttons & 2) return;\n    const pointerInfo = this.createPointerInfo(event);\n    this.svgService.onPointerMove(pointerInfo);\n  }\n\n  @HostListener('pointerup', ['$event'])\n  onPointerUp(event: PointerEvent): void {\n    this.lastX = event.clientX;\n    this.lastY = event.clientY;\n\n    if (event.currentTarget && (event.currentTarget as Element).hasPointerCapture(event.pointerId)) {\n      (event.currentTarget as Element).releasePointerCapture(event.pointerId);\n    }\n\n    if (event.button === MOUSE_BUTTON.RIGHT) return;\n    const pointerInfo = this.createPointerInfo(event);\n    this.svgService.onPointerUp(pointerInfo);\n  }\n\n  @HostListener('pointercancel', ['$event'])\n  @HostListener('pointerleave', ['$event'])\n  onPointerCancel(event: PointerEvent): void {\n    if (event.currentTarget && (event.currentTarget as Element).hasPointerCapture(event.pointerId)) {\n      (event.currentTarget as Element).releasePointerCapture(event.pointerId);\n    }\n    this.svgService.onPointerCancel(this.createPointerInfo(event));\n  }\n\n  @HostListener('wheel', ['$event'])\n  onWheel(event: WheelEvent): void {\n    event.preventDefault();\n    this.svgService.onWheel(event);\n  }\n\n  @HostListener('keydown', ['$event'])\n  onKeyDown(event: KeyboardEvent): void {\n    event.preventDefault();\n    this.svgService.onKeyDown(event);\n  }\n\n  @HostListener('keyup', ['$event'])\n  onKeyUp(event: KeyboardEvent): void {\n    this.svgService.onKeyUp(event);\n  }\n\n  @HostListener('dragover', ['$event'])\n  onDragOver(event: DragEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n    this.svgService.onDragOver(event);\n  }\n\n  @HostListener('dragenter', ['$event'])\n  onDragEnter(event: DragEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n  }\n\n  @HostListener('drop', ['$event'])\n  onDrop(event: DragEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n    this.svgService.onDrop(event);\n  }\n\n  @HostListener('contextmenu', ['$event'])\n  onContextMenu(event: PointerEvent): void {\n    event.preventDefault();\n    const pointerInfo = this.createPointerInfo(event);\n    const containerBounds = (event.currentTarget as SVGElement).getBoundingClientRect();\n\n    const relativePosition = this.getPointerPosition(event);\n    const adjustedPointerInfo = {\n      ...pointerInfo,\n      clientX: containerBounds.left + relativePosition.x,\n      clientY: containerBounds.top + relativePosition.y,\n    };\n\n    this.svgService.onContextMenu(adjustedPointerInfo, containerBounds);\n  }\n\n  private createPointerInfo(event: PointerEvent): PointerInfo {\n    const { x, y } = this.getPointerPosition(event);\n    return {\n      x,\n      y,\n\n      clientX: event.clientX,\n      clientY: event.clientY,\n      pageX: event.pageX,\n      pageY: event.pageY,\n      movementX: event.movementX,\n      movementY: event.movementY,\n\n      pressure: event.pressure,\n      tangentialPressure: event.tangentialPressure,\n      tiltX: event.tiltX,\n      tiltY: event.tiltY,\n      twist: event.twist,\n\n      width: event.width,\n      height: event.height,\n\n      pointerType: event.pointerType,\n      pointerId: event.pointerId,\n      isPrimary: event.isPrimary,\n\n      button: event.button as -1 | 0 | 1 | 2 | 3 | 4,\n      buttons: event.buttons,\n\n      ctrlKey: event.ctrlKey,\n      shiftKey: event.shiftKey,\n      altKey: event.altKey,\n      metaKey: event.metaKey,\n\n      eventType: event.type,\n\n      timeStamp: event.timeStamp,\n\n      target: event.target,\n    };\n  }\n\n  private getPointerPosition(event: PointerEvent): { x: number; y: number } {\n    const rect = (event.currentTarget as SVGElement).getBoundingClientRect();\n\n    const x = event.clientX - rect.left;\n    const y = event.clientY - rect.top;\n\n    return { x, y };\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nconst CURSOR_NW_RESIZE = 'nw-resize';\nconst CURSOR_NE_RESIZE = 'ne-resize';\nconst CURSOR_NS_RESIZE = 'ns-resize';\nconst CURSOR_EW_RESIZE = 'ew-resize';\nconst CURSOR_GRAB = 'grab';\nconst CURSOR_DEFAULT = 'default';\n\nconst MIN_ANGLE_THRESHOLD = 45;\nconst MAX_ANGLE_THRESHOLD = 135;\n\nconst ROTATE_IDENTIFIER = 'rotate';\n\n@Pipe({\n  name: 'gripCursor',\n  standalone: true,\n})\nexport class GripCursorPipe implements PipeTransform {\n  private readonly cornerGrips = ['nw', 'ne', 'se', 'sw'];\n  private readonly sideGrips = ['n', 's', 'e', 'w'];\n\n  transform(grip: string, rotation: number): string {\n    if (grip.includes(ROTATE_IDENTIFIER)) {\n      return CURSOR_GRAB;\n    }\n\n    const isHorizontalOrientation = this.isHorizontalOrientation(rotation);\n\n    if (this.cornerGrips.includes(grip)) {\n      return this.getCornerCursor(grip, isHorizontalOrientation);\n    }\n\n    if (this.sideGrips.includes(grip)) {\n      return this.getSideCursor(grip, isHorizontalOrientation);\n    }\n\n    return CURSOR_DEFAULT;\n  }\n\n  private isHorizontalOrientation(rotation: number): boolean {\n    const normalizedRotation = rotation % 180;\n    return normalizedRotation < MIN_ANGLE_THRESHOLD || normalizedRotation > MAX_ANGLE_THRESHOLD;\n  }\n\n  private getCornerCursor(grip: string, isHorizontal: boolean): string {\n    const isNwOrSe = grip === 'nw' || grip === 'se';\n\n    if (isNwOrSe) {\n      return isHorizontal ? CURSOR_NW_RESIZE : CURSOR_NE_RESIZE;\n    }\n\n    return isHorizontal ? CURSOR_NE_RESIZE : CURSOR_NW_RESIZE;\n  }\n\n  private getSideCursor(grip: string, isHorizontal: boolean): string {\n    const isNorthOrSouth = grip === 'n' || grip === 's';\n\n    if (isNorthOrSouth) {\n      return isHorizontal ? CURSOR_NS_RESIZE : CURSOR_EW_RESIZE;\n    }\n\n    return isHorizontal ? CURSOR_EW_RESIZE : CURSOR_NS_RESIZE;\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { WhiteboardElement, WhiteboardLayer } from '../types';\n\n@Pipe({\n  name: 'elementOpacity',\n  standalone: true,\n})\nexport class ElementOpacityPipe implements PipeTransform {\n  /**\n   * Calculate the effective opacity combining element, style, and layer opacity.\n   */\n  transform(element: WhiteboardElement, layers: WhiteboardLayer[]): number {\n    if (element.isDeleting) {\n      return 0.1;\n    }\n\n    let opacity = (element.opacity || 100) / 100;\n\n    if (element.style?.opacity !== undefined) {\n      opacity *= element.style.opacity;\n    }\n\n    if (element.layerId) {\n      const layer = layers.find((l) => l.id === element.layerId);\n      if (layer && layer.opacity !== undefined) {\n        opacity *= layer.opacity;\n      }\n    }\n\n    return opacity;\n  }\n}\n","import type { StrokeOptions } from './stroke-types';\nimport { dist, dist2, equals, lrp, toPoint } from './vector';\n\nconst MIN_START_PRESSURE = 0.025;\nconst MIN_END_PRESSURE = 0.01;\n\n/**\n * Processes raw input points into optimized stroke points for rendering.\n * Applies streamlining, pressure simulation, and point filtering.\n */\nexport function getStrokePoints(rawInputPoints: number[][], options: StrokeOptions = {}): number[][] {\n  const { streamline = 0.5, size = 16, simulatePressure = false } = options;\n\n  if (rawInputPoints.length === 0) return [];\n\n  const t = 0.15 + (1 - streamline) * 0.85;\n\n  let pts = [...rawInputPoints];\n  let pointsRemovedFromNearEnd = 0;\n\n  if (!simulatePressure) {\n    let pt = pts[0];\n    while (pt) {\n      if (pt[2] >= MIN_START_PRESSURE) break;\n      pts.shift();\n      pt = pts[0];\n    }\n  }\n\n  if (!simulatePressure) {\n    let pt = pts[pts.length - 1];\n    while (pt) {\n      if (pt[2] >= MIN_END_PRESSURE) break;\n      pts.pop();\n      pt = pts[pts.length - 1];\n    }\n  }\n\n  if (pts.length === 0) {\n    const firstPoint = rawInputPoints[0];\n    if (\n      firstPoint &&\n      typeof firstPoint[0] === 'number' &&\n      typeof firstPoint[1] === 'number' &&\n      !isNaN(firstPoint[0]) &&\n      !isNaN(firstPoint[1])\n    ) {\n      return [toPoint(firstPoint)];\n    }\n    return [];\n  }\n\n  let pt = pts[1];\n  while (pt) {\n    if (dist2(pt, pts[0]) > (size / 3) ** 2) break;\n    pts[0][2] = Math.max(pts[0][2], pt[2]);\n    pts.splice(1, 1);\n    pt = pts[1];\n  }\n\n  const lastPoint = pts.pop();\n  if (!lastPoint) {\n    return [];\n  }\n  const last = lastPoint;\n  pt = pts[pts.length - 1];\n  while (pt) {\n    if (dist2(pt, last) > (size / 3) ** 2) break;\n    pts.pop();\n    pt = pts[pts.length - 1];\n    pointsRemovedFromNearEnd++;\n  }\n  pts.push(last);\n\n  const isComplete =\n    options.last ||\n    !options.simulatePressure ||\n    (pts.length > 1 && dist2(pts[pts.length - 1], pts[pts.length - 2]) < size ** 2) ||\n    pointsRemovedFromNearEnd > 0;\n\n  if (pts.length === 2 && options.simulatePressure) {\n    const last = pts[1];\n    pts = pts.slice(0, -1);\n    for (let i = 1; i < 5; i++) {\n      const next = lrp(pts[0], last, i / 4);\n      next[2] = ((pts[0][2] + (last[2] - pts[0][2])) * i) / 4;\n      pts.push(next);\n    }\n  }\n\n  const strokePoints: number[][] = [pts[0]];\n\n  let totalLength = 0;\n\n  let prevPoint = strokePoints[0];\n\n  let point: number[], distance: number;\n\n  if (isComplete && streamline > 0) {\n    pts.push(pts[pts.length - 1]);\n  }\n\n  for (let i = 1, n = pts.length; i < n; i++) {\n    point = !t || (options.last && i === n - 1) ? pts[i] : lrp(pts[i], prevPoint, 1 - t);\n\n    if (equals(prevPoint, point)) continue;\n\n    distance = dist(point, prevPoint);\n\n    totalLength += distance;\n\n    if (i < 4 && totalLength < size) {\n      continue;\n    }\n\n    prevPoint = point;\n\n    strokePoints.push(point);\n  }\n\n  return strokePoints;\n}\n","/** Generates SVG path data from a set of stroke points. */\nexport function getSvgPathFromStroke(points: number[][], closed = false): string {\n  const len = points.length;\n\n  if (len === 0) {\n    return '';\n  }\n\n  if (len === 1) {\n    const point = points[0];\n    if (!point || point.length < 2 || isNaN(point[0]) || isNaN(point[1])) {\n      return '';\n    }\n    const r = 2;\n    return `M ${point[0]} ${point[1]} m -${r}, 0 a ${r},${r} 0 1,0 ${r * 2},0 a ${r},${r} 0 1,0 -${r * 2},0`;\n  }\n\n  let a = points[0];\n  let b = points[1];\n\n  if (len === 2) {\n    // If only two points, just draw a line\n    return `M${precise(a)}L${precise(b)}`;\n  }\n\n  let result = '';\n\n  for (let i = 2, max = len - 1; i < max; i++) {\n    a = points[i];\n    b = points[i + 1];\n    result += average(a, b);\n  }\n\n  if (closed) {\n    // If closed, draw a curve from the last point to the first\n    return `M${average(points[0], points[1])}Q${precise(points[1])}${average(points[1], points[2])}T${result}${average(\n      points[len - 1],\n      points[0]\n    )}${average(points[0], points[1])}Z`;\n  } else {\n    // If not closed, draw a curve starting at the first point and\n    // ending at the midpoint of the last and second-last point, then\n    // complete the curve with a line segment to the last point.\n    return `M${precise(points[0])}Q${precise(points[1])}${average(points[1], points[2])}${\n      points.length > 3 ? 'T' : ''\n    }${result}L${precise(points[len - 1])}`;\n  }\n}\n\nfunction precise(A: number[]) {\n  return `${toDomPrecision(A[0])},${toDomPrecision(A[1])} `;\n}\n\nfunction average(A: number[], B: number[]) {\n  return `${toDomPrecision((A[0] + B[0]) / 2)},${toDomPrecision((A[1] + B[1]) / 2)} `;\n}\n\nfunction toDomPrecision(v: number) {\n  return Math.round(v * 1e4) / 1e4;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { StrokeOptions } from '../utils/drawing';\nimport { getStrokePoints } from '../utils/drawing/stroke-points';\nimport { getSvgPathFromStroke } from '../utils/drawing/path';\n\n@Pipe({\n  name: 'pointsToPath',\n  standalone: true,\n})\nexport class PointsToPathPipe implements PipeTransform {\n  /**\n   * Converts an array of points to an SVG path string.\n   */\n  transform(points: number[][] | undefined, options?: StrokeOptions): string {\n    if (!points || points.length === 0) {\n      return '';\n    }\n\n    const stroke = getStrokePoints(points, options);\n\n    return getSvgPathFromStroke(stroke);\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { ArrowElement, ArrowheadConfig, ArrowheadType } from '../elements';\n// ArrowPathType is accessed via element.pathType\n\nexport interface ArrowheadRenderItem {\n  /** SVG path `d` attribute */\n  d: string;\n  /** Whether the shape should be filled (true) or stroked outline only (false) */\n  filled: boolean;\n  /** SVG transform for positioning, rotation, and scaling */\n  transform: string;\n  /** For stroked heads: stroke-width divided by the scale factor so the visual weight matches the line body */\n  strokeWidth?: number;\n}\n\nexport interface ArrowRenderData {\n  /** Adjusted line start (pulled back if startHead present) */\n  lineX1: number;\n  lineY1: number;\n  /** Adjusted line end (pulled back if endHead present) */\n  lineX2: number;\n  lineY2: number;\n  /** SVG path items for each head */\n  heads: ArrowheadRenderItem[];\n  /** SVG `d` attribute for the arrow body (line or curve) */\n  pathD: string;\n  /** Whether this is a curved arrow (use <path> instead of <line>) */\n  isCurved: boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/*  Predefined arrowhead paths                                        */\n/*  All paths are authored pointing RIGHT (+X), tip at (0, 0).       */\n/*  baseSize = 10: all coordinates are in a 10-unit space.           */\n/*  At render time: translate(px py) rotate(angleDeg) scale(size/10) */\n/* ------------------------------------------------------------------ */\n\ninterface ArrowheadPathDef {\n  /** SVG path `d` in native coordinates */\n  d: string;\n  /** Reference size — all paths authored at this scale */\n  baseSize: number;\n  /** Whether this head type should be filled (true) or stroked (false) */\n  filled: boolean;\n  /** How far back to inset the line end, in baseSize units */\n  baseInset: number;\n}\n\n/**\n * Filled triangle. Tip at (0,0), base at x=-10, half-width=5.\n * Rendered filled, no stroke needed.\n */\nconst ARROW_PATH: ArrowheadPathDef = {\n  d: 'M 0 0 L -10 -5 L -10 5 Z',\n  baseSize: 10,\n  filled: true,\n  baseInset: 10,\n};\n\n/**\n * Open chevron / V-arrow. Tip at (0,0), arms reach to (-8, ±5).\n * Rendered as stroke, no fill.\n */\nconst OPEN_ARROW_PATH: ArrowheadPathDef = {\n  d: 'M -8 -5 L 0 0 L -8 5',\n  baseSize: 10,\n  filled: false,\n  baseInset: 3,\n};\n\n/**\n * Filled diamond. Tip at (0,0), tail at (-14,0), half-height=5.\n * Rendered filled.\n */\nconst DIAMOND_PATH: ArrowheadPathDef = {\n  d: 'M 0 0 L -7 -5 L -14 0 L -7 5 Z',\n  baseSize: 10,\n  filled: true,\n  baseInset: 14,\n};\n\n/**\n * Open diamond. Same shape as filled diamond but stroked only.\n */\nconst OPEN_DIAMOND_PATH: ArrowheadPathDef = {\n  d: 'M 0 0 L -7 -5 L -14 0 L -7 5 Z',\n  baseSize: 10,\n  filled: false,\n  baseInset: 14,\n};\n\n/**\n * Filled circle. Tip at (0,0) = right edge of circle. Radius=5, center at (-5,0).\n * Rendered filled.\n */\nconst CIRCLE_PATH: ArrowheadPathDef = {\n  d: 'M 0 0 A 5 5 0 1 0 0 0.001 Z',\n  baseSize: 10,\n  filled: true,\n  baseInset: 10,\n};\n\n/**\n * Open circle. Same as circle but stroked only.\n */\nconst OPEN_CIRCLE_PATH: ArrowheadPathDef = {\n  d: 'M 0 0 A 5 5 0 1 0 0 0.001 Z',\n  baseSize: 10,\n  filled: false,\n  baseInset: 10,\n};\n\n/**\n * Perpendicular bar. A vertical line at x=0, from y=-5 to y=5.\n * Rendered as stroke.\n */\nconst BAR_PATH: ArrowheadPathDef = {\n  d: 'M 0 -5 L 0 5',\n  baseSize: 10,\n  filled: false,\n  baseInset: 0,\n};\n\n@Pipe({\n  name: 'arrowhead',\n  standalone: true,\n})\nexport class ArrowheadPipe implements PipeTransform {\n  transform(element: ArrowElement): ArrowRenderData {\n    const { x1, y1, x2, y2, style, startHead, endHead, pathType } = element;\n    const strokeWidth = style.strokeWidth || 2;\n\n    const isCurved = pathType && pathType.type !== 'straight';\n\n    // Compute angles at each end based on path type\n    let endAngle: number;\n    let startAngle: number;\n\n    if (pathType?.type === 'elbow') {\n      // Elbow: start leaves horizontally, end arrives horizontally\n      startAngle = x2 > x1 ? Math.PI : 0;\n      endAngle = x2 > x1 ? 0 : Math.PI;\n    } else if (pathType?.type === 'quadratic') {\n      // Tangent at end = direction from control point to endpoint\n      endAngle = Math.atan2(y2 - pathType.cy, x2 - pathType.cx);\n      // Tangent at start = direction from control point to start point (reversed)\n      startAngle = Math.atan2(y1 - pathType.cy, x1 - pathType.cx);\n    } else if (pathType?.type === 'cubic') {\n      endAngle = Math.atan2(y2 - pathType.cy2, x2 - pathType.cx2);\n      startAngle = Math.atan2(y1 - pathType.cy1, x1 - pathType.cx1);\n    } else {\n      endAngle = Math.atan2(y2 - y1, x2 - x1);\n      startAngle = endAngle + Math.PI;\n    }\n\n    const heads: ArrowheadRenderItem[] = [];\n\n    const endResult = this.buildHead(endHead, x2, y2, endAngle, strokeWidth);\n    const startResult = this.buildHead(startHead, x1, y1, startAngle, strokeWidth);\n\n    if (endResult) {\n      heads.push(endResult.item);\n    }\n    if (startResult) {\n      heads.push(startResult.item);\n    }\n\n    // Pull line endpoints back so the stroke doesn't bleed through heads.\n    // Clamp so both insets together never consume more than 80% of the straight-line\n    // distance — this prevents the body from disappearing on short arrows.\n    let endInset = endResult?.inset ?? 0;\n    let startInset = startResult?.inset ?? 0;\n    const arrowLen = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n    const totalInset = startInset + endInset;\n    if (arrowLen > 0 && totalInset > arrowLen * 0.8) {\n      const ratio = (arrowLen * 0.8) / totalInset;\n      startInset *= ratio;\n      endInset *= ratio;\n    }\n\n    let lineX1: number, lineY1: number, lineX2: number, lineY2: number;\n\n    if (pathType?.type === 'elbow') {\n      // Elbow: start leaves horizontally toward the path, end arrives horizontally.\n      // startAngle points BACKWARD (away from the path), so inset must move FORWARD\n      // which is the opposite direction: startAngle + π.\n      const startFwdAngle = startAngle + Math.PI;\n      lineX1 = x1 + startInset * Math.cos(startFwdAngle);\n      lineY1 = y1 + startInset * Math.sin(startFwdAngle);\n      lineX2 = x2 - endInset * Math.cos(endAngle);\n      lineY2 = y2 - endInset * Math.sin(endAngle);\n    } else if (pathType?.type === 'quadratic') {\n      const startDir = Math.atan2(pathType.cy - y1, pathType.cx - x1);\n      lineX1 = x1 + startInset * Math.cos(startDir);\n      lineY1 = y1 + startInset * Math.sin(startDir);\n      lineX2 = x2 - endInset * Math.cos(endAngle);\n      lineY2 = y2 - endInset * Math.sin(endAngle);\n    } else if (pathType?.type === 'cubic') {\n      const startDir = Math.atan2(pathType.cy1 - y1, pathType.cx1 - x1);\n      lineX1 = x1 + startInset * Math.cos(startDir);\n      lineY1 = y1 + startInset * Math.sin(startDir);\n      lineX2 = x2 - endInset * Math.cos(endAngle);\n      lineY2 = y2 - endInset * Math.sin(endAngle);\n    } else {\n      const straightAngle = Math.atan2(y2 - y1, x2 - x1);\n      lineX1 = x1 + startInset * Math.cos(straightAngle);\n      lineY1 = y1 + startInset * Math.sin(straightAngle);\n      lineX2 = x2 - endInset * Math.cos(straightAngle);\n      lineY2 = y2 - endInset * Math.sin(straightAngle);\n    }\n\n    // Build the SVG path `d` attribute for the arrow body\n    let pathD: string;\n    if (pathType?.type === 'elbow') {\n      const midRatio = pathType.midRatio ?? 0.5;\n      const bendX = lineX1 + (lineX2 - lineX1) * midRatio;\n      pathD = `M ${lineX1} ${lineY1} L ${bendX} ${lineY1} L ${bendX} ${lineY2} L ${lineX2} ${lineY2}`;\n    } else if (pathType?.type === 'quadratic') {\n      pathD = `M ${lineX1} ${lineY1} Q ${pathType.cx} ${pathType.cy} ${lineX2} ${lineY2}`;\n    } else if (pathType?.type === 'cubic') {\n      pathD = `M ${lineX1} ${lineY1} C ${pathType.cx1} ${pathType.cy1} ${pathType.cx2} ${pathType.cy2} ${lineX2} ${lineY2}`;\n    } else {\n      pathD = `M ${lineX1} ${lineY1} L ${lineX2} ${lineY2}`;\n    }\n\n    return {\n      lineX1,\n      lineY1,\n      lineX2,\n      lineY2,\n      heads,\n      pathD,\n      isCurved: !!isCurved,\n    };\n  }\n\n  private buildHead(\n    config: ArrowheadConfig | undefined,\n    px: number,\n    py: number,\n    angle: number,\n    strokeWidth: number\n  ): { item: ArrowheadRenderItem; inset: number } | null {\n    if (!config || config.type === ArrowheadType.None) {\n      return null;\n    }\n\n    // Arrowhead size grows gently with stroke width (3× ratio keeps heads proportional\n    // without aggressively shortening the line body)\n    const size = Math.max(12, strokeWidth * 3);\n\n    let def: ArrowheadPathDef;\n\n    switch (config.type) {\n      case ArrowheadType.Arrow:\n        def = ARROW_PATH;\n        break;\n      case ArrowheadType.OpenArrow:\n        def = OPEN_ARROW_PATH;\n        break;\n      case ArrowheadType.Diamond:\n        def = DIAMOND_PATH;\n        break;\n      case ArrowheadType.OpenDiamond:\n        def = OPEN_DIAMOND_PATH;\n        break;\n      case ArrowheadType.Circle:\n        def = CIRCLE_PATH;\n        break;\n      case ArrowheadType.OpenCircle:\n        def = OPEN_CIRCLE_PATH;\n        break;\n      case ArrowheadType.Bar:\n        def = BAR_PATH;\n        break;\n      default:\n        return null;\n    }\n\n    const scale = size / def.baseSize;\n    const inset = def.baseInset * scale;\n    const transform = this.buildTransform(px, py, angle, scale);\n    const headStrokeWidth = def.filled ? undefined : strokeWidth / scale;\n    return { item: { d: def.d, filled: def.filled, transform, strokeWidth: headStrokeWidth }, inset };\n  }\n\n  /** Build an SVG transform: translate to endpoint, rotate to angle, then scale */\n  private buildTransform(px: number, py: number, angle: number, scale: number): string {\n    const angleDeg = (angle * 180) / Math.PI;\n    return `translate(${px} ${py}) rotate(${angleDeg}) scale(${scale})`;\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  ElementRef,\n  inject,\n  ViewChild,\n} from '@angular/core';\nimport { ConfigService } from '../../config/config.service';\nimport { GlobalKeyboardDirective, ResizeHandlerDirective } from '../../directives';\n\nimport { SvgDirective } from '../../svg/svg.directive';\nimport { SvgService } from '../../svg/svg.service';\nimport { ElementType, ToolType, WhiteboardElement } from '../../types';\nimport { ApiService } from '../../api';\nimport { CanvasService } from '../../canvas';\nimport { ConnectionUIService, HandleService, SelectionService } from '../../elements';\nimport { GripCursorPipe, ElementOpacityPipe, PointsToPathPipe, ArrowheadPipe } from '../../pipes';\nimport { ToolsService } from '../../tools';\n\n@Component({\n  selector: 'ng-whiteboard-canvas',\n  standalone: true,\n  imports: [\n    CommonModule,\n    GripCursorPipe,\n    ElementOpacityPipe,\n    PointsToPathPipe,\n    ArrowheadPipe,\n    SvgDirective,\n    ResizeHandlerDirective,\n    GlobalKeyboardDirective,\n  ],\n  templateUrl: './whiteboard-canvas.component.html',\n  styleUrl: './whiteboard-canvas.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WhiteboardCanvasComponent implements AfterViewInit {\n  @ViewChild('svgContainer', { static: false })\n  svgContainer!: ElementRef<SVGSVGElement>;\n\n  apiService = inject(ApiService);\n  configService = inject(ConfigService);\n  toolsService = inject(ToolsService);\n  selectionService = inject(SelectionService);\n  canvasService = inject(CanvasService);\n  svgService = inject(SvgService);\n  connectionUIService = inject(ConnectionUIService);\n  handleService = inject(HandleService);\n\n  config = this.configService.getConfigSignal();\n\n  elements = this.apiService.allElements;\n  layers = this.apiService.layers;\n  selectedToolSignal = this.toolsService.selectedTool;\n  selectionBoxSignal = this.selectionService.getSelectionBoxSignal();\n  boundingBoxSignal = this.selectionService.getBoundingBoxSignal();\n  transform = this.canvasService.getTransform();\n\n  filteredElements = computed(() => {\n    const layers = this.layers();\n    const elements = this.elements();\n\n    // Create a map for O(1) layer lookups\n    const layersMap = new Map(layers.map((l) => [l.id, l]));\n\n    const sortElements = (arr: WhiteboardElement[]) =>\n      arr.slice().sort((a, b) => {\n        const layerA = a.layerId ? layersMap.get(a.layerId) : undefined;\n        const layerB = b.layerId ? layersMap.get(b.layerId) : undefined;\n        const zA = (layerA?.zIndex ?? 0) * 1000 + (a.zIndex ?? 0);\n        const zB = (layerB?.zIndex ?? 0) * 1000 + (b.zIndex ?? 0);\n        return zA - zB;\n      });\n\n    // Use a Set for faster inclusion checks\n    const visibleLayerIds = new Set(layers.filter((l) => l.visible).map((l) => l.id));\n\n    if (visibleLayerIds.size === 0 && layers.length > 0) {\n      return [];\n    }\n\n    const filtered = elements.filter((el) => !el.layerId || visibleLayerIds.has(el.layerId));\n    const sorted = sortElements(filtered);\n\n    // Add computed properties for rendering\n    return sorted.map((el) => {\n      const layer = el.layerId ? layersMap.get(el.layerId) : undefined;\n      return {\n        ...el,\n        transform: this.buildTransform(el),\n        isLocked: layer?.locked || false,\n        blendMode: layer?.blendMode || 'normal',\n      };\n    });\n  });\n\n  private buildTransform(element: WhiteboardElement): string {\n    const scaleX = element.scaleX ?? 1;\n    const scaleY = element.scaleY ?? 1;\n    return `translate(${element.x},${element.y}) rotate(${element.rotation}) scale(${scaleX},${scaleY})`;\n  }\n\n  canvasWidth = computed(() => this.config().canvasWidth);\n  canvasHeight = computed(() => this.config().canvasHeight);\n  zoom = computed(() => this.config().zoom);\n  x = computed(() => this.config().x);\n  y = computed(() => this.config().y);\n  canvasX = computed(() => this.config().canvasX);\n  canvasY = computed(() => this.config().canvasY);\n  gridSize = computed(() => this.config().gridSize);\n  backgroundColor = computed(() => this.config().backgroundColor);\n  enableGrid = computed(() => this.config().enableGrid);\n  fullScreen = computed(() => this.config().fullScreen);\n\n  svgDimensions = computed(() => {\n    const fullScreen = this.fullScreen();\n    const canvasWidth = this.canvasWidth();\n    const canvasHeight = this.canvasHeight();\n    const zoom = this.zoom();\n\n    return fullScreen\n      ? { width: '100%', height: '100%' }\n      : { width: `${canvasWidth * zoom}px`, height: `${canvasHeight * zoom}px` };\n  });\n\n  svgViewBox = computed(() => {\n    if (this.fullScreen()) {\n      const viewWidth = this.canvasWidth() / this.zoom();\n      const viewHeight = this.canvasHeight() / this.zoom();\n      return `0 0 ${viewWidth} ${viewHeight}`;\n    } else {\n      return `0 0 ${this.canvasWidth()} ${this.canvasHeight()}`;\n    }\n  });\n\n  contentTransform = computed(() => {\n    const x = this.x();\n    const y = this.y();\n    return `translate(${x}, ${y})`;\n  });\n\n  gridConfig = computed(() => {\n    const x = this.x();\n    const y = this.y();\n    const zoom = this.zoom();\n    const offsetX = x % 100;\n    const offsetY = y % 100;\n    return {\n      transform: `translate(${offsetX}, ${offsetY})`,\n      width: (this.canvasWidth() + 100) / zoom,\n      height: (this.canvasHeight() + 100) / zoom,\n    };\n  });\n\n  cursor = computed(() => this.toolsService.cursor());\n\n  // ────────── Arrow / Line selection (from HandleService) ──────────\n  readonly isLineOnlySelection = this.handleService.isLineOnlySelection;\n  readonly lineEndpointHandles = this.handleService.lineEndpointHandles;\n  readonly curveHandles = this.handleService.curveHandles;\n\n  // ────────── Arrow connection signals (from ConnectionUIService) ──────────\n  readonly snapIndicator = this.connectionUIService.snapIndicator;\n  readonly visibleConnectionPoints = this.connectionUIService.visibleConnectionPoints;\n\n  /** Check if an arrow is currently selected (for showing endpoint handles) */\n  isArrowSelected(elementId: string): boolean {\n    return this.selectionService.isSelected(elementId);\n  }\n\n  types = ElementType;\n  tools = ToolType;\n\n  ngAfterViewInit() {\n    this.apiService.initializeWhiteboard(this.svgContainer.nativeElement);\n  }\n}\n","<svg\n  #svgContainer\n  id=\"svgroot\"\n  [class]=\"'svgroot ' + selectedToolSignal()\"\n  xmlns=\"http://www.w3.org/2000/svg\"\n  xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n  tabindex=\"0\"\n  svg\n  resizeHandler\n  globalKeyboard\n  [style.cursor]=\"cursor()\"\n>\n  <svg\n    id=\"svgcontent\"\n    [attr.width]=\"svgDimensions().width\"\n    [attr.height]=\"svgDimensions().height\"\n    [attr.viewBox]=\"svgViewBox()\"\n    [attr.x]=\"canvasX()\"\n    [attr.y]=\"canvasY()\"\n  >\n    <defs>\n      <!-- Grid -->\n      <pattern id=\"smallGrid\" [attr.width]=\"gridSize()\" [attr.height]=\"gridSize()\" patternUnits=\"userSpaceOnUse\">\n        <path\n          [attr.d]=\"'M ' + gridSize() + ' 0 H 0 V ' + gridSize() + ''\"\n          fill=\"none\"\n          stroke=\"gray\"\n          stroke-width=\"0.5\"\n        />\n      </pattern>\n      <pattern id=\"grid\" width=\"100\" height=\"100\" patternUnits=\"userSpaceOnUse\">\n        <rect width=\"100\" height=\"100\" fill=\"url(#smallGrid)\" />\n        <path d=\"M 100 0 H 0 V 100\" fill=\"none\" stroke=\"gray\" stroke-width=\"2\" />\n      </pattern>\n    </defs>\n\n    <rect width=\"100%\" height=\"100%\" [attr.fill]=\"backgroundColor()\"></rect>\n\n    @if (enableGrid()) {\n    <g [attr.transform]=\"gridConfig().transform\">\n      <rect\n        x=\"-100\"\n        y=\"-100\"\n        [attr.width]=\"gridConfig().width + 200\"\n        [attr.height]=\"gridConfig().height + 200\"\n        fill=\"url(#grid)\"\n      ></rect>\n    </g>\n    }\n\n    <g [attr.transform]=\"contentTransform()\" style=\"pointer-events: all\">\n      @for (item of filteredElements(); track item.id) {\n      <g\n        class=\"wb_element\"\n        [id]=\"'item_' + item.id\"\n        [attr.data-wb-id]=\"item.id\"\n        [attr.transform]=\"item.transform\"\n        [attr.opacity]=\"item | elementOpacity : layers()\"\n        [style.pointer-events]=\"item.isLocked ? 'none' : 'auto'\"\n        [style.mix-blend-mode]=\"item.blendMode\"\n        transform-origin=\"center\"\n      >\n        @switch (item.type) { @case (types.Pen) {\n        <g>\n          <path\n            fill=\"none\"\n            [attr.d]=\"item.points | pointsToPath : item.pathOptions\"\n            [attr.stroke-width]=\"item.style.strokeWidth\"\n            [attr.stroke-linecap]=\"item.style.lineCap\"\n            [attr.stroke-linejoin]=\"item.style.lineJoin\"\n            [attr.stroke]=\"item.style.strokeColor\"\n            [attr.stroke-dasharray]=\"item.style.dasharray\"\n            [attr.stroke-dashoffset]=\"item.style.dashoffset\"\n          ></path>\n        </g>\n        } @case (types.Image) {\n        <g>\n          <image\n            [attr.height]=\"item.height\"\n            [attr.width]=\"item.width\"\n            preserveAspectRatio=\"none\"\n            [attr.xlink:href]=\"item.src\"\n            [attr.href]=\"item.src\"\n            [attr.stroke-width]=\"item.style.strokeWidth\"\n            [attr.fill]=\"item.style.fill\"\n            [attr.stroke]=\"item.style.strokeColor\"\n            [attr.stroke-dasharray]=\"item.style.dasharray\"\n            [attr.stroke-dashoffset]=\"item.style.dashoffset\"\n          ></image>\n        </g>\n        } @case (types.Line) {\n\n        <g>\n          <line\n            [attr.x1]=\"item.x1\"\n            [attr.y1]=\"item.y1\"\n            [attr.x2]=\"item.x2\"\n            [attr.y2]=\"item.y2\"\n            [attr.stroke-dasharray]=\"item.style.dasharray\"\n            [attr.stroke-dashoffset]=\"item.style.dashoffset\"\n            [attr.stroke-width]=\"item.style.strokeWidth\"\n            [attr.stroke-linecap]=\"item.style.lineCap\"\n            [attr.stroke]=\"item.style.strokeColor\"\n          ></line>\n        </g>\n        } @case (types.Arrow) {\n        <g>\n          @if (item | arrowhead; as arrow) {\n          <!-- Arrow body: use <path> for both straight and curved -->\n          <path\n            [attr.d]=\"arrow.pathD\"\n            fill=\"none\"\n            [attr.stroke-dasharray]=\"item.style.dasharray\"\n            [attr.stroke-dashoffset]=\"item.style.dashoffset\"\n            [attr.stroke-width]=\"item.style.strokeWidth\"\n            [attr.stroke-linecap]=\"item.style.lineCap\"\n            [attr.stroke]=\"item.style.strokeColor\"\n          ></path>\n          @for (head of arrow.heads; track $index) {\n          <path\n            [attr.d]=\"head.d\"\n            [attr.transform]=\"head.transform\"\n            [attr.fill]=\"head.filled ? item.style.strokeColor : 'none'\"\n            [attr.stroke]=\"head.filled ? 'none' : item.style.strokeColor\"\n            [attr.stroke-width]=\"head.filled ? 0 : head.strokeWidth ?? item.style.strokeWidth\"\n            [attr.stroke-linecap]=\"item.style.lineCap\"\n            stroke-linejoin=\"round\"\n          ></path>\n          } }\n        </g>\n        } @case (types.Rectangle) {\n        <g>\n          <rect\n            [attr.rx]=\"item.rx\"\n            [attr.width]=\"item.width\"\n            [attr.height]=\"item.height\"\n            [attr.stroke-dasharray]=\"item.style.dasharray\"\n            [attr.stroke-dashoffset]=\"item.style.dashoffset\"\n            [attr.stroke-width]=\"item.style.strokeWidth\"\n            [attr.fill]=\"item.style.fill\"\n            [attr.stroke]=\"item.style.strokeColor\"\n            [attr.stroke-linejoin]=\"item.style.lineJoin\"\n          ></rect>\n        </g>\n        } @case (types.Ellipse) {\n        <g>\n          <ellipse\n            [attr.cx]=\"item.cx\"\n            [attr.cy]=\"item.cy\"\n            [attr.rx]=\"item.rx\"\n            [attr.ry]=\"item.ry\"\n            [attr.stroke-dasharray]=\"item.style.dasharray\"\n            [attr.stroke-dashoffset]=\"item.style.dashoffset\"\n            [attr.stroke-width]=\"item.style.strokeWidth\"\n            [attr.stroke]=\"item.style.strokeColor\"\n            [attr.fill]=\"item.style.fill\"\n          ></ellipse>\n        </g>\n        } @case (types.Text) {\n        <g>\n          <text\n            text-anchor=\"start\"\n            [attr.font-size]=\"item.style.fontSize\"\n            [attr.font-family]=\"item.style.fontFamily\"\n            [attr.fill]=\"item.style.color\"\n            [attr.font-style]=\"item.style.fontStyle\"\n            [attr.font-weight]=\"item.style.fontWeight\"\n            alignment-baseline=\"before-edge\"\n            [attr.stroke-linecap]=\"item.style.lineCap\"\n            [attr.stroke-linejoin]=\"item.style.lineJoin\"\n            [attr.stroke-dasharray]=\"item.style.dasharray\"\n            [attr.stroke-dashoffset]=\"item.style.dashoffset\"\n            [attr.stroke]=\"item.style.strokeColor\"\n            [attr.stroke-width]=\"item.style.strokeWidth\"\n          >\n            @for (line of item.text.split('\\n'); track $index) {\n            <tspan [attr.x]=\"0\" [attr.dy]=\"$index === 0 ? 0 : (item.style.fontSize || 16) * 1.2\">{{ line }}</tspan>\n            }\n          </text>\n        </g>\n        } }\n      </g>\n      } @if (selectionBoxSignal(); as box) {\n\n      <!-- Connection point snap indicator (shown during arrow drawing/reconnecting) -->\n      @if (snapIndicator(); as snap) {\n      <circle\n        class=\"snap-indicator\"\n        [attr.cx]=\"snap.x\"\n        [attr.cy]=\"snap.y\"\n        r=\"8\"\n        fill=\"rgba(76, 175, 80, 0.3)\"\n        stroke=\"#4CAF50\"\n        stroke-width=\"2\"\n        pointer-events=\"none\"\n      ></circle>\n      }\n\n      <!-- Connection points on hovered shape during arrow drawing -->\n      @for (cp of visibleConnectionPoints(); track cp.id) {\n      <circle\n        class=\"connection-point\"\n        [attr.cx]=\"cp.position.x\"\n        [attr.cy]=\"cp.position.y\"\n        r=\"4\"\n        fill=\"rgba(33, 150, 243, 0.4)\"\n        stroke=\"#2196F3\"\n        stroke-width=\"1\"\n        pointer-events=\"none\"\n      ></circle>\n      }\n\n      <rect\n        [attr.x]=\"box.x\"\n        [attr.y]=\"box.y\"\n        [attr.width]=\"box.width\"\n        [attr.height]=\"box.height\"\n        stroke=\"blue\"\n        stroke-dasharray=\"5,5\"\n        fill=\"transparent\"\n      />\n      } @if (boundingBoxSignal(); as box) {\n      <g\n        id=\"selectorParentGroup\"\n        [attr.transform]=\"\n          'rotate(' + box.rotation + ',' + (box.x + box.width / 2) + ',' + (box.y + box.height / 2) + ')'\n        \"\n      >\n        <rect\n          id=\"selectorBox\"\n          [attr.x]=\"box.x\"\n          [attr.y]=\"box.y\"\n          [attr.width]=\"box.width\"\n          [attr.height]=\"box.height\"\n          fill=\"transparent\"\n          stroke=\"dodgerblue\"\n          stroke-width=\"1\"\n          cursor=\"move\"\n          pointer-events=\"all\"\n        ></rect>\n\n        <!-- Side Resize Lines -->\n        <ng-container *ngFor=\"let side of ['n', 's', 'e', 'w']\">\n          <rect\n            [attr.id]=\"'selectorGrip_resize_' + side\"\n            [attr.x]=\"side === 'n' || side === 's' ? box.x : side === 'e' ? box.x + box.width - 5 : box.x - 5\"\n            [attr.y]=\"side === 'n' ? box.y - 5 : side === 's' ? box.y + box.height - 5 : box.y\"\n            [attr.width]=\"side === 'n' || side === 's' ? box.width : 10\"\n            [attr.height]=\"side === 'n' || side === 's' ? 10 : box.height\"\n            fill=\"transparent\"\n            stroke=\"transparent\"\n            [attr.cursor]=\"side | gripCursor : box.rotation\"\n            pointer-events=\"all\"\n          ></rect>\n        </ng-container>\n\n        <!-- Corner Resize Grips -->\n        <ng-container *ngFor=\"let grip of ['nw', 'ne', 'se', 'sw']\">\n          <rect\n            [attr.id]=\"'selectorGrip_resize_' + grip\"\n            [attr.x]=\"box.x + (grip === 'ne' || grip === 'se' ? box.width : 0) - 5\"\n            [attr.y]=\"box.y + (grip === 'se' || grip === 'sw' ? box.height : 0) - 5\"\n            width=\"10\"\n            height=\"10\"\n            fill=\"white\"\n            stroke=\"dodgerblue\"\n            stroke-width=\"1\"\n            [attr.cursor]=\"grip | gripCursor : box.rotation\"\n          ></rect>\n        </ng-container>\n\n        <circle\n          id=\"selectorGrip_rotate_n\"\n          [attr.cx]=\"box.handles.rotateHandle.x\"\n          [attr.cy]=\"box.handles.rotateHandle.y\"\n          r=\"6\"\n          fill=\"white\"\n          stroke=\"green\"\n          stroke-width=\"1\"\n          cursor=\"grab\"\n        ></circle>\n\n        <!-- Corner Rotate Grips -->\n        <ng-container *ngFor=\"let grip of ['nw', 'ne', 'se', 'sw']\">\n          <circle\n            [attr.id]=\"'selectorGrip_rotate_' + grip\"\n            [attr.cx]=\"box.x + (grip === 'ne' || grip === 'se' ? box.width : -20) + 10\"\n            [attr.cy]=\"box.y + (grip === 'se' || grip === 'sw' ? box.height : -20) + 10\"\n            r=\"6\"\n            fill=\"none\"\n            stroke=\"none\"\n            stroke-width=\"1\"\n            [attr.cursor]=\"'rotate_' + grip | gripCursor : box.rotation\"\n          ></circle>\n        </ng-container>\n      </g>\n      }\n\n      <!-- 2-point endpoint handles for selected arrows / lines -->\n      @for (handle of lineEndpointHandles(); track handle.elementId + '_' + handle.end) {\n      <circle\n        class=\"line-endpoint-handle\"\n        [attr.id]=\"'endpointHandle_' + handle.elementId + '_' + handle.end\"\n        [attr.cx]=\"handle.x\"\n        [attr.cy]=\"handle.y\"\n        r=\"6\"\n        [attr.fill]=\"handle.bound ? '#4CAF50' : 'white'\"\n        stroke=\"dodgerblue\"\n        stroke-width=\"1.5\"\n        cursor=\"crosshair\"\n        pointer-events=\"all\"\n        [attr.data-arrow-id]=\"handle.elementId\"\n        [attr.data-handle]=\"handle.end\"\n      ></circle>\n      }\n\n      <!-- Middle curve handle for selected arrows -->\n      @for (handle of curveHandles(); track handle.elementId) {\n      <circle\n        class=\"curve-handle\"\n        [attr.id]=\"'curveHandle_' + handle.elementId\"\n        [attr.cx]=\"handle.x\"\n        [attr.cy]=\"handle.y\"\n        r=\"5\"\n        [attr.fill]=\"handle.isCurved ? '#FF9800' : 'white'\"\n        [attr.stroke]=\"handle.isCurved ? '#E65100' : '#999'\"\n        stroke-width=\"1.5\"\n        cursor=\"move\"\n        pointer-events=\"all\"\n        [attr.data-arrow-id]=\"handle.elementId\"\n        data-handle=\"curve\"\n      ></circle>\n      }\n    </g>\n  </svg>\n</svg>\n","import { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n  inject,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ApiService } from './core/api';\nimport { CanvasService, InstanceService } from './core/canvas';\nimport { WhiteboardCanvasComponent } from './core/components/canvas/whiteboard-canvas.component';\nimport { ContextMenuComponent } from './core/components/context-menu/context-menu.component';\nimport { ContextMenuService } from './core/components/context-menu/context-menu.service';\nimport { ConfigService } from './core/config/config.service';\nimport {\n  ArrowBindingService,\n  ConnectionPointsService,\n  ConnectionUIService,\n  ElementsService,\n  HandleService,\n  LayerManagementService,\n  SelectionService,\n} from './core/elements';\nimport { EventBusService } from './core/event-bus/event-bus.service';\nimport { HistoryService } from './core/history';\nimport { ClipboardService, DragDropService, IOService, KeyboardShortcutService } from './core/input';\nimport { SvgService } from './core/svg/svg.service';\nimport { ToolsService } from './core/tools';\nimport { ToolFactory } from './core/tools/tool-factory.service';\nimport { ToolType, WhiteboardConfig, WhiteboardElement } from './core/types';\nimport { WhiteboardEvent } from './core/types/events';\nimport { generateUUID } from './core/utils';\nimport { PanService, WheelHandlerService, ZoomService } from './core/viewport';\n\n/**\n * Main whiteboard component providing a canvas with drawing tools and configuration options.\n *\n * Handles whiteboard initialization, event management, and configuration updates.\n */\n@Component({\n  selector: 'ng-whiteboard',\n  standalone: true,\n  imports: [CommonModule, WhiteboardCanvasComponent, ContextMenuComponent],\n  template: `\n    <div style=\"width: 100%; height: 100%; position: relative;\">\n      <ng-whiteboard-canvas></ng-whiteboard-canvas>\n      <wb-context-menu></wb-context-menu>\n    </div>\n  `,\n  styles: [\n    `\n      :host {\n        display: block;\n        width: inherit;\n        height: inherit;\n        min-width: inherit;\n        min-height: inherit;\n        max-width: inherit;\n        max-height: inherit;\n      }\n    `,\n  ],\n  providers: [\n    SvgService,\n    ApiService,\n    ElementsService,\n    CanvasService,\n    IOService,\n    ZoomService,\n    PanService,\n    SelectionService,\n    ClipboardService,\n    ToolsService,\n    ToolFactory,\n    EventBusService,\n    ConfigService,\n    KeyboardShortcutService,\n    LayerManagementService,\n    HistoryService,\n    ContextMenuService,\n    DragDropService,\n    WheelHandlerService,\n    ConnectionPointsService,\n    ArrowBindingService,\n    ConnectionUIService,\n    HandleService,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgWhiteboardComponent implements OnInit, OnDestroy {\n  private configService = inject(ConfigService);\n  private apiService = inject(ApiService);\n  private toolsService = inject(ToolsService);\n  private eventBusService = inject(EventBusService);\n  private cd = inject(ChangeDetectorRef);\n  private instanceService = inject(InstanceService);\n\n  /**\n   * Unique identifier for this whiteboard instance.\n   * Auto-generated if not provided.\n   */\n  @Input() boardId = generateUUID();\n\n  /**\n   * Whiteboard configuration options.\n   */\n  @Input() set config(value: Partial<WhiteboardConfig>) {\n    this.configService.updateConfig(value, false);\n  }\n\n  get config(): WhiteboardConfig {\n    return this.configService.getConfig();\n  }\n\n  /**\n   * Whiteboard data elements.\n   */\n  @Input() set data(data: WhiteboardElement[]) {\n    if (data && data !== this.apiService.getElements()) {\n      this.apiService.setElements(data);\n    }\n  }\n\n  /**\n   * Active drawing tool.\n   */\n  @Input() set selectedTool(tool: ToolType) {\n    if (tool && this.toolsService.getActiveToolType() !== tool) {\n      this.toolsService.setActiveTool(tool);\n    }\n  }\n\n  /**\n   * Emitted when the whiteboard component is ready.\n   */\n  @Output() ready = new EventEmitter<void>();\n\n  /**\n   * Emitted when the whiteboard is destroyed.\n   */\n  @Output() destroyed = new EventEmitter<void>();\n\n  /**\n   * Emitted when the user starts drawing.\n   */\n  @Output() drawStart = new EventEmitter<{ x: number; y: number }>();\n\n  /**\n   * Emitted while the user is drawing.\n   */\n  @Output() drawing = new EventEmitter<{ x: number; y: number }>();\n\n  /**\n   * Emitted when the user stops drawing.\n   */\n  @Output() drawEnd = new EventEmitter<void>();\n\n  /**\n   * Emitted when elements are added.\n   */\n  @Output() elementsAdded = new EventEmitter<WhiteboardElement[]>();\n\n  /**\n   * Emitted when elements are updated.\n   */\n  @Output() elementsUpdated = new EventEmitter<WhiteboardElement[]>();\n\n  /**\n   * Emitted when elements are selected or deselected.\n   */\n  @Output() elementsSelected = new EventEmitter<WhiteboardElement[]>();\n\n  /**\n   * Emitted when elements are removed.\n   */\n  @Output() elementsRemoved = new EventEmitter<WhiteboardElement[]>();\n\n  /**\n   * Emitted when an element is double-clicked.\n   */\n  @Output() elementDoubleClicked = new EventEmitter<{ target: EventTarget | null; clientX: number; clientY: number }>();\n\n  /**\n   * Emitted when an undo action is triggered.\n   */\n  @Output() undo = new EventEmitter<void>();\n\n  /**\n   * Emitted when a redo action is triggered.\n   */\n  @Output() redo = new EventEmitter<void>();\n\n  /**\n   * Emitted when the whiteboard is cleared.\n   */\n  @Output() clear = new EventEmitter<void>();\n\n  /**\n   * Emitted when the whiteboard data changes.\n   */\n  @Output() dataChange = new EventEmitter<WhiteboardElement[]>();\n\n  /**\n   * Emitted when the whiteboard content is saved.\n   */\n  @Output() save = new EventEmitter<string>();\n\n  /**\n   * Emitted when an image is added.\n   */\n  @Output() imageAdded = new EventEmitter<File>();\n\n  /**\n   * Emitted when the selected drawing tool changes.\n   */\n  @Output() selectedToolChange = new EventEmitter<ToolType>();\n\n  /**\n   * Emitted when the configuration changes.\n   */\n  @Output() configChange = new EventEmitter<Partial<WhiteboardConfig>>();\n\n  /**\n   * Emitted when zoom-related configuration changes.\n   */\n  @Output() zoomChange = new EventEmitter<{\n    zoom: number;\n    center: boolean;\n    canvasWidth: number;\n    canvasHeight: number;\n  }>();\n\n  private readonly eventsMap = {\n    [WhiteboardEvent.Ready]: this.ready,\n    [WhiteboardEvent.Destroyed]: this.destroyed,\n    [WhiteboardEvent.DrawStart]: this.drawStart,\n    [WhiteboardEvent.Drawing]: this.drawing,\n    [WhiteboardEvent.DrawEnd]: this.drawEnd,\n    [WhiteboardEvent.ElementsAdded]: this.elementsAdded,\n    [WhiteboardEvent.ElementsUpdated]: this.elementsUpdated,\n    [WhiteboardEvent.ElementsSelected]: this.elementsSelected,\n    [WhiteboardEvent.ElementsRemoved]: this.elementsRemoved,\n    [WhiteboardEvent.ElementDoubleClicked]: this.elementDoubleClicked,\n    [WhiteboardEvent.Undo]: this.undo,\n    [WhiteboardEvent.Redo]: this.redo,\n    [WhiteboardEvent.Clear]: this.clear,\n    [WhiteboardEvent.DataChange]: this.dataChange,\n    [WhiteboardEvent.Save]: this.save,\n    [WhiteboardEvent.ImageAdded]: this.imageAdded,\n    [WhiteboardEvent.ToolChange]: this.selectedToolChange,\n    [WhiteboardEvent.ConfigChange]: this.configChange,\n    [WhiteboardEvent.ZoomChange]: this.zoomChange,\n  };\n\n  private eventsSubscription?: Subscription;\n\n  ngOnInit(): void {\n    this.instanceService.register(this.boardId, this.apiService);\n\n    // Subscribe to the observable stream instead of using a signal effect\n    // This ensures all synchronously emitted events are captured,\n    // preventing events from being swallowed when multiple events fire in the same cycle\n    this.eventsSubscription = this.eventBusService.listen().subscribe((event) => {\n      const emitter = this.eventsMap[event.type] as EventEmitter<unknown> | undefined;\n      if (emitter) {\n        if (event.payload !== undefined) {\n          emitter.emit(event.payload as unknown);\n        } else {\n          emitter.emit();\n        }\n        this.cd.markForCheck();\n      }\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.instanceService.unregister(this.boardId);\n    this.eventBusService.emit(WhiteboardEvent.Destroyed);\n\n    // Clean up subscription\n    if (this.eventsSubscription) {\n      this.eventsSubscription.unsubscribe();\n    }\n  }\n}\n","/*\n * Public API Surface of ng-whiteboard\n */\n\n// Main component and service\nexport * from './lib/ng-whiteboard.service';\nexport * from './lib/ng-whiteboard.component';\n\n// Core types and configurations\nexport * from './lib/core/types';\nexport * from './lib/core/config';\n\nexport * from './lib/core/api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.EventBusService","i1.ConfigService","i2.EventBusService","i1.ElementsService","i2.ClipboardService","i3.ElementsService","i4.ToolsService","i5.CanvasService","i1.ApiService","i2.ConfigService","i2.CanvasService","i3.ZoomService","i4.PanService","i5.EventBusService","i6.SelectionService","i7.LayerManagementService","i8.ConfigService","i1.ContextMenuService","i1.ToolsService","i3.EventBusService","i4.KeyboardShortcutService","i5.ApiService","i6.ContextMenuService","i7.DragDropService","i8.WheelHandlerService","i1.SvgService"],"mappings":"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"}