@daltonr/pathwrite-angular 0.11.0 → 0.12.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/README.md CHANGED
@@ -113,6 +113,7 @@ export class MyWizardComponent { }
113
113
  | `setData(key, value)` | Update a single data field. Type-safe when `TData` is specified. |
114
114
  | `startSubPath(definition, data?, meta?)` | Push a sub-path. `meta` is returned to `onSubPathComplete`/`onSubPathCancel`. |
115
115
  | `adoptEngine(engine)` | Adopt an externally-managed `PathEngine` (e.g. from `restoreOrStart()`). |
116
+ | `validate()` | Set `snapshot().hasValidated` without navigating. Triggers all inline field errors simultaneously. Used to validate all tabs in a nested shell at once. |
116
117
 
117
118
  ## `<pw-shell>` inputs/outputs
118
119
 
@@ -128,13 +129,16 @@ Step content is provided via `<ng-template pwStep="stepId">` directives inside `
128
129
  | `autoStart` | `boolean` | `true` | Start the path on `ngOnInit`. Ignored when `engine` is provided. |
129
130
  | `validationDisplay` | `"summary" \| "inline" \| "both"` | `"summary"` | Where `fieldErrors` are rendered. Use `"inline"` so step components render their own errors. |
130
131
  | `loadingLabel` | `string` | — | Label shown while the path is navigating. |
131
- | `footerLayout` | `"wizard" \| "form" \| "auto"` | `"auto"` | `"wizard"`: Back on left, Cancel+Submit on right. `"form"`: Cancel on left, Submit on right, no Back. `"auto"` picks `"form"` for single-step paths. |
132
+ | `layout` | `"wizard" \| "form" \| "auto" \| "tabs"` | `"auto"` | `"wizard"`: Back on left, Cancel+Submit on right. `"form"`: Cancel on left, Submit on right, no Back. `"tabs"`: No progress header or footer — for tabbed interfaces. `"auto"` picks `"form"` for single-step paths. |
132
133
  | `hideProgress` | `boolean` | `false` | Hide the progress indicator. Also hidden automatically for single-step paths. |
133
134
  | `backLabel` | `string` | `"Previous"` | Previous button label. |
134
135
  | `nextLabel` | `string` | `"Next"` | Next button label. |
135
136
  | `completeLabel` | `string` | `"Complete"` | Complete button label (last step). |
136
137
  | `cancelLabel` | `string` | `"Cancel"` | Cancel button label. |
137
138
  | `hideCancel` | `boolean` | `false` | Hide the Cancel button. |
139
+ | `services` | `unknown` | `null` | Arbitrary services object available to step components via `usePathContext<TData, TServices>().services`. |
140
+ | `validateWhen` | `boolean` | `false` | When it becomes `true`, calls `validate()` on the engine. Bind to the outer snapshot's `hasAttemptedNext` when this shell is nested inside a step of an outer shell. |
141
+ | `restoreKey` | `string` | — | When set, the shell automatically saves its full state (data + active step) into the nearest outer `<pw-shell>`'s data under this key on every change, and restores from it on remount. No-op on a top-level shell. |
138
142
 
139
143
  ### Outputs
140
144
 
@@ -144,21 +148,103 @@ Step content is provided via `<ng-template pwStep="stepId">` directives inside `
144
148
  | `(cancel)` | `PathData` | Emitted when the path is cancelled. |
145
149
  | `(event)` | `PathEvent` | Emitted for every engine event. |
146
150
 
147
- ## `injectPath()`
151
+ ### Completion content
148
152
 
149
- `injectPath()` is the preferred API for step components and forms rendered inside `<pw-shell>`. It resolves the `PathFacade` from the nearest injector in the tree and returns a signal-based interface typed with an optional `TData` generic no `providers: [PathFacade]` needed in step components.
153
+ When `completionBehaviour` is `"stayOnFinal"` (the default), `<pw-shell>` renders a completion panel once `snapshot.status === "completed"`. Use the `[pwShellCompletion]` directive to replace the default "All done." panel with a custom template. The template receives the completed snapshot as its implicit context:
150
154
 
