@mintplayer/scheduler-wc 1.0.1 → 1.1.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 (40) hide show
  1. package/package.json +1 -1
  2. package/src/components/mp-scheduler.d.ts +16 -41
  3. package/src/components/mp-scheduler.js +126 -575
  4. package/src/components/mp-scheduler.js.map +1 -1
  5. package/src/drag/drag-manager.d.ts +90 -0
  6. package/src/drag/drag-manager.js +201 -0
  7. package/src/drag/drag-manager.js.map +1 -0
  8. package/src/drag/drag-preview.d.ts +42 -0
  9. package/src/drag/drag-preview.js +87 -0
  10. package/src/drag/drag-preview.js.map +1 -0
  11. package/src/drag/drag-state-machine.d.ts +102 -0
  12. package/src/drag/drag-state-machine.js +320 -0
  13. package/src/drag/drag-state-machine.js.map +1 -0
  14. package/src/drag/drag-types.d.ts +104 -0
  15. package/src/drag/drag-types.js +8 -0
  16. package/src/drag/drag-types.js.map +1 -0
  17. package/src/drag/index.d.ts +4 -0
  18. package/src/drag/index.js +5 -0
  19. package/src/drag/index.js.map +1 -0
  20. package/src/events/event-types.d.ts +43 -0
  21. package/src/events/event-types.js +2 -0
  22. package/src/events/event-types.js.map +1 -0
  23. package/src/events/index.d.ts +2 -0
  24. package/src/events/index.js +3 -0
  25. package/src/events/index.js.map +1 -0
  26. package/src/events/scheduler-event-emitter.d.ts +46 -0
  27. package/src/events/scheduler-event-emitter.js +70 -0
  28. package/src/events/scheduler-event-emitter.js.map +1 -0
  29. package/src/input/index.d.ts +2 -0
  30. package/src/input/index.js +3 -0
  31. package/src/input/index.js.map +1 -0
  32. package/src/input/input-handler.d.ts +93 -0
  33. package/src/input/input-handler.js +340 -0
  34. package/src/input/input-handler.js.map +1 -0
  35. package/src/input/pointer-event.d.ts +39 -0
  36. package/src/input/pointer-event.js +41 -0
  37. package/src/input/pointer-event.js.map +1 -0
  38. package/src/styles/scheduler.styles.d.ts +1 -1
  39. package/src/styles/scheduler.styles.js +14 -0
  40. package/src/styles/scheduler.styles.js.map +1 -1
