@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.
- package/package.json +1 -1
- package/src/components/mp-scheduler.d.ts +16 -41
- package/src/components/mp-scheduler.js +126 -575
- package/src/components/mp-scheduler.js.map +1 -1
- package/src/drag/drag-manager.d.ts +90 -0
- package/src/drag/drag-manager.js +201 -0
- package/src/drag/drag-manager.js.map +1 -0
- package/src/drag/drag-preview.d.ts +42 -0
- package/src/drag/drag-preview.js +87 -0
- package/src/drag/drag-preview.js.map +1 -0
- package/src/drag/drag-state-machine.d.ts +102 -0
- package/src/drag/drag-state-machine.js +320 -0
- package/src/drag/drag-state-machine.js.map +1 -0
- package/src/drag/drag-types.d.ts +104 -0
- package/src/drag/drag-types.js +8 -0
- package/src/drag/drag-types.js.map +1 -0
- package/src/drag/index.d.ts +4 -0
- package/src/drag/index.js +5 -0
- package/src/drag/index.js.map +1 -0
- package/src/events/event-types.d.ts +43 -0
- package/src/events/event-types.js +2 -0
- package/src/events/event-types.js.map +1 -0
- package/src/events/index.d.ts +2 -0
- package/src/events/index.js +3 -0
- package/src/events/index.js.map +1 -0
- package/src/events/scheduler-event-emitter.d.ts +46 -0
- package/src/events/scheduler-event-emitter.js +70 -0
- package/src/events/scheduler-event-emitter.js.map +1 -0
- package/src/input/index.d.ts +2 -0
- package/src/input/index.js +3 -0
- package/src/input/index.js.map +1 -0
- package/src/input/input-handler.d.ts +93 -0
- package/src/input/input-handler.js +340 -0
- package/src/input/input-handler.js.map +1 -0
- package/src/input/pointer-event.d.ts +39 -0
- package/src/input/pointer-event.js +41 -0
- package/src/input/pointer-event.js.map +1 -0
- package/src/styles/scheduler.styles.d.ts +1 -1
- package/src/styles/scheduler.styles.js +14 -0
- 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
|
|
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"}
|