151
155
  ```typescript
152
- import { injectPath } from "@daltonr/pathwrite-angular";
156
+ import { PathShellCompletionDirective } from "@daltonr/pathwrite-angular/shell";
157
+
158
+ @Component({
159
+ imports: [PathShellComponent, PathStepDirective, PathShellCompletionDirective],
160
+ template: `
161
+ <pw-shell [path]="path" [initialData]="{ name: '' }">
162
+ <ng-template pwShellCompletion let-s>
163
+ <div class="done-panel">
164
+ <h2>Thanks, {{ s.data.name }}!</h2>
165
+ <button (click)="facade.restart()">Start over</button>
166
+ </div>
167
+ </ng-template>
168
+ <ng-template pwStep="details"><app-details-form /></ng-template>
169
+ </pw-shell>
170
+ `
171
+ })
172
+ export class MyWizardComponent {
173
+ protected readonly path = myPath;
174
+ protected readonly facade = usePathContext();
175
+ }
176
+ ```
177
+
178
+ ## `usePathContext()`
179
+
180
+ `usePathContext()` is the preferred API for step components and forms rendered inside `<pw-shell>`. It resolves the `PathFacade` from the nearest injector in the tree and returns a signal-based interface typed with optional `TData` and `TServices` generics — no `providers: [PathFacade]` needed in step components.
181
+
182
+ ```typescript
183
+ import { usePathContext } from "@daltonr/pathwrite-angular";
153
184
 
154
185
  export class DetailsStepComponent {
155
- protected readonly path = injectPath<ApplicationData>();
186
+ protected readonly path = usePathContext<ApplicationData>();
156
187
  // path.snapshot() — Signal<PathSnapshot | null>
157
188
  // path.setData(key, value) — type-safe with TData
158
189
  // path.next(), path.previous(), path.cancel(), etc.
190
+ // path.validate() — trigger inline errors on all steps simultaneously
191
+ // path.services — typed as TServices
159
192
  }
160
193
  ```
161
194
 
195
+ ### Passing services to step components
196
+
197
+ Use the `[services]` input on `<pw-shell>` to provide shared dependencies (API clients, feature flags, etc.) to all step components without prop-drilling:
198
+
199
+ ```typescript
200
+ // In the wizard host component:
201
+ @Component({
202
+ template: `
203
+ <pw-shell [path]="path" [services]="svc">
204
+ <ng-template pwStep="details"><app-details /></ng-template>
205
+ </pw-shell>
206
+ `
207
+ })
208
+ export class WizardComponent {
209
+ protected readonly svc: HiringServices = { api: inject(HiringApi) };
210
+ }
211
+
212
+ // In a step component:
213
+ export class DetailsStepComponent {
214
+ protected readonly path = usePathContext<HiringData, HiringServices>();
215
+ // this.path.services — typed as HiringServices
216
+ }
217
+ ```
218
+
219
+ ### Nested shells and `validateWhen`
220
+
221
+ When `<pw-shell>` is nested inside a step of an outer shell, bind `[validateWhen]` to the outer snapshot's `hasAttemptedNext`. This triggers `validate()` on the inner engine when the outer shell's user attempts to proceed, surfacing all inner field errors at once:
222
+
223
+ ```typescript
224
+ @Component({
225
+ selector: "app-contact-step",
226
+ standalone: true,
227
+ imports: [PathShellComponent, PathStepDirective],
228
+ template: `
229
+ <pw-shell
230
+ [path]="contactTabsPath"
231
+ [layout]="'tabs'"
232
+ [validateWhen]="outerSnap()?.hasAttemptedNext ?? false"
233
+ >
234
+ <ng-template pwStep="name"><app-name-tab /></ng-template>
235
+ <ng-template pwStep="address"><app-address-tab /></ng-template>
236
+ </pw-shell>
237
+ `
238
+ })
239
+ export class ContactStepComponent {
240
+ protected readonly outerPath = usePathContext<ApplicationData>();
241
+ protected readonly outerSnap = this.outerPath.snapshot;
242
+ protected readonly contactTabsPath = contactTabsPath;
243
+ }
244
+ ```
245
+
246
+ > **Do NOT add `providers: [PathFacade]` to step components.** Doing so creates a second, disconnected `PathFacade` instance scoped to that component — `snapshot()` will always be `null` inside it. `usePathContext()` resolves the shell's instance automatically via DI; no extra provider needed.
247
+
162
248
  ## Further reading