@@ -0,0 +1,93 @@
1
+ import { SchedulerEvent } from '@mintplayer/scheduler-core';
2
+ import { NormalizedPointerEvent } from './pointer-event';
3
+ import { PointerTarget } from '../drag/drag-types';
4
+ /**
5
+ * Callbacks for input handler events.
6
+ */
7
+ export interface InputHandlerCallbacks {
8
+ /** Called when pointer goes down on a valid target */
9
+ onPointerDown: (pointer: NormalizedPointerEvent, target: PointerTarget, immediate?: boolean) => void;
10
+ /** Called when pointer moves (during drag) */
11
+ onPointerMove: (pointer: NormalizedPointerEvent) => void;
12
+ /** Called when pointer is released */
13
+ onPointerUp: (pointer: NormalizedPointerEvent) => void;
14
+ /** Called for click events (not drag) */
15
+ onClick: (pointer: NormalizedPointerEvent, target: PointerTarget) => void;
16
+ /** Called for double-click events */
17
+ onDoubleClick: (pointer: NormalizedPointerEvent, target: PointerTarget) => void;
18
+ /** Called when touch drag mode is activated (after hold) */
19
+ onTouchDragActivated?: () => void;
20
+ /** Called when touch drag mode is deactivated */
21
+ onTouchDragDeactivated?: () => void;
22
+ }
23
+ /**
24
+ * Configuration for the input handler.
25
+ */
26
+ export interface InputHandlerConfig {
27
+ /** Shadow root to attach listeners to */
28
+ shadowRoot: ShadowRoot;
29
+ /** Function to get event by ID */
30
+ getEventById: (id: string) => SchedulerEvent | null;
31
+ /** Whether editing is enabled */
32
+ isEditable: () => boolean;
33
+ /** Whether selection is enabled */
34
+ isSelectable: () => boolean;
35
+ /** Touch hold duration in ms before drag activates (default: 500) */
36
+ touchHoldDuration?: number;
37
+ /** Movement threshold before touch hold is cancelled (default: 10) */
38
+ touchMoveThreshold?: number;
39
+ }
40
+ /**
41
+ * Unified input handler for mouse and touch events.
42
+ * Normalizes events and handles touch-specific behaviors (hold-to-drag).
43
+ */
44
+ export declare class InputHandler {
45
+ private readonly config;
46
+ private readonly callbacks;
47
+ private touchHoldTimer;
48
+ private touchStartPosition;
49
+ private isTouchDragMode;
50
+ private touchHoldTarget;
51
+ private touchHoldPointer;
52
+ private readonly boundHandleMouseDown;
53
+ private readonly boundHandleMouseMove;
54
+ private readonly boundHandleMouseUp;
55
+ private readonly boundHandleClick;
56
+ private readonly boundHandleDblClick;
57
+ private readonly boundHandleTouchStart;
58
+ private readonly boundHandleTouchMove;
59
+ private readonly boundHandleTouchEnd;
60
+ private readonly boundHandleTouchCancel;
61
+ constructor(config: InputHandlerConfig, callbacks: InputHandlerCallbacks);
62
+ /**
63
+ * Attach all event listeners.
64
+ */
65
+ attach(): void;
66
+ /**
67
+ * Detach all event listeners.
68
+ */
69
+ detach(): void;
70
+ /**
71
+ * Check if in touch drag mode.
72
+ */
73
+ isInTouchDragMode(): boolean;
74
+ /**
75
+ * Analyze pointer target to determine what was clicked.
76
+ */
77
+ analyzeTarget(element: HTMLElement): PointerTarget;
78
+ private handleMouseDown;
79
+ private handleMouseMove;
80
+ private handleMouseUp;
81
+ private handleClick;
82
+ private handleDblClick;
83
+ private handleTouchStart;
84
+ private handleTouchMove;
85
+ private handleTouchEnd;
86
+ private handleTouchCancel;
87
+ private activateTouchDragMode;
88
+ private cancelTouchHold;
89
+ private exitTouchDragMode;
90
+ private addTouchFeedback;
91
+ private removeTouchFeedback;
92
+ private triggerHapticFeedback;
93
+ }
@@ -0,0 +1,340 @@
1
+ import { normalizeMouseEvent, normalizeTouchEvent, getPointerDistance, } from './pointer-event';
2
+ const DEFAULT_TOUCH_HOLD_DURATION = 500;
3
+ const DEFAULT_TOUCH_MOVE_THRESHOLD = 10;
4
+ /**
5
+ * Unified input handler for mouse and touch events.
6
+ * Normalizes events and handles touch-specific behaviors (hold-to-drag).
7
+ */
8
+ export class InputHandler {
9
+ constructor(config, callbacks) {
10
+ // Touch-specific state
11
+ this.touchHoldTimer = null;
12
+ this.touchStartPosition = null;
13
+ this.isTouchDragMode = false;
14
+ this.touchHoldTarget = null;
15
+ this.touchHoldPointer = null;
16
+ this.config = config;
17
+ this.callbacks = callbacks;
18
+ // Bind handlers
19
+ this.boundHandleMouseDown = this.handleMouseDown.bind(this);
20
+ this.boundHandleMouseMove = this.handleMouseMove.bind(this);
21
+ this.boundHandleMouseUp = this.handleMouseUp.bind(this);
22
+ this.boundHandleClick = this.handleClick.bind(this);
23
+ this.boundHandleDblClick = this.handleDblClick.bind(this);
24
+ this.boundHandleTouchStart = this.handleTouchStart.bind(this);
25
+ this.boundHandleTouchMove = this.handleTouchMove.bind(this);
26
+ this.boundHandleTouchEnd = this.handleTouchEnd.bind(this);
27
+ this.boundHandleTouchCancel = this.handleTouchCancel.bind(this);
28
+ }
29
+ /**
30
+ * Attach all event listeners.
31
+ */
32
+ attach() {
33
+ const root = this.config.shadowRoot;
34
+ root.addEventListener('mousedown', this.boundHandleMouseDown);
35
+ document.addEventListener('mousemove', this.boundHandleMouseMove);
36
+ document.addEventListener('mouseup', this.boundHandleMouseUp);
37
+ root.addEventListener('click', this.boundHandleClick);
38
+ root.addEventListener('dblclick', this.boundHandleDblClick);
39
+ root.addEventListener('touchstart', this.boundHandleTouchStart, {
40
+ passive: false,
41
+ });
42
+ root.addEventListener('touchmove', this.boundHandleTouchMove, {
43
+ passive: false,
44
+ });
45
+ root.addEventListener('touchend', this.boundHandleTouchEnd);
46
+ root.addEventListener('touchcancel', this.boundHandleTouchCancel);
47
+ }
48
+ /**
49
+ * Detach all event listeners.
50
+ */
51
+ detach() {
52
+ const root = this.config.shadowRoot;
53
+ root.removeEventListener('mousedown', this.boundHandleMouseDown);
54
+ document.removeEventListener('mousemove', this.boundHandleMouseMove);
55
+ document.removeEventListener('mouseup', this.boundHandleMouseUp);
56
+ root.removeEventListener('click', this.boundHandleClick);
57
+ root.removeEventListener('dblclick', this.boundHandleDblClick);
58
+ root.removeEventListener('touchstart', this.boundHandleTouchStart);
59
+ root.removeEventListener('touchmove', this.boundHandleTouchMove);
60
+ root.removeEventListener('touchend', this.boundHandleTouchEnd);
61
+ root.removeEventListener('touchcancel', this.boundHandleTouchCancel);
62
+ this.cancelTouchHold();
63
+ }
64
+ /**
65
+ * Check if in touch drag mode.
66
+ */
67
+ isInTouchDragMode() {
68
+ return this.isTouchDragMode;
69
+ }
70
+ /**
71
+ * Analyze pointer target to determine what was clicked.
72
+ */
73
+ analyzeTarget(element) {
74
+ // Check for resize handle first
75
+ const resizeHandle = element.closest('.resize-handle');
76
+ if (resizeHandle) {
77
+ const eventEl = resizeHandle.closest('.scheduler-event');
78
+ const eventId = eventEl === null || eventEl === void 0 ? void 0 : eventEl.dataset['eventId'];
79
+ const event = eventId ? this.config.getEventById(eventId) : null;
80
+ if (event) {
81
+ return {
82
+ type: 'resize-handle',
83
+ event,
84
+ resizeHandle: resizeHandle.dataset['handle'],
85
+ };
86
+ }
87
+ }
88
+ // Check for event
89
+ const eventEl = element.closest('.scheduler-event:not(.preview)');
90
+ if (eventEl) {
91
+ const eventId = eventEl.dataset['eventId'];
92
+ const event = eventId ? this.config.getEventById(eventId) : null;
93
+ if (event) {
94
+ return { type: 'event', event };
95
+ }
96
+ }
97
+ // Check for slot
98
+ const slotEl = element.closest('.scheduler-time-slot, .scheduler-timeline-slot');
99
+ if (slotEl) {
100
+ return { type: 'slot', slotElement: slotEl };
101
+ }
102
+ return { type: 'none' };
103
+ }
104
+ // Mouse event handlers
105
+ handleMouseDown(e) {
106
+ if (!this.config.isEditable())
107
+ return;
108
+ const pointer = normalizeMouseEvent(e);
109
+ const target = this.analyzeTarget(pointer.target);
110
+ // Only handle drag-initiating targets
111
+ if (target.type === 'none')
112
+ return;
113
+ // Check if selectable for slots
114
+ if (target.type === 'slot' && !this.config.isSelectable())
115
+ return;
116
+ e.preventDefault();
117
+ this.callbacks.onPointerDown(pointer, target);
118
+ }
119
+ handleMouseMove(e) {
120
+ const pointer = normalizeMouseEvent(e);
121
+ this.callbacks.onPointerMove(pointer);
122
+ }
123
+ handleMouseUp(e) {
124
+ const pointer = normalizeMouseEvent(e);
125
+ this.callbacks.onPointerUp(pointer);
126
+ }
127
+ handleClick(e) {
128
+ const pointer = normalizeMouseEvent(e);
129
+ const target = this.analyzeTarget(pointer.target);
130
+ // Skip event clicks - handled by drag manager
131
+ if (target.type === 'event' || target.type === 'resize-handle') {
132
+ return;
133
+ }
134
+ this.callbacks.onClick(pointer, target);
135
+ }
136
+ handleDblClick(e) {
137
+ const pointer = normalizeMouseEvent(e);
138
+ const target = this.analyzeTarget(pointer.target);
139
+ this.callbacks.onDoubleClick(pointer, target);
140
+ }
141
+ // Touch event handlers
142
+ handleTouchStart(e) {
143
+ var _a;
144
+ if (!this.config.isEditable())
145
+ return;
146
+ // Only handle single touch
147
+ if (e.touches.length !== 1) {
148
+ this.cancelTouchHold();
149
+ return;
150
+ }
151
+ const pointer = normalizeTouchEvent(e);
152
+ if (!pointer)
153
+ return;
154
+ const target = this.analyzeTarget(pointer.target);
155
+ // Only handle drag-initiating targets
156
+ if (target.type === 'none')
157
+ return;
158
+ if (target.type === 'slot' && !this.config.isSelectable())
159
+ return;
160
+ this.touchStartPosition = { x: pointer.clientX, y: pointer.clientY };
161
+ this.touchHoldTarget = pointer.target;
162
+ this.touchHoldPointer = pointer;
163
+ // Add element-level listeners IMMEDIATELY for ALL drag-initiating touches
164
+ // CRITICAL: Use e.target (the actual touched element) not pointer.target
165
+ // In shadow DOM, touch.target and e.target can differ due to event retargeting.
166
+ // Only the listener on e.target will continue to receive events after DOM replacement
167
+ // (e.g., when Lit re-renders and replaces the element due to visual feedback classes).
168
+ const self = this;
169
+ const touchedElement = e.target;
170
+ // Add listener directly to the touched element - this is the ONLY listener
171
+ // that will work after the element is replaced during re-render
172
+ touchedElement.addEventListener('touchmove', function (evt) {
173
+ self.handleTouchMove(evt);
174
+ }, { passive: false });
175
+ touchedElement.addEventListener('touchend', function (evt) {
176
+ self.handleTouchEnd(evt);
177
+ });
178
+ touchedElement.addEventListener('touchcancel', function (evt) {
179
+ self.handleTouchCancel(evt);
180
+ });
181
+ // Add visual feedback
182
+ this.addTouchFeedback(pointer.target, 'pending');
183
+ // Start hold timer
184
+ const holdDuration = (_a = this.config.touchHoldDuration) !== null && _a !== void 0 ? _a : DEFAULT_TOUCH_HOLD_DURATION;
185
+ this.touchHoldTimer = setTimeout(() => {
186
+ this.activateTouchDragMode(pointer, target);
187
+ }, holdDuration);
188
+ }
189
+ handleTouchMove(e) {
190
+ var _a;
191
+ if (e.touches.length !== 1) {
192
+ this.cancelTouchHold();
193
+ return;
194
+ }
195
+ const pointer = normalizeTouchEvent(e);
196
+ if (!pointer)
197
+ return;
198
+ // If we have a pending touch hold, check if user moved too much
199
+ if (this.touchHoldTimer && this.touchStartPosition) {
200
+ const threshold = (_a = this.config.touchMoveThreshold) !== null && _a !== void 0 ? _a : DEFAULT_TOUCH_MOVE_THRESHOLD;
201
+ const distance = getPointerDistance(this.touchStartPosition, {
202
+ x: pointer.clientX,
203
+ y: pointer.clientY,
204
+ });
205
+ if (distance > threshold) {
206
+ // User moved too much, cancel hold and allow scroll
207
+ this.cancelTouchHold();
208
+ return;
209
+ }
210
+ // Still waiting for hold - prevent scroll while waiting
211
+ // This is critical: we must prevent the browser from starting scroll
212
+ // intervention during the hold period, otherwise it will take over
213
+ // and subsequent touchmove events become non-cancelable
214
+ e.preventDefault();
215
+ return;
216
+ }
217
+ // If in touch drag mode, handle the drag
218
+ if (this.isTouchDragMode) {
219
+ e.preventDefault();
220
+ this.callbacks.onPointerMove(pointer);
221
+ }
222
+ }
223
+ handleTouchEnd(e) {
224
+ const pointer = normalizeTouchEvent(e);
225
+ // If we had a pending hold that never activated, treat as tap
226
+ if (this.touchHoldTimer) {
227
+ this.cancelTouchHold();
228
+ if (pointer && this.touchHoldTarget) {
229
+ const target = this.analyzeTarget(this.touchHoldTarget);
230
+ this.callbacks.onClick(pointer, target);
231
+ }
232
+ this.touchHoldTarget = null;
233
+ this.touchHoldPointer = null;
234
+ return;
235
+ }
236
+ // If in touch drag mode, finalize
237
+ if (this.isTouchDragMode && pointer) {
238
+ this.callbacks.onPointerUp(pointer);
239
+ this.exitTouchDragMode();
240
+ }
241
+ }
242
+ handleTouchCancel(_e) {
243
+ var _a;
244
+ this.cancelTouchHold();
245
+ if (this.isTouchDragMode) {
246
+ // Notify pointer up to cancel the drag
247
+ if (this.touchStartPosition) {
248
+ this.callbacks.onPointerUp({
249
+ pointerId: 0,
250
+ pointerType: 'touch',
251
+ clientX: this.touchStartPosition.x,
252
+ clientY: this.touchStartPosition.y,
253
+ originalEvent: _e,
254
+ target: (_a = this.touchHoldTarget) !== null && _a !== void 0 ? _a : document.body,
255
+ isPrimary: true,
256
+ });
257
+ }
258
+ this.exitTouchDragMode();
259
+ }
260
+ }
261
+ // Touch helpers
262
+ activateTouchDragMode(pointer, target) {
263
+ var _a, _b, _c;
264
+ this.touchHoldTimer = null;
265
+ this.touchStartPosition = null; // Clear so touchmove doesn't think we're still pending
266
+ // Trigger haptic feedback
267
+ this.triggerHapticFeedback();
268
+ // Enter touch drag mode
269
+ this.isTouchDragMode = true;
270
+ // Document listeners were already added in handleTouchStart for event touches
271
+ // For slot touches, add them now
272
+ if (!((_a = this.touchHoldTarget) === null || _a === void 0 ? void 0 : _a.closest('.scheduler-event'))) {
273
+ document.addEventListener('touchmove', this.boundHandleTouchMove, { passive: false });
274
+ document.addEventListener('touchend', this.boundHandleTouchEnd);
275
+ document.addEventListener('touchcancel', this.boundHandleTouchCancel);
276
+ }
277
+ // Update visual feedback
278
+ if (this.touchHoldTarget) {
279
+ this.removeTouchFeedback(this.touchHoldTarget, 'pending');
280
+ this.addTouchFeedback(this.touchHoldTarget, 'active');
281
+ }
282
+ // Add container class
283
+ const container = this.config.shadowRoot.querySelector('.scheduler-container');
284
+ container === null || container === void 0 ? void 0 : container.classList.add('touch-drag-mode');
285
+ // Notify callback
286
+ (_c = (_b = this.callbacks).onTouchDragActivated) === null || _c === void 0 ? void 0 : _c.call(_b);
287
+ // Start the drag immediately (skip pending threshold for touch)
288
+ this.callbacks.onPointerDown(pointer, target, true);
289
+ }
290
+ cancelTouchHold() {
291
+ if (this.touchHoldTimer) {
292
+ clearTimeout(this.touchHoldTimer);
293
+ this.touchHoldTimer = null;
294
+ }
295
+ // Remove document listeners that were added in handleTouchStart
296
+ document.removeEventListener('touchmove', this.boundHandleTouchMove);
297
+ document.removeEventListener('touchend', this.boundHandleTouchEnd);
298
+ document.removeEventListener('touchcancel', this.boundHandleTouchCancel);
299
+ // Remove pending visual feedback
300
+ if (this.touchHoldTarget) {
301
+ this.removeTouchFeedback(this.touchHoldTarget, 'pending');
302
+ this.removeTouchFeedback(this.touchHoldTarget, 'active');
303
+ }
304
+ this.touchStartPosition = null;
305
+ }
306
+ exitTouchDragMode() {
307
+ var _a, _b;
308
+ this.isTouchDragMode = false;
309
+ this.touchStartPosition = null;
310
+ this.touchHoldTarget = null;
311
+ this.touchHoldPointer = null;
312
+ // Remove document-level listeners added during drag mode
313
+ document.removeEventListener('touchmove', this.boundHandleTouchMove);
314
+ document.removeEventListener('touchend', this.boundHandleTouchEnd);
315
+ document.removeEventListener('touchcancel', this.boundHandleTouchCancel);
316
+ // Remove container class
317
+ const container = this.config.shadowRoot.querySelector('.scheduler-container');
318
+ container === null || container === void 0 ? void 0 : container.classList.remove('touch-drag-mode');
319
+ // Remove all feedback classes
320
+ this.config.shadowRoot
321
+ .querySelectorAll('.touch-hold-active, .touch-hold-pending')
322
+ .forEach((el) => {
323
+ el.classList.remove('touch-hold-active', 'touch-hold-pending');
324
+ });
325
+ // Notify callback
326
+ (_b = (_a = this.callbacks).onTouchDragDeactivated) === null || _b === void 0 ? void 0 : _b.call(_a);
327
+ }
328
+ addTouchFeedback(element, type) {
329
+ const targetEl = element.closest('.scheduler-event, .scheduler-time-slot, .scheduler-timeline-slot');
330
+ targetEl === null || targetEl === void 0 ? void 0 : targetEl.classList.add(`touch-hold-${type}`);
331
+ }
332
+ removeTouchFeedback(element, type) {
333
+ const targetEl = element.closest('.scheduler-event, .scheduler-time-slot, .scheduler-timeline-slot');
334
+ targetEl === null || targetEl === void 0 ? void 0 : targetEl.classList.remove(`touch-hold-${type}`);
335
+ }
336
+ triggerHapticFeedback() {
337
+ // Vibration API removed - can cause issues on some devices
338
+ }
339
+ }
340
+ //# sourceMappingURL=input-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-handler.js","sourceRoot":"","sources":["../../../../../libs/mp-scheduler-wc/src/input/input-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Normalized pointer event that abstracts mouse vs touch.
3
+ * Provides a single interface for all pointer-based interactions.
4
+ */
5
+ export interface NormalizedPointerEvent {
6
+ /** Unique identifier for this pointer (0 for mouse, touch.identifier for touch) */
7
+ pointerId: number;
8
+ /** Type of pointer: 'mouse' or 'touch' */
9
+ pointerType: 'mouse' | 'touch';
10
+ /** Client X coordinate */
11
+ clientX: number;
12
+ /** Client Y coordinate */
13
+ clientY: number;
14
+ /** The original DOM event */
15
+ originalEvent: MouseEvent | TouchEvent;
16
+ /** Target element at pointer position */
17
+ target: HTMLElement;
18
+ /** Whether this is the primary pointer */
19
+ isPrimary: boolean;
20
+ }
21
+ /**
22
+ * Create a normalized pointer event from a mouse event.
23
+ */
24
+ export declare function normalizeMouseEvent(event: MouseEvent): NormalizedPointerEvent;
25
+ /**
26
+ * Create a normalized pointer event from a touch event.
27
+ * Returns the first touch, or null if no touches.
28
+ */
29
+ export declare function normalizeTouchEvent(event: TouchEvent): NormalizedPointerEvent | null;
30
+ /**
31
+ * Calculate distance between two positions.
32
+ */
33
+ export declare function getPointerDistance(pos1: {
34
+ x: number;
35
+ y: number;
36
+ }, pos2: {
37
+ x: number;
38
+ y: number;
39
+ }): number;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Create a normalized pointer event from a mouse event.
3
+ */
4
+ export function normalizeMouseEvent(event) {
5
+ return {
6
+ pointerId: 0,
7
+ pointerType: 'mouse',
8
+ clientX: event.clientX,
9
+ clientY: event.clientY,
10
+ originalEvent: event,
11
+ target: event.target,
12
+ isPrimary: true,
13
+ };
14
+ }
15
+ /**
16
+ * Create a normalized pointer event from a touch event.
17
+ * Returns the first touch, or null if no touches.
18
+ */
19
+ export function normalizeTouchEvent(event) {
20
+ const touch = event.touches[0] || event.changedTouches[0];
21
+ if (!touch)
22
+ return null;
23
+ return {
24
+ pointerId: touch.identifier,
25
+ pointerType: 'touch',
26
+ clientX: touch.clientX,
27
+ clientY: touch.clientY,
28
+ originalEvent: event,
29
+ target: touch.target,
30
+ isPrimary: touch.identifier === 0,
31
+ };
32
+ }
33
+ /**
34
+ * Calculate distance between two positions.
35
+ */
36
+ export function getPointerDistance(pos1, pos2) {
37
+ const dx = pos2.x - pos1.x;
38
+ const dy = pos2.y - pos1.y;
39
+ return Math.sqrt(dx * dx + dy * dy);
40
+ }
41
+ //# sourceMappingURL=pointer-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pointer-event.js","sourceRoot":"","sources":["../../../../../libs/mp-scheduler-wc/src/input/pointer-event.ts"],"names":[],"mappings":"AAqBA;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAiB;IACnD,OAAO;QACL,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,OAAO;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,aAAa,EAAE,KAAK;QACpB,MAAM,EAAE,KAAK,CAAC,MAAqB;QACnC,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAiB;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,UAAU;QAC3B,WAAW,EAAE,OAAO;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,aAAa,EAAE,KAAK;QACpB,MAAM,EAAE,KAAK,CAAC,MAAqB;QACnC,SAAS,EAAE,KAAK,CAAC,UAAU,KAAK,CAAC;KAClC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAA8B,EAC9B,IAA8B;IAE9B,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AACtC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Scheduler CSS styles as a template literal
3
3
  */
