@mintplayer/ng-bootstrap 21.22.0 → 21.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/fesm2022/mintplayer-ng-bootstrap-accordion.mjs +20 -20
  2. package/fesm2022/mintplayer-ng-bootstrap-accordion.mjs.map +1 -1
  3. package/fesm2022/mintplayer-ng-bootstrap-alert.mjs +8 -8
  4. package/fesm2022/mintplayer-ng-bootstrap-alert.mjs.map +1 -1
  5. package/fesm2022/mintplayer-ng-bootstrap-badge.mjs +5 -5
  6. package/fesm2022/mintplayer-ng-bootstrap-badge.mjs.map +1 -1
  7. package/fesm2022/mintplayer-ng-bootstrap-breadcrumb.mjs +6 -6
  8. package/fesm2022/mintplayer-ng-bootstrap-breadcrumb.mjs.map +1 -1
  9. package/fesm2022/mintplayer-ng-bootstrap-button-group.mjs +3 -3
  10. package/fesm2022/mintplayer-ng-bootstrap-button-group.mjs.map +1 -1
  11. package/fesm2022/mintplayer-ng-bootstrap-button-type.mjs +4 -4
  12. package/fesm2022/mintplayer-ng-bootstrap-button-type.mjs.map +1 -1
  13. package/fesm2022/mintplayer-ng-bootstrap-calendar-month.mjs +9 -9
  14. package/fesm2022/mintplayer-ng-bootstrap-calendar-month.mjs.map +1 -1
  15. package/fesm2022/mintplayer-ng-bootstrap-calendar.mjs +10 -10
  16. package/fesm2022/mintplayer-ng-bootstrap-calendar.mjs.map +1 -1
  17. package/fesm2022/mintplayer-ng-bootstrap-card.mjs +8 -8
  18. package/fesm2022/mintplayer-ng-bootstrap-card.mjs.map +1 -1
  19. package/fesm2022/mintplayer-ng-bootstrap-carousel.mjs +25 -25
  20. package/fesm2022/mintplayer-ng-bootstrap-carousel.mjs.map +1 -1
  21. package/fesm2022/mintplayer-ng-bootstrap-close.mjs +3 -3
  22. package/fesm2022/mintplayer-ng-bootstrap-close.mjs.map +1 -1
  23. package/fesm2022/mintplayer-ng-bootstrap-code-snippet.mjs +7 -7
  24. package/fesm2022/mintplayer-ng-bootstrap-code-snippet.mjs.map +1 -1
  25. package/fesm2022/mintplayer-ng-bootstrap-color-picker.mjs +58 -58
  26. package/fesm2022/mintplayer-ng-bootstrap-color-picker.mjs.map +1 -1
  27. package/fesm2022/mintplayer-ng-bootstrap-container.mjs +3 -3
  28. package/fesm2022/mintplayer-ng-bootstrap-container.mjs.map +1 -1
  29. package/fesm2022/mintplayer-ng-bootstrap-context-menu.mjs +3 -3
  30. package/fesm2022/mintplayer-ng-bootstrap-context-menu.mjs.map +1 -1
  31. package/fesm2022/mintplayer-ng-bootstrap-copy.mjs +4 -4
  32. package/fesm2022/mintplayer-ng-bootstrap-copy.mjs.map +1 -1
  33. package/fesm2022/mintplayer-ng-bootstrap-datatable.mjs +20 -20
  34. package/fesm2022/mintplayer-ng-bootstrap-datatable.mjs.map +1 -1
  35. package/fesm2022/mintplayer-ng-bootstrap-datepicker.mjs +6 -6
  36. package/fesm2022/mintplayer-ng-bootstrap-datepicker.mjs.map +1 -1
  37. package/fesm2022/mintplayer-ng-bootstrap-dock.mjs +789 -1175
  38. package/fesm2022/mintplayer-ng-bootstrap-dock.mjs.map +1 -1
  39. package/fesm2022/mintplayer-ng-bootstrap-dropdown-divider.mjs +3 -3
  40. package/fesm2022/mintplayer-ng-bootstrap-dropdown-divider.mjs.map +1 -1
  41. package/fesm2022/mintplayer-ng-bootstrap-dropdown-menu.mjs +10 -10
  42. package/fesm2022/mintplayer-ng-bootstrap-dropdown-menu.mjs.map +1 -1
  43. package/fesm2022/mintplayer-ng-bootstrap-dropdown.mjs +15 -15
  44. package/fesm2022/mintplayer-ng-bootstrap-dropdown.mjs.map +1 -1
  45. package/fesm2022/mintplayer-ng-bootstrap-enhanced-paste.mjs +3 -3
  46. package/fesm2022/mintplayer-ng-bootstrap-enhanced-paste.mjs.map +1 -1
  47. package/fesm2022/mintplayer-ng-bootstrap-enum.mjs +3 -3
  48. package/fesm2022/mintplayer-ng-bootstrap-enum.mjs.map +1 -1
  49. package/fesm2022/mintplayer-ng-bootstrap-file-upload.mjs +16 -16
  50. package/fesm2022/mintplayer-ng-bootstrap-file-upload.mjs.map +1 -1
  51. package/fesm2022/mintplayer-ng-bootstrap-floating-labels.mjs +3 -3
  52. package/fesm2022/mintplayer-ng-bootstrap-floating-labels.mjs.map +1 -1
  53. package/fesm2022/mintplayer-ng-bootstrap-font-color.mjs +3 -3
  54. package/fesm2022/mintplayer-ng-bootstrap-font-color.mjs.map +1 -1
  55. package/fesm2022/mintplayer-ng-bootstrap-for.mjs +4 -4
  56. package/fesm2022/mintplayer-ng-bootstrap-for.mjs.map +1 -1
  57. package/fesm2022/mintplayer-ng-bootstrap-form.mjs +11 -11
  58. package/fesm2022/mintplayer-ng-bootstrap-form.mjs.map +1 -1
  59. package/fesm2022/mintplayer-ng-bootstrap-grid.mjs +26 -26
  60. package/fesm2022/mintplayer-ng-bootstrap-grid.mjs.map +1 -1
  61. package/fesm2022/mintplayer-ng-bootstrap-has-overlay.mjs +4 -4
  62. package/fesm2022/mintplayer-ng-bootstrap-has-overlay.mjs.map +1 -1
  63. package/fesm2022/mintplayer-ng-bootstrap-has-property.mjs +3 -3
  64. package/fesm2022/mintplayer-ng-bootstrap-has-property.mjs.map +1 -1
  65. package/fesm2022/mintplayer-ng-bootstrap-in-list.mjs +3 -3
  66. package/fesm2022/mintplayer-ng-bootstrap-in-list.mjs.map +1 -1
  67. package/fesm2022/mintplayer-ng-bootstrap-input-group.mjs +3 -3
  68. package/fesm2022/mintplayer-ng-bootstrap-input-group.mjs.map +1 -1
  69. package/fesm2022/mintplayer-ng-bootstrap-instance-of.mjs +14 -14
  70. package/fesm2022/mintplayer-ng-bootstrap-instance-of.mjs.map +1 -1
  71. package/fesm2022/mintplayer-ng-bootstrap-let.mjs +4 -4
  72. package/fesm2022/mintplayer-ng-bootstrap-let.mjs.map +1 -1
  73. package/fesm2022/mintplayer-ng-bootstrap-linify.mjs +3 -3
  74. package/fesm2022/mintplayer-ng-bootstrap-linify.mjs.map +1 -1
  75. package/fesm2022/mintplayer-ng-bootstrap-list-group.mjs +7 -7
  76. package/fesm2022/mintplayer-ng-bootstrap-list-group.mjs.map +1 -1
  77. package/fesm2022/mintplayer-ng-bootstrap-markdown.mjs +12 -12
  78. package/fesm2022/mintplayer-ng-bootstrap-markdown.mjs.map +1 -1
  79. package/fesm2022/mintplayer-ng-bootstrap-marquee.mjs +3 -3
  80. package/fesm2022/mintplayer-ng-bootstrap-marquee.mjs.map +1 -1
  81. package/fesm2022/mintplayer-ng-bootstrap-modal.mjs +24 -24
  82. package/fesm2022/mintplayer-ng-bootstrap-modal.mjs.map +1 -1
  83. package/fesm2022/mintplayer-ng-bootstrap-multiselect.mjs +24 -24
  84. package/fesm2022/mintplayer-ng-bootstrap-multiselect.mjs.map +1 -1
  85. package/fesm2022/mintplayer-ng-bootstrap-navbar-toggler.mjs +5 -5
  86. package/fesm2022/mintplayer-ng-bootstrap-navbar-toggler.mjs.map +1 -1
  87. package/fesm2022/mintplayer-ng-bootstrap-navbar.mjs +58 -58
  88. package/fesm2022/mintplayer-ng-bootstrap-navbar.mjs.map +1 -1
  89. package/fesm2022/mintplayer-ng-bootstrap-navigation-lock.mjs +8 -8
  90. package/fesm2022/mintplayer-ng-bootstrap-navigation-lock.mjs.map +1 -1
  91. package/fesm2022/mintplayer-ng-bootstrap-no-noscript.mjs +3 -3
  92. package/fesm2022/mintplayer-ng-bootstrap-no-noscript.mjs.map +1 -1
  93. package/fesm2022/mintplayer-ng-bootstrap-offcanvas.mjs +40 -40
  94. package/fesm2022/mintplayer-ng-bootstrap-offcanvas.mjs.map +1 -1
  95. package/fesm2022/mintplayer-ng-bootstrap-ordinal-number.mjs +3 -3
  96. package/fesm2022/mintplayer-ng-bootstrap-ordinal-number.mjs.map +1 -1
  97. package/fesm2022/mintplayer-ng-bootstrap-pagination.mjs +12 -12
  98. package/fesm2022/mintplayer-ng-bootstrap-pagination.mjs.map +1 -1
  99. package/fesm2022/mintplayer-ng-bootstrap-parallax.mjs +6 -6
  100. package/fesm2022/mintplayer-ng-bootstrap-parallax.mjs.map +1 -1
  101. package/fesm2022/mintplayer-ng-bootstrap-placeholder.mjs +7 -7
  102. package/fesm2022/mintplayer-ng-bootstrap-placeholder.mjs.map +1 -1
  103. package/fesm2022/mintplayer-ng-bootstrap-playlist-toggler.mjs +5 -5
  104. package/fesm2022/mintplayer-ng-bootstrap-playlist-toggler.mjs.map +1 -1
  105. package/fesm2022/mintplayer-ng-bootstrap-popover.mjs +20 -20
  106. package/fesm2022/mintplayer-ng-bootstrap-popover.mjs.map +1 -1
  107. package/fesm2022/mintplayer-ng-bootstrap-priority-nav.mjs +30 -30
  108. package/fesm2022/mintplayer-ng-bootstrap-priority-nav.mjs.map +1 -1
  109. package/fesm2022/mintplayer-ng-bootstrap-progress-bar.mjs +17 -17
  110. package/fesm2022/mintplayer-ng-bootstrap-progress-bar.mjs.map +1 -1
  111. package/fesm2022/mintplayer-ng-bootstrap-range.mjs +9 -9
  112. package/fesm2022/mintplayer-ng-bootstrap-range.mjs.map +1 -1
  113. package/fesm2022/mintplayer-ng-bootstrap-rating.mjs +7 -7
  114. package/fesm2022/mintplayer-ng-bootstrap-rating.mjs.map +1 -1
  115. package/fesm2022/mintplayer-ng-bootstrap-resizable.mjs +25 -25
  116. package/fesm2022/mintplayer-ng-bootstrap-resizable.mjs.map +1 -1
  117. package/fesm2022/mintplayer-ng-bootstrap-scheduler.mjs +16 -16
  118. package/fesm2022/mintplayer-ng-bootstrap-scheduler.mjs.map +1 -1
  119. package/fesm2022/mintplayer-ng-bootstrap-scrollspy.mjs +14 -14
  120. package/fesm2022/mintplayer-ng-bootstrap-scrollspy.mjs.map +1 -1
  121. package/fesm2022/mintplayer-ng-bootstrap-searchbox.mjs +24 -24
  122. package/fesm2022/mintplayer-ng-bootstrap-searchbox.mjs.map +1 -1
  123. package/fesm2022/mintplayer-ng-bootstrap-select.mjs +19 -19
  124. package/fesm2022/mintplayer-ng-bootstrap-select.mjs.map +1 -1
  125. package/fesm2022/mintplayer-ng-bootstrap-select2.mjs +20 -20
  126. package/fesm2022/mintplayer-ng-bootstrap-select2.mjs.map +1 -1
  127. package/fesm2022/mintplayer-ng-bootstrap-shell.mjs +11 -11
  128. package/fesm2022/mintplayer-ng-bootstrap-shell.mjs.map +1 -1
  129. package/fesm2022/mintplayer-ng-bootstrap-signature-pad.mjs +7 -7
  130. package/fesm2022/mintplayer-ng-bootstrap-signature-pad.mjs.map +1 -1
  131. package/fesm2022/mintplayer-ng-bootstrap-slugify.mjs +3 -3
  132. package/fesm2022/mintplayer-ng-bootstrap-slugify.mjs.map +1 -1
  133. package/fesm2022/mintplayer-ng-bootstrap-spinner.mjs +7 -7
  134. package/fesm2022/mintplayer-ng-bootstrap-spinner.mjs.map +1 -1
  135. package/fesm2022/mintplayer-ng-bootstrap-split-string.mjs +3 -3
  136. package/fesm2022/mintplayer-ng-bootstrap-split-string.mjs.map +1 -1
  137. package/fesm2022/mintplayer-ng-bootstrap-sticky-footer.mjs +6 -6
  138. package/fesm2022/mintplayer-ng-bootstrap-sticky-footer.mjs.map +1 -1
  139. package/fesm2022/mintplayer-ng-bootstrap-tab-control.mjs +57 -67
  140. package/fesm2022/mintplayer-ng-bootstrap-tab-control.mjs.map +1 -1
  141. package/fesm2022/mintplayer-ng-bootstrap-table.mjs +10 -10
  142. package/fesm2022/mintplayer-ng-bootstrap-table.mjs.map +1 -1
  143. package/fesm2022/mintplayer-ng-bootstrap-timepicker.mjs +8 -8
  144. package/fesm2022/mintplayer-ng-bootstrap-timepicker.mjs.map +1 -1
  145. package/fesm2022/mintplayer-ng-bootstrap-toast.mjs +24 -24
  146. package/fesm2022/mintplayer-ng-bootstrap-toast.mjs.map +1 -1
  147. package/fesm2022/mintplayer-ng-bootstrap-toggle-button.mjs +22 -22
  148. package/fesm2022/mintplayer-ng-bootstrap-toggle-button.mjs.map +1 -1
  149. package/fesm2022/mintplayer-ng-bootstrap-tooltip.mjs +10 -10
  150. package/fesm2022/mintplayer-ng-bootstrap-tooltip.mjs.map +1 -1
  151. package/fesm2022/mintplayer-ng-bootstrap-treeview.mjs +14 -14
  152. package/fesm2022/mintplayer-ng-bootstrap-treeview.mjs.map +1 -1
  153. package/fesm2022/mintplayer-ng-bootstrap-trust-html.mjs +3 -3
  154. package/fesm2022/mintplayer-ng-bootstrap-trust-html.mjs.map +1 -1
  155. package/fesm2022/mintplayer-ng-bootstrap-typeahead.mjs +10 -10
  156. package/fesm2022/mintplayer-ng-bootstrap-typeahead.mjs.map +1 -1
  157. package/fesm2022/mintplayer-ng-bootstrap-uc-first.mjs +3 -3
  158. package/fesm2022/mintplayer-ng-bootstrap-uc-first.mjs.map +1 -1
  159. package/fesm2022/mintplayer-ng-bootstrap-user-agent.mjs +3 -3
  160. package/fesm2022/mintplayer-ng-bootstrap-user-agent.mjs.map +1 -1
  161. package/fesm2022/mintplayer-ng-bootstrap-viewport.mjs +3 -3
  162. package/fesm2022/mintplayer-ng-bootstrap-viewport.mjs.map +1 -1
  163. package/fesm2022/mintplayer-ng-bootstrap-virtual-datatable.mjs +10 -10
  164. package/fesm2022/mintplayer-ng-bootstrap-virtual-datatable.mjs.map +1 -1
  165. package/fesm2022/mintplayer-ng-bootstrap-web-components-scheduler-core.mjs +1356 -0
  166. package/fesm2022/mintplayer-ng-bootstrap-web-components-scheduler-core.mjs.map +1 -0
  167. package/fesm2022/mintplayer-ng-bootstrap-web-components-scheduler.mjs +3819 -0
  168. package/fesm2022/mintplayer-ng-bootstrap-web-components-scheduler.mjs.map +1 -0
  169. package/fesm2022/mintplayer-ng-bootstrap-web-components-splitter.mjs +731 -0
  170. package/fesm2022/mintplayer-ng-bootstrap-web-components-splitter.mjs.map +1 -0
  171. package/fesm2022/mintplayer-ng-bootstrap-web-components-tab-control.mjs +549 -0
  172. package/fesm2022/mintplayer-ng-bootstrap-web-components-tab-control.mjs.map +1 -0
  173. package/fesm2022/mintplayer-ng-bootstrap-word-count.mjs +3 -3
  174. package/fesm2022/mintplayer-ng-bootstrap-word-count.mjs.map +1 -1
  175. package/package.json +20 -6
  176. package/types/mintplayer-ng-bootstrap-dock.d.ts +55 -19
  177. package/types/mintplayer-ng-bootstrap-scheduler.d.ts +2 -2
  178. package/types/mintplayer-ng-bootstrap-tab-control.d.ts +7 -11
  179. package/types/mintplayer-ng-bootstrap-web-components-scheduler-core.d.ts +890 -0
  180. package/types/mintplayer-ng-bootstrap-web-components-scheduler.d.ts +354 -0
  181. package/types/mintplayer-ng-bootstrap-web-components-splitter.d.ts +165 -0
  182. package/types/mintplayer-ng-bootstrap-web-components-tab-control.d.ts +95 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mintplayer-ng-bootstrap-web-components-scheduler.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/src/state/scheduler-state.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/src/views/base-view.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/src/views/year-view.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/src/views/month-view.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/src/views/week-view.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/src/views/day-view.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/src/views/timeline-view.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/src/styles/scheduler.styles.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/src/drag/drag-types.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/src/drag/drag-preview.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/src/input/pointer-event.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/src/drag/drag-state-machine.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/src/drag/drag-manager.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/src/input/input-handler.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/src/events/scheduler-event-emitter.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/src/components/mp-scheduler.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/src/index.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/scheduler/mintplayer-ng-bootstrap-web-components-scheduler.ts"],"sourcesContent":["import {\n ViewType,\n SchedulerEvent,\n Resource,\n ResourceGroup,\n SchedulerOptions,\n DEFAULT_OPTIONS,\n PreviewEvent,\n DragState,\n TimeSlot,\n} from '@mintplayer/ng-bootstrap/web-components/scheduler-core';\n\n/**\n * Internal state for the scheduler web component\n */\nexport interface SchedulerState {\n /** Current view type */\n view: ViewType;\n /** Current date (the date shown in the view) */\n date: Date;\n /** All events */\n events: SchedulerEvent[];\n /** Resources and resource groups */\n resources: (Resource | ResourceGroup)[];\n /** Configuration options */\n options: SchedulerOptions;\n /** Currently selected event */\n selectedEvent: SchedulerEvent | null;\n /** Currently hovered event */\n hoveredEvent: SchedulerEvent | null;\n /** Currently hovered time slot */\n hoveredSlot: TimeSlot | null;\n /** Current drag operation state */\n dragState: DragState | null;\n /** Preview event during drag operations */\n previewEvent: PreviewEvent | null;\n /** Collapsed resource group IDs */\n collapsedGroups: Set<string>;\n /** Whether mouse button is pressed */\n isMouseDown: boolean;\n /** Loading state */\n isLoading: boolean;\n}\n\n/**\n * Create initial scheduler state\n */\nexport function createInitialState(\n options: Partial<SchedulerOptions> = {}\n): SchedulerState {\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n\n return {\n view: mergedOptions.initialView,\n date: mergedOptions.initialDate,\n events: [],\n resources: [],\n options: mergedOptions,\n selectedEvent: null,\n hoveredEvent: null,\n hoveredSlot: null,\n dragState: null,\n previewEvent: null,\n collapsedGroups: new Set(),\n isMouseDown: false,\n isLoading: false,\n };\n}\n\n/**\n * State update function type\n */\nexport type StateUpdater = (state: SchedulerState) => Partial<SchedulerState>;\n\n/**\n * State manager for the scheduler\n */\nexport class SchedulerStateManager {\n private state: SchedulerState;\n private listeners: Set<(state: SchedulerState) => void> = new Set();\n\n constructor(initialOptions: Partial<SchedulerOptions> = {}) {\n this.state = createInitialState(initialOptions);\n }\n\n /**\n * Get current state\n */\n getState(): SchedulerState {\n return this.state;\n }\n\n /**\n * Update state with partial update or updater function\n */\n setState(update: Partial<SchedulerState> | StateUpdater): void {\n const partialUpdate =\n typeof update === 'function' ? update(this.state) : update;\n\n this.state = { ...this.state, ...partialUpdate };\n this.notifyListeners();\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(listener: (state: SchedulerState) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Notify all listeners of state change\n */\n private notifyListeners(): void {\n for (const listener of this.listeners) {\n listener(this.state);\n }\n }\n\n // Convenience methods for common state updates\n\n /**\n * Set the current view\n */\n setView(view: ViewType): void {\n this.setState({ view });\n }\n\n /**\n * Set the current date\n */\n setDate(date: Date): void {\n this.setState({ date });\n }\n\n /**\n * Set events\n */\n setEvents(events: SchedulerEvent[]): void {\n this.setState({ events });\n }\n\n /**\n * Add an event\n */\n addEvent(event: SchedulerEvent): void {\n this.setState((state) => ({\n events: [...state.events, event],\n }));\n }\n\n /**\n * Update an event\n */\n updateEvent(event: SchedulerEvent): void {\n this.setState((state) => ({\n events: state.events.map((e) => (e.id === event.id ? event : e)),\n }));\n }\n\n /**\n * Remove an event\n */\n removeEvent(eventId: string): void {\n this.setState((state) => ({\n events: state.events.filter((e) => e.id !== eventId),\n }));\n }\n\n /**\n * Set resources\n */\n setResources(resources: (Resource | ResourceGroup)[]): void {\n this.setState({ resources });\n }\n\n /**\n * Toggle resource group collapse\n */\n toggleGroupCollapse(groupId: string): void {\n this.setState((state) => {\n const newCollapsed = new Set(state.collapsedGroups);\n if (newCollapsed.has(groupId)) {\n newCollapsed.delete(groupId);\n } else {\n newCollapsed.add(groupId);\n }\n return { collapsedGroups: newCollapsed };\n });\n }\n\n /**\n * Set selected event\n */\n setSelectedEvent(event: SchedulerEvent | null): void {\n this.setState({ selectedEvent: event });\n }\n\n /**\n * Set hovered event\n */\n setHoveredEvent(event: SchedulerEvent | null): void {\n this.setState({ hoveredEvent: event });\n }\n\n /**\n * Set hovered slot\n */\n setHoveredSlot(slot: TimeSlot | null): void {\n this.setState({ hoveredSlot: slot });\n }\n\n /**\n * Start a drag operation\n */\n startDrag(dragState: DragState): void {\n this.setState({\n dragState,\n previewEvent: dragState.preview,\n isMouseDown: true,\n });\n }\n\n /**\n * Update drag operation\n */\n updateDrag(currentSlot: TimeSlot, preview: PreviewEvent): void {\n this.setState((state) => ({\n dragState: state.dragState\n ? { ...state.dragState, currentSlot, preview }\n : null,\n previewEvent: preview,\n }));\n }\n\n /**\n * End drag operation\n */\n endDrag(): void {\n this.setState({\n dragState: null,\n previewEvent: null,\n isMouseDown: false,\n });\n }\n\n /**\n * Set mouse down state\n */\n setMouseDown(isMouseDown: boolean): void {\n this.setState({ isMouseDown });\n }\n\n /**\n * Set loading state\n */\n setLoading(isLoading: boolean): void {\n this.setState({ isLoading });\n }\n\n /**\n * Update options\n */\n setOptions(options: Partial<SchedulerOptions>): void {\n this.setState((state) => ({\n options: { ...state.options, ...options },\n }));\n }\n\n /**\n * Navigate to next period\n */\n next(): void {\n this.setState((state) => {\n const newDate = new Date(state.date);\n switch (state.view) {\n case 'year':\n newDate.setFullYear(newDate.getFullYear() + 1);\n break;\n case 'month':\n newDate.setMonth(newDate.getMonth() + 1);\n break;\n case 'week':\n case 'timeline':\n newDate.setDate(newDate.getDate() + 7);\n break;\n case 'day':\n newDate.setDate(newDate.getDate() + 1);\n break;\n }\n return { date: newDate };\n });\n }\n\n /**\n * Navigate to previous period\n */\n prev(): void {\n this.setState((state) => {\n const newDate = new Date(state.date);\n switch (state.view) {\n case 'year':\n newDate.setFullYear(newDate.getFullYear() - 1);\n break;\n case 'month':\n newDate.setMonth(newDate.getMonth() - 1);\n break;\n case 'week':\n case 'timeline':\n newDate.setDate(newDate.getDate() - 7);\n break;\n case 'day':\n newDate.setDate(newDate.getDate() - 1);\n break;\n }\n return { date: newDate };\n });\n }\n\n /**\n * Navigate to today\n */\n today(): void {\n this.setState({ date: new Date() });\n }\n\n /**\n * Navigate to a specific date\n */\n gotoDate(date: Date): void {\n this.setState({ date });\n }\n}\n","import { SchedulerState } from '../state/scheduler-state';\n\n/**\n * Base class for scheduler views\n */\nexport abstract class BaseView {\n protected container: HTMLElement;\n protected state: SchedulerState;\n\n constructor(container: HTMLElement, state: SchedulerState) {\n this.container = container;\n this.state = state;\n }\n\n /**\n * Update the view with new state\n */\n abstract update(state: SchedulerState): void;\n\n /**\n * Render the view\n */\n abstract render(): void;\n\n /**\n * Clean up the view\n */\n abstract destroy(): void;\n\n /**\n * Update the now indicator position (called every minute)\n * Default implementation does nothing - override in views that have a now indicator\n */\n updateNowIndicator(): void {\n // Default: do nothing\n }\n\n /**\n * Get the view's root element\n */\n getElement(): HTMLElement {\n return this.container;\n }\n\n /**\n * Helper to create an element with classes\n */\n protected createElement<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n ...classes: string[]\n ): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag);\n if (classes.length > 0) {\n el.classList.add(...classes);\n }\n return el;\n }\n\n /**\n * Helper to set data attributes\n */\n protected setData(\n element: HTMLElement,\n data: Record<string, string | number>\n ): void {\n for (const [key, value] of Object.entries(data)) {\n element.dataset[key] = String(value);\n }\n }\n\n /**\n * Helper to clear container\n */\n protected clearContainer(): void {\n this.container.innerHTML = '';\n }\n}\n","import {\n dateService,\n timelineService,\n} from '@mintplayer/ng-bootstrap/web-components/scheduler-core';\nimport { BaseView } from './base-view';\nimport { SchedulerState } from '../state/scheduler-state';\n\n/**\n * Year view renderer\n */\nexport class YearView extends BaseView {\n render(): void {\n this.clearContainer();\n this.container.classList.add('scheduler-year-view');\n\n const { date, options } = this.state;\n const months = dateService.getYearMonths(date);\n\n const grid = this.createElement('div', 'scheduler-year-grid');\n\n for (const month of months) {\n const monthEl = this.createMonthCard(month);\n grid.appendChild(monthEl);\n }\n\n this.container.appendChild(grid);\n }\n\n private createMonthCard(month: Date): HTMLElement {\n const { events, options } = this.state;\n const card = this.createElement('div', 'scheduler-year-month');\n\n // Month header\n const header = this.createElement('div', 'scheduler-year-month-header');\n header.textContent = dateService.getMonthName(month, options.locale);\n this.setData(header, { month: month.toISOString() });\n card.appendChild(header);\n\n // Mini calendar\n const miniMonth = this.createElement('div', 'scheduler-mini-month');\n\n // Day headers\n const weeks = dateService.getMonthWeeks(month, options.firstDayOfWeek);\n const firstWeek = weeks[0];\n\n for (const day of firstWeek) {\n const dayHeader = this.createElement('div', 'scheduler-mini-day', 'header');\n dayHeader.textContent = dateService.getDayName(day, options.locale, 'narrow');\n dayHeader.style.fontWeight = '600';\n dayHeader.style.color = '#666';\n miniMonth.appendChild(dayHeader);\n }\n\n // Days\n const monthStart = dateService.getMonthStart(month);\n const monthEnd = dateService.getMonthEnd(month);\n const monthEvents = timelineService.filterByRange(events, monthStart, monthEnd);\n\n // Create a set of dates that have events\n const datesWithEvents = new Set<string>();\n for (const event of monthEvents) {\n const current = new Date(event.start);\n current.setHours(0, 0, 0, 0);\n while (current <= event.end) {\n datesWithEvents.add(current.toISOString().split('T')[0]);\n current.setDate(current.getDate() + 1);\n }\n }\n\n for (const week of weeks) {\n for (const day of week) {\n const dayEl = this.createElement('div', 'scheduler-mini-day');\n dayEl.textContent = String(day.getDate());\n this.setData(dayEl, { date: day.toISOString() });\n\n if (!dateService.isSameMonth(day, month)) {\n dayEl.classList.add('other-month');\n }\n\n if (dateService.isToday(day)) {\n dayEl.classList.add('today');\n }\n\n const dateKey = day.toISOString().split('T')[0];\n if (datesWithEvents.has(dateKey)) {\n dayEl.classList.add('has-events');\n }\n\n miniMonth.appendChild(dayEl);\n }\n }\n\n card.appendChild(miniMonth);\n return card;\n }\n\n update(state: SchedulerState): void {\n this.state = state;\n // Year view is mostly static, re-render fully\n this.render();\n }\n\n destroy(): void {\n this.clearContainer();\n }\n}\n","import {\n dateService,\n timelineService,\n SchedulerEvent,\n getContrastColor,\n} from '@mintplayer/ng-bootstrap/web-components/scheduler-core';\nimport { BaseView } from './base-view';\nimport { SchedulerState } from '../state/scheduler-state';\n\n/**\n * Month view renderer\n */\nexport class MonthView extends BaseView {\n private dayCells: Map<string, HTMLElement> = new Map();\n\n render(): void {\n this.clearContainer();\n this.container.classList.add('scheduler-month-view');\n\n const { date, options } = this.state;\n const weeks = dateService.getMonthWeeks(date, options.firstDayOfWeek);\n\n // Create day-of-week headers\n const headers = this.createElement('div', 'scheduler-day-headers');\n const firstWeek = weeks[0];\n\n for (const day of firstWeek) {\n const header = this.createElement('div', 'scheduler-day-header');\n header.textContent = dateService.getDayName(day, options.locale);\n headers.appendChild(header);\n }\n\n this.container.appendChild(headers);\n\n // Create month grid\n const grid = this.createElement('div', 'scheduler-month-grid');\n\n for (const week of weeks) {\n for (const day of week) {\n const cell = this.createDayCell(day);\n grid.appendChild(cell);\n }\n }\n\n this.container.appendChild(grid);\n\n // Render events\n this.renderEvents();\n }\n\n private createDayCell(day: Date): HTMLElement {\n const { date } = this.state;\n const cell = this.createElement('div', 'scheduler-month-day');\n\n if (!dateService.isSameMonth(day, date)) {\n cell.classList.add('other-month');\n }\n\n if (dateService.isToday(day)) {\n cell.classList.add('today');\n }\n\n // Day number\n const dayNumber = this.createElement('div', 'day-number');\n dayNumber.textContent = String(day.getDate());\n cell.appendChild(dayNumber);\n\n // Events container\n const eventsContainer = this.createElement('div', 'month-events');\n cell.appendChild(eventsContainer);\n\n // Store reference\n const key = day.toISOString().split('T')[0];\n this.dayCells.set(key, cell);\n this.setData(cell, { date: key });\n\n return cell;\n }\n\n private renderEvents(): void {\n const { date, events, options } = this.state;\n const monthStart = dateService.getMonthStart(date);\n const monthEnd = dateService.getMonthEnd(date);\n\n // Get weeks for full view range\n const weeks = dateService.getMonthWeeks(date, options.firstDayOfWeek);\n const viewStart = weeks[0][0];\n const viewEnd = weeks[weeks.length - 1][6];\n viewEnd.setHours(23, 59, 59, 999);\n\n // Filter events for the view range\n const viewEvents = timelineService.filterByRange(events, viewStart, viewEnd);\n\n // Group events by day\n const eventsByDay = new Map<string, SchedulerEvent[]>();\n\n for (const event of viewEvents) {\n const eventStart = new Date(event.start);\n const eventEnd = new Date(event.end);\n\n // Iterate through each day the event spans\n const current = new Date(eventStart);\n current.setHours(0, 0, 0, 0);\n\n while (current <= eventEnd) {\n const key = current.toISOString().split('T')[0];\n if (!eventsByDay.has(key)) {\n eventsByDay.set(key, []);\n }\n eventsByDay.get(key)!.push(event);\n current.setDate(current.getDate() + 1);\n }\n }\n\n // Render events in each day cell\n const maxEventsPerDay = typeof options.dayMaxEvents === 'number'\n ? options.dayMaxEvents\n : 3;\n\n for (const [key, dayEvents] of eventsByDay) {\n const cell = this.dayCells.get(key);\n if (!cell) continue;\n\n const eventsContainer = cell.querySelector('.month-events');\n if (!eventsContainer) continue;\n\n // Clear existing events\n eventsContainer.innerHTML = '';\n\n const visibleEvents = dayEvents.slice(0, maxEventsPerDay);\n const hiddenCount = dayEvents.length - visibleEvents.length;\n\n for (const event of visibleEvents) {\n const eventEl = this.createElement('div', 'scheduler-month-event');\n eventEl.textContent = event.title;\n eventEl.style.backgroundColor = event.color ?? '#3788d8';\n eventEl.style.color = event.textColor ?? getContrastColor(event.color ?? '#3788d8');\n this.setData(eventEl, { eventId: event.id });\n eventsContainer.appendChild(eventEl);\n }\n\n if (hiddenCount > 0) {\n const moreLink = this.createElement('div', 'scheduler-more-link');\n moreLink.textContent = `+${hiddenCount} more`;\n this.setData(moreLink, { date: key });\n eventsContainer.appendChild(moreLink);\n }\n }\n }\n\n update(state: SchedulerState): void {\n const dateChanged = this.state.date.getMonth() !== state.date.getMonth() ||\n this.state.date.getFullYear() !== state.date.getFullYear();\n const optionsChanged = this.optionsRequireRerender(this.state.options, state.options);\n this.state = state;\n\n // If month or relevant options changed, we need to re-render the entire view\n if (dateChanged || optionsChanged) {\n this.render();\n return;\n }\n\n this.renderEvents();\n }\n\n private optionsRequireRerender(oldOpts: SchedulerState['options'], newOpts: SchedulerState['options']): boolean {\n return oldOpts.firstDayOfWeek !== newOpts.firstDayOfWeek ||\n oldOpts.dayMaxEvents !== newOpts.dayMaxEvents ||\n oldOpts.locale !== newOpts.locale;\n }\n\n destroy(): void {\n this.dayCells.clear();\n this.clearContainer();\n }\n}\n","import {\n dateService,\n timelineService,\n SchedulerEvent,\n SchedulerEventPart,\n TimeSlot,\n getContrastColor,\n} from '@mintplayer/ng-bootstrap/web-components/scheduler-core';\nimport { BaseView } from './base-view';\nimport { SchedulerState } from '../state/scheduler-state';\n\n/**\n * Week view renderer\n */\nexport class WeekView extends BaseView {\n private dayColumns: HTMLElement[] = [];\n private eventElements: Map<string, HTMLElement> = new Map();\n private slotElements: Map<string, HTMLElement> = new Map();\n\n render(): void {\n this.clearContainer();\n this.container.classList.add('scheduler-week-view');\n\n const { date, options } = this.state;\n const days = dateService.getWeekDays(date, options.firstDayOfWeek);\n\n // Create day headers\n const headers = this.createElement('div', 'scheduler-day-headers');\n\n // Add time gutter space\n const gutterSpace = this.createElement('div', 'scheduler-time-gutter-space');\n gutterSpace.style.width = 'var(--scheduler-time-gutter-width)';\n headers.appendChild(gutterSpace);\n\n for (const day of days) {\n const header = this.createElement('div', 'scheduler-day-header');\n if (dateService.isToday(day)) {\n header.classList.add('today');\n }\n\n const dayName = this.createElement('div', 'day-name');\n dayName.textContent = dateService.getDayName(day, options.locale);\n\n const dayNumber = this.createElement('div', 'day-number');\n dayNumber.textContent = String(day.getDate());\n\n header.appendChild(dayName);\n header.appendChild(dayNumber);\n headers.appendChild(header);\n }\n\n this.container.appendChild(headers);\n\n // Create time grid\n const timeGrid = this.createElement('div', 'scheduler-time-grid');\n\n // Time gutter\n const timeGutter = this.createElement('div', 'scheduler-time-gutter');\n const slots = dateService.getTimeSlots(\n days[0],\n options.slotDuration,\n options.slotMinTime,\n options.slotMaxTime\n );\n\n for (const slot of slots) {\n const label = this.createElement('div', 'scheduler-time-slot-label');\n label.textContent = dateService.formatTime(slot.start, options.timeFormat);\n timeGutter.appendChild(label);\n }\n\n timeGrid.appendChild(timeGutter);\n\n // Days container\n const daysContainer = this.createElement('div', 'scheduler-days-container');\n this.dayColumns = [];\n\n for (let dayIndex = 0; dayIndex < days.length; dayIndex++) {\n const day = days[dayIndex];\n const dayColumn = this.createElement('div', 'scheduler-day-column');\n this.setData(dayColumn, { dayIndex });\n\n // Create time slots\n for (let slotIndex = 0; slotIndex < slots.length; slotIndex++) {\n const slotTemplate = slots[slotIndex];\n const slotStart = new Date(day);\n slotStart.setHours(\n slotTemplate.start.getHours(),\n slotTemplate.start.getMinutes(),\n 0,\n 0\n );\n\n const slotEnd = new Date(day);\n slotEnd.setHours(\n slotTemplate.end.getHours(),\n slotTemplate.end.getMinutes(),\n 0,\n 0\n );\n\n const slotEl = this.createElement('div', 'scheduler-time-slot');\n this.setData(slotEl, {\n dayIndex,\n slotIndex,\n start: slotStart.toISOString(),\n end: slotEnd.toISOString(),\n });\n\n const key = `${dayIndex}-${slotIndex}`;\n this.slotElements.set(key, slotEl);\n dayColumn.appendChild(slotEl);\n }\n\n // Events container for this day\n const eventsContainer = this.createElement('div', 'scheduler-events-container');\n dayColumn.appendChild(eventsContainer);\n\n this.dayColumns.push(dayColumn);\n daysContainer.appendChild(dayColumn);\n }\n\n timeGrid.appendChild(daysContainer);\n this.container.appendChild(timeGrid);\n\n // Render events\n this.renderEvents();\n\n // Render now indicator\n this.renderNowIndicator(days, slots);\n }\n\n update(state: SchedulerState): void {\n const dateChanged = this.state.date.getTime() !== state.date.getTime();\n const optionsChanged = this.optionsRequireRerender(this.state.options, state.options);\n const selectionChanged = this.state.selectedEvent?.id !== state.selectedEvent?.id;\n this.state = state;\n\n // If date or relevant options changed, we need to re-render the entire view\n if (dateChanged || optionsChanged) {\n this.render();\n return;\n }\n\n // Update greyed slots based on drag state\n this.updateGreyedSlots();\n\n // Re-render events if selection changed or needed\n if (selectionChanged) {\n this.renderEvents();\n } else {\n this.renderEvents();\n }\n\n // Render preview event\n this.renderPreviewEvent();\n }\n\n private optionsRequireRerender(oldOpts: SchedulerState['options'], newOpts: SchedulerState['options']): boolean {\n return oldOpts.slotDuration !== newOpts.slotDuration ||\n oldOpts.timeFormat !== newOpts.timeFormat ||\n oldOpts.firstDayOfWeek !== newOpts.firstDayOfWeek ||\n oldOpts.slotMinTime !== newOpts.slotMinTime ||\n oldOpts.slotMaxTime !== newOpts.slotMaxTime ||\n oldOpts.locale !== newOpts.locale;\n }\n\n private renderEvents(): void {\n const { date, events, options } = this.state;\n const days = dateService.getWeekDays(date, options.firstDayOfWeek);\n const weekStart = days[0];\n const weekEnd = new Date(days[6]);\n weekEnd.setHours(23, 59, 59, 999);\n\n // Filter events for this week\n const weekEvents = timelineService.filterByRange(events, weekStart, weekEnd);\n\n // Split events into parts and get timeline\n const allParts: SchedulerEventPart[] = [];\n for (const event of weekEvents) {\n const { parts } = timelineService.splitInParts(event);\n allParts.push(...parts);\n }\n\n // Filter parts for this week\n const weekParts = timelineService.filterPartsByRange(allParts, weekStart, weekEnd);\n\n // Get timelened parts with track info\n const timelinedParts = timelineService.getTimelinedParts(weekParts);\n\n // Clear existing events\n this.eventElements.forEach((el) => el.remove());\n this.eventElements.clear();\n\n // Render each event part\n for (const { part, trackIndex, totalTracks, colspan } of timelinedParts) {\n if (!part.event) continue;\n\n const dayIndex = days.findIndex((d) => dateService.isSameDay(d, part.start));\n if (dayIndex === -1) continue;\n\n const dayColumn = this.dayColumns[dayIndex];\n const eventsContainer = dayColumn.querySelector('.scheduler-events-container');\n if (!eventsContainer) continue;\n\n const eventEl = this.createEventElement(\n part,\n trackIndex,\n totalTracks,\n colspan,\n options.slotDuration ?? 1800\n );\n\n eventsContainer.appendChild(eventEl);\n this.eventElements.set(part.id, eventEl);\n }\n }\n\n private createEventElement(\n part: SchedulerEventPart,\n trackIndex: number,\n totalTracks: number,\n colspan: number,\n slotDuration: number\n ): HTMLElement {\n const event = part.event;\n const eventEl = this.createElement('div', 'scheduler-event');\n\n // Mark as selected if this is the selected event\n if (this.state.selectedEvent?.id === event.id) {\n eventEl.classList.add('selected');\n }\n\n // Calculate position\n const dayStart = new Date(part.start);\n dayStart.setHours(0, 0, 0, 0);\n\n const startMinutes =\n (part.start.getTime() - dayStart.getTime()) / (1000 * 60);\n const endMinutes = (part.end.getTime() - dayStart.getTime()) / (1000 * 60);\n const durationMinutes = endMinutes - startMinutes;\n\n const slotMinutes = slotDuration / 60;\n const top = (startMinutes / slotMinutes) * 40; // 40px per slot\n const height = Math.max((durationMinutes / slotMinutes) * 40, 20);\n\n // Calculate width based on tracks and colspan\n // colspan allows events to span multiple columns when there's no blocking event\n const leftPercent = (trackIndex / totalTracks) * 100;\n const widthPercent = (colspan / totalTracks) * 100;\n\n eventEl.style.top = `${top}px`;\n eventEl.style.height = `${height}px`;\n eventEl.style.left = `${leftPercent}%`;\n eventEl.style.width = `calc(${widthPercent}% - 2px)`;\n eventEl.style.backgroundColor = event.color ?? '#3788d8';\n eventEl.style.color = event.textColor ?? getContrastColor(event.color ?? '#3788d8');\n\n this.setData(eventEl, { eventId: event.id });\n\n // Title\n const title = this.createElement('div', 'event-title');\n title.textContent = event.title;\n eventEl.appendChild(title);\n\n // Time\n const timeEl = this.createElement('div', 'event-time');\n timeEl.textContent = `${dateService.formatTime(part.start, this.state.options.timeFormat)} - ${dateService.formatTime(part.end, this.state.options.timeFormat)}`;\n eventEl.appendChild(timeEl);\n\n // Resize handles\n if (event.resizable !== false) {\n if (part.isStart) {\n const topHandle = this.createElement('div', 'resize-handle', 'top');\n this.setData(topHandle, { handle: 'start' });\n eventEl.appendChild(topHandle);\n }\n if (part.isEnd) {\n const bottomHandle = this.createElement('div', 'resize-handle', 'bottom');\n this.setData(bottomHandle, { handle: 'end' });\n eventEl.appendChild(bottomHandle);\n }\n }\n\n return eventEl;\n }\n\n private renderPreviewEvent(): void {\n // Remove existing preview\n const existingPreview = this.container.querySelector('.scheduler-event.preview');\n if (existingPreview) {\n existingPreview.remove();\n }\n\n const { previewEvent, options, date } = this.state;\n if (!previewEvent) return;\n\n const days = dateService.getWeekDays(date, options.firstDayOfWeek);\n const dayIndex = days.findIndex((d) => dateService.isSameDay(d, previewEvent.start));\n if (dayIndex === -1) return;\n\n const dayColumn = this.dayColumns[dayIndex];\n const eventsContainer = dayColumn?.querySelector('.scheduler-events-container');\n if (!eventsContainer) return;\n\n const previewEl = this.createElement('div', 'scheduler-event', 'preview');\n\n const dayStart = new Date(previewEvent.start);\n dayStart.setHours(0, 0, 0, 0);\n\n const startMinutes =\n (previewEvent.start.getTime() - dayStart.getTime()) / (1000 * 60);\n const endMinutes =\n (previewEvent.end.getTime() - dayStart.getTime()) / (1000 * 60);\n const durationMinutes = endMinutes - startMinutes;\n\n const slotMinutes = (options.slotDuration ?? 1800) / 60;\n const top = (startMinutes / slotMinutes) * 40;\n const height = Math.max((durationMinutes / slotMinutes) * 40, 20);\n\n previewEl.style.top = `${top}px`;\n previewEl.style.height = `${height}px`;\n previewEl.style.left = '0';\n previewEl.style.width = '100%';\n\n eventsContainer.appendChild(previewEl);\n }\n\n private updateGreyedSlots(): void {\n const { dragState, previewEvent, options, date } = this.state;\n\n // Clear all greyed slots\n this.slotElements.forEach((el) => el.classList.remove('greyed'));\n\n if (!dragState || !previewEvent) return;\n\n const days = dateService.getWeekDays(date, options.firstDayOfWeek);\n const slots = dateService.getTimeSlots(\n days[0],\n options.slotDuration,\n options.slotMinTime,\n options.slotMaxTime\n );\n\n // Find affected slots\n for (let dayIndex = 0; dayIndex < days.length; dayIndex++) {\n const day = days[dayIndex];\n\n if (!dateService.isSameDay(day, previewEvent.start) &&\n !dateService.isSameDay(day, previewEvent.end)) {\n continue;\n }\n\n for (let slotIndex = 0; slotIndex < slots.length; slotIndex++) {\n const slotTemplate = slots[slotIndex];\n const slotStart = new Date(day);\n slotStart.setHours(\n slotTemplate.start.getHours(),\n slotTemplate.start.getMinutes(),\n 0,\n 0\n );\n\n const slotEnd = new Date(day);\n slotEnd.setHours(\n slotTemplate.end.getHours(),\n slotTemplate.end.getMinutes(),\n 0,\n 0\n );\n\n // Check if slot overlaps with preview event\n if (slotStart < previewEvent.end && slotEnd > previewEvent.start) {\n const key = `${dayIndex}-${slotIndex}`;\n const slotEl = this.slotElements.get(key);\n if (slotEl) {\n slotEl.classList.add('greyed');\n }\n }\n }\n }\n }\n\n private renderNowIndicator(days: Date[], slots: TimeSlot[]): void {\n if (!this.state.options.nowIndicator) return;\n\n const now = new Date();\n const todayIndex = days.findIndex((d) => dateService.isSameDay(d, now));\n if (todayIndex === -1) return;\n\n const dayColumn = this.dayColumns[todayIndex];\n if (!dayColumn) return;\n\n // Calculate position\n const dayStart = new Date(now);\n dayStart.setHours(0, 0, 0, 0);\n const minutesFromMidnight = (now.getTime() - dayStart.getTime()) / (1000 * 60);\n const slotMinutes = (this.state.options.slotDuration ?? 1800) / 60;\n const top = (minutesFromMidnight / slotMinutes) * 40;\n\n const indicator = this.createElement('div', 'scheduler-now-indicator');\n indicator.style.top = `${top}px`;\n dayColumn.appendChild(indicator);\n }\n\n override updateNowIndicator(): void {\n if (!this.state.options.nowIndicator) return;\n\n const { date, options } = this.state;\n const days = dateService.getWeekDays(date, options.firstDayOfWeek);\n\n const now = new Date();\n const todayIndex = days.findIndex((d) => dateService.isSameDay(d, now));\n if (todayIndex === -1) return;\n\n const dayColumn = this.dayColumns[todayIndex];\n if (!dayColumn) return;\n\n // Find existing indicator\n const existingIndicator = dayColumn.querySelector('.scheduler-now-indicator');\n\n // Calculate new position\n const dayStart = new Date(now);\n dayStart.setHours(0, 0, 0, 0);\n const minutesFromMidnight = (now.getTime() - dayStart.getTime()) / (1000 * 60);\n const slotMinutes = (options.slotDuration ?? 1800) / 60;\n const top = (minutesFromMidnight / slotMinutes) * 40;\n\n if (existingIndicator) {\n // Update position of existing indicator\n (existingIndicator as HTMLElement).style.top = `${top}px`;\n } else {\n // Create new indicator if it doesn't exist\n const indicator = this.createElement('div', 'scheduler-now-indicator');\n indicator.style.top = `${top}px`;\n dayColumn.appendChild(indicator);\n }\n }\n\n destroy(): void {\n this.eventElements.clear();\n this.slotElements.clear();\n this.dayColumns = [];\n this.clearContainer();\n }\n}\n","import {\n dateService,\n timelineService,\n SchedulerEventPart,\n getContrastColor,\n} from '@mintplayer/ng-bootstrap/web-components/scheduler-core';\nimport { BaseView } from './base-view';\nimport { SchedulerState } from '../state/scheduler-state';\n\n/**\n * Day view renderer\n */\nexport class DayView extends BaseView {\n private eventsContainer: HTMLElement | null = null;\n private slotElements: Map<number, HTMLElement> = new Map();\n private dayColumn: HTMLElement | null = null;\n\n render(): void {\n this.clearContainer();\n this.container.classList.add('scheduler-day-view');\n\n const { date, options } = this.state;\n\n // Day header\n const header = this.createElement('div', 'scheduler-day-headers');\n\n // Time gutter space\n const gutterSpace = this.createElement('div', 'scheduler-time-gutter-space');\n gutterSpace.style.width = 'var(--scheduler-time-gutter-width)';\n header.appendChild(gutterSpace);\n\n const dayHeader = this.createElement('div', 'scheduler-day-header');\n if (dateService.isToday(date)) {\n dayHeader.classList.add('today');\n }\n\n const dayName = this.createElement('div', 'day-name');\n dayName.textContent = dateService.getDayName(date, options.locale);\n\n const dayNumber = this.createElement('div', 'day-number');\n dayNumber.textContent = String(date.getDate());\n\n const monthYear = this.createElement('div', 'month-year');\n monthYear.textContent = dateService.formatDate(date, options.locale, {\n month: 'long',\n year: 'numeric',\n });\n monthYear.style.fontSize = '12px';\n monthYear.style.color = '#666';\n\n dayHeader.appendChild(dayName);\n dayHeader.appendChild(dayNumber);\n dayHeader.appendChild(monthYear);\n header.appendChild(dayHeader);\n this.container.appendChild(header);\n\n // Time grid\n const timeGrid = this.createElement('div', 'scheduler-time-grid');\n\n // Time gutter\n const timeGutter = this.createElement('div', 'scheduler-time-gutter');\n const slots = dateService.getTimeSlots(\n date,\n options.slotDuration,\n options.slotMinTime,\n options.slotMaxTime\n );\n\n for (const slot of slots) {\n const label = this.createElement('div', 'scheduler-time-slot-label');\n label.textContent = dateService.formatTime(slot.start, options.timeFormat);\n timeGutter.appendChild(label);\n }\n\n timeGrid.appendChild(timeGutter);\n\n // Day column\n const daysContainer = this.createElement('div', 'scheduler-days-container');\n this.dayColumn = this.createElement('div', 'scheduler-day-column');\n const dayColumn = this.dayColumn;\n\n // Create time slots\n for (let slotIndex = 0; slotIndex < slots.length; slotIndex++) {\n const slot = slots[slotIndex];\n const slotEl = this.createElement('div', 'scheduler-time-slot');\n this.setData(slotEl, {\n slotIndex,\n start: slot.start.toISOString(),\n end: slot.end.toISOString(),\n });\n this.slotElements.set(slotIndex, slotEl);\n dayColumn.appendChild(slotEl);\n }\n\n // Events container\n this.eventsContainer = this.createElement('div', 'scheduler-events-container');\n dayColumn.appendChild(this.eventsContainer);\n\n daysContainer.appendChild(dayColumn);\n timeGrid.appendChild(daysContainer);\n this.container.appendChild(timeGrid);\n\n // Render events\n this.renderEvents();\n\n // Render now indicator\n if (dateService.isToday(date) && options.nowIndicator) {\n this.renderNowIndicator(dayColumn);\n }\n }\n\n private renderEvents(): void {\n if (!this.eventsContainer) return;\n this.eventsContainer.innerHTML = '';\n\n const { date, events, options } = this.state;\n const dayStart = new Date(date);\n dayStart.setHours(0, 0, 0, 0);\n const dayEnd = new Date(date);\n dayEnd.setHours(23, 59, 59, 999);\n\n // Filter events for this day\n const dayEvents = timelineService.filterByRange(events, dayStart, dayEnd);\n\n // Split events into parts\n const allParts: SchedulerEventPart[] = [];\n for (const event of dayEvents) {\n const { parts } = timelineService.splitInParts(event);\n const dayParts = timelineService.filterPartsByRange(parts, dayStart, dayEnd);\n allParts.push(...dayParts);\n }\n\n // Get timelened parts with track info\n const timelinedParts = timelineService.getTimelinedParts(allParts);\n\n // Render each event part\n for (const { part, trackIndex, totalTracks, colspan } of timelinedParts) {\n if (!part.event) continue;\n\n const eventEl = this.createEventElement(\n part,\n trackIndex,\n totalTracks,\n colspan,\n options.slotDuration ?? 1800\n );\n this.eventsContainer.appendChild(eventEl);\n }\n }\n\n private createEventElement(\n part: SchedulerEventPart,\n trackIndex: number,\n totalTracks: number,\n colspan: number,\n slotDuration: number\n ): HTMLElement {\n const event = part.event;\n const eventEl = this.createElement('div', 'scheduler-event');\n\n // Mark as selected if this is the selected event\n if (this.state.selectedEvent?.id === event.id) {\n eventEl.classList.add('selected');\n }\n\n // Calculate position\n const dayStart = new Date(part.start);\n dayStart.setHours(0, 0, 0, 0);\n\n const startMinutes = (part.start.getTime() - dayStart.getTime()) / (1000 * 60);\n const endMinutes = (part.end.getTime() - dayStart.getTime()) / (1000 * 60);\n const durationMinutes = endMinutes - startMinutes;\n\n const slotMinutes = slotDuration / 60;\n const top = (startMinutes / slotMinutes) * 40;\n const height = Math.max((durationMinutes / slotMinutes) * 40, 20);\n\n // Calculate width based on tracks and colspan\n // colspan allows events to span multiple columns when there's no blocking event\n const leftPercent = (trackIndex / totalTracks) * 100;\n const widthPercent = (colspan / totalTracks) * 100;\n\n eventEl.style.top = `${top}px`;\n eventEl.style.height = `${height}px`;\n eventEl.style.left = `${leftPercent}%`;\n eventEl.style.width = `calc(${widthPercent}% - 2px)`;\n eventEl.style.backgroundColor = event.color ?? '#3788d8';\n eventEl.style.color = event.textColor ?? getContrastColor(event.color ?? '#3788d8');\n\n this.setData(eventEl, { eventId: event.id });\n\n // Title\n const title = this.createElement('div', 'event-title');\n title.textContent = event.title;\n eventEl.appendChild(title);\n\n // Time\n const timeEl = this.createElement('div', 'event-time');\n timeEl.textContent = `${dateService.formatTime(part.start, this.state.options.timeFormat)} - ${dateService.formatTime(part.end, this.state.options.timeFormat)}`;\n eventEl.appendChild(timeEl);\n\n // Resize handles\n if (event.resizable !== false) {\n if (part.isStart) {\n const topHandle = this.createElement('div', 'resize-handle', 'top');\n this.setData(topHandle, { handle: 'start' });\n eventEl.appendChild(topHandle);\n }\n if (part.isEnd) {\n const bottomHandle = this.createElement('div', 'resize-handle', 'bottom');\n this.setData(bottomHandle, { handle: 'end' });\n eventEl.appendChild(bottomHandle);\n }\n }\n\n return eventEl;\n }\n\n private renderNowIndicator(dayColumn: HTMLElement): void {\n const now = new Date();\n const dayStart = new Date(now);\n dayStart.setHours(0, 0, 0, 0);\n\n const minutesFromMidnight = (now.getTime() - dayStart.getTime()) / (1000 * 60);\n const slotMinutes = (this.state.options.slotDuration ?? 1800) / 60;\n const top = (minutesFromMidnight / slotMinutes) * 40;\n\n const indicator = this.createElement('div', 'scheduler-now-indicator');\n indicator.style.top = `${top}px`;\n dayColumn.appendChild(indicator);\n }\n\n override updateNowIndicator(): void {\n if (!this.dayColumn) return;\n if (!this.state.options.nowIndicator) return;\n if (!dateService.isToday(this.state.date)) return;\n\n // Find existing indicator\n const existingIndicator = this.dayColumn.querySelector('.scheduler-now-indicator');\n\n // Calculate new position\n const now = new Date();\n const dayStart = new Date(now);\n dayStart.setHours(0, 0, 0, 0);\n\n const minutesFromMidnight = (now.getTime() - dayStart.getTime()) / (1000 * 60);\n const slotMinutes = (this.state.options.slotDuration ?? 1800) / 60;\n const top = (minutesFromMidnight / slotMinutes) * 40;\n\n if (existingIndicator) {\n // Update position of existing indicator\n (existingIndicator as HTMLElement).style.top = `${top}px`;\n } else {\n // Create new indicator if it doesn't exist\n this.renderNowIndicator(this.dayColumn);\n }\n }\n\n update(state: SchedulerState): void {\n const dateChanged = this.state.date.getTime() !== state.date.getTime();\n const optionsChanged = this.optionsRequireRerender(this.state.options, state.options);\n this.state = state;\n\n // If date or relevant options changed, we need to re-render the entire view\n if (dateChanged || optionsChanged) {\n this.render();\n return;\n }\n\n // Update greyed slots\n this.updateGreyedSlots();\n\n // Re-render events\n this.renderEvents();\n\n // Render preview event\n this.renderPreviewEvent();\n }\n\n private optionsRequireRerender(oldOpts: SchedulerState['options'], newOpts: SchedulerState['options']): boolean {\n return oldOpts.slotDuration !== newOpts.slotDuration ||\n oldOpts.timeFormat !== newOpts.timeFormat ||\n oldOpts.slotMinTime !== newOpts.slotMinTime ||\n oldOpts.slotMaxTime !== newOpts.slotMaxTime ||\n oldOpts.locale !== newOpts.locale;\n }\n\n private updateGreyedSlots(): void {\n const { dragState, previewEvent, options, date } = this.state;\n\n // Clear all greyed slots\n this.slotElements.forEach((el) => el.classList.remove('greyed'));\n\n if (!dragState || !previewEvent) return;\n if (!dateService.isSameDay(date, previewEvent.start)) return;\n\n const slots = dateService.getTimeSlots(\n date,\n options.slotDuration,\n options.slotMinTime,\n options.slotMaxTime\n );\n\n for (let slotIndex = 0; slotIndex < slots.length; slotIndex++) {\n const slot = slots[slotIndex];\n\n // Check if slot overlaps with preview event\n if (slot.start < previewEvent.end && slot.end > previewEvent.start) {\n const slotEl = this.slotElements.get(slotIndex);\n if (slotEl) {\n slotEl.classList.add('greyed');\n }\n }\n }\n }\n\n private renderPreviewEvent(): void {\n if (!this.eventsContainer) return;\n\n // Remove existing preview\n const existingPreview = this.eventsContainer.querySelector('.scheduler-event.preview');\n if (existingPreview) {\n existingPreview.remove();\n }\n\n const { previewEvent, options, date } = this.state;\n if (!previewEvent) return;\n if (!dateService.isSameDay(date, previewEvent.start)) return;\n\n const previewEl = this.createElement('div', 'scheduler-event', 'preview');\n\n const dayStart = new Date(previewEvent.start);\n dayStart.setHours(0, 0, 0, 0);\n\n const startMinutes = (previewEvent.start.getTime() - dayStart.getTime()) / (1000 * 60);\n const endMinutes = (previewEvent.end.getTime() - dayStart.getTime()) / (1000 * 60);\n const durationMinutes = endMinutes - startMinutes;\n\n const slotMinutes = (options.slotDuration ?? 1800) / 60;\n const top = (startMinutes / slotMinutes) * 40;\n const height = Math.max((durationMinutes / slotMinutes) * 40, 20);\n\n previewEl.style.top = `${top}px`;\n previewEl.style.height = `${height}px`;\n previewEl.style.left = '0';\n previewEl.style.width = '100%';\n\n this.eventsContainer.appendChild(previewEl);\n }\n\n destroy(): void {\n this.eventsContainer = null;\n this.dayColumn = null;\n this.slotElements.clear();\n this.clearContainer();\n }\n}\n","import {\n dateService,\n timelineService,\n resourceService,\n Resource,\n ResourceGroup,\n SchedulerEvent,\n SchedulerEventPart,\n isResource,\n isResourceGroup,\n FlattenedResource,\n getContrastColor,\n} from '@mintplayer/ng-bootstrap/web-components/scheduler-core';\nimport { BaseView } from './base-view';\nimport { SchedulerState } from '../state/scheduler-state';\n\n/**\n * Timeline view renderer\n */\nexport class TimelineView extends BaseView {\n private rowElements: Map<string, HTMLElement> = new Map();\n private slotWidth: number = 50;\n\n render(): void {\n this.clearContainer();\n this.container.classList.add('scheduler-timeline-view');\n\n const { date, options, resources, collapsedGroups } = this.state;\n const days = dateService.getWeekDays(date, options.firstDayOfWeek);\n\n // Create timeline structure\n const timeline = this.createElement('div', 'scheduler-timeline');\n\n // Header\n const header = this.createElement('div', 'scheduler-timeline-header');\n\n // Resource column header\n const resourceHeader = this.createElement('div', 'scheduler-resource-header');\n resourceHeader.textContent = 'Resources';\n header.appendChild(resourceHeader);\n\n // Time slots header\n const slotsHeader = this.createElement('div', 'scheduler-timeline-slots-header');\n\n for (const day of days) {\n const slots = dateService.getTimeSlots(\n day,\n options.slotDuration,\n options.slotMinTime,\n options.slotMaxTime\n );\n\n // Day header spanning multiple slots\n const daySlots = slots.length;\n const dayHeader = this.createElement('div', 'scheduler-timeline-slot-header');\n dayHeader.style.width = `${daySlots * this.slotWidth}px`;\n dayHeader.textContent = dateService.formatDateWithWeekday(day, options.locale);\n dayHeader.style.borderBottom = '1px solid var(--scheduler-border-color)';\n slotsHeader.appendChild(dayHeader);\n }\n\n header.appendChild(slotsHeader);\n timeline.appendChild(header);\n\n // Time labels row\n const timeLabelRow = this.createElement('div', 'scheduler-timeline-header');\n const emptyCell = this.createElement('div', 'scheduler-resource-header');\n emptyCell.style.borderBottom = '1px solid var(--scheduler-border-color)';\n timeLabelRow.appendChild(emptyCell);\n\n const timeLabelsContainer = this.createElement('div', 'scheduler-timeline-slots-header');\n\n for (const day of days) {\n const slots = dateService.getTimeSlots(\n day,\n options.slotDuration,\n options.slotMinTime,\n options.slotMaxTime\n );\n\n for (const slot of slots) {\n const slotHeader = this.createElement('div', 'scheduler-timeline-slot-header');\n slotHeader.style.width = `${this.slotWidth}px`;\n slotHeader.textContent = dateService.formatTime(slot.start, options.timeFormat);\n slotHeader.style.fontSize = '10px';\n timeLabelsContainer.appendChild(slotHeader);\n }\n }\n\n timeLabelRow.appendChild(timeLabelsContainer);\n timeline.appendChild(timeLabelRow);\n\n // Body\n const body = this.createElement('div', 'scheduler-timeline-body');\n\n // Flatten resources\n const flattened = resourceService.flatten(resources, collapsedGroups);\n\n for (const flat of flattened) {\n if (!flat.visible) continue;\n\n const row = this.createResourceRow(flat, days);\n body.appendChild(row);\n }\n\n timeline.appendChild(body);\n this.container.appendChild(timeline);\n\n // Render events\n this.renderEvents(days);\n }\n\n private createResourceRow(flat: FlattenedResource, days: Date[]): HTMLElement {\n const { options } = this.state;\n const row = this.createElement('div', 'scheduler-timeline-row');\n\n if (isResourceGroup(flat.item)) {\n row.classList.add('group');\n }\n\n // Resource cell\n const resourceCell = this.createElement('div', 'scheduler-resource-cell');\n resourceCell.style.paddingLeft = `${8 + flat.depth * 16}px`;\n\n if (isResourceGroup(flat.item)) {\n const toggle = this.createElement('span', 'expand-toggle');\n toggle.textContent = this.state.collapsedGroups.has(flat.item.id) ? '▶' : '▼';\n this.setData(toggle, { groupId: flat.item.id });\n resourceCell.appendChild(toggle);\n }\n\n const title = this.createElement('span');\n title.textContent = flat.item.title;\n resourceCell.appendChild(title);\n\n row.appendChild(resourceCell);\n\n // Slots container\n const slotsContainer = this.createElement('div', 'scheduler-timeline-slots');\n\n for (const day of days) {\n const slots = dateService.getTimeSlots(\n day,\n options.slotDuration,\n options.slotMinTime,\n options.slotMaxTime\n );\n\n for (const slot of slots) {\n const slotEl = this.createElement('div', 'scheduler-timeline-slot');\n slotEl.style.width = `${this.slotWidth}px`;\n this.setData(slotEl, {\n resourceId: flat.item.id,\n start: slot.start.toISOString(),\n end: slot.end.toISOString(),\n });\n slotsContainer.appendChild(slotEl);\n }\n }\n\n // Events container for this row\n if (isResource(flat.item)) {\n const eventsContainer = this.createElement('div', 'scheduler-timeline-events');\n slotsContainer.appendChild(eventsContainer);\n }\n\n row.appendChild(slotsContainer);\n this.rowElements.set(flat.item.id, row);\n\n return row;\n }\n\n private renderEvents(days: Date[]): void {\n const { events, resources, options, collapsedGroups } = this.state;\n\n const weekStart = days[0];\n const weekEnd = new Date(days[6]);\n weekEnd.setHours(23, 59, 59, 999);\n\n // Get total slots per day\n const slotsPerDay = dateService.getTimeSlots(\n days[0],\n options.slotDuration,\n options.slotMinTime,\n options.slotMaxTime\n ).length;\n\n const totalSlots = slotsPerDay * 7;\n const totalWidth = totalSlots * this.slotWidth;\n\n // Get all resources\n const allResources = resourceService.getAllResources(resources);\n\n for (const resource of allResources) {\n const row = this.rowElements.get(resource.id);\n if (!row) continue;\n\n const eventsContainer = row.querySelector('.scheduler-timeline-events');\n if (!eventsContainer) continue;\n\n // Clear existing events\n eventsContainer.innerHTML = '';\n\n // Get events for this resource\n const resourceEvents = (resource.events ?? []).filter(\n (e) => e.start < weekEnd && e.end > weekStart\n );\n\n // Create event parts for layout (don't split into daily parts for timeline view)\n // For timeline view, treat each event as a single entity for layout purposes\n const allParts: SchedulerEventPart[] = resourceEvents.map((event) => ({\n id: event.id,\n event: event,\n start: event.start,\n end: event.end,\n isStart: true,\n isEnd: true,\n dayIndex: 0,\n totalDays: 1,\n }));\n\n // Get timelened parts with track info (uses colspan algorithm)\n const timelinedParts = timelineService.getTimelinedParts(allParts);\n\n // Render each event part\n for (const { part, trackIndex, totalTracks, colspan } of timelinedParts) {\n if (!part.event) continue;\n\n const eventEl = this.createEventElement(\n part.event,\n trackIndex,\n totalTracks,\n colspan,\n weekStart,\n totalWidth,\n options.slotDuration ?? 1800\n );\n eventsContainer.appendChild(eventEl);\n }\n }\n }\n\n private createEventElement(\n event: SchedulerEvent,\n trackIndex: number,\n totalTracks: number,\n colspan: number,\n viewStart: Date,\n totalWidth: number,\n slotDuration: number\n ): HTMLElement {\n const eventEl = this.createElement('div', 'scheduler-timeline-event');\n\n // Mark as selected if this is the selected event\n if (this.state.selectedEvent?.id === event.id) {\n eventEl.classList.add('selected');\n }\n\n // Clamp event to view bounds\n const eventStart = Math.max(event.start.getTime(), viewStart.getTime());\n const viewEndTime = viewStart.getTime() + 7 * 24 * 60 * 60 * 1000;\n const eventEnd = Math.min(event.end.getTime(), viewEndTime);\n\n // Calculate position\n const startOffset = eventStart - viewStart.getTime();\n const duration = eventEnd - eventStart;\n const viewDuration = viewEndTime - viewStart.getTime();\n\n const left = (startOffset / viewDuration) * totalWidth;\n const width = Math.max((duration / viewDuration) * totalWidth, 20);\n\n // Calculate vertical position based on track and colspan\n // colspan allows events to span multiple tracks when there's no blocking event\n const top = (trackIndex / totalTracks) * 100;\n const heightPercent = (colspan / totalTracks) * 100;\n\n eventEl.style.left = `${left}px`;\n eventEl.style.width = `${width}px`;\n eventEl.style.top = `${top}%`;\n eventEl.style.height = `${heightPercent}%`;\n eventEl.style.backgroundColor = event.color ?? '#3788d8';\n eventEl.style.color = event.textColor ?? getContrastColor(event.color ?? '#3788d8');\n\n this.setData(eventEl, { eventId: event.id });\n\n eventEl.textContent = event.title;\n\n return eventEl;\n }\n\n update(state: SchedulerState): void {\n const dateChanged = this.state.date.getTime() !== state.date.getTime();\n const optionsChanged = this.optionsRequireRerender(this.state.options, state.options);\n this.state = state;\n\n // If date or relevant options changed, we need to re-render the entire view\n if (dateChanged || optionsChanged) {\n this.render();\n return;\n }\n\n // Update greyed slots\n this.updateGreyedSlots();\n\n // Re-render events\n const days = dateService.getWeekDays(state.date, state.options.firstDayOfWeek);\n this.renderEvents(days);\n }\n\n private optionsRequireRerender(oldOpts: SchedulerState['options'], newOpts: SchedulerState['options']): boolean {\n return oldOpts.slotDuration !== newOpts.slotDuration ||\n oldOpts.timeFormat !== newOpts.timeFormat ||\n oldOpts.firstDayOfWeek !== newOpts.firstDayOfWeek ||\n oldOpts.slotMinTime !== newOpts.slotMinTime ||\n oldOpts.slotMaxTime !== newOpts.slotMaxTime ||\n oldOpts.locale !== newOpts.locale;\n }\n\n private updateGreyedSlots(): void {\n const { dragState, previewEvent } = this.state;\n\n // Clear all greyed slots\n const allSlots = this.container.querySelectorAll('.scheduler-timeline-slot');\n allSlots.forEach((slot) => slot.classList.remove('greyed'));\n\n if (!dragState || !previewEvent) return;\n\n // Grey out slots that overlap with the preview\n allSlots.forEach((slot) => {\n const slotStart = new Date((slot as HTMLElement).dataset['start'] ?? '');\n const slotEnd = new Date((slot as HTMLElement).dataset['end'] ?? '');\n\n if (slotStart < previewEvent.end && slotEnd > previewEvent.start) {\n slot.classList.add('greyed');\n }\n });\n }\n\n destroy(): void {\n this.rowElements.clear();\n this.clearContainer();\n }\n}\n","// AUTO-GENERATED — do not edit by hand.\n// Source: scheduler.styles.scss\n// Regenerate with the codegen-wc Nx target.\n\nimport { unsafeCSS } from 'lit';\n\nexport const schedulerStyles = unsafeCSS(`:host {\n display: block;\n height: 100%;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, sans-serif;\n font-size: 14px;\n --scheduler-border-color: #ddd;\n --scheduler-header-bg: #f8f9fa;\n --scheduler-today-bg: #fff3cd;\n --scheduler-slot-height: 40px;\n --scheduler-time-gutter-width: 80px;\n --scheduler-event-border-radius: 4px;\n --scheduler-now-indicator-color: #dc3545;\n --scheduler-preview-bg: rgba(0, 123, 255, 0.3);\n --scheduler-greyed-slot-bg: rgba(0, 0, 0, 0.1);\n --scheduler-column-min-width: 120px;\n --scheduler-touch-hold-duration: 500ms;\n}\n\n* {\n box-sizing: border-box;\n}\n\n.scheduler-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n border: 1px solid var(--scheduler-border-color);\n border-radius: 4px;\n overflow: hidden;\n background: #fff;\n}\n\n/* Header */\n.scheduler-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: var(--scheduler-header-bg);\n border-bottom: 1px solid var(--scheduler-border-color);\n flex-shrink: 0;\n}\n\n.scheduler-nav {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.scheduler-nav button {\n padding: 6px 12px;\n border: 1px solid var(--scheduler-border-color);\n border-radius: 4px;\n background: #fff;\n cursor: pointer;\n font-size: 14px;\n}\n\n.scheduler-nav button:hover {\n background: #e9ecef;\n}\n\n.scheduler-title {\n font-size: 18px;\n font-weight: 600;\n}\n\n.scheduler-view-switcher {\n display: flex;\n gap: 4px;\n}\n\n.scheduler-view-switcher button {\n padding: 6px 12px;\n border: 1px solid var(--scheduler-border-color);\n border-radius: 4px;\n background: #fff;\n cursor: pointer;\n font-size: 13px;\n}\n\n.scheduler-view-switcher button:hover {\n background: #e9ecef;\n}\n\n.scheduler-view-switcher button.active {\n background: #0d6efd;\n color: #fff;\n border-color: #0d6efd;\n}\n\n/* Main content area */\n.scheduler-body {\n display: flex;\n flex: 1;\n overflow: hidden;\n}\n\n.scheduler-sidebar {\n width: var(--scheduler-time-gutter-width);\n flex-shrink: 0;\n border-right: 1px solid var(--scheduler-border-color);\n background: var(--scheduler-header-bg);\n}\n\n.scheduler-content {\n flex: 1;\n overflow: auto;\n position: relative;\n}\n\n/* Week/Day View Grid */\n.scheduler-grid {\n display: grid;\n min-width: 100%;\n}\n\n.scheduler-day-headers {\n display: flex;\n border-bottom: 1px solid var(--scheduler-border-color);\n background: var(--scheduler-header-bg);\n position: sticky;\n top: 0;\n z-index: 10;\n min-width: fit-content;\n}\n\n.scheduler-day-header {\n flex: 1 0 var(--scheduler-column-min-width);\n min-width: var(--scheduler-column-min-width);\n text-align: center;\n padding: 8px 4px;\n border-right: 1px solid var(--scheduler-border-color);\n font-weight: 500;\n}\n\n.scheduler-day-header:last-child {\n border-right: none;\n}\n\n.scheduler-day-header.today {\n background: var(--scheduler-today-bg);\n}\n\n.scheduler-day-header .day-name {\n font-size: 12px;\n color: #666;\n text-transform: uppercase;\n}\n\n.scheduler-day-header .day-number {\n font-size: 20px;\n font-weight: 600;\n margin-top: 2px;\n}\n\n.scheduler-time-grid {\n display: flex;\n position: relative;\n min-width: fit-content;\n}\n\n.scheduler-time-gutter {\n width: var(--scheduler-time-gutter-width);\n flex-shrink: 0;\n border-right: 1px solid var(--scheduler-border-color);\n background: var(--scheduler-header-bg);\n}\n\n.scheduler-time-slot-label {\n height: var(--scheduler-slot-height);\n padding: 0 8px;\n font-size: 12px;\n color: #666;\n text-align: right;\n position: relative;\n top: -8px;\n white-space: nowrap;\n}\n\n.scheduler-days-container {\n display: flex;\n flex: 1;\n position: relative;\n min-width: fit-content;\n}\n\n.scheduler-day-column {\n flex: 1 0 var(--scheduler-column-min-width);\n min-width: var(--scheduler-column-min-width);\n position: relative;\n border-right: 1px solid var(--scheduler-border-color);\n}\n\n.scheduler-day-column:last-child {\n border-right: none;\n}\n\n.scheduler-time-slot {\n height: var(--scheduler-slot-height);\n border-bottom: 1px solid #eee;\n position: relative;\n}\n\n.scheduler-time-slot:nth-child(2n) {\n border-bottom-color: var(--scheduler-border-color);\n}\n\n.scheduler-time-slot.greyed {\n background: var(--scheduler-greyed-slot-bg);\n}\n\n/* Events */\n.scheduler-events-container {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n}\n\n.scheduler-event {\n position: absolute;\n border-radius: var(--scheduler-event-border-radius);\n padding: 2px 4px;\n font-size: 12px;\n overflow: hidden;\n cursor: pointer;\n pointer-events: auto;\n border-left: 3px solid rgba(0, 0, 0, 0.2);\n}\n\n/* Prevent browser from handling touch gestures on events (enables drag) */\n.scheduler-event:not(.preview) {\n touch-action: none;\n -ms-touch-action: none;\n}\n\n.scheduler-event:hover {\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n}\n\n.scheduler-event.selected {\n box-shadow: 0 0 0 3px #212529;\n}\n\n.scheduler-event .event-title {\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.scheduler-event .event-time {\n font-size: 11px;\n opacity: 0.8;\n}\n\n.scheduler-event.preview {\n background: var(--scheduler-preview-bg);\n border: 2px dashed #0d6efd;\n pointer-events: none;\n}\n\n/* Resize handles */\n.scheduler-event .resize-handle {\n position: absolute;\n left: 0;\n right: 0;\n height: 8px;\n cursor: ns-resize;\n}\n\n.scheduler-event .resize-handle.top {\n top: 0;\n}\n\n.scheduler-event .resize-handle.bottom {\n bottom: 0;\n}\n\n/* Now indicator */\n.scheduler-now-indicator {\n position: absolute;\n left: 0;\n right: 0;\n height: 2px;\n background: var(--scheduler-now-indicator-color);\n z-index: 5;\n pointer-events: none;\n}\n\n.scheduler-now-indicator::before {\n content: \"\";\n position: absolute;\n left: -4px;\n top: -4px;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: var(--scheduler-now-indicator-color);\n}\n\n/* Month View */\n.scheduler-month-grid {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n grid-auto-rows: minmax(100px, 1fr);\n height: 100%;\n}\n\n.scheduler-month-day {\n border-right: 1px solid var(--scheduler-border-color);\n border-bottom: 1px solid var(--scheduler-border-color);\n padding: 4px;\n overflow: hidden;\n}\n\n.scheduler-month-day:nth-child(7n) {\n border-right: none;\n}\n\n.scheduler-month-day.other-month {\n background: #f8f9fa;\n color: #adb5bd;\n}\n\n.scheduler-month-day.today {\n background: var(--scheduler-today-bg);\n}\n\n.scheduler-month-day .day-number {\n font-weight: 500;\n margin-bottom: 4px;\n}\n\n.scheduler-month-day .month-events {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.scheduler-month-event {\n padding: 2px 4px;\n border-radius: 2px;\n font-size: 11px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n}\n\n.scheduler-more-link {\n font-size: 11px;\n color: #0d6efd;\n cursor: pointer;\n margin-top: 2px;\n}\n\n/* Year View */\n.scheduler-year-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n padding: 16px;\n}\n\n.scheduler-year-month {\n border: 1px solid var(--scheduler-border-color);\n border-radius: 4px;\n overflow: hidden;\n}\n\n.scheduler-year-month-header {\n padding: 8px;\n background: var(--scheduler-header-bg);\n font-weight: 600;\n text-align: center;\n cursor: pointer;\n}\n\n.scheduler-year-month-header:hover {\n background: #e9ecef;\n}\n\n.scheduler-mini-month {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 1px;\n padding: 4px;\n}\n\n.scheduler-mini-day {\n aspect-ratio: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n cursor: pointer;\n border-radius: 50%;\n}\n\n.scheduler-mini-day:hover {\n background: #e9ecef;\n}\n\n.scheduler-mini-day.has-events {\n font-weight: 600;\n}\n\n.scheduler-mini-day.has-events::after {\n content: \"\";\n position: absolute;\n bottom: 2px;\n width: 4px;\n height: 4px;\n border-radius: 50%;\n background: #0d6efd;\n}\n\n.scheduler-mini-day.today {\n background: var(--scheduler-today-bg);\n}\n\n.scheduler-mini-day.other-month {\n color: #adb5bd;\n}\n\n/* Timeline View */\n.scheduler-timeline {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.scheduler-timeline-header {\n display: flex;\n border-bottom: 1px solid var(--scheduler-border-color);\n background: var(--scheduler-header-bg);\n position: sticky;\n top: 0;\n z-index: 10;\n}\n\n.scheduler-resource-header {\n width: 200px;\n flex-shrink: 0;\n padding: 8px;\n border-right: 1px solid var(--scheduler-border-color);\n font-weight: 600;\n}\n\n.scheduler-timeline-slots-header {\n display: flex;\n flex: 1;\n overflow: hidden;\n}\n\n.scheduler-timeline-slot-header {\n flex-shrink: 0;\n padding: 8px;\n text-align: center;\n border-right: 1px solid var(--scheduler-border-color);\n font-size: 12px;\n}\n\n.scheduler-timeline-body {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: auto;\n}\n\n.scheduler-timeline-row {\n display: flex;\n border-bottom: 1px solid var(--scheduler-border-color);\n min-height: 40px;\n}\n\n.scheduler-timeline-row.group {\n background: var(--scheduler-header-bg);\n font-weight: 600;\n}\n\n.scheduler-resource-cell {\n width: 200px;\n flex-shrink: 0;\n padding: 8px;\n border-right: 1px solid var(--scheduler-border-color);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.scheduler-resource-cell .expand-toggle {\n cursor: pointer;\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.scheduler-timeline-slots {\n display: flex;\n flex: 1;\n position: relative;\n}\n\n.scheduler-timeline-slot {\n flex-shrink: 0;\n border-right: 1px solid #eee;\n height: 100%;\n}\n\n.scheduler-timeline-slot.greyed {\n background: var(--scheduler-greyed-slot-bg);\n}\n\n.scheduler-timeline-events {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n}\n\n.scheduler-timeline-event {\n position: absolute;\n height: calc(100% - 4px);\n top: 2px;\n border-radius: var(--scheduler-event-border-radius);\n padding: 2px 6px;\n font-size: 12px;\n overflow: hidden;\n cursor: pointer;\n pointer-events: auto;\n}\n\n.scheduler-timeline-event.selected {\n box-shadow: 0 0 0 3px #212529;\n}\n\n/* Loading state */\n.scheduler-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 200px;\n color: #666;\n}\n\n/* Empty state */\n.scheduler-empty {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 200px;\n color: #666;\n font-style: italic;\n}\n\n/* Touch drag mode indicator */\n.scheduler-container.touch-drag-mode {\n cursor: grabbing;\n user-select: none;\n -webkit-user-select: none;\n touch-action: none;\n -ms-touch-action: none;\n}\n\n.scheduler-container.touch-drag-mode .scheduler-content {\n overflow: hidden;\n touch-action: none;\n -ms-touch-action: none;\n}\n\n.scheduler-event.touch-hold-pending {\n animation: touch-hold-pulse 0.5s ease-in-out;\n touch-action: none;\n -ms-touch-action: none;\n}\n\n.scheduler-event.touch-hold-active {\n transform: scale(1.02);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n z-index: 100;\n touch-action: none;\n -ms-touch-action: none;\n}\n\n.scheduler-time-slot.touch-hold-pending,\n.scheduler-timeline-slot.touch-hold-pending {\n animation: touch-hold-pulse 0.5s ease-in-out;\n}\n\n.scheduler-time-slot.touch-hold-active,\n.scheduler-timeline-slot.touch-hold-active {\n background: var(--scheduler-preview-bg);\n}\n\n@keyframes touch-hold-pulse {\n 0% {\n opacity: 1;\n }\n 50% {\n opacity: 0.7;\n }\n 100% {\n opacity: 1;\n }\n}\n/* Pan mode styling */\n.scheduler-content.pan-mode {\n cursor: grabbing;\n user-select: none;\n}\n\n/* Scroll blocking during drag operations */\n.scheduler-content.scroll-blocked {\n overflow: hidden !important;\n touch-action: none !important;\n}\n\n/* Scrollbar styling */\n.scheduler-content::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.scheduler-content::-webkit-scrollbar-track {\n background: #f1f1f1;\n}\n\n.scheduler-content::-webkit-scrollbar-thumb {\n background: #c1c1c1;\n border-radius: 4px;\n}\n\n.scheduler-content::-webkit-scrollbar-thumb:hover {\n background: #a1a1a1;\n}`);\nexport default schedulerStyles;\n","import {\n DragOperationType,\n PreviewEvent,\n SchedulerEvent,\n TimeSlot,\n} from '@mintplayer/ng-bootstrap/web-components/scheduler-core';\n\n/**\n * Simple position with x/y coordinates.\n */\nexport interface Position {\n x: number;\n y: number;\n}\n\n/**\n * Result of analyzing what element the pointer is over.\n */\nexport interface PointerTarget {\n /** Type of target element */\n type: 'event' | 'resize-handle' | 'slot' | 'none';\n /** The scheduler event if pointer is over an event */\n event?: SchedulerEvent;\n /** The slot element if pointer is over a slot */\n slotElement?: HTMLElement;\n /** The resize handle type if pointer is over a resize handle */\n resizeHandle?: 'start' | 'end';\n}\n\n/**\n * Drag operation phases - explicit state machine states.\n *\n * - idle: No drag operation in progress\n * - pending: Pointer down, waiting for movement to exceed threshold\n * - active: Drag in progress, preview is being updated\n * - completing: Pointer up, finalizing the operation\n */\nexport type DragPhase = 'idle' | 'pending' | 'active' | 'completing';\n\n/**\n * State machine state with discriminated union.\n * The `phase` field determines which other fields are valid.\n */\nexport type DragMachineState =\n | { phase: 'idle' }\n | {\n phase: 'pending';\n operationType: DragOperationType;\n event: SchedulerEvent | null;\n startPosition: Position;\n startSlot: TimeSlot | null;\n slotElement?: HTMLElement;\n }\n | {\n phase: 'active';\n operationType: DragOperationType;\n event: SchedulerEvent | null;\n startSlot: TimeSlot;\n currentSlot: TimeSlot;\n preview: PreviewEvent;\n originalEvent?: SchedulerEvent;\n }\n | {\n phase: 'completing';\n result: DragCompletionResult;\n };\n\n/**\n * Result of a completed drag operation.\n */\nexport interface DragCompletionResult {\n /** Type of operation that was completed */\n type: DragOperationType;\n /** The final preview (new event position) */\n preview: PreviewEvent;\n /** The event that was moved/resized (null for create) */\n event: SchedulerEvent | null;\n /** Original event before modification */\n originalEvent?: SchedulerEvent;\n /** Whether this was a click (no actual drag occurred) */\n wasClick: boolean;\n}\n\n/**\n * Events that can trigger state transitions in the drag state machine.\n */\nexport type DragMachineEvent =\n | {\n type: 'POINTER_DOWN';\n target: PointerTarget;\n position: Position;\n slot: TimeSlot | null;\n slotElement?: HTMLElement;\n /** If true, skip pending state and go directly to active (for touch drags) */\n immediate?: boolean;\n }\n | {\n type: 'POINTER_MOVE';\n position: Position;\n slot: TimeSlot | null;\n }\n | {\n type: 'POINTER_UP';\n position: Position;\n }\n | {\n type: 'CANCEL';\n };\n\n/**\n * Configuration for the drag state machine.\n */\nexport interface DragConfig {\n /** Pixels of movement before drag activates (default: 5) */\n dragThreshold: number;\n /** Minimum event duration in milliseconds (default: 30 minutes) */\n minDurationMs: number;\n}\n\n/**\n * Default drag configuration.\n */\nexport const DEFAULT_DRAG_CONFIG: DragConfig = {\n dragThreshold: 5,\n minDurationMs: 30 * 60 * 1000, // 30 minutes\n};\n","import {\n DragOperationType,\n PreviewEvent,\n SchedulerEvent,\n TimeSlot,\n} from '@mintplayer/ng-bootstrap/web-components/scheduler-core';\nimport { DragConfig, DEFAULT_DRAG_CONFIG } from './drag-types';\n\n/**\n * Calculates preview positions for drag operations.\n * Handles create, move, and resize operations.\n */\nexport class DragPreviewCalculator {\n private readonly config: DragConfig;\n\n constructor(config: Partial<DragConfig> = {}) {\n this.config = { ...DEFAULT_DRAG_CONFIG, ...config };\n }\n\n /**\n * Calculate the preview event position based on drag state.\n *\n * @param type - The type of drag operation\n * @param startSlot - The slot where the drag started\n * @param currentSlot - The current slot under the pointer\n * @param originalEvent - The original event being moved/resized (null for create)\n * @returns The preview event with new start/end, or null if invalid\n */\n calculatePreview(\n type: DragOperationType,\n startSlot: TimeSlot,\n currentSlot: TimeSlot,\n originalEvent: SchedulerEvent | null\n ): PreviewEvent | null {\n switch (type) {\n case 'create':\n return this.calculateCreatePreview(startSlot, currentSlot);\n case 'move':\n return originalEvent\n ? this.calculateMovePreview(startSlot, currentSlot, originalEvent)\n : null;\n case 'resize-start':\n return originalEvent\n ? this.calculateResizeStartPreview(currentSlot, originalEvent)\n : null;\n case 'resize-end':\n return originalEvent\n ? this.calculateResizeEndPreview(currentSlot, originalEvent)\n : null;\n default:\n return null;\n }\n }\n\n /**\n * Calculate preview for creating a new event.\n * Extends selection from start slot to current slot.\n */\n private calculateCreatePreview(\n startSlot: TimeSlot,\n currentSlot: TimeSlot\n ): PreviewEvent {\n const start = new Date(\n Math.min(startSlot.start.getTime(), currentSlot.start.getTime())\n );\n const end = new Date(\n Math.max(startSlot.end.getTime(), currentSlot.end.getTime())\n );\n return { start, end };\n }\n\n /**\n * Calculate preview for moving an existing event.\n * Preserves event duration, applies offset from drag start.\n */\n private calculateMovePreview(\n startSlot: TimeSlot,\n currentSlot: TimeSlot,\n originalEvent: SchedulerEvent\n ): PreviewEvent {\n // Calculate how much the pointer has moved in time\n const offsetMs = currentSlot.start.getTime() - startSlot.start.getTime();\n\n // Preserve the original event duration\n const duration = originalEvent.end.getTime() - originalEvent.start.getTime();\n\n // Apply offset to original event position\n const newStart = new Date(originalEvent.start.getTime() + offsetMs);\n const newEnd = new Date(newStart.getTime() + duration);\n\n return { start: newStart, end: newEnd };\n }\n\n /**\n * Calculate preview for resizing event start.\n * Moves start time while keeping end fixed.\n * Enforces minimum duration.\n */\n private calculateResizeStartPreview(\n currentSlot: TimeSlot,\n originalEvent: SchedulerEvent\n ): PreviewEvent {\n // Calculate maximum allowed start time (end - min duration)\n const maxStart = originalEvent.end.getTime() - this.config.minDurationMs;\n\n // New start is the earlier of: current slot start, or max allowed start\n const newStart = new Date(\n Math.min(currentSlot.start.getTime(), maxStart)\n );\n\n return { start: newStart, end: originalEvent.end };\n }\n\n /**\n * Calculate preview for resizing event end.\n * Moves end time while keeping start fixed.\n * Enforces minimum duration.\n */\n private calculateResizeEndPreview(\n currentSlot: TimeSlot,\n originalEvent: SchedulerEvent\n ): PreviewEvent {\n // Calculate minimum allowed end time (start + min duration)\n const minEnd = originalEvent.start.getTime() + this.config.minDurationMs;\n\n // New end is the later of: current slot end, or min allowed end\n const newEnd = new Date(\n Math.max(currentSlot.end.getTime(), minEnd)\n );\n\n return { start: originalEvent.start, end: newEnd };\n }\n}\n","/**\n * Normalized pointer event that abstracts mouse vs touch.\n * Provides a single interface for all pointer-based interactions.\n */\nexport interface NormalizedPointerEvent {\n /** Unique identifier for this pointer (0 for mouse, touch.identifier for touch) */\n pointerId: number;\n /** Type of pointer: 'mouse' or 'touch' */\n pointerType: 'mouse' | 'touch';\n /** Client X coordinate */\n clientX: number;\n /** Client Y coordinate */\n clientY: number;\n /** The original DOM event */\n originalEvent: MouseEvent | TouchEvent;\n /** Target element at pointer position */\n target: HTMLElement;\n /** Whether this is the primary pointer */\n isPrimary: boolean;\n}\n\n/**\n * Create a normalized pointer event from a mouse event.\n */\nexport function normalizeMouseEvent(event: MouseEvent): NormalizedPointerEvent {\n return {\n pointerId: 0,\n pointerType: 'mouse',\n clientX: event.clientX,\n clientY: event.clientY,\n originalEvent: event,\n target: event.target as HTMLElement,\n isPrimary: true,\n };\n}\n\n/**\n * Create a normalized pointer event from a touch event.\n * Returns the first touch, or null if no touches.\n */\nexport function normalizeTouchEvent(event: TouchEvent): NormalizedPointerEvent | null {\n const touch = event.touches[0] || event.changedTouches[0];\n if (!touch) return null;\n\n return {\n pointerId: touch.identifier,\n pointerType: 'touch',\n clientX: touch.clientX,\n clientY: touch.clientY,\n originalEvent: event,\n target: touch.target as HTMLElement,\n isPrimary: touch.identifier === 0,\n };\n}\n\n/**\n * Calculate distance between two positions.\n */\nexport function getPointerDistance(\n pos1: { x: number; y: number },\n pos2: { x: number; y: number }\n): number {\n const dx = pos2.x - pos1.x;\n const dy = pos2.y - pos1.y;\n return Math.sqrt(dx * dx + dy * dy);\n}\n","import { DragOperationType, PreviewEvent, SchedulerEvent, TimeSlot } from '@mintplayer/ng-bootstrap/web-components/scheduler-core';\nimport {\n DragMachineState,\n DragMachineEvent,\n DragConfig,\n DEFAULT_DRAG_CONFIG,\n DragCompletionResult,\n Position,\n PointerTarget,\n} from './drag-types';\nimport { DragPreviewCalculator } from './drag-preview';\nimport { getPointerDistance } from '../input/pointer-event';\n\n/**\n * Explicit state machine for drag operations.\n *\n * States:\n * - idle: No drag operation in progress\n * - pending: Pointer is down, waiting for movement to exceed threshold\n * - active: Drag is in progress, preview is being updated\n * - completing: Drag just finished, result is available\n *\n * Transitions:\n * - idle + POINTER_DOWN (on valid target) → pending\n * - pending + POINTER_MOVE (threshold exceeded) → active\n * - pending + POINTER_UP → idle (treated as click)\n * - pending + CANCEL → idle\n * - active + POINTER_MOVE → active (update preview)\n * - active + POINTER_UP → completing\n * - active + CANCEL → idle\n * - completing → idle (after result is consumed)\n */\nexport class DragStateMachine {\n private state: DragMachineState = { phase: 'idle' };\n private readonly config: DragConfig;\n private readonly previewCalculator: DragPreviewCalculator;\n\n constructor(config: Partial<DragConfig> = {}) {\n this.config = { ...DEFAULT_DRAG_CONFIG, ...config };\n this.previewCalculator = new DragPreviewCalculator(this.config);\n }\n\n /**\n * Get current state (read-only).\n */\n getState(): Readonly<DragMachineState> {\n return this.state;\n }\n\n /**\n * Get the current phase.\n */\n getPhase(): DragMachineState['phase'] {\n return this.state.phase;\n }\n\n /**\n * Check if drag is currently active.\n */\n isActive(): boolean {\n return this.state.phase === 'active';\n }\n\n /**\n * Check if drag is pending (waiting for threshold).\n */\n isPending(): boolean {\n return this.state.phase === 'pending';\n }\n\n /**\n * Check if in any drag-related state (pending or active).\n */\n isDragging(): boolean {\n return this.state.phase === 'pending' || this.state.phase === 'active';\n }\n\n /**\n * Get the preview event if in active state.\n */\n getPreview(): PreviewEvent | null {\n return this.state.phase === 'active' ? this.state.preview : null;\n }\n\n /**\n * Get the completion result if in completing state.\n */\n getCompletionResult(): DragCompletionResult | null {\n return this.state.phase === 'completing' ? this.state.result : null;\n }\n\n /**\n * Process an event and transition to new state.\n * Returns true if state changed.\n */\n send(event: DragMachineEvent): boolean {\n const previousPhase = this.state.phase;\n this.state = this.transition(event);\n return this.state.phase !== previousPhase;\n }\n\n /**\n * Reset to idle state.\n */\n reset(): void {\n this.state = { phase: 'idle' };\n }\n\n /**\n * Consume the completion result and return to idle.\n * Call this after handling a completed drag.\n */\n consumeResult(): DragCompletionResult | null {\n if (this.state.phase === 'completing') {\n const result = this.state.result;\n this.state = { phase: 'idle' };\n return result;\n }\n return null;\n }\n\n /**\n * Pure transition function.\n * Given current state and event, returns new state.\n */\n private transition(event: DragMachineEvent): DragMachineState {\n switch (this.state.phase) {\n case 'idle':\n return this.transitionFromIdle(event);\n case 'pending':\n return this.transitionFromPending(event);\n case 'active':\n return this.transitionFromActive(event);\n case 'completing':\n return this.transitionFromCompleting(event);\n default:\n return this.state;\n }\n }\n\n /**\n * Transitions from idle state.\n */\n private transitionFromIdle(event: DragMachineEvent): DragMachineState {\n if (event.type !== 'POINTER_DOWN') {\n return this.state;\n }\n\n const { target, position, slot, slotElement, immediate } = event;\n\n // Determine operation type from target\n const operationType = this.getOperationType(target);\n if (!operationType) {\n return this.state;\n }\n\n // Get the event being dragged (if any)\n const schedulerEvent = target.event ?? null;\n\n // Check if this event is draggable\n if (schedulerEvent && schedulerEvent.draggable === false) {\n return this.state;\n }\n\n // For touch-initiated drags, skip pending and go directly to active\n if (immediate) {\n // For move operations without a slot, create one from the event's times\n let startSlot = slot;\n if (!startSlot && schedulerEvent && operationType === 'move') {\n startSlot = {\n start: schedulerEvent.start,\n end: schedulerEvent.end,\n };\n }\n\n if (startSlot) {\n const preview = this.previewCalculator.calculatePreview(\n operationType,\n startSlot,\n startSlot,\n schedulerEvent\n );\n\n if (preview) {\n return {\n phase: 'active',\n operationType,\n event: schedulerEvent,\n startSlot,\n currentSlot: startSlot,\n preview,\n originalEvent: schedulerEvent ?? undefined,\n };\n }\n }\n }\n\n return {\n phase: 'pending',\n operationType,\n event: schedulerEvent,\n startPosition: position,\n startSlot: slot,\n slotElement,\n };\n }\n\n /**\n * Transitions from pending state.\n */\n private transitionFromPending(event: DragMachineEvent): DragMachineState {\n if (this.state.phase !== 'pending') return this.state;\n\n switch (event.type) {\n case 'POINTER_MOVE': {\n const distance = getPointerDistance(\n this.state.startPosition,\n event.position\n );\n\n if (distance < this.config.dragThreshold) {\n // Not enough movement, stay in pending\n return this.state;\n }\n\n // Threshold exceeded - activate drag\n return this.activateDrag(event.slot);\n }\n\n case 'POINTER_UP': {\n // Released before threshold - treat as click\n return {\n phase: 'completing',\n result: {\n type: this.state.operationType,\n preview: this.getInitialPreview(),\n event: this.state.event,\n originalEvent: this.state.event ?? undefined,\n wasClick: true,\n },\n };\n }\n\n case 'CANCEL':\n return { phase: 'idle' };\n\n default:\n return this.state;\n }\n }\n\n /**\n * Transitions from active state.\n */\n private transitionFromActive(event: DragMachineEvent): DragMachineState {\n if (this.state.phase !== 'active') return this.state;\n\n switch (event.type) {\n case 'POINTER_MOVE': {\n if (!event.slot) {\n // No valid slot under pointer, keep current state\n return this.state;\n }\n\n // Calculate new preview\n const preview = this.previewCalculator.calculatePreview(\n this.state.operationType,\n this.state.startSlot,\n event.slot,\n this.state.originalEvent ?? null\n );\n\n if (!preview) {\n return this.state;\n }\n\n return {\n ...this.state,\n currentSlot: event.slot,\n preview,\n };\n }\n\n case 'POINTER_UP': {\n return {\n phase: 'completing',\n result: {\n type: this.state.operationType,\n preview: this.state.preview,\n event: this.state.event,\n originalEvent: this.state.originalEvent,\n wasClick: false,\n },\n };\n }\n\n case 'CANCEL':\n return { phase: 'idle' };\n\n default:\n return this.state;\n }\n }\n\n /**\n * Transitions from completing state.\n */\n private transitionFromCompleting(event: DragMachineEvent): DragMachineState {\n // Any event from completing goes to idle\n // (The result should be consumed via consumeResult first)\n if (event.type === 'CANCEL' || event.type === 'POINTER_DOWN') {\n return { phase: 'idle' };\n }\n return this.state;\n }\n\n /**\n * Activate drag from pending state.\n */\n private activateDrag(currentSlot: TimeSlot | null): DragMachineState {\n if (this.state.phase !== 'pending') {\n return this.state;\n }\n\n const startSlot = this.state.startSlot ?? currentSlot;\n if (!startSlot) {\n return { phase: 'idle' };\n }\n\n const slot = currentSlot ?? startSlot;\n\n // Calculate initial preview\n const preview = this.previewCalculator.calculatePreview(\n this.state.operationType,\n startSlot,\n slot,\n this.state.event\n );\n\n if (!preview) {\n return { phase: 'idle' };\n }\n\n return {\n phase: 'active',\n operationType: this.state.operationType,\n event: this.state.event,\n startSlot,\n currentSlot: slot,\n preview,\n originalEvent: this.state.event ?? undefined,\n };\n }\n\n /**\n * Get operation type from pointer target.\n */\n private getOperationType(target: PointerTarget): DragOperationType | null {\n switch (target.type) {\n case 'resize-handle':\n return target.resizeHandle === 'start' ? 'resize-start' : 'resize-end';\n case 'event':\n return 'move';\n case 'slot':\n return 'create';\n default:\n return null;\n }\n }\n\n /**\n * Get initial preview for a pending drag (used for click detection).\n */\n private getInitialPreview(): PreviewEvent {\n if (this.state.phase !== 'pending') {\n return { start: new Date(), end: new Date() };\n }\n\n if (this.state.event) {\n return {\n start: this.state.event.start,\n end: this.state.event.end,\n };\n }\n\n if (this.state.startSlot) {\n return {\n start: this.state.startSlot.start,\n end: this.state.startSlot.end,\n };\n }\n\n return { start: new Date(), end: new Date() };\n }\n}\n","import {\n SchedulerEvent,\n TimeSlot,\n generateEventId,\n} from '@mintplayer/ng-bootstrap/web-components/scheduler-core';\nimport { SchedulerStateManager } from '../state/scheduler-state';\nimport { DragStateMachine } from './drag-state-machine';\nimport {\n DragConfig,\n DEFAULT_DRAG_CONFIG,\n DragCompletionResult,\n PointerTarget,\n Position,\n} from './drag-types';\nimport { NormalizedPointerEvent } from '../input/pointer-event';\n\n/**\n * Callback for when a drag operation completes.\n */\nexport interface DragCompleteCallback {\n (result: DragCompletionResult, originalEvent: Event): void;\n}\n\n/**\n * Coordinates drag operations between the state machine and scheduler state.\n * Handles RAF scheduling for smooth drag updates.\n */\nexport class DragManager {\n private readonly stateMachine: DragStateMachine;\n private readonly stateManager: SchedulerStateManager;\n private readonly config: DragConfig;\n\n // RAF scheduling for smooth updates\n private pendingUpdate: number | null = null;\n private latestPointer: NormalizedPointerEvent | null = null;\n private getSlotAtPosition: ((x: number, y: number) => TimeSlot | null) | null = null;\n\n constructor(\n stateManager: SchedulerStateManager,\n config: Partial<DragConfig> = {}\n ) {\n this.stateManager = stateManager;\n this.config = { ...DEFAULT_DRAG_CONFIG, ...config };\n this.stateMachine = new DragStateMachine(this.config);\n }\n\n /**\n * Set the function used to get a slot at a position.\n * This must be set before handling pointer events.\n */\n setSlotResolver(resolver: (x: number, y: number) => TimeSlot | null): void {\n this.getSlotAtPosition = resolver;\n }\n\n /**\n * Handle pointer down - may start pending drag.\n * @param immediate If true, skip pending state (for touch-initiated drags)\n */\n handlePointerDown(\n pointer: NormalizedPointerEvent,\n target: PointerTarget,\n immediate = false\n ): void {\n const slot = this.getSlotAtPosition?.(pointer.clientX, pointer.clientY) ?? null;\n\n this.stateMachine.send({\n type: 'POINTER_DOWN',\n target,\n position: { x: pointer.clientX, y: pointer.clientY },\n slot,\n slotElement: target.slotElement,\n immediate,\n });\n\n // If we started a drag, update state manager\n if (this.stateMachine.isActive()) {\n this.syncToStateManager();\n }\n }\n\n /**\n * Handle pointer move - may activate drag or update preview.\n */\n handlePointerMove(pointer: NormalizedPointerEvent): void {\n if (!this.stateMachine.isDragging()) {\n return;\n }\n\n // Store latest pointer for RAF callback\n this.latestPointer = pointer;\n\n // Schedule update if not already pending\n if (this.pendingUpdate === null) {\n this.pendingUpdate = requestAnimationFrame(() => {\n this.processPendingMove();\n });\n }\n }\n\n /**\n * Handle pointer up - finalize or cancel drag.\n * Returns the completion result if a drag was completed.\n */\n handlePointerUp(pointer: NormalizedPointerEvent): DragCompletionResult | null {\n // Cancel any pending RAF\n this.cancelPendingUpdate();\n\n this.stateMachine.send({\n type: 'POINTER_UP',\n position: { x: pointer.clientX, y: pointer.clientY },\n });\n\n // Get and consume the result\n const result = this.stateMachine.consumeResult();\n\n // Clear state manager drag state\n this.stateManager.endDrag();\n\n return result;\n }\n\n /**\n * Cancel any in-progress drag operation.\n */\n cancel(): void {\n this.cancelPendingUpdate();\n this.stateMachine.send({ type: 'CANCEL' });\n this.stateManager.endDrag();\n }\n\n /**\n * Check if a drag operation is in progress.\n */\n isActive(): boolean {\n return this.stateMachine.isActive();\n }\n\n /**\n * Check if waiting for drag threshold.\n */\n isPending(): boolean {\n return this.stateMachine.isPending();\n }\n\n /**\n * Check if in any drag-related state.\n */\n isDragging(): boolean {\n return this.stateMachine.isDragging();\n }\n\n /**\n * Get the current drag phase.\n */\n getPhase(): string {\n return this.stateMachine.getPhase();\n }\n\n /**\n * Reset the drag manager state.\n */\n reset(): void {\n this.cancelPendingUpdate();\n this.stateMachine.reset();\n }\n\n /**\n * Clean up resources.\n */\n destroy(): void {\n this.cancelPendingUpdate();\n this.latestPointer = null;\n this.getSlotAtPosition = null;\n }\n\n /**\n * Create a new event from a completed create drag.\n */\n createEventFromResult(result: DragCompletionResult): SchedulerEvent {\n return {\n id: generateEventId(),\n title: 'New Event',\n start: result.preview.start,\n end: result.preview.end,\n color: '#3788d8',\n };\n }\n\n /**\n * Update an event from a completed move/resize drag.\n */\n updateEventFromResult(\n result: DragCompletionResult,\n event: SchedulerEvent\n ): SchedulerEvent {\n return {\n ...event,\n start: result.preview.start,\n end: result.preview.end,\n };\n }\n\n /**\n * Process pending pointer move using RAF.\n */\n private processPendingMove(): void {\n this.pendingUpdate = null;\n\n const pointer = this.latestPointer;\n this.latestPointer = null;\n\n if (!pointer || !this.stateMachine.isDragging()) {\n return;\n }\n\n const slot = this.getSlotAtPosition?.(pointer.clientX, pointer.clientY) ?? null;\n\n const stateChanged = this.stateMachine.send({\n type: 'POINTER_MOVE',\n position: { x: pointer.clientX, y: pointer.clientY },\n slot,\n });\n\n // Sync to state manager if state changed\n if (stateChanged || this.stateMachine.isActive()) {\n this.syncToStateManager();\n }\n }\n\n /**\n * Sync state machine state to scheduler state manager.\n */\n private syncToStateManager(): void {\n const machineState = this.stateMachine.getState();\n\n if (machineState.phase === 'active') {\n // Update or start drag in state manager\n const currentState = this.stateManager.getState();\n\n if (currentState.dragState) {\n // Update existing drag\n this.stateManager.updateDrag(machineState.currentSlot, machineState.preview);\n } else {\n // Start new drag\n this.stateManager.startDrag({\n type: machineState.operationType,\n event: machineState.event,\n startSlot: machineState.startSlot,\n currentSlot: machineState.currentSlot,\n preview: machineState.preview,\n originalEvent: machineState.originalEvent,\n });\n }\n }\n }\n\n /**\n * Cancel any pending RAF update.\n */\n private cancelPendingUpdate(): void {\n if (this.pendingUpdate !== null) {\n cancelAnimationFrame(this.pendingUpdate);\n this.pendingUpdate = null;\n }\n this.latestPointer = null;\n }\n}\n","import { SchedulerEvent, TimeSlot } from '@mintplayer/ng-bootstrap/web-components/scheduler-core';\nimport {\n NormalizedPointerEvent,\n normalizeMouseEvent,\n normalizeTouchEvent,\n getPointerDistance,\n} from './pointer-event';\nimport { PointerTarget } from '../drag/drag-types';\n\n/**\n * Callbacks for input handler events.\n */\nexport interface InputHandlerCallbacks {\n /** Called when pointer goes down on a valid target */\n onPointerDown: (pointer: NormalizedPointerEvent, target: PointerTarget, immediate?: boolean) => void;\n /** Called when pointer moves (during drag) */\n onPointerMove: (pointer: NormalizedPointerEvent) => void;\n /** Called when pointer is released */\n onPointerUp: (pointer: NormalizedPointerEvent) => void;\n /** Called for click events (not drag) */\n onClick: (pointer: NormalizedPointerEvent, target: PointerTarget) => void;\n /** Called for double-click events */\n onDoubleClick: (pointer: NormalizedPointerEvent, target: PointerTarget) => void;\n /** Called when touch drag mode is activated (after hold) */\n onTouchDragActivated?: () => void;\n /** Called when touch drag mode is deactivated */\n onTouchDragDeactivated?: () => void;\n /** Called to get the scrollable container for panning */\n getScrollContainer?: () => HTMLElement | null;\n}\n\n/**\n * Configuration for the input handler.\n */\nexport interface InputHandlerConfig {\n /** Shadow root to attach listeners to */\n shadowRoot: ShadowRoot;\n /** Function to get event by ID */\n getEventById: (id: string) => SchedulerEvent | null;\n /** Whether editing is enabled */\n isEditable: () => boolean;\n /** Whether selection is enabled */\n isSelectable: () => boolean;\n /** Touch hold duration in ms before drag activates (default: 500) */\n touchHoldDuration?: number;\n /** Movement threshold before touch hold is cancelled (default: 10) */\n touchMoveThreshold?: number;\n}\n\nconst DEFAULT_TOUCH_HOLD_DURATION = 600;\nconst DEFAULT_TOUCH_MOVE_THRESHOLD = 10;\nconst DEFAULT_MOUSE_PAN_TIMEOUT = 600;\n\n/**\n * Unified input handler for mouse and touch events.\n * Normalizes events and handles touch-specific behaviors (hold-to-drag).\n */\nexport class InputHandler {\n private readonly config: InputHandlerConfig;\n private readonly callbacks: InputHandlerCallbacks;\n\n // Touch-specific state\n private touchHoldTimer: ReturnType<typeof setTimeout> | null = null;\n private touchStartPosition: { x: number; y: number } | null = null;\n private isTouchDragMode = false;\n private touchHoldTarget: HTMLElement | null = null;\n private touchHoldPointer: NormalizedPointerEvent | null = null;\n\n // Pan mode state (for panning when touch/mouse starts on event and moves quickly)\n private isPanMode = false;\n private panStartPosition: { x: number; y: number } | null = null;\n private panStartScroll: { left: number; top: number } | null = null;\n private panStartedOnEvent = false;\n\n // Mouse pan state (for panning when mousedown on event and move within timeout)\n private mousePanTimer: ReturnType<typeof setTimeout> | null = null;\n private mouseStartPosition: { x: number; y: number } | null = null;\n private isMousePanCandidate = false;\n\n // Scroll blocking state (saved styles for restoration)\n private savedBodyStyles: { overflow: string; touchAction: string } | null = null;\n\n // Bound event handlers\n private readonly boundHandleMouseDown: (e: MouseEvent) => void;\n private readonly boundHandleMouseMove: (e: MouseEvent) => void;\n private readonly boundHandleMouseUp: (e: MouseEvent) => void;\n private readonly boundHandleClick: (e: MouseEvent) => void;\n private readonly boundHandleDblClick: (e: MouseEvent) => void;\n private readonly boundHandleTouchStart: (e: TouchEvent) => void;\n private readonly boundHandleTouchMove: (e: TouchEvent) => void;\n private readonly boundHandleTouchEnd: (e: TouchEvent) => void;\n private readonly boundHandleTouchCancel: (e: TouchEvent) => void;\n\n constructor(config: InputHandlerConfig, callbacks: InputHandlerCallbacks) {\n this.config = config;\n this.callbacks = callbacks;\n\n // Bind handlers\n this.boundHandleMouseDown = this.handleMouseDown.bind(this);\n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseUp = this.handleMouseUp.bind(this);\n this.boundHandleClick = this.handleClick.bind(this);\n this.boundHandleDblClick = this.handleDblClick.bind(this);\n this.boundHandleTouchStart = this.handleTouchStart.bind(this);\n this.boundHandleTouchMove = this.handleTouchMove.bind(this);\n this.boundHandleTouchEnd = this.handleTouchEnd.bind(this);\n this.boundHandleTouchCancel = this.handleTouchCancel.bind(this);\n }\n\n /**\n * Attach all event listeners.\n */\n attach(): void {\n const root = this.config.shadowRoot as unknown as HTMLElement;\n\n root.addEventListener('mousedown', this.boundHandleMouseDown as EventListener);\n document.addEventListener('mousemove', this.boundHandleMouseMove);\n document.addEventListener('mouseup', this.boundHandleMouseUp);\n root.addEventListener('click', this.boundHandleClick as EventListener);\n root.addEventListener('dblclick', this.boundHandleDblClick as EventListener);\n\n root.addEventListener('touchstart', this.boundHandleTouchStart as EventListener, {\n passive: false,\n });\n root.addEventListener('touchmove', this.boundHandleTouchMove as EventListener, {\n passive: false,\n });\n root.addEventListener('touchend', this.boundHandleTouchEnd as EventListener);\n root.addEventListener('touchcancel', this.boundHandleTouchCancel as EventListener);\n }\n\n /**\n * Detach all event listeners.\n */\n detach(): void {\n const root = this.config.shadowRoot as unknown as HTMLElement;\n\n root.removeEventListener('mousedown', this.boundHandleMouseDown as EventListener);\n document.removeEventListener('mousemove', this.boundHandleMouseMove);\n document.removeEventListener('mouseup', this.boundHandleMouseUp);\n root.removeEventListener('click', this.boundHandleClick as EventListener);\n root.removeEventListener('dblclick', this.boundHandleDblClick as EventListener);\n\n root.removeEventListener('touchstart', this.boundHandleTouchStart as EventListener);\n root.removeEventListener('touchmove', this.boundHandleTouchMove as EventListener);\n root.removeEventListener('touchend', this.boundHandleTouchEnd as EventListener);\n root.removeEventListener('touchcancel', this.boundHandleTouchCancel as EventListener);\n\n this.cancelTouchHold();\n this.cleanupMousePanState();\n this.exitPanMode();\n this.removeScrollBlock();\n }\n\n /**\n * Check if in touch drag mode.\n */\n isInTouchDragMode(): boolean {\n return this.isTouchDragMode;\n }\n\n /**\n * Analyze pointer target to determine what was clicked.\n */\n analyzeTarget(element: HTMLElement): PointerTarget {\n // Check for resize handle first\n const resizeHandle = element.closest('.resize-handle') as HTMLElement;\n if (resizeHandle) {\n const eventEl = resizeHandle.closest('.scheduler-event') as HTMLElement;\n const eventId = eventEl?.dataset['eventId'];\n const event = eventId ? this.config.getEventById(eventId) : null;\n\n if (event) {\n return {\n type: 'resize-handle',\n event,\n resizeHandle: resizeHandle.dataset['handle'] as 'start' | 'end',\n };\n }\n }\n\n // Check for event\n const eventEl = element.closest('.scheduler-event:not(.preview)') as HTMLElement;\n if (eventEl) {\n const eventId = eventEl.dataset['eventId'];\n const event = eventId ? this.config.getEventById(eventId) : null;\n\n if (event) {\n return { type: 'event', event };\n }\n }\n\n // Check for slot\n const slotEl = element.closest(\n '.scheduler-time-slot, .scheduler-timeline-slot'\n ) as HTMLElement;\n if (slotEl) {\n return { type: 'slot', slotElement: slotEl };\n }\n\n return { type: 'none' };\n }\n\n // Mouse event handlers\n\n private handleMouseDown(e: MouseEvent): void {\n if (!this.config.isEditable()) return;\n\n const pointer = normalizeMouseEvent(e);\n const target = this.analyzeTarget(pointer.target);\n\n // Only handle drag-initiating targets\n if (target.type === 'none') return;\n\n // Check if selectable for slots\n if (target.type === 'slot' && !this.config.isSelectable()) return;\n\n e.preventDefault();\n\n // For events/resize handles, set up mouse pan candidate (can pan if moved quickly)\n if (target.type === 'event' || target.type === 'resize-handle') {\n this.mouseStartPosition = { x: pointer.clientX, y: pointer.clientY };\n this.isMousePanCandidate = true;\n\n // Start timer - after this time, regular drag behavior takes over\n this.mousePanTimer = setTimeout(() => {\n // Timer expired without entering pan mode, so this is a drag operation\n this.isMousePanCandidate = false;\n this.mousePanTimer = null;\n }, DEFAULT_MOUSE_PAN_TIMEOUT);\n }\n\n this.callbacks.onPointerDown(pointer, target);\n }\n\n private handleMouseMove(e: MouseEvent): void {\n const pointer = normalizeMouseEvent(e);\n\n // If in pan mode, continue panning\n if (this.isPanMode) {\n e.preventDefault();\n this.performPan(pointer.clientX, pointer.clientY);\n return;\n }\n\n // Check if we should enter pan mode (mouse on event + moved > threshold within timeout)\n if (this.isMousePanCandidate && this.mouseStartPosition) {\n const threshold =\n this.config.touchMoveThreshold ?? DEFAULT_TOUCH_MOVE_THRESHOLD;\n const distance = getPointerDistance(this.mouseStartPosition, {\n x: pointer.clientX,\n y: pointer.clientY,\n });\n\n if (distance > threshold) {\n // Cancel the pan timer\n if (this.mousePanTimer) {\n clearTimeout(this.mousePanTimer);\n this.mousePanTimer = null;\n }\n this.isMousePanCandidate = false;\n\n // Enter pan mode\n this.enterPanMode(pointer.clientX, pointer.clientY);\n e.preventDefault();\n return;\n }\n }\n\n this.callbacks.onPointerMove(pointer);\n }\n\n private handleMouseUp(e: MouseEvent): void {\n const pointer = normalizeMouseEvent(e);\n\n // If in pan mode, exit it\n if (this.isPanMode) {\n this.exitPanMode();\n this.cleanupMousePanState();\n return;\n }\n\n // Clean up mouse pan candidate state\n this.cleanupMousePanState();\n\n this.callbacks.onPointerUp(pointer);\n }\n\n private cleanupMousePanState(): void {\n if (this.mousePanTimer) {\n clearTimeout(this.mousePanTimer);\n this.mousePanTimer = null;\n }\n this.mouseStartPosition = null;\n this.isMousePanCandidate = false;\n }\n\n private handleClick(e: MouseEvent): void {\n const pointer = normalizeMouseEvent(e);\n const target = this.analyzeTarget(pointer.target);\n\n // Skip event clicks - handled by drag manager\n if (target.type === 'event' || target.type === 'resize-handle') {\n return;\n }\n\n this.callbacks.onClick(pointer, target);\n }\n\n private handleDblClick(e: MouseEvent): void {\n const pointer = normalizeMouseEvent(e);\n const target = this.analyzeTarget(pointer.target);\n this.callbacks.onDoubleClick(pointer, target);\n }\n\n // Touch event handlers\n\n private handleTouchStart(e: TouchEvent): void {\n if (!this.config.isEditable()) return;\n\n // Only handle single touch\n if (e.touches.length !== 1) {\n this.cancelTouchHold();\n return;\n }\n\n const pointer = normalizeTouchEvent(e);\n if (!pointer) return;\n\n const target = this.analyzeTarget(pointer.target);\n\n // Only handle drag-initiating targets\n if (target.type === 'none') return;\n if (target.type === 'slot' && !this.config.isSelectable()) return;\n\n this.touchStartPosition = { x: pointer.clientX, y: pointer.clientY };\n this.touchHoldTarget = pointer.target;\n this.touchHoldPointer = pointer;\n\n // Track if touch started on an event (for pan support)\n this.panStartedOnEvent = target.type === 'event' || target.type === 'resize-handle';\n\n // Add element-level listeners IMMEDIATELY for ALL drag-initiating touches\n // CRITICAL: Use e.target (the actual touched element) not pointer.target\n // In shadow DOM, touch.target and e.target can differ due to event retargeting.\n // Only the listener on e.target will continue to receive events after DOM replacement\n // (e.g., when Lit re-renders and replaces the element due to visual feedback classes).\n const self = this;\n const touchedElement = e.target as HTMLElement;\n\n // Add listener directly to the touched element - this is the ONLY listener\n // that will work after the element is replaced during re-render\n touchedElement.addEventListener('touchmove', function(evt: TouchEvent) {\n self.handleTouchMove(evt);\n }, { passive: false });\n\n touchedElement.addEventListener('touchend', function(evt: TouchEvent) {\n self.handleTouchEnd(evt);\n });\n\n touchedElement.addEventListener('touchcancel', function(evt: TouchEvent) {\n self.handleTouchCancel(evt);\n });\n\n // Add visual feedback\n this.addTouchFeedback(pointer.target, 'pending');\n\n // Start hold timer\n const holdDuration =\n this.config.touchHoldDuration ?? DEFAULT_TOUCH_HOLD_DURATION;\n\n this.touchHoldTimer = setTimeout(() => {\n this.activateTouchDragMode(pointer, target);\n }, holdDuration);\n }\n\n private handleTouchMove(e: TouchEvent): void {\n if (e.touches.length !== 1) {\n this.cancelTouchHold();\n this.exitPanMode();\n return;\n }\n\n const pointer = normalizeTouchEvent(e);\n if (!pointer) return;\n\n // If in pan mode, continue panning\n if (this.isPanMode) {\n e.preventDefault();\n this.performPan(pointer.clientX, pointer.clientY);\n return;\n }\n\n // If we have a pending touch hold, check if user moved too much\n if (this.touchHoldTimer && this.touchStartPosition) {\n const threshold =\n this.config.touchMoveThreshold ?? DEFAULT_TOUCH_MOVE_THRESHOLD;\n const distance = getPointerDistance(this.touchStartPosition, {\n x: pointer.clientX,\n y: pointer.clientY,\n });\n\n if (distance > threshold) {\n // User moved too much during hold period\n this.cancelTouchHold();\n\n // If touch started on an event, enter pan mode instead of allowing native scroll\n if (this.panStartedOnEvent) {\n this.enterPanMode(pointer.clientX, pointer.clientY);\n e.preventDefault();\n }\n // Otherwise, allow native scroll (no preventDefault)\n return;\n }\n\n // Still waiting for hold - prevent scroll while waiting\n // This is critical: we must prevent the browser from starting scroll\n // intervention during the hold period, otherwise it will take over\n // and subsequent touchmove events become non-cancelable\n e.preventDefault();\n return;\n }\n\n // If in touch drag mode, handle the drag\n if (this.isTouchDragMode) {\n e.preventDefault();\n this.callbacks.onPointerMove(pointer);\n }\n }\n\n private handleTouchEnd(e: TouchEvent): void {\n const pointer = normalizeTouchEvent(e);\n\n // If in pan mode, exit it\n if (this.isPanMode) {\n this.exitPanMode();\n return;\n }\n\n // If we had a pending hold that never activated, treat as tap\n if (this.touchHoldTimer) {\n this.cancelTouchHold();\n\n if (pointer && this.touchHoldTarget) {\n const target = this.analyzeTarget(this.touchHoldTarget);\n this.callbacks.onClick(pointer, target);\n }\n\n this.touchHoldTarget = null;\n this.touchHoldPointer = null;\n return;\n }\n\n // If in touch drag mode, finalize\n if (this.isTouchDragMode && pointer) {\n this.callbacks.onPointerUp(pointer);\n this.exitTouchDragMode();\n }\n }\n\n private handleTouchCancel(_e: TouchEvent): void {\n this.cancelTouchHold();\n this.exitPanMode();\n\n if (this.isTouchDragMode) {\n // Notify pointer up to cancel the drag\n if (this.touchStartPosition) {\n this.callbacks.onPointerUp({\n pointerId: 0,\n pointerType: 'touch',\n clientX: this.touchStartPosition.x,\n clientY: this.touchStartPosition.y,\n originalEvent: _e,\n target: this.touchHoldTarget ?? document.body,\n isPrimary: true,\n });\n }\n this.exitTouchDragMode();\n }\n }\n\n // Touch helpers\n\n private activateTouchDragMode(\n pointer: NormalizedPointerEvent,\n target: PointerTarget\n ): void {\n this.touchHoldTimer = null;\n this.touchStartPosition = null; // Clear so touchmove doesn't think we're still pending\n\n // Trigger haptic feedback\n this.triggerHapticFeedback();\n\n // Enter touch drag mode\n this.isTouchDragMode = true;\n\n // Document listeners were already added in handleTouchStart for event touches\n // For slot touches, add them now\n if (!this.touchHoldTarget?.closest('.scheduler-event')) {\n document.addEventListener('touchmove', this.boundHandleTouchMove, { passive: false });\n document.addEventListener('touchend', this.boundHandleTouchEnd);\n document.addEventListener('touchcancel', this.boundHandleTouchCancel);\n }\n\n // Update visual feedback\n if (this.touchHoldTarget) {\n this.removeTouchFeedback(this.touchHoldTarget, 'pending');\n this.addTouchFeedback(this.touchHoldTarget, 'active');\n }\n\n // Add container class\n const container = this.config.shadowRoot.querySelector('.scheduler-container');\n container?.classList.add('touch-drag-mode');\n\n // Apply scroll blocking to document body and scheduler-content\n this.applyScrollBlock();\n\n // Notify callback\n this.callbacks.onTouchDragActivated?.();\n\n // Start the drag immediately (skip pending threshold for touch)\n this.callbacks.onPointerDown(pointer, target, true);\n }\n\n private cancelTouchHold(): void {\n if (this.touchHoldTimer) {\n clearTimeout(this.touchHoldTimer);\n this.touchHoldTimer = null;\n }\n\n // Remove document listeners that were added in handleTouchStart\n document.removeEventListener('touchmove', this.boundHandleTouchMove);\n document.removeEventListener('touchend', this.boundHandleTouchEnd);\n document.removeEventListener('touchcancel', this.boundHandleTouchCancel);\n\n // Remove pending visual feedback\n if (this.touchHoldTarget) {\n this.removeTouchFeedback(this.touchHoldTarget, 'pending');\n this.removeTouchFeedback(this.touchHoldTarget, 'active');\n }\n\n // Note: Don't reset touchStartPosition here as it may be needed for pan mode\n // Also don't reset panStartedOnEvent - it's needed after cancelTouchHold\n }\n\n private exitTouchDragMode(): void {\n this.isTouchDragMode = false;\n this.touchStartPosition = null;\n this.touchHoldTarget = null;\n this.touchHoldPointer = null;\n\n // Remove document-level listeners added during drag mode\n document.removeEventListener('touchmove', this.boundHandleTouchMove);\n document.removeEventListener('touchend', this.boundHandleTouchEnd);\n document.removeEventListener('touchcancel', this.boundHandleTouchCancel);\n\n // Remove container class\n const container = this.config.shadowRoot.querySelector('.scheduler-container');\n container?.classList.remove('touch-drag-mode');\n\n // Remove scroll blocking\n this.removeScrollBlock();\n\n // Remove all feedback classes\n this.config.shadowRoot\n .querySelectorAll('.touch-hold-active, .touch-hold-pending')\n .forEach((el) => {\n el.classList.remove('touch-hold-active', 'touch-hold-pending');\n });\n\n // Notify callback\n this.callbacks.onTouchDragDeactivated?.();\n }\n\n private addTouchFeedback(\n element: HTMLElement,\n type: 'pending' | 'active'\n ): void {\n const targetEl = element.closest(\n '.scheduler-event, .scheduler-time-slot, .scheduler-timeline-slot'\n );\n targetEl?.classList.add(`touch-hold-${type}`);\n }\n\n private removeTouchFeedback(\n element: HTMLElement,\n type: 'pending' | 'active'\n ): void {\n const targetEl = element.closest(\n '.scheduler-event, .scheduler-time-slot, .scheduler-timeline-slot'\n );\n targetEl?.classList.remove(`touch-hold-${type}`);\n }\n\n private triggerHapticFeedback(): void {\n // Vibration API removed - can cause issues on some devices\n }\n\n // Pan helpers\n\n private enterPanMode(clientX: number, clientY: number): void {\n const container = this.callbacks.getScrollContainer?.();\n if (!container) return;\n\n this.isPanMode = true;\n this.panStartPosition = { x: clientX, y: clientY };\n this.panStartScroll = { left: container.scrollLeft, top: container.scrollTop };\n\n // Add visual feedback for pan mode\n container.classList.add('pan-mode');\n\n // Remove hold feedback if any\n if (this.touchHoldTarget) {\n this.removeTouchFeedback(this.touchHoldTarget, 'pending');\n this.removeTouchFeedback(this.touchHoldTarget, 'active');\n }\n }\n\n private exitPanMode(): void {\n if (!this.isPanMode) return;\n\n this.isPanMode = false;\n this.panStartPosition = null;\n this.panStartScroll = null;\n this.panStartedOnEvent = false;\n this.touchStartPosition = null;\n this.touchHoldTarget = null;\n\n // Remove visual feedback\n const container = this.callbacks.getScrollContainer?.();\n container?.classList.remove('pan-mode');\n }\n\n private performPan(clientX: number, clientY: number): void {\n if (!this.isPanMode || !this.panStartPosition || !this.panStartScroll) return;\n\n const container = this.callbacks.getScrollContainer?.();\n if (!container) return;\n\n // Calculate delta from start position\n const deltaX = this.panStartPosition.x - clientX;\n const deltaY = this.panStartPosition.y - clientY;\n\n // Apply scroll\n container.scrollLeft = this.panStartScroll.left + deltaX;\n container.scrollTop = this.panStartScroll.top + deltaY;\n }\n\n // Scroll blocking helpers\n\n private applyScrollBlock(): void {\n // Save current body styles for restoration\n this.savedBodyStyles = {\n overflow: document.body.style.overflow,\n touchAction: document.body.style.touchAction,\n };\n\n // Block scrolling on document body\n document.body.style.overflow = 'hidden';\n document.body.style.touchAction = 'none';\n\n // Block scrolling on scheduler-content\n const scrollContainer = this.callbacks.getScrollContainer?.();\n if (scrollContainer) {\n scrollContainer.classList.add('scroll-blocked');\n }\n }\n\n private removeScrollBlock(): void {\n // Restore body styles\n if (this.savedBodyStyles) {\n document.body.style.overflow = this.savedBodyStyles.overflow;\n document.body.style.touchAction = this.savedBodyStyles.touchAction;\n this.savedBodyStyles = null;\n }\n\n // Remove scroll blocking from scheduler-content\n const scrollContainer = this.callbacks.getScrollContainer?.();\n if (scrollContainer) {\n scrollContainer.classList.remove('scroll-blocked');\n }\n }\n}\n","import { SchedulerCustomEvent, EventDetail } from './event-types';\n\n/**\n * Handles dispatching custom events from the scheduler.\n * Centralizes event emission logic for consistency.\n */\nexport class SchedulerEventEmitter {\n constructor(private readonly host: HTMLElement) {}\n\n /**\n * Emit a scheduler custom event.\n * The event will bubble up through the DOM.\n */\n emit(event: SchedulerCustomEvent): void {\n const { type, ...detail } = event;\n this.host.dispatchEvent(\n new CustomEvent(type, {\n detail,\n bubbles: true,\n })\n );\n }\n\n /**\n * Emit an event-click event.\n */\n emitEventClick(\n event: EventDetail<'event-click'>['event'],\n originalEvent: Event\n ): void {\n this.emit({ type: 'event-click', event, originalEvent });\n }\n\n /**\n * Emit an event-dblclick event.\n */\n emitEventDblClick(\n event: EventDetail<'event-dblclick'>['event'],\n originalEvent: Event\n ): void {\n this.emit({ type: 'event-dblclick', event, originalEvent });\n }\n\n /**\n * Emit an event-create event.\n */\n emitEventCreate(\n event: EventDetail<'event-create'>['event'],\n originalEvent: Event\n ): void {\n this.emit({ type: 'event-create', event, originalEvent });\n }\n\n /**\n * Emit an event-update event.\n */\n emitEventUpdate(\n event: EventDetail<'event-update'>['event'],\n oldEvent: EventDetail<'event-update'>['oldEvent'],\n originalEvent: Event\n ): void {\n this.emit({ type: 'event-update', event, oldEvent, originalEvent });\n }\n\n /**\n * Emit an event-delete event.\n */\n emitEventDelete(event: EventDetail<'event-delete'>['event']): void {\n this.emit({ type: 'event-delete', event });\n }\n\n /**\n * Emit a date-click event.\n */\n emitDateClick(date: Date, originalEvent: Event): void {\n this.emit({ type: 'date-click', date, originalEvent });\n }\n\n /**\n * Emit a view-change event.\n */\n emitViewChange(\n view: EventDetail<'view-change'>['view'],\n date: EventDetail<'view-change'>['date']\n ): void {\n this.emit({ type: 'view-change', view, date });\n }\n\n /**\n * Emit a selection-change event.\n */\n emitSelectionChange(\n selectedEvent: EventDetail<'selection-change'>['selectedEvent']\n ): void {\n this.emit({ type: 'selection-change', selectedEvent });\n }\n}\n","import { LitElement, html, type TemplateResult } from 'lit';\nimport {\n ViewType,\n SchedulerEvent,\n Resource,\n ResourceGroup,\n SchedulerOptions,\n TimeSlot,\n dateService,\n generateEventId,\n} from '@mintplayer/ng-bootstrap/web-components/scheduler-core';\nimport { SchedulerStateManager, SchedulerState } from '../state/scheduler-state';\nimport { BaseView } from '../views/base-view';\nimport { YearView } from '../views/year-view';\nimport { MonthView } from '../views/month-view';\nimport { WeekView } from '../views/week-view';\nimport { DayView } from '../views/day-view';\nimport { TimelineView } from '../views/timeline-view';\nimport { schedulerStyles } from '../styles/scheduler.styles';\nimport { DragManager, PointerTarget, DragCompletionResult } from '../drag';\nimport { InputHandler, NormalizedPointerEvent } from '../input';\nimport { SchedulerEventEmitter } from '../events';\n\n/**\n * MpScheduler Web Component\n *\n * A fully-featured scheduler/calendar component.\n * Refactored for clarity with separated concerns:\n * - DragManager: Handles all drag operations\n * - InputHandler: Normalizes mouse/touch input\n * - SchedulerEventEmitter: Dispatches custom events\n */\nexport class MpScheduler extends LitElement {\n static override styles = [schedulerStyles];\n\n static override get observedAttributes(): string[] {\n return [\n ...(super.observedAttributes ?? []),\n 'view',\n 'date',\n 'locale',\n 'first-day-of-week',\n 'slot-duration',\n 'time-format',\n 'editable',\n 'selectable',\n ];\n }\n\n private stateManager: SchedulerStateManager;\n private currentView: BaseView | null = null;\n private currentViewType: ViewType | null = null;\n private contentContainer: HTMLElement | null = null;\n\n // Managers\n private dragManager: DragManager;\n private inputHandler: InputHandler | null = null;\n private eventEmitter: SchedulerEventEmitter;\n\n // Track previous state for change detection\n private previousView: ViewType | null = null;\n private previousDate: Date | null = null;\n private previousSelectedEventId: string | null = null;\n\n // RAF scheduling for drag updates\n private pendingDragUpdate: number | null = null;\n private latestDragState: SchedulerState | null = null;\n\n // Keyboard handler\n private boundHandleKeyDown: (e: KeyboardEvent) => void;\n\n // Now indicator update timer\n private nowIndicatorTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor() {\n super();\n\n this.stateManager = new SchedulerStateManager();\n this.eventEmitter = new SchedulerEventEmitter(this);\n\n // Initialize drag manager (input handler is deferred to firstUpdated()\n // because it needs the shadow root, which Lit creates after construction).\n this.dragManager = new DragManager(this.stateManager);\n this.dragManager.setSlotResolver((x, y) => this.getSlotAtPosition(x, y));\n\n // Bind keyboard handler\n this.boundHandleKeyDown = this.handleKeyDown.bind(this);\n\n // Subscribe to state changes\n this.stateManager.subscribe((state) => this.onStateChange(state));\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.inputHandler) {\n this.inputHandler.attach();\n }\n this.addEventListener('keydown', this.boundHandleKeyDown);\n\n // Start now indicator update timer (every minute)\n this.startNowIndicatorTimer();\n }\n\n override disconnectedCallback(): void {\n this.inputHandler?.detach();\n this.removeEventListener('keydown', this.boundHandleKeyDown);\n this.currentView?.destroy();\n this.dragManager.destroy();\n\n // Stop now indicator timer\n this.stopNowIndicatorTimer();\n\n // Cancel any pending RAF\n if (this.pendingDragUpdate !== null) {\n cancelAnimationFrame(this.pendingDragUpdate);\n this.pendingDragUpdate = null;\n }\n this.latestDragState = null;\n super.disconnectedCallback();\n }\n\n override attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null\n ): void {\n super.attributeChangedCallback(name, oldValue, newValue);\n if (oldValue === newValue) return;\n\n switch (name) {\n case 'view':\n if (newValue && ['year', 'month', 'week', 'day', 'timeline'].includes(newValue)) {\n this.stateManager.setView(newValue as ViewType);\n }\n break;\n case 'date':\n if (newValue) {\n this.stateManager.setDate(new Date(newValue));\n }\n break;\n case 'locale':\n if (newValue) {\n this.stateManager.setOptions({ locale: newValue });\n }\n break;\n case 'first-day-of-week':\n if (newValue) {\n const day = parseInt(newValue, 10);\n if (day >= 0 && day <= 6) {\n this.stateManager.setOptions({\n firstDayOfWeek: day as 0 | 1 | 2 | 3 | 4 | 5 | 6,\n });\n }\n }\n break;\n case 'slot-duration':\n if (newValue) {\n this.stateManager.setOptions({ slotDuration: parseInt(newValue, 10) });\n }\n break;\n case 'time-format':\n if (newValue && (newValue === '12h' || newValue === '24h')) {\n this.stateManager.setOptions({ timeFormat: newValue });\n }\n break;\n case 'editable':\n this.stateManager.setOptions({ editable: newValue !== 'false' });\n break;\n case 'selectable':\n this.stateManager.setOptions({ selectable: newValue !== 'false' });\n break;\n }\n }\n\n // ============================================\n // Public API\n // ============================================\n\n get view(): ViewType {\n return this.stateManager.getState().view;\n }\n\n set view(value: ViewType) {\n this.stateManager.setView(value);\n }\n\n get date(): Date {\n return this.stateManager.getState().date;\n }\n\n set date(value: Date) {\n this.stateManager.setDate(value);\n }\n\n get events(): SchedulerEvent[] {\n return this.stateManager.getState().events;\n }\n\n set events(value: SchedulerEvent[]) {\n this.stateManager.setEvents(value);\n }\n\n get resources(): (Resource | ResourceGroup)[] {\n return this.stateManager.getState().resources;\n }\n\n set resources(value: (Resource | ResourceGroup)[]) {\n this.stateManager.setResources(value);\n }\n\n get options(): SchedulerOptions {\n return this.stateManager.getState().options;\n }\n\n set options(value: Partial<SchedulerOptions>) {\n this.stateManager.setOptions(value);\n }\n\n get selectedEvent(): SchedulerEvent | null {\n return this.stateManager.getState().selectedEvent;\n }\n\n set selectedEvent(value: SchedulerEvent | null) {\n this.stateManager.setSelectedEvent(value);\n }\n\n get selectedRange(): { start: Date; end: Date } | null {\n const state = this.stateManager.getState();\n if (state.previewEvent) {\n return { start: state.previewEvent.start, end: state.previewEvent.end };\n }\n return null;\n }\n\n next(): void {\n this.stateManager.next();\n }\n\n prev(): void {\n this.stateManager.prev();\n }\n\n today(): void {\n this.stateManager.today();\n }\n\n gotoDate(date: Date): void {\n this.stateManager.gotoDate(date);\n }\n\n changeView(view: ViewType): void {\n this.stateManager.setView(view);\n }\n\n addEvent(event: SchedulerEvent): void {\n this.stateManager.addEvent(event);\n }\n\n updateEvent(event: SchedulerEvent): void {\n this.stateManager.updateEvent(event);\n }\n\n removeEvent(eventId: string): void {\n this.stateManager.removeEvent(eventId);\n }\n\n getEventById(eventId: string): SchedulerEvent | null {\n return this.events.find((e) => e.id === eventId) ?? null;\n }\n\n refetchEvents(): void {\n this.currentView?.update(this.stateManager.getState());\n }\n\n // ============================================\n // Rendering\n // ============================================\n\n override render(): TemplateResult {\n return html`\n <div class=\"scheduler-container\">\n <header class=\"scheduler-header\"></header>\n <div class=\"scheduler-content\"></div>\n </div>\n `;\n }\n\n protected override firstUpdated(): void {\n const headerEl = this.shadowRoot!.querySelector('.scheduler-header') as HTMLElement;\n this.contentContainer = this.shadowRoot!.querySelector('.scheduler-content') as HTMLElement;\n\n this.populateHeader(headerEl);\n\n // Construct InputHandler now that shadowRoot is available, then attach.\n this.inputHandler = new InputHandler(\n {\n shadowRoot: this.shadowRoot!,\n getEventById: (id) => this.getEventById(id),\n isEditable: () => this.stateManager.getState().options.editable ?? true,\n isSelectable: () => this.stateManager.getState().options.selectable ?? true,\n },\n {\n onPointerDown: (pointer, target, immediate) => this.handlePointerDown(pointer, target, immediate),\n onPointerMove: (pointer) => this.handlePointerMove(pointer),\n onPointerUp: (pointer) => this.handlePointerUp(pointer),\n onClick: (pointer, target) => this.handleClick(pointer, target),\n onDoubleClick: (pointer, target) => this.handleDoubleClick(pointer, target),\n getScrollContainer: () => this.contentContainer,\n }\n );\n this.inputHandler.attach();\n\n this.renderView();\n }\n\n private populateHeader(header: HTMLElement): void {\n // Navigation\n const nav = document.createElement('nav');\n nav.className = 'scheduler-nav';\n\n const prevBtn = document.createElement('button');\n prevBtn.textContent = '‹';\n prevBtn.title = 'Previous';\n prevBtn.addEventListener('click', () => this.prev());\n\n const nextBtn = document.createElement('button');\n nextBtn.textContent = '›';\n nextBtn.title = 'Next';\n nextBtn.addEventListener('click', () => this.next());\n\n const todayBtn = document.createElement('button');\n todayBtn.textContent = 'Today';\n todayBtn.addEventListener('click', () => this.today());\n\n nav.appendChild(prevBtn);\n nav.appendChild(nextBtn);\n nav.appendChild(todayBtn);\n\n // Title\n const title = document.createElement('div');\n title.className = 'scheduler-title';\n this.updateTitle(title);\n\n // View switcher\n const viewSwitcher = document.createElement('div');\n viewSwitcher.className = 'scheduler-view-switcher';\n\n const views: { key: ViewType; label: string }[] = [\n { key: 'year', label: 'Year' },\n { key: 'month', label: 'Month' },\n { key: 'week', label: 'Week' },\n { key: 'day', label: 'Day' },\n { key: 'timeline', label: 'Timeline' },\n ];\n\n for (const { key, label } of views) {\n const btn = document.createElement('button');\n btn.textContent = label;\n btn.dataset['view'] = key;\n if (key === this.view) {\n btn.classList.add('active');\n }\n btn.addEventListener('click', () => this.changeView(key));\n viewSwitcher.appendChild(btn);\n }\n\n header.appendChild(nav);\n header.appendChild(title);\n header.appendChild(viewSwitcher);\n }\n\n private updateTitle(titleEl?: HTMLElement): void {\n const title = titleEl ?? this.shadowRoot!.querySelector('.scheduler-title');\n if (!title) return;\n\n const state = this.stateManager.getState();\n const { date, view, options } = state;\n\n let titleText = '';\n switch (view) {\n case 'year':\n titleText = date.getFullYear().toString();\n break;\n case 'month':\n titleText = dateService.formatDate(date, options.locale, {\n month: 'long',\n year: 'numeric',\n });\n break;\n case 'week':\n case 'timeline': {\n const weekStart = dateService.getWeekStart(date, options.firstDayOfWeek);\n const weekEnd = dateService.addDays(weekStart, 6);\n titleText = `${dateService.formatDate(weekStart, options.locale, {\n month: 'short',\n day: 'numeric',\n })} - ${dateService.formatDate(weekEnd, options.locale, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n })}`;\n break;\n }\n case 'day':\n titleText = dateService.formatDate(date, options.locale, {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n });\n break;\n }\n\n title.textContent = titleText;\n }\n\n private renderView(): void {\n if (!this.contentContainer) return;\n\n this.currentView?.destroy();\n\n const state = this.stateManager.getState();\n\n switch (state.view) {\n case 'year':\n this.currentView = new YearView(this.contentContainer, state);\n this.currentViewType = 'year';\n break;\n case 'month':\n this.currentView = new MonthView(this.contentContainer, state);\n this.currentViewType = 'month';\n break;\n case 'week':\n this.currentView = new WeekView(this.contentContainer, state);\n this.currentViewType = 'week';\n break;\n case 'day':\n this.currentView = new DayView(this.contentContainer, state);\n this.currentViewType = 'day';\n break;\n case 'timeline':\n this.currentView = new TimelineView(this.contentContainer, state);\n this.currentViewType = 'timeline';\n break;\n }\n\n this.currentView?.render();\n }\n\n // ============================================\n // State Change Handling\n // ============================================\n\n private onStateChange(state: SchedulerState): void {\n this.detectAndEmitChanges(state);\n this.updateUI(state);\n }\n\n private detectAndEmitChanges(state: SchedulerState): void {\n const viewChanged =\n this.previousView !== null && this.previousView !== state.view;\n const dateChanged =\n this.previousDate !== null &&\n this.previousDate.getTime() !== state.date.getTime();\n const selectedEventId = state.selectedEvent?.id ?? null;\n const selectionChanged =\n this.previousSelectedEventId !== null &&\n this.previousSelectedEventId !== selectedEventId;\n\n if (viewChanged || dateChanged) {\n this.eventEmitter.emitViewChange(state.view, state.date);\n }\n\n if (selectionChanged) {\n this.eventEmitter.emitSelectionChange(state.selectedEvent);\n }\n\n this.previousView = state.view;\n this.previousDate = new Date(state.date);\n this.previousSelectedEventId = selectedEventId;\n }\n\n private updateUI(state: SchedulerState): void {\n this.updateTitle();\n\n // Update view switcher active state\n const buttons = this.shadowRoot!.querySelectorAll('.scheduler-view-switcher button');\n buttons.forEach((btn) => {\n const btnEl = btn as HTMLButtonElement;\n btnEl.classList.toggle('active', btnEl.dataset['view'] === state.view);\n });\n\n // Update or re-render view\n if (this.currentView) {\n if (this.currentViewType !== state.view) {\n this.renderView();\n } else if (state.dragState || state.previewEvent) {\n this.scheduleDragUpdate(state);\n } else {\n this.currentView.update(state);\n }\n }\n }\n\n private scheduleDragUpdate(state: SchedulerState): void {\n this.latestDragState = state;\n\n if (this.pendingDragUpdate !== null) {\n return;\n }\n\n this.pendingDragUpdate = requestAnimationFrame(() => {\n this.pendingDragUpdate = null;\n\n const stateToApply = this.latestDragState;\n this.latestDragState = null;\n\n if (stateToApply && this.currentView) {\n this.currentView.update(stateToApply);\n }\n });\n }\n\n // ============================================\n // Input Handling (Callbacks from InputHandler)\n // ============================================\n\n private handlePointerDown(\n pointer: NormalizedPointerEvent,\n target: PointerTarget,\n immediate?: boolean\n ): void {\n this.dragManager.handlePointerDown(pointer, target, immediate);\n }\n\n private handlePointerMove(pointer: NormalizedPointerEvent): void {\n this.dragManager.handlePointerMove(pointer);\n }\n\n private handlePointerUp(pointer: NormalizedPointerEvent): void {\n const result = this.dragManager.handlePointerUp(pointer);\n\n if (result) {\n this.handleDragComplete(result, pointer.originalEvent);\n }\n }\n\n private handleDragComplete(\n result: DragCompletionResult,\n originalEvent: Event\n ): void {\n if (result.wasClick) {\n // It was a click, not a drag\n if (result.event) {\n this.stateManager.setSelectedEvent(result.event);\n this.eventEmitter.emitEventClick(result.event, originalEvent);\n }\n return;\n }\n\n // Handle actual drag completion\n switch (result.type) {\n case 'create': {\n const newEvent: SchedulerEvent = {\n id: generateEventId(),\n title: 'New Event',\n start: result.preview.start,\n end: result.preview.end,\n color: '#3788d8',\n };\n this.stateManager.addEvent(newEvent);\n this.eventEmitter.emitEventCreate(newEvent, originalEvent);\n break;\n }\n\n case 'move':\n case 'resize-start':\n case 'resize-end': {\n if (result.event && result.originalEvent) {\n const updatedEvent: SchedulerEvent = {\n ...result.event,\n start: result.preview.start,\n end: result.preview.end,\n };\n this.stateManager.updateEvent(updatedEvent);\n this.eventEmitter.emitEventUpdate(\n updatedEvent,\n result.originalEvent,\n originalEvent\n );\n }\n break;\n }\n }\n }\n\n private handleClick(\n pointer: NormalizedPointerEvent,\n target: PointerTarget\n ): void {\n const targetEl = pointer.target;\n\n // Group toggle\n const toggle = targetEl.closest('.expand-toggle') as HTMLElement;\n if (toggle) {\n const groupId = toggle.dataset['groupId'];\n if (groupId) {\n this.stateManager.toggleGroupCollapse(groupId);\n this.renderView();\n return;\n }\n }\n\n // Date click\n const dayEl = targetEl.closest('[data-date]') as HTMLElement;\n if (dayEl) {\n const dateStr = dayEl.dataset['date'];\n if (dateStr) {\n this.eventEmitter.emitDateClick(new Date(dateStr), pointer.originalEvent);\n }\n }\n\n // Month click in year view\n const monthHeader = targetEl.closest(\n '.scheduler-year-month-header'\n ) as HTMLElement;\n if (monthHeader) {\n const monthStr = monthHeader.dataset['month'];\n if (monthStr) {\n this.stateManager.setDate(new Date(monthStr));\n this.stateManager.setView('month');\n }\n }\n\n // More link click\n const moreLink = targetEl.closest('.scheduler-more-link') as HTMLElement;\n if (moreLink) {\n const dateStr = moreLink.dataset['date'];\n if (dateStr) {\n this.stateManager.setDate(new Date(dateStr));\n this.stateManager.setView('day');\n }\n }\n }\n\n private handleDoubleClick(\n pointer: NormalizedPointerEvent,\n target: PointerTarget\n ): void {\n if (target.type === 'event' && target.event) {\n this.eventEmitter.emitEventDblClick(target.event, pointer.originalEvent);\n }\n }\n\n private handleKeyDown(e: KeyboardEvent): void {\n const state = this.stateManager.getState();\n\n switch (e.key) {\n case 'ArrowLeft':\n this.prev();\n e.preventDefault();\n break;\n case 'ArrowRight':\n this.next();\n e.preventDefault();\n break;\n case 't':\n case 'T':\n this.today();\n e.preventDefault();\n break;\n case 'y':\n case 'Y':\n this.changeView('year');\n e.preventDefault();\n break;\n case 'm':\n case 'M':\n this.changeView('month');\n e.preventDefault();\n break;\n case 'w':\n case 'W':\n this.changeView('week');\n e.preventDefault();\n break;\n case 'd':\n case 'D':\n this.changeView('day');\n e.preventDefault();\n break;\n case 'Delete':\n case 'Backspace':\n if (state.selectedEvent) {\n this.eventEmitter.emitEventDelete(state.selectedEvent);\n }\n break;\n case 'Escape':\n if (this.dragManager.isDragging()) {\n this.dragManager.cancel();\n }\n break;\n }\n }\n\n // ============================================\n // Now Indicator Timer\n // ============================================\n\n private startNowIndicatorTimer(): void {\n // Update every minute (60000ms)\n this.nowIndicatorTimer = setInterval(() => {\n this.currentView?.updateNowIndicator();\n }, 60000);\n }\n\n private stopNowIndicatorTimer(): void {\n if (this.nowIndicatorTimer !== null) {\n clearInterval(this.nowIndicatorTimer);\n this.nowIndicatorTimer = null;\n }\n }\n\n // ============================================\n // Slot Resolution\n // ============================================\n\n private getSlotAtPosition(clientX: number, clientY: number): TimeSlot | null {\n const elements = this.shadowRoot!.elementsFromPoint(clientX, clientY);\n const slotEl = elements.find((el) =>\n el.matches('.scheduler-time-slot, .scheduler-timeline-slot')\n ) as HTMLElement | undefined;\n\n return slotEl ? this.getSlotFromElement(slotEl) : null;\n }\n\n private getSlotFromElement(el: HTMLElement): TimeSlot | null {\n const startStr = el.dataset['start'];\n const endStr = el.dataset['end'];\n\n if (!startStr || !endStr) return null;\n\n return {\n start: new Date(startStr),\n end: new Date(endStr),\n };\n }\n}\n\n// Register the custom element\nif (typeof customElements !== 'undefined' && !customElements.get('mp-scheduler')) {\n customElements.define('mp-scheduler', MpScheduler);\n}\n","// Main component\nexport { MpScheduler } from './components/mp-scheduler';\n\n// State management\nexport { SchedulerStateManager, SchedulerState, createInitialState } from './state/scheduler-state';\n\n// Views\nexport * from './views';\n\n// Styles\nexport { schedulerStyles } from './styles/scheduler.styles';\n\n// Re-export core types for convenience\nexport type {\n ViewType,\n DisplayMode,\n SchedulerEvent,\n SchedulerEventPart,\n Resource,\n ResourceGroup,\n SchedulerOptions,\n TimeSlot,\n PreviewEvent,\n DragState,\n} from '@mintplayer/ng-bootstrap/web-components/scheduler-core';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}