163
249
 
164
250
  - [Angular getting started guide](../../docs/getting-started/frameworks/angular.md)
@@ -167,4 +253,4 @@ export class DetailsStepComponent {
167
253
 
168
254
  ---
169
255
 
170
- MIT — © 2026 Devjoy Ltd.
256
+ © 2026 Devjoy Ltd. MIT License.
package/dist/index.css CHANGED
@@ -77,6 +77,31 @@
77
77
  font-size: 14px;
78
78
  }
79
79
 
80
+ /* ------------------------------------------------------------------ */
81
+ /* Completion panel */
82
+ /* ------------------------------------------------------------------ */
83
+ .pw-shell__completion {
84
+ text-align: center;
85
+ padding: 40px 16px;
86
+ }
87
+
88
+ .pw-shell__completion-message {
89
+ font-size: 18px;
90
+ font-weight: 600;
91
+ color: var(--pw-color-text);
92
+ margin: 0 0 20px;
93
+ }
94
+
95
+ .pw-shell__completion-restart {
96
+ border: 1px solid var(--pw-color-btn-border);
97
+ background: var(--pw-color-btn-bg);
98
+ color: var(--pw-color-text);
99
+ padding: var(--pw-btn-padding);
100
+ border-radius: var(--pw-btn-radius);
101
+ cursor: pointer;
102
+ font-size: 14px;
103
+ }
104
+
80
105
  /* ------------------------------------------------------------------ */
81
106
  /* Root progress — persistent top-level bar visible during sub-paths */
82
107
  /* ------------------------------------------------------------------ */
package/dist/index.d.ts CHANGED
@@ -22,6 +22,12 @@ export declare class PathFacade<TData extends PathData = PathData> implements On
22
22
  private readonly _events$;
23
23
  private _unsubscribeFromEngine;
24
24
  private readonly _stateSignal;
25
+ /**
26
+ * Arbitrary services object passed via `[services]` on `<pw-shell>`.
27
+ * Read it in step components via `usePathContext<TData, TServices>().services`.
28
+ * Set directly by `PathShellComponent` — do not set this manually.
29
+ */
30
+ services: unknown;
25
31
  readonly state$: Observable<PathSnapshot<TData> | null>;
26
32
  readonly events$: Observable<PathEvent>;
27
33
  /** Signal version of state$. Updates on every path state change. Requires Angular 16+. */
@@ -63,11 +69,15 @@ export declare class PathFacade<TData extends PathData = PathData> implements On
63
69
  /** Reset the current step's data to what it was when the step was entered.
64
70
  * Useful for "Clear" or "Reset" buttons that undo changes within a step. */
65
71
  resetStep(): Promise<void>;
66
- goToStep(stepId: string): Promise<void>;
72
+ goToStep(stepId: string, options?: {
73
+ validateOnLeave?: boolean;
74
+ }): Promise<void>;
67
75
  /** Jump to a step by ID, checking the current step's canMoveNext (forward) or
68
76
  * canMovePrevious (backward) guard first. Navigation is blocked if the guard
69
77
  * returns false. Throws if the step ID does not exist. */
