@hawsen-the-first/interactiv 0.0.1 → 0.0.2

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/README.md CHANGED
@@ -253,6 +253,65 @@ eventManager.drag(".draggable", {
253
253
  });
254
254
  ```
255
255
 
256
+ ### Screensaver Manager
257
+
258
+ The screensaver manager monitors user activity and triggers actions after a configurable timeout period. It supports two modes:
259
+
260
+ #### Standard Screensaver Mode
261
+
262
+ Navigate to a dedicated screensaver page after inactivity. User activity exits the screensaver and returns to the previous or starting page.
263
+
264
+ ```typescript
265
+ // Create a screensaver page with views
266
+ const screensaverPage = new Page("screensaver-page", orchestrator, false);
267
+ const screensaverView = new View("screensaver-view", orchestrator, false,
268
+ html`<div class="screensaver">...</div>`,
269
+ css`.screensaver { /* styles */ }`
270
+ );
271
+ screensaverPage.addView(screensaverView);
272
+
273
+ // Add screensaver with standard behavior
274
+ app.addScreensaver(screensaverPage, {
275
+ timeoutSeconds: 30,
276
+ defaultViewId: "screensaver-view",
277
+ exitBehavior: "return", // Return to where the user was before
278
+ transitionConfig: { type: "fade", duration: 500 },
279
+ });
280
+ ```
281
+
282
+ #### Return-to-Home Mode
283
+
284
+ Instead of showing a screensaver, navigate back to a specified home page/view after inactivity. No screensaver page is needed — the app simply redirects to the home screen. The screensaver never enters an "active" state, so user activity just resets the inactivity timer.
285
+
286
+ ```typescript
287
+ // No screensaver page needed — pass null
288
+ app.addScreensaver(null, {
289
+ timeoutSeconds: 60,
290
+ screensaverViewBehavior: "returnHome",
291
+ startingPageId: "home-page", // The home page to navigate to
292
+ defaultViewId: "home-view", // Optional: the home view to show
293
+ transitionConfig: { type: "fade", duration: 500 },
294
+ });
295
+ ```
296
+
297
+ #### Configuration Options
298
+
299
+ | Option | Type | Description |
300
+ |--------|------|-------------|
301
+ | `timeoutSeconds` | `number` | Seconds of inactivity before activation |
302
+ | `page` | `Page` | Screensaver page (required unless using `returnHome`) |
303
+ | `screensaverViewBehavior` | `"default" \| "specific" \| "return" \| "returnHome"` | How to handle the view on activation |
304
+ | `defaultViewId` | `string` | Default view to show (or home view for `returnHome`) |
305
+ | `exitBehavior` | `"reset" \| "return"` | Where to go when exiting the screensaver |
306
+ | `startingPageId` | `string` | Page to navigate to on exit/reset (or home page for `returnHome`) |
307
+ | `startingViewId` | `string` | View within the starting page on exit |
308
+ | `transitionConfig` | `TransitionConfig` | Transition animation configuration |
309
+ | `activateCallback` | `() => void` | Called when screensaver activates or returns home |
310
+ | `deactivateCallback` | `() => void` | Called when screensaver deactivates |
311
+ | `blockerCallback` | `() => boolean` | Return `true` to prevent activation |
312
+ | `rebootTimeout` | `number \| null` | Minutes before triggering a reboot callback |
313
+ | `rebootCallback` | `() => void` | Called when reboot timeout elapses |
314
+
256
315
  ### Settings Manager
257
316
 
258
317
  Create hidden settings pages with corner touch activation. See [SETTINGS_MANAGER.md](./SETTINGS_MANAGER.md) for detailed documentation.
package/dist/index.js CHANGED
@@ -10,6 +10,7 @@ import { Logger } from "./utils/logger";
10
10
  import { useAnimations, AnimationManager } from "./src/animationBus";
11
11
  import { configureLogger } from "./src/logger";
12
12
  import { GarbageCollector, createGarbageCollector, } from "./src/garbageCollector";
13
+ 5;
13
14
  export { createOrchestrator, EventOrchestrator, EventBus, AppBuilder, Page, View, Component, NavigationManager, ScreensaverManager, SettingsManager, EventManager, AnimationManager,
14
15
  // External State Management
15
16
  stateManager, getGlobalState, setGlobalState, subscribeToGlobalState, useGlobalStateExternal, useAnimations, ExternalStateManager, ComponentStateManager,
@@ -128,11 +128,13 @@ declare class AppBuilder extends RenderableComponent {
128
128
  isTransitioning(): boolean;
129
129
  /**
130
130
  * Add a screensaver page with the specified configuration
131
- * The screensaver page can contain multiple views for rich interactive experiences
132
- * @param screensaverPage The page to use as the screensaver (can contain multiple views)
131
+ * The screensaver page can contain multiple views for rich interactive experiences.
132
+ * Pass `null` for screensaverPage when using `screensaverViewBehavior: "returnHome"` mode,
133
+ * which navigates back to a home page/view on timeout instead of showing a screensaver.
134
+ * @param screensaverPage The page to use as the screensaver (can contain multiple views), or null for returnHome mode
133
135
  * @param config Configuration object for the screensaver (excluding 'page' property)
134
136
  */
135
- addScreensaver(screensaverPage: Page, config: Omit<ScreensaverConfig, 'page'>): void;
137
+ addScreensaver(screensaverPage: Page | null, config: Omit<ScreensaverConfig, 'page'>): void;
136
138
  attachToDom(): void;
137
139
  }
138
140
  declare class Page extends RenderableComponent {
@@ -143,11 +145,13 @@ declare class Page extends RenderableComponent {
143
145
  addView(view: View): void;
144
146
  removeView(viewId: string): void;
145
147
  /**
146
- * Add a screensaver page with the specified configuration
147
- * @param screensaverPage The page to use as the screensaver (can contain multiple views)
148
+ * Add a screensaver page with the specified configuration.
149
+ * Pass `null` for screensaverPage when using `screensaverViewBehavior: "returnHome"` mode,
150
+ * which navigates back to a home page/view on timeout instead of showing a screensaver.
151
+ * @param screensaverPage The page to use as the screensaver (can contain multiple views), or null for returnHome mode
148
152
  * @param config Configuration object for the screensaver (excluding 'page' property)
149
153
  */
150
- addScreensaver(screensaverPage: Page, config: Omit<ScreensaverConfig, 'page'>): void;
154
+ addScreensaver(screensaverPage: Page | null, config: Omit<ScreensaverConfig, 'page'>): void;
151
155
  /**
152
156
  * Add a hidden settings page to this page with the specified configuration
153
157
  * The settings page is activated by touching corners in sequence: top-left, top-right, bottom-right
@@ -1 +1 @@
1
- {"version":3,"file":"appBuilder.d.ts","sourceRoot":"","sources":["../../src/appBuilder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"appBuilder.d.ts","sourceRoot":"","sources":["../../src/appBuilder.ts"],"names":[],"mappings":"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"}
@@ -499,20 +499,24 @@ class AppBuilder extends RenderableComponent {
499
499
  }
500
500
  /**
501
501
  * Add a screensaver page with the specified configuration
502
- * The screensaver page can contain multiple views for rich interactive experiences
503
- * @param screensaverPage The page to use as the screensaver (can contain multiple views)
502
+ * The screensaver page can contain multiple views for rich interactive experiences.
503
+ * Pass `null` for screensaverPage when using `screensaverViewBehavior: "returnHome"` mode,
504
+ * which navigates back to a home page/view on timeout instead of showing a screensaver.
505
+ * @param screensaverPage The page to use as the screensaver (can contain multiple views), or null for returnHome mode
504
506
  * @param config Configuration object for the screensaver (excluding 'page' property)
505
507
  */
506
508
  addScreensaver(screensaverPage, config) {
507
- // Add the screensaver page to the app
508
- this.addPage(screensaverPage);
509
+ // Add the screensaver page to the app (only if provided)
510
+ if (screensaverPage) {
511
+ this.addPage(screensaverPage);
512
+ }
509
513
  // Register the screensaver with the screensaver manager via event bus
510
514
  const screensaverBus = this.orchestrator.getEventBus("screensaver-manager");
511
515
  if (screensaverBus) {
512
516
  screensaverBus.emit("register-screensaver", {
513
517
  config: {
514
518
  ...config,
515
- page: screensaverPage,
519
+ page: screensaverPage || undefined,
516
520
  },
517
521
  });
518
522
  }
@@ -644,8 +648,10 @@ class Page extends RenderableComponent {
644
648
  }
645
649
  }
646
650
  /**
647
- * Add a screensaver page with the specified configuration
648
- * @param screensaverPage The page to use as the screensaver (can contain multiple views)
651
+ * Add a screensaver page with the specified configuration.
652
+ * Pass `null` for screensaverPage when using `screensaverViewBehavior: "returnHome"` mode,
653
+ * which navigates back to a home page/view on timeout instead of showing a screensaver.
654
+ * @param screensaverPage The page to use as the screensaver (can contain multiple views), or null for returnHome mode
649
655
  * @param config Configuration object for the screensaver (excluding 'page' property)
650
656
  */
651
657
  addScreensaver(screensaverPage, config) {
@@ -655,7 +661,7 @@ class Page extends RenderableComponent {
655
661
  screensaverBus.emit("register-screensaver", {
656
662
  config: {
657
663
  ...config,
658
- page: screensaverPage,
664
+ page: screensaverPage || undefined,
659
665
  },
660
666
  });
661
667
  }
@@ -3,9 +3,9 @@ import { Page } from "./appBuilder";
3
3
  import { NavigationManager, type TransitionConfig } from "./navigationManager";
4
4
  export interface ScreensaverConfig {
5
5
  timeoutSeconds: number;
6
- page: Page;
6
+ page?: Page;
7
7
  defaultViewId?: string;
8
- screensaverViewBehavior?: "default" | "specific" | "return";
8
+ screensaverViewBehavior?: "default" | "specific" | "return" | "returnHome";
9
9
  specificViewId?: string;
10
10
  transitionConfig?: TransitionConfig;
11
11
  exitBehavior?: "reset" | "return";
@@ -38,6 +38,7 @@ export declare class ScreensaverManager {
38
38
  private initializeGlobalState;
39
39
  private setupEventListeners;
40
40
  registerScreensaver(config: ScreensaverConfig): void;
41
+ private isReturnHomeMode;
41
42
  private validateConfig;
42
43
  private setupGlobalActivityListeners;
43
44
  private shouldIgnoreActivity;
@@ -45,6 +46,12 @@ export declare class ScreensaverManager {
45
46
  private pauseActivityTimer;
46
47
  private clearActivityTimer;
47
48
  private activateScreensaver;
49
+ /**
50
+ * Return-to-home activation: navigates to the configured home page/view
51
+ * without entering "screensaver active" state. The timer resets immediately
52
+ * for the next inactivity cycle.
53
+ */
54
+ private activateReturnHome;
48
55
  private determineScreensaverView;
49
56
  private handleScreensaverExit;
50
57
  private deactivateScreensaver;
@@ -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,EAAE,IAAI,CAAC;IACX,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC5D,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;IAwCpB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAiC3D,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,4BAA4B;IAmDpC,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,kBAAkB;YAOZ,mBAAmB;IAkDjC,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":"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"}
@@ -67,7 +67,8 @@ export class ScreensaverManager {
67
67
  if (navBus) {
68
68
  navBus.on("page-changed", (e) => {
69
69
  const { newPageId } = e.detail;
70
- if (!this.isScreensaverActive && newPageId !== this.config?.page.componentId) {
70
+ const screensaverPageId = this.config?.page?.componentId;
71
+ if (!this.isScreensaverActive && (!screensaverPageId || newPageId !== screensaverPageId)) {
71
72
  this.lastActivePageId = newPageId;
72
73
  stateManager.set("screensaver.lastActivePageId", newPageId);
73
74
  }
@@ -103,33 +104,52 @@ export class ScreensaverManager {
103
104
  type: "snap",
104
105
  },
105
106
  };
106
- // Register the screensaver page with navigation manager
107
- const navBus = this.orchestrator.getEventBus("navigation-manager");
108
- if (navBus) {
109
- navBus.emit("register-page", { page: this.config.page });
107
+ // Register the screensaver page with navigation manager (only in screensaver mode)
108
+ if (!this.isReturnHomeMode() && this.config.page) {
109
+ const navBus = this.orchestrator.getEventBus("navigation-manager");
110
+ if (navBus) {
111
+ navBus.emit("register-page", { page: this.config.page });
112
+ }
110
113
  }
111
114
  this.setupGlobalActivityListeners();
112
115
  this.resetActivityTimer();
113
- log.trace(`Screensaver registered with ${config.timeoutSeconds}s timeout and '${this.config.exitBehavior}' exit behavior`);
116
+ if (this.isReturnHomeMode()) {
117
+ log.trace(`Screensaver registered in returnHome mode with ${config.timeoutSeconds}s timeout, target: ${this.config.startingPageId}/${this.config.defaultViewId || "default"}`);
118
+ }
119
+ else {
120
+ log.trace(`Screensaver registered with ${config.timeoutSeconds}s timeout and '${this.config.exitBehavior}' exit behavior`);
121
+ }
122
+ }
123
+ isReturnHomeMode() {
124
+ return this.config?.screensaverViewBehavior === "returnHome";
114
125
  }
115
126
  validateConfig(config) {
116
- if (!config.page) {
117
- throw new Error("Screensaver page is required");
118
- }
119
127
  if (config.timeoutSeconds <= 0) {
120
128
  throw new Error("timeoutSeconds must be greater than 0");
121
129
  }
122
- if (config.exitBehavior === "reset" && !config.startingPageId) {
123
- throw new Error('startingPageId is required when exitBehavior is "reset"');
130
+ if (config.screensaverViewBehavior && !["default", "specific", "return", "returnHome"].includes(config.screensaverViewBehavior)) {
131
+ throw new Error('screensaverViewBehavior must be "default", "specific", "return", or "returnHome"');
124
132
  }
125
- if (config.exitBehavior && !["reset", "return"].includes(config.exitBehavior)) {
126
- throw new Error('exitBehavior must be either "reset" or "return"');
127
- }
128
- if (config.screensaverViewBehavior === "specific" && !config.specificViewId) {
129
- throw new Error('specificViewId is required when screensaverViewBehavior is "specific"');
133
+ if (config.screensaverViewBehavior === "returnHome") {
134
+ // In returnHome mode, startingPageId is required as the home page target
135
+ if (!config.startingPageId) {
136
+ throw new Error('startingPageId is required when screensaverViewBehavior is "returnHome"');
137
+ }
130
138
  }
131
- if (config.screensaverViewBehavior && !["default", "specific", "return"].includes(config.screensaverViewBehavior)) {
132
- throw new Error('screensaverViewBehavior must be "default", "specific", or "return"');
139
+ else {
140
+ // In screensaver modes, page is required
141
+ if (!config.page) {
142
+ throw new Error('Screensaver page is required when screensaverViewBehavior is not "returnHome"');
143
+ }
144
+ if (config.exitBehavior === "reset" && !config.startingPageId) {
145
+ throw new Error('startingPageId is required when exitBehavior is "reset"');
146
+ }
147
+ if (config.exitBehavior && !["reset", "return"].includes(config.exitBehavior)) {
148
+ throw new Error('exitBehavior must be either "reset" or "return"');
149
+ }
150
+ if (config.screensaverViewBehavior === "specific" && !config.specificViewId) {
151
+ throw new Error('specificViewId is required when screensaverViewBehavior is "specific"');
152
+ }
133
153
  }
134
154
  }
135
155
  setupGlobalActivityListeners() {
@@ -219,17 +239,26 @@ export class ScreensaverManager {
219
239
  }
220
240
  }
221
241
  async activateScreensaver() {
222
- if (!this.config || this.isScreensaverActive)
242
+ if (!this.config)
223
243
  return;
224
244
  if (this.config.blockerCallback && this.config.blockerCallback()) {
225
245
  this.resetActivityTimer();
226
246
  return;
227
247
  }
248
+ // Handle returnHome mode — navigate to home page/view without entering screensaver state
249
+ if (this.isReturnHomeMode()) {
250
+ await this.activateReturnHome();
251
+ return;
252
+ }
253
+ // Standard screensaver mode
254
+ if (this.isScreensaverActive)
255
+ return;
228
256
  log.trace("Activating screensaver");
229
257
  // Store the current page and view before switching to screensaver
230
258
  const currentPageId = this.navigationManager.getCurrentPageId();
231
259
  const currentViewId = this.navigationManager.getCurrentViewId();
232
- if (currentPageId && currentPageId !== this.config.page.componentId) {
260
+ const screensaverPageId = this.config.page.componentId;
261
+ if (currentPageId && currentPageId !== screensaverPageId) {
233
262
  this.lastActivePageId = currentPageId;
234
263
  this.lastActiveViewId = currentViewId;
235
264
  stateManager.set("screensaver.lastActivePageId", currentPageId);
@@ -239,14 +268,14 @@ export class ScreensaverManager {
239
268
  stateManager.set("screensaver.isActive", true);
240
269
  try {
241
270
  // Navigate to screensaver page
242
- await this.navigationManager.navigateToPage(this.config.page.componentId, this.config.transitionConfig);
271
+ await this.navigationManager.navigateToPage(screensaverPageId, this.config.transitionConfig);
243
272
  // Determine which view to show based on screensaverViewBehavior
244
273
  const targetViewId = this.determineScreensaverView();
245
274
  if (targetViewId) {
246
275
  await this.navigationManager.navigateToView(targetViewId, { type: "snap" });
247
276
  }
248
277
  this.eventBus.emit("screensaver-activated", {
249
- pageId: this.config.page.componentId,
278
+ pageId: screensaverPageId,
250
279
  viewId: targetViewId,
251
280
  previousPageId: this.lastActivePageId,
252
281
  previousViewId: this.lastActiveViewId,
@@ -263,6 +292,53 @@ export class ScreensaverManager {
263
292
  this.startRebootCheckInterval();
264
293
  this.checkAndPerformReboot();
265
294
  }
295
+ /**
296
+ * Return-to-home activation: navigates to the configured home page/view
297
+ * without entering "screensaver active" state. The timer resets immediately
298
+ * for the next inactivity cycle.
299
+ */
300
+ async activateReturnHome() {
301
+ if (!this.config)
302
+ return;
303
+ const targetPageId = this.config.startingPageId;
304
+ const targetViewId = this.config.defaultViewId || null;
305
+ const currentPageId = this.navigationManager.getCurrentPageId();
306
+ const currentViewId = this.navigationManager.getCurrentViewId();
307
+ // Skip navigation if already on the target page/view
308
+ const alreadyOnTargetPage = currentPageId === targetPageId;
309
+ const alreadyOnTargetView = !targetViewId || currentViewId === targetViewId;
310
+ if (alreadyOnTargetPage && alreadyOnTargetView) {
311
+ log.trace("ReturnHome: Already on home page/view, resetting timer");
312
+ this.resetActivityTimer();
313
+ return;
314
+ }
315
+ log.trace(`ReturnHome: Navigating to ${targetPageId}/${targetViewId || "default"}`);
316
+ try {
317
+ // Navigate to home page
318
+ if (!alreadyOnTargetPage) {
319
+ await this.navigationManager.navigateToPage(targetPageId, this.config.transitionConfig);
320
+ }
321
+ // Navigate to home view if specified
322
+ if (targetViewId && !alreadyOnTargetView) {
323
+ await this.navigationManager.navigateToView(targetViewId, { type: "snap" });
324
+ }
325
+ this.eventBus.emit("screensaver-returned-home", {
326
+ targetPageId,
327
+ targetViewId,
328
+ previousPageId: currentPageId,
329
+ previousViewId: currentViewId,
330
+ });
331
+ if (this.config.activateCallback)
332
+ this.config.activateCallback();
333
+ }
334
+ catch (error) {
335
+ log.error("Failed to return to home:", error);
336
+ }
337
+ // Reset timer for next inactivity cycle
338
+ this.resetActivityTimer();
339
+ // Check reboot timeout if configured
340
+ this.checkAndPerformReboot();
341
+ }
266
342
  determineScreensaverView() {
267
343
  if (!this.config)
268
344
  return null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hawsen-the-first/interactiv",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
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",