/** * Type definitions for calendar events and drag operations */ import { ColumnBounds } from "../utils/ColumnDetectionUtils"; import { CalendarEvent } from "./CalendarTypes"; /** * Drag Event Payload Interfaces * Type-safe interfaces for drag and drop events */ // Common position interface export interface MousePosition { x: number; y: number; } // Drag start event payload export interface DragStartEventPayload { draggedElement: HTMLElement; draggedClone: HTMLElement | null; mousePosition: MousePosition; mouseOffset: MousePosition; columnBounds: ColumnBounds | null; } // Drag move event payload export interface DragMoveEventPayload { draggedElement: HTMLElement; draggedClone: HTMLElement; mousePosition: MousePosition; mouseOffset: MousePosition; columnBounds: ColumnBounds | null; snappedY: number; } // Drag end event payload export interface DragEndEventPayload { originalElement: HTMLElement; draggedClone: HTMLElement | null; sourceColumn: ColumnBounds | null; // Where drag started mousePosition: MousePosition; finalPosition: { column: ColumnBounds | null; // Where drag ended snappedY: number; }; target: 'swp-day-column' | 'swp-day-header' | null; } // Drag mouse enter header event payload export interface DragMouseEnterHeaderEventPayload { targetColumn: ColumnBounds; mousePosition: MousePosition; originalElement: HTMLElement | null; draggedClone: HTMLElement; calendarEvent: CalendarEvent; // Delegate pattern - allows subscriber to replace the dragged clone replaceClone: (newClone: HTMLElement) => void; } // Drag mouse leave header event payload export interface DragMouseLeaveHeaderEventPayload { targetDate: string | null; mousePosition: MousePosition; originalElement: HTMLElement| null; draggedClone: HTMLElement| null; } // Drag column change event payload export interface DragColumnChangeEventPayload { originalElement: HTMLElement; draggedClone: HTMLElement | null; previousColumn: ColumnBounds | null; newColumn: ColumnBounds; mousePosition: MousePosition; } // Header ready event payload export interface HeaderReadyEventPayload { headerElements: ColumnBounds[]; } // Resize end event payload export interface ResizeEndEventPayload { eventId: string; element: HTMLElement; finalHeight: number; }