70
- goToStepChecked(stepId: string): Promise<void>;
78
+ goToStepChecked(stepId: string, options?: {
79
+ validateOnLeave?: boolean;
80
+ }): Promise<void>;
71
81
  validate(): void;
72
82
  snapshot(): PathSnapshot<TData> | null;
73
83
  static ɵfac: i0.ɵɵFactoryDeclaration<PathFacade<any>, never>;
@@ -78,7 +88,7 @@ export declare class PathFacade<TData extends PathData = PathData> implements On
78
88
  * path state and strongly-typed navigation actions. Mirrors React's `usePathContext()`
79
89
  * return type for consistency across adapters.
80
90
  */
81
- export interface UsePathContextReturn<TData extends PathData = PathData> {
91
+ export interface UsePathContextReturn<TData extends PathData = PathData, TServices = unknown> {
82
92
  /** Current path snapshot as a signal. Returns `null` when no path is active. */
83
93
  snapshot: Signal<PathSnapshot<TData> | null>;
84
94
  /** Start (or restart) a path. */
@@ -95,10 +105,14 @@ export interface UsePathContextReturn<TData extends PathData = PathData> {
95
105
  setData: <K extends string & keyof TData>(key: K, value: TData[K]) => Promise<void>;
96
106
  /** Reset the current step's data to what it was when the step was entered. */
97
107
  resetStep: () => Promise<void>;
98
- /** Jump to a step by ID without checking guards. */
99
- goToStep: (stepId: string) => Promise<void>;
108
+ /** Jump to a step by ID without checking guards. Pass `{ validateOnLeave: true }` to mark the departing step as attempted before navigating. */
109
+ goToStep: (stepId: string, options?: {
110
+ validateOnLeave?: boolean;
111
+ }) => Promise<void>;
100
112
  /** Jump to a step by ID, checking guards first. */
101
- goToStepChecked: (stepId: string) => Promise<void>;
113
+ goToStepChecked: (stepId: string, options?: {
114
+ validateOnLeave?: boolean;
115
+ }) => Promise<void>;
102
116
  /**
103
117
  * Tears down any active path and immediately starts the given path fresh.
104
118
  * Use for "Start over" / retry flows.
@@ -108,6 +122,12 @@ export interface UsePathContextReturn<TData extends PathData = PathData> {
108
122
  retry: () => Promise<void>;
109
123
  /** Pause with intent to return, preserving all state. Emits `suspended`. */
110
124
  suspend: () => Promise<void>;
125
+ /**
126
+ * The services object passed to the nearest `<pw-shell>` via `[services]`.
127
+ * Typed as `TServices` — pass your services interface as the second generic:
128
+ * `usePathContext<MyData, MyServices>().services`.
129
+ */
130
+ services: TServices;
111
131
  }
112
132
  /**
113
133
  * Access the nearest `PathFacade`'s path instance for use in Angular step components.
@@ -145,7 +165,7 @@ export interface UsePathContextReturn<TData extends PathData = PathData> {
145
165
  *
146
166
  * @throws Error if PathFacade is not provided in the injector tree
147
167
  */
148
- export declare function usePathContext<TData extends PathData = PathData>(): UsePathContextReturn<TData>;
168
+ export declare function usePathContext<TData extends PathData = PathData, TServices = unknown>(): UsePathContextReturn<TData, TServices>;
149
169
  /**
150
170
  * Minimal interface describing what syncFormGroup needs from an Angular
151
171
  * FormGroup. Typed as a duck interface so that @angular/forms is not a
package/dist/index.js CHANGED
@@ -23,6 +23,12 @@ export class PathFacade {
23
23
  this._events$ = new Subject();
24
24
  this._unsubscribeFromEngine = () => { };
25
25
  this._stateSignal = signal(null);
26
+ /**
27
+ * Arbitrary services object passed via `[services]` on `<pw-shell>`.
28
+ * Read it in step components via `usePathContext<TData, TServices>().services`.
29
+ * Set directly by `PathShellComponent` — do not set this manually.
30
+ */
31
+ this.services = null;
26
32
  this.state$ = this._state$.asObservable();
27
33
  this.events$ = this._events$.asObservable();
28
34
  /** Signal version of state$. Updates on every path state change. Requires Angular 16+. */
@@ -61,8 +67,9 @@ export class PathFacade {
61
67
  this._stateSignal.set(event.snapshot);
62
68
  }
63
69
  else if (event.type === "completed" || event.type === "cancelled") {
64
- this._state$.next(null);
65
- this._stateSignal.set(null);
70
+ const snap = engine.snapshot();
71
+ this._state$.next(snap);
72
+ this._stateSignal.set(snap);
66
73
  }
67
74
  });
