@hawsen-the-first/interactiv 0.0.3 → 0.0.4
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.
|
@@ -32,7 +32,10 @@ export declare class ScreensaverManager {
|
|
|
32
32
|
private lastScreensaverViewId;
|
|
33
33
|
private lastActivityResetTime;
|
|
34
34
|
private globalListeners;
|
|
35
|
+
private interactionShieldActive;
|
|
36
|
+
private shieldRemovalTimer;
|
|
35
37
|
private readonly DEBOUNCE_INTERVAL;
|
|
38
|
+
private readonly SHIELD_DURATION;
|
|
36
39
|
private readonly DEFAULT_ACTIVITY_EVENTS;
|
|
37
40
|
constructor(orchestrator: EventOrchestrator, navigationManager: NavigationManager);
|
|
38
41
|
private initializeGlobalState;
|
|
@@ -69,5 +72,15 @@ export declare class ScreensaverManager {
|
|
|
69
72
|
private checkAndPerformReboot;
|
|
70
73
|
private startRebootCheckInterval;
|
|
71
74
|
private stopRebootCheckInterval;
|
|
75
|
+
/**
|
|
76
|
+
* Activates the interaction shield to block follow-up events from the same gesture
|
|
77
|
+
* that dismissed the screensaver. This prevents touch events from bleeding through
|
|
78
|
+
* to elements on the home page.
|
|
79
|
+
*/
|
|
80
|
+
private activateInteractionShield;
|
|
81
|
+
/**
|
|
82
|
+
* Deactivates the interaction shield, allowing normal event processing to resume.
|
|
83
|
+
*/
|
|
84
|
+
private deactivateInteractionShield;
|
|
72
85
|
}
|
|
73
86
|
//# sourceMappingURL=screensaverManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screensaverManager.d.ts","sourceRoot":"","sources":["../../src/screensaverManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAM/E,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAC;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,YAAY,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,mBAAmB,CAAkB;IAC7C,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,eAAe,CAIf;IAGR,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;IAG1C,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAStC;gBAEU,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB;IASjF,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,mBAAmB;IAyCpB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAyC3D,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,cAAc;IAkCtB,OAAO,CAAC,4BAA4B;
|
|
1
|
+
{"version":3,"file":"screensaverManager.d.ts","sourceRoot":"","sources":["../../src/screensaverManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,8 +14,13 @@ export class ScreensaverManager {
|
|
|
14
14
|
lastScreensaverViewId = null;
|
|
15
15
|
lastActivityResetTime = null;
|
|
16
16
|
globalListeners = [];
|
|
17
|
+
// Interaction shield state
|
|
18
|
+
interactionShieldActive = false;
|
|
19
|
+
shieldRemovalTimer = null;
|
|
17
20
|
// Debounce interval for activity timer resets (in milliseconds)
|
|
18
21
|
DEBOUNCE_INTERVAL = 1000;
|
|
22
|
+
// Shield duration to block follow-up events from the same gesture (in milliseconds)
|
|
23
|
+
SHIELD_DURATION = 400;
|
|
19
24
|
// Default activity events to monitor
|
|
20
25
|
DEFAULT_ACTIVITY_EVENTS = [
|
|
21
26
|
"mousemove",
|
|
@@ -156,6 +161,13 @@ export class ScreensaverManager {
|
|
|
156
161
|
if (!this.config)
|
|
157
162
|
return;
|
|
158
163
|
const activityHandler = (event) => {
|
|
164
|
+
// Block all events if interaction shield is active
|
|
165
|
+
if (this.interactionShieldActive) {
|
|
166
|
+
event.stopPropagation();
|
|
167
|
+
event.preventDefault();
|
|
168
|
+
log.trace(`Interaction shield blocked ${event.type} event`);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
159
171
|
// Check if event should be ignored based on excludeSelectors
|
|
160
172
|
if (this.shouldIgnoreActivity(event)) {
|
|
161
173
|
return;
|
|
@@ -174,9 +186,14 @@ export class ScreensaverManager {
|
|
|
174
186
|
}
|
|
175
187
|
};
|
|
176
188
|
// Add listeners to document for global coverage
|
|
189
|
+
// Use non-passive listeners for click and touch events to allow preventDefault()
|
|
177
190
|
this.config.activityEvents.forEach((eventType) => {
|
|
178
191
|
const listener = activityHandler.bind(this);
|
|
179
|
-
|
|
192
|
+
const usePassive = !["click", "touchstart", "touchend"].includes(eventType);
|
|
193
|
+
document.addEventListener(eventType, listener, {
|
|
194
|
+
passive: usePassive,
|
|
195
|
+
capture: true // Use capture phase to intercept events before they reach targets
|
|
196
|
+
});
|
|
180
197
|
this.globalListeners.push({
|
|
181
198
|
element: document,
|
|
182
199
|
type: eventType,
|
|
@@ -356,6 +373,8 @@ export class ScreensaverManager {
|
|
|
356
373
|
if (!this.config || !this.isScreensaverActive)
|
|
357
374
|
return;
|
|
358
375
|
log.trace(`Exiting screensaver with '${this.config.exitBehavior}' behavior`);
|
|
376
|
+
// Activate interaction shield to block follow-up events from the same gesture
|
|
377
|
+
this.activateInteractionShield();
|
|
359
378
|
// Stop the reboot check interval
|
|
360
379
|
this.stopRebootCheckInterval();
|
|
361
380
|
if (this.config.deactivateCallback)
|
|
@@ -432,6 +451,7 @@ export class ScreensaverManager {
|
|
|
432
451
|
cleanup() {
|
|
433
452
|
this.clearActivityTimer();
|
|
434
453
|
this.stopRebootCheckInterval();
|
|
454
|
+
this.deactivateInteractionShield();
|
|
435
455
|
// Remove all global event listeners
|
|
436
456
|
this.globalListeners.forEach(({ element, type, listener }) => {
|
|
437
457
|
element.removeEventListener(type, listener);
|
|
@@ -490,4 +510,34 @@ export class ScreensaverManager {
|
|
|
490
510
|
log.trace("Reboot check interval stopped");
|
|
491
511
|
}
|
|
492
512
|
}
|
|
513
|
+
// Interaction shield methods
|
|
514
|
+
/**
|
|
515
|
+
* Activates the interaction shield to block follow-up events from the same gesture
|
|
516
|
+
* that dismissed the screensaver. This prevents touch events from bleeding through
|
|
517
|
+
* to elements on the home page.
|
|
518
|
+
*/
|
|
519
|
+
activateInteractionShield() {
|
|
520
|
+
// Clear any existing shield timer
|
|
521
|
+
if (this.shieldRemovalTimer !== null) {
|
|
522
|
+
clearTimeout(this.shieldRemovalTimer);
|
|
523
|
+
this.shieldRemovalTimer = null;
|
|
524
|
+
}
|
|
525
|
+
this.interactionShieldActive = true;
|
|
526
|
+
log.trace("Interaction shield activated");
|
|
527
|
+
// Automatically deactivate shield after the gesture completes
|
|
528
|
+
this.shieldRemovalTimer = window.setTimeout(() => {
|
|
529
|
+
this.deactivateInteractionShield();
|
|
530
|
+
}, this.SHIELD_DURATION);
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Deactivates the interaction shield, allowing normal event processing to resume.
|
|
534
|
+
*/
|
|
535
|
+
deactivateInteractionShield() {
|
|
536
|
+
if (this.shieldRemovalTimer !== null) {
|
|
537
|
+
clearTimeout(this.shieldRemovalTimer);
|
|
538
|
+
this.shieldRemovalTimer = null;
|
|
539
|
+
}
|
|
540
|
+
this.interactionShieldActive = false;
|
|
541
|
+
log.trace("Interaction shield deactivated");
|
|
542
|
+
}
|
|
493
543
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hawsen-the-first/interactiv",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "A TypeScript framework for building interactive applications with event management, state management, navigation, and screensaver functionality",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|