4
- export declare const schedulerStyles = "\n :host {\n display: block;\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 .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 }\n\n .scheduler-container.touch-drag-mode .scheduler-content {\n overflow: hidden;\n }\n\n .scheduler-event.touch-hold-pending {\n animation: touch-hold-pulse 0.5s ease-in-out;\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 }\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% { opacity: 1; }\n 50% { opacity: 0.7; }\n 100% { opacity: 1; }\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 }\n";
4
+ export declare const schedulerStyles = "\n :host {\n display: block;\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% { opacity: 1; }\n 50% { opacity: 0.7; }\n 100% { opacity: 1; }\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 }\n";
5
5
  export default schedulerStyles;
@@ -234,6 +234,12 @@ export const schedulerStyles = `
234
234
  border-left: 3px solid rgba(0, 0, 0, 0.2);
235
235
  }
236
236
 
237
+ /* Prevent browser from handling touch gestures on events (enables drag) */
238
+ .scheduler-event:not(.preview) {
239
+ touch-action: none;
240
+ -ms-touch-action: none;
241
+ }
242
+
237
243
  .scheduler-event:hover {
238
244
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
239
245
  }
@@ -564,20 +570,28 @@ export const schedulerStyles = `
564
570
  cursor: grabbing;
565
571
  user-select: none;
566
572
  -webkit-user-select: none;
573
+ touch-action: none;
574
+ -ms-touch-action: none;
567
575
  }
568
576
 
569
577
  .scheduler-container.touch-drag-mode .scheduler-content {
570
578
  overflow: hidden;
579
+ touch-action: none;
580
+ -ms-touch-action: none;
571
581
  }
572
582
 
573
583
  .scheduler-event.touch-hold-pending {
574
584
  animation: touch-hold-pulse 0.5s ease-in-out;
585
+ touch-action: none;
586
+ -ms-touch-action: none;
575
587
  }
576
588
 
577
589
  .scheduler-event.touch-hold-active {
578
590
  transform: scale(1.02);
579
591
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
580
592
  z-index: 100;
593
+ touch-action: none;
594
+ -ms-touch-action: none;
581
595
  }
582
596
 
583
597
  .scheduler-time-slot.touch-hold-pending,
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.styles.js","sourceRoot":"","sources":["../../../../../libs/mp-scheduler-wc/src/styles/scheduler.styles.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqmB9B,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"scheduler.styles.js","sourceRoot":"","sources":["../../../../../libs/mp-scheduler-wc/src/styles/scheduler.styles.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmnB9B,CAAC;AAEF,eAAe,eAAe,CAAC"}