68
75
  }
@@ -111,14 +118,14 @@ export class PathFacade {
111
118
  resetStep() {
112
119
  return this._engine.resetStep();
113
120
  }
114
- goToStep(stepId) {
115
- return this._engine.goToStep(stepId);
121
+ goToStep(stepId, options) {
122
+ return this._engine.goToStep(stepId, options);
116
123
  }
117
124
  /** Jump to a step by ID, checking the current step's canMoveNext (forward) or
118
125
  * canMovePrevious (backward) guard first. Navigation is blocked if the guard
119
126
  * returns false. Throws if the step ID does not exist. */
120
- goToStepChecked(stepId) {
121
- return this._engine.goToStepChecked(stepId);
127
+ goToStepChecked(stepId, options) {
128
+ return this._engine.goToStepChecked(stepId, options);
122
129
  }
123
130
  validate() {
124
131
  this._engine.validate();
@@ -183,11 +190,12 @@ export function usePathContext() {
183
190
  cancel: () => facade.cancel(),
184
191
  setData: (key, value) => facade.setData(key, value),
185
192
  resetStep: () => facade.resetStep(),
186
- goToStep: (stepId) => facade.goToStep(stepId),
187
- goToStepChecked: (stepId) => facade.goToStepChecked(stepId),
193
+ goToStep: (stepId, options) => facade.goToStep(stepId, options),
194
+ goToStepChecked: (stepId, options) => facade.goToStepChecked(stepId, options),
188
195
  restart: () => facade.restart(),
189
196
  retry: () => facade.retry(),
190
197
  suspend: () => facade.suspend(),
198
+ services: facade.services,
191
199
  };
192
200
  }
193
201
  /**
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAyB,MAAM,EAAU,MAAM,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAc,OAAO,EAAE,MAAM,MAAM,CAAC;AAC5D,OAAO,EAGL,UAAU,EAGX,MAAM,yBAAyB,CAAC;;AAEjC;;;;;;;;;;;;;GAaG;AAEH,MAAM,OAAO,UAAU;IAYrB;QAXQ,YAAO,GAAG,IAAI,UAAU,EAAE,CAAC;QAClB,YAAO,GAAG,IAAI,eAAe,CAA6B,IAAI,CAAC,CAAC;QAChE,aAAQ,GAAG,IAAI,OAAO,EAAa,CAAC;QAC7C,2BAAsB,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;QACrC,iBAAY,GAAG,MAAM,CAA6B,IAAI,CAAC,CAAC;QAEzD,WAAM,GAA2C,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC7E,YAAO,GAA0B,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC9E,0FAA0F;QAC1E,gBAAW,GAAuC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;QAG/F,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED;;;;;;;;;;;;OAYG;IACI,WAAW,CAAC,MAAkB;QACnC,+DAA+D;QAC/D,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAEO,aAAa,CAAC,MAAkB;QACtC,0EAA0E;QAC1E,kEAAkE;QAClE,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAgC,CAAC;QAChE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE/B,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YACvD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAA+B,CAAC,CAAC;gBACzD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,QAA+B,CAAC,CAAC;YAC/D,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACpE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,WAAW;QAChB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAEM,KAAK,CAAC,IAAyB,EAAE,cAAwB,EAAE;QAChE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;OAKG;IACI,OAAO;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,4IAA4I;IACrI,KAAK;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED,wFAAwF;IACjF,OAAO;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC;IAEM,YAAY,CAAC,IAAyB,EAAE,cAAwB,EAAE,EAAE,IAA8B;QACvG,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;IAEM,IAAI;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IAEM,MAAM;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IAC/B,CAAC;IAEM,OAAO,CAAiC,GAAM,EAAE,KAAe;QACpE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAgB,CAAC,CAAC;IACrD,CAAC;IAED;iFAC6E;IACtE,SAAS;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;IAClC,CAAC;IAEM,QAAQ,CAAC,MAAc;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED;;+DAE2D;IACpD,eAAe,CAAC,MAAc;QACnC,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAEM,QAAQ;QACb,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;+GAhIU,UAAU;mHAAV,UAAU;;4FAAV,UAAU;kBADtB,UAAU;;AA6KX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAA6B,CAAC;IAElF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,uDAAuD;YACvD,wEAAwE,CACzE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,WAAW;QAC5B,KAAK,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC;QAClE,YAAY,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC;QAC5F,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE;QACzB,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE;QACjC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;QAC7B,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;QACnD,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE;QACnC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC7C,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;QAC3D,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE;QAC/B,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;QAC3B,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE;KAChC,CAAC;AACJ,CAAC;AAoBD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAyB,EACzB,SAAwB,EACxB,UAAuB;IAEvB,MAAM,UAAU,GAAG,MAA8B,CAAC;IAElD,SAAS,WAAW;QAClB,IAAI,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI;YAAE,OAAO,CAAC,mCAAmC;QAC/E,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACnE,KAAK,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,WAAW,EAAE,CAAC;IAEd,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAE3E,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;IACjD,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,OAAO,CAAC;AACjB,CAAC;AAgBD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/shell.d.ts CHANGED
@@ -11,8 +11,12 @@ export interface PathShellActions {
11
11
  next: () => Promise<void>;
12
12
  previous: () => Promise<void>;
13
13
  cancel: () => Promise<void>;
14
- goToStep: (stepId: string) => Promise<void>;
15
- goToStepChecked: (stepId: string) => Promise<void>;
14
+ goToStep: (stepId: string, options?: {
15
+ validateOnLeave?: boolean;
16
+ }) => Promise<void>;
17
+ goToStepChecked: (stepId: string, options?: {
18
+ validateOnLeave?: boolean;
19
+ }) => Promise<void>;
16
20
  setData: (key: string, value: unknown) => Promise<void>;
17
21
  /** Restart the shell's current path with its current `initialData`. */
18
22
  restart: () => Promise<void>;
@@ -89,6 +93,30 @@ export declare class PathShellFooterDirective {
89
93
  static ɵfac: i0.ɵɵFactoryDeclaration<PathShellFooterDirective, never>;
90
94
  static ɵdir: i0.ɵɵDirectiveDeclaration<PathShellFooterDirective, "[pwShellFooter]", never, {}, {}, never, never, true, never>;
91
95
  }
96
+ /**
97
+ * Replaces the default completion panel inside `<pw-shell>` when
98
+ * `snapshot.status === "completed"` (`completionBehaviour: "stayOnFinal"`).
99
+ * The template receives the current `PathSnapshot` as the implicit context.
100
+ *
101
+ * ```html
102
+ * <pw-shell [path]="myPath">
103
+ * <ng-template pwShellCompletion let-s>
104
+ * <my-completion-screen [data]="s.data" />
105
+ * </ng-template>
106
+ * <ng-template pwStep="details"><app-details-form /></ng-template>
107
+ * </pw-shell>
108
+ * ```
109
+ */
110
+ export declare class PathShellCompletionDirective {
111
+ readonly templateRef: TemplateRef<{
112
+ $implicit: PathSnapshot;
113
+ }>;
114
+ constructor(templateRef: TemplateRef<{
115
+ $implicit: PathSnapshot;
116
+ }>);
117
+ static ɵfac: i0.ɵɵFactoryDeclaration<PathShellCompletionDirective, never>;
118
+ static ɵdir: i0.ɵɵDirectiveDeclaration<PathShellCompletionDirective, "[pwShellCompletion]", never, {}, {}, never, never, true, never>;
119
+ }
92
120
  /**
93
121
  * Default UI shell component. Renders a progress indicator, step content,
94
122
  * and navigation buttons.
@@ -118,8 +146,14 @@ export declare class PathShellComponent implements OnInit, OnChanges, OnDestroy
118
146
  * ```
119
147
  */
120
148
  engine?: PathEngine;
121
- /** Initial data merged into the path engine on start. */
149
+ /** Initial data merged into the path engine on start. Used on first visit; overridden by stored snapshot when `restoreKey` is set. */
122
150
  initialData: PathData;
151
+ /**
152
+ * When set, this shell automatically saves its state into the nearest outer `pw-shell`'s
153
+ * data under this key on every change, and restores from that stored state on remount.
154
+ * No-op when used on a top-level shell with no outer `pw-shell` ancestor.
155
+ */
156
+ restoreKey?: string;
123
157
  /** Start the path automatically on ngOnInit. Set to false to call doStart() manually. */
124
158
  autoStart: boolean;
125
159
  /** Label for the Back navigation button. */
@@ -141,12 +175,19 @@ export declare class PathShellComponent implements OnInit, OnChanges, OnDestroy
141
175
  /** When true, calls `validate()` on the facade so all steps show inline errors simultaneously. Useful when this shell is nested inside a step of an outer shell: bind to the outer snapshot's `hasAttemptedNext`. */
142
176
  validateWhen: boolean;
143
177
  /**
144
- * Footer layout mode:
178
+ * Arbitrary services object made available to all step components via
179
+ * `usePathContext<TData, TServices>().services`. Pass API clients, feature
180
+ * flags, or any shared dependency without prop-drilling through each step.
181
+ */
182
+ services: unknown;
183
+ /**
184
+ * Shell layout mode:
145
185
  * - "auto" (default): Uses "form" for single-step top-level paths, "wizard" otherwise.
146
- * - "wizard": Back button on left, Cancel and Submit together on right.
147
- * - "form": Cancel on left, Submit alone on right. Back button never shown.
186
+ * - "wizard": Progress header + Back button on left, Cancel and Submit together on right.
187
+ * - "form": Progress header + Cancel on left, Submit alone on right. Back button never shown.
188
+ * - "tabs": No progress header, no footer. Use for tabbed interfaces with a custom tab bar inside the step body.
148
189
  */
149
- footerLayout: "wizard" | "form" | "auto";
190
+ layout: "wizard" | "form" | "auto" | "tabs";
150
191
  /**
151
192
  * Controls whether the shell renders its auto-generated field-error summary box.
152
193
  * - `"summary"` (default): Shell renders the labeled error list below the step body.
@@ -168,10 +209,13 @@ export declare class PathShellComponent implements OnInit, OnChanges, OnDestroy
168
209
  stepDirectives: QueryList<PathStepDirective>;
169
210
  customHeader?: PathShellHeaderDirective;
170
211
  customFooter?: PathShellFooterDirective;
212
+ customCompletion?: PathShellCompletionDirective;
171
213
  readonly facade: PathFacade<PathData>;
172
214
  /** The shell's own component-level injector. Passed to ngTemplateOutlet so that
173
215
  * step components can resolve PathFacade (provided by this shell) via inject(). */
174
216
  protected readonly shellInjector: Injector;
217
+ /** Outer shell's PathFacade — present when this shell is nested inside another pw-shell. */
218
+ private readonly outerFacade;
175
219
  started: boolean;
176
220
  /** Navigation actions passed to custom `pwShellFooter` templates. */
177
221
  protected readonly shellActions: PathShellActions;
@@ -194,10 +238,12 @@ export declare class PathShellComponent implements OnInit, OnChanges, OnDestroy
194
238
  protected fieldEntries(s: PathSnapshot): [string, string][];
195
239
  /** Returns Object.entries(s.fieldWarnings) for use in *ngFor. */
196
240
  protected warningEntries(s: PathSnapshot): [string, string][];
197
- /** Resolves "auto" footerLayout based on snapshot. Single-step top-level → "form", otherwise → "wizard". */
198
- protected getResolvedFooterLayout(s: PathSnapshot): "wizard" | "form";
241
+ get effectiveHideProgress(): boolean;
242
+ get effectiveHideFooter(): boolean;
243
+ /** Resolves "auto"/"tabs" layout to "wizard" or "form" for footer button arrangement. */
244
+ protected getResolvedLayout(s: PathSnapshot): "wizard" | "form";
199
245
  protected errorPhaseMessage: typeof errorPhaseMessage;
200
246
  protected formatFieldKey: typeof formatFieldKey;
201
247
  static ɵfac: i0.ɵɵFactoryDeclaration<PathShellComponent, never>;
202
- static ɵcmp: i0.ɵɵComponentDeclaration<PathShellComponent, "pw-shell", never, { "path": { "alias": "path"; "required": false; }; "engine": { "alias": "engine"; "required": false; }; "initialData": { "alias": "initialData"; "required": false; }; "autoStart": { "alias": "autoStart"; "required": false; }; "backLabel": { "alias": "backLabel"; "required": false; }; "nextLabel": { "alias": "nextLabel"; "required": false; }; "completeLabel": { "alias": "completeLabel"; "required": false; }; "loadingLabel": { "alias": "loadingLabel"; "required": false; }; "cancelLabel": { "alias": "cancelLabel"; "required": false; }; "hideCancel": { "alias": "hideCancel"; "required": false; }; "hideProgress": { "alias": "hideProgress"; "required": false; }; "hideFooter": { "alias": "hideFooter"; "required": false; }; "validateWhen": { "alias": "validateWhen"; "required": false; }; "footerLayout": { "alias": "footerLayout"; "required": false; }; "validationDisplay": { "alias": "validationDisplay"; "required": false; }; "progressLayout": { "alias": "progressLayout"; "required": false; }; }, { "complete": "complete"; "cancel": "cancel"; "event": "event"; }, ["customHeader", "customFooter", "stepDirectives"], never, true, never>;
248
+ static ɵcmp: i0.ɵɵComponentDeclaration<PathShellComponent, "pw-shell", never, { "path": { "alias": "path"; "required": false; }; "engine": { "alias": "engine"; "required": false; }; "initialData": { "alias": "initialData"; "required": false; }; "restoreKey": { "alias": "restoreKey"; "required": false; }; "autoStart": { "alias": "autoStart"; "required": false; }; "backLabel": { "alias": "backLabel"; "required": false; }; "nextLabel": { "alias": "nextLabel"; "required": false; }; "completeLabel": { "alias": "completeLabel"; "required": false; }; "loadingLabel": { "alias": "loadingLabel"; "required": false; }; "cancelLabel": { "alias": "cancelLabel"; "required": false; }; "hideCancel": { "alias": "hideCancel"; "required": false; }; "hideProgress": { "alias": "hideProgress"; "required": false; }; "hideFooter": { "alias": "hideFooter"; "required": false; }; "validateWhen": { "alias": "validateWhen"; "required": false; }; "services": { "alias": "services"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "validationDisplay": { "alias": "validationDisplay"; "required": false; }; "progressLayout": { "alias": "progressLayout"; "required": false; }; }, { "complete": "complete"; "cancel": "cancel"; "event": "event"; }, ["customHeader", "customFooter", "customCompletion", "stepDirectives"], never, true, never>;
203
249
  }