@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;IAmDpC,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,kBAAkB;YAOZ,mBAAmB;IA6DjC;;;;OAIG;YACW,kBAAkB;IAkDhC,OAAO,CAAC,wBAAwB;YAclB,qBAAqB;YAmDrB,qBAAqB;IAI5B,QAAQ,IAAI,OAAO;IAInB,gBAAgB,IAAI,iBAAiB,GAAG,IAAI;IAI5C,mBAAmB,IAAI,MAAM,GAAG,IAAI;IAIpC,mBAAmB,IAAI,MAAM,GAAG,IAAI;IAIpC,wBAAwB,IAAI,MAAM,GAAG,IAAI;IAKzC,aAAa,IAAI,IAAI;IAKrB,eAAe,IAAI,IAAI;IAIvB,UAAU,IAAI,IAAI;IAMzB,OAAO,CAAC,OAAO;IAcR,OAAO,IAAI,IAAI;IAUtB,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,wBAAwB;IAchC,OAAO,CAAC,uBAAuB;CAOhC"}
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
- document.addEventListener(eventType, listener, { passive: true });
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",
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",