@daltonr/pathwrite-react 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
@@ -73,7 +73,7 @@ Step components call `usePathContext()` to access engine state — no prop drill
73
73
 
74
74
  | Return value | Type | Description |
75
75
  |---|---|---|
76
- | `snapshot` | `PathSnapshot \| null` | Current snapshot. `null` when no path is active. Triggers re-render on change. |
76
+ | `snapshot` | `PathSnapshot \| null` | Current snapshot. `null` when no path is active or when `completionBehaviour: "dismiss"` is used. With the default `"stayOnFinal"`, a non-null snapshot with `status === "completed"` is returned after the path finishes. Triggers re-render on change. |
77
77
  | `start(definition, data?)` | function | Start or re-start a path. |
78
78
  | `next()` | function | Advance one step. Completes the path on the last step. |
79
79
  | `previous()` | function | Go back one step. No-op on the first step of a top-level path. |
@@ -86,6 +86,7 @@ Step components call `usePathContext()` to access engine state — no prop drill
86
86
  | `suspend()` | function | Suspend an async step while work completes. |
87
87
  | `retry()` | function | Retry the current step after a suspension or error. |
88
88
  | `restart(definition, data?)` | function | Tear down the active path without firing hooks and start fresh. |
89
+ | `validate()` | function | Set `snapshot.hasValidated` without navigating. Triggers all inline field errors simultaneously. Used to validate all tabs in a nested shell at once. |
89
90
 
90
91
  All returned callbacks are referentially stable — safe to pass as props or include in `useEffect` dependency arrays.
91
92
 
@@ -103,11 +104,14 @@ All returned callbacks are referentially stable — safe to pass as props or inc
103
104
  | `onComplete` | `(data: PathData) => void` | — | Called when the path completes. |
104
105
  | `onCancel` | `(data: PathData) => void` | — | Called when the path is cancelled. |
105
106
  | `engine` | `PathEngine` | — | An externally-managed engine. When provided, `PathShell` skips its own `start()`. |
107
+ | `restoreKey` | `string` | — | When set, the shell automatically saves its full state (data + active step) into the nearest outer `PathShell`'s data under this key on every change, and restores from it on remount. No-op on a top-level shell. |
108
+ | `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. |
106
109
  | `validationDisplay` | `"summary" \| "inline" \| "both"` | `"summary"` | Where `fieldErrors` are rendered. Use `"inline"` so step components render their own errors. |
107
110
  | `loadingLabel` | `string` | `"Loading…"` | Label shown during async step suspension. |
108
- | `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. |
111
+ | `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. |
109
112
  | `hideProgress` | `boolean` | `false` | Hide the progress indicator. Also hidden automatically for single-step top-level paths. |
110
113
  | `services` | `TServices` | — | Services object injected into step lifecycle hooks via `PathStepContext`. |
114
+ | `completionContent` | `ReactNode` | — | Custom content rendered when `snapshot.status === "completed"` (requires `completionBehaviour: "stayOnFinal"`, the default). If omitted, a default "All done." panel with a "Start over" button is shown. Components inside `completionContent` can call `usePathContext()` to access `restart` and `snapshot.data`. |
111
115
 
112
116
  Step components rendered inside `<PathShell>` call `usePathContext()` to read `snapshot` and invoke actions — no prop drilling required.
113
117
 
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
@@ -28,10 +28,14 @@ export interface UsePathReturn<TData extends PathData = PathData> {
28
28
  previous: () => void;
29
29
  /** Cancel the active path (or sub-path). */
30
30
  cancel: () => void;
31
- /** Jump directly to a step by ID. Calls onLeave / onEnter but bypasses guards and shouldSkip. */
32
- goToStep: (stepId: string) => void;
31
+ /** Jump directly to a step by ID. Calls onLeave / onEnter but bypasses guards and shouldSkip. Pass `{ validateOnLeave: true }` to mark the departing step as attempted before navigating, so inline errors are visible if the user returns to it. */
32
+ goToStep: (stepId: string, options?: {
33
+ validateOnLeave?: boolean;
34
+ }) => void;
33
35
  /** Jump directly to a step by ID, checking the current step's canMoveNext (forward) or canMovePrevious (backward) guard first. Navigation is blocked if the guard returns false. */
34
- goToStepChecked: (stepId: string) => void;
36
+ goToStepChecked: (stepId: string, options?: {
37
+ validateOnLeave?: boolean;
38
+ }) => void;
35
39
  /** Update a single data value; triggers a re-render via stateChanged. When `TData` is specified, `key` and `value` are type-checked against your data shape. */
36
40
  setData: <K extends string & keyof TData>(key: K, value: TData[K]) => void;
37
41
  /** Reset the current step's data to what it was when the step was entered. Useful for "Clear" or "Reset" buttons. */
@@ -130,8 +134,25 @@ export interface PathShellProps {
130
134
  engine?: PathEngine;
131
135
  /** Map of step ID → content. The shell renders `steps[snapshot.stepId]` for the current step. */
132
136
  steps: Record<string, ReactNode>;
133
- /** Initial data passed to `engine.start()`. */
137
+ /** Initial data passed to `engine.start()`. Used on first visit. Overridden by a stored snapshot when `restoreKey` is set. */
134
138
  initialData?: PathData;
139
+ /**
140
+ * When set, this shell automatically saves its state into the nearest outer `PathShell`'s
141
+ * data under this key on every change, and restores from that stored state on remount.
142
+ *
143
+ * Use this for nested shells (e.g. a tabbed inner shell inside a wizard step) so that
144
+ * navigating away and back preserves both the inner data and the active tab:
145
+ *
146
+ * ```tsx
147
+ * <PathShell path={detailsPath} restoreKey="details" initialData={DETAILS_INITIAL} ... />
148
+ * ```
149
+ *
150
+ * The outer path stores a full `PathSnapshot` under `data[restoreKey]`. Later steps in
151
+ * the outer path can read inner field values via `data.details?.data.fieldName`.
152
+ *
153
+ * No-op when used on a top-level shell with no outer `PathShell` ancestor.
154
+ */
155
+ restoreKey?: string;
135
156
  /** If true, the path is started automatically on mount. Defaults to `true`. */
136
157
  autoStart?: boolean;
137
158
  /** Called when the path completes. Receives the final data. */
@@ -159,12 +180,13 @@ export interface PathShellProps {
159
180
  /** When true, calls `validate()` on the engine 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`. */
160
181
  validateWhen?: boolean;
161
182
  /**
162
- * Footer layout mode:
183
+ * Shell layout mode:
163
184
  * - `"auto"` (default): Uses "form" for single-step top-level paths, "wizard" otherwise.
164
- * - `"wizard"`: Back button on left, Cancel and Submit together on right.
165
- * - `"form"`: Cancel on left, Submit alone on right. Back button never shown.
185
+ * - `"wizard"`: Progress header + Back button on left, Cancel and Submit together on right.
186
+ * - `"form"`: Progress header + Cancel on left, Submit alone on right. Back button never shown.
187
+ * - `"tabs"`: No progress header, no footer. Use for tabbed interfaces with a custom tab bar inside the step body.
166
188
  */
167
- footerLayout?: "wizard" | "form" | "auto";
189
+ layout?: "wizard" | "form" | "auto" | "tabs";
168
190
  /** Optional extra CSS class on the root element. */
169
191
  className?: string;
170
192
  /** Render prop to replace the entire header (progress area). Receives the snapshot. */
@@ -202,6 +224,17 @@ export interface PathShellProps {
202
224
  * ```
203
225
  */
204
226
  services?: unknown;
227
+ /**
228
+ * Content to render when `snapshot.status === "completed"` (i.e. after the
229
+ * path finishes with `completionBehaviour: "stayOnFinal"`).
230
+ *
231
+ * When provided, the shell replaces the step body with this content. If
232
+ * omitted, a default "All done." panel is shown with a Restart button.
233
+ *
234
+ * Has no effect when `completionBehaviour` is `"dismiss"` or `"reset"`,
235
+ * since those modes never produce a `"completed"` snapshot.
236
+ */
237
+ completionContent?: ReactNode;
205
238
  }
206
239
  export interface PathShellHandle {
207
240
  /** Restart the shell's current path with its original `initialData`, without unmounting. */
@@ -211,8 +244,12 @@ export interface PathShellActions {
211
244
  next: () => void;
212
245
  previous: () => void;
213
246
  cancel: () => void;
214
- goToStep: (stepId: string) => void;
215
- goToStepChecked: (stepId: string) => void;
247
+ goToStep: (stepId: string, options?: {
248
+ validateOnLeave?: boolean;
249
+ }) => void;
250
+ goToStepChecked: (stepId: string, options?: {
251
+ validateOnLeave?: boolean;
252
+ }) => void;
216
253
  setData: (key: string, value: unknown) => void;
217
254
  /** Restart the shell's current path with its current `initialData`. */
218
255
  restart: () => void;
package/dist/index.js CHANGED
@@ -34,7 +34,7 @@ export function usePath(options) {
34
34
  snapshotRef.current = event.snapshot;
35
35
  }
36
36
  else if (event.type === "completed" || event.type === "cancelled") {
37
- snapshotRef.current = null;
37
+ snapshotRef.current = engine.snapshot();
38
38
  }
39
39
  onEventRef.current?.(event);
40
40
  callback();
@@ -47,8 +47,8 @@ export function usePath(options) {
47
47
  const next = useCallback(() => engine.next(), [engine]);
48
48
  const previous = useCallback(() => engine.previous(), [engine]);
49
49
  const cancel = useCallback(() => engine.cancel(), [engine]);
50
- const goToStep = useCallback((stepId) => engine.goToStep(stepId), [engine]);
51
- const goToStepChecked = useCallback((stepId) => engine.goToStepChecked(stepId), [engine]);
50
+ const goToStep = useCallback((stepId, options) => engine.goToStep(stepId, options), [engine]);
51
+ const goToStepChecked = useCallback((stepId, options) => engine.goToStepChecked(stepId, options), [engine]);
52
52
  const setData = useCallback((key, value) => engine.setData(key, value), [engine]);
53
53
  const resetStep = useCallback(() => engine.resetStep(), [engine]);
54
54
  const restart = useCallback(() => engine.restart(), [engine]);
@@ -143,7 +143,10 @@ export function useField(field) {
143
143
  * />
144
144
  * ```
145
145
  */
146
- export const PathShell = forwardRef(function PathShell({ path: pathDef, engine: externalEngine, steps, initialData = {}, autoStart = true, onComplete, onCancel, onEvent, backLabel = "Previous", nextLabel = "Next", completeLabel = "Complete", loadingLabel, cancelLabel = "Cancel", hideCancel = false, hideProgress = false, hideFooter = false, footerLayout = "auto", className, renderHeader, renderFooter, validationDisplay = "summary", progressLayout = "merged", services, validateWhen = false, }, ref) {
146
+ export const PathShell = forwardRef(function PathShell({ path: pathDef, engine: externalEngine, steps, initialData = {}, restoreKey, autoStart = true, onComplete, onCancel, onEvent, backLabel = "Previous", nextLabel = "Next", completeLabel = "Complete", loadingLabel, cancelLabel = "Cancel", hideCancel = false, hideProgress = false, hideFooter = false, layout = "auto", className, renderHeader, renderFooter, validationDisplay = "summary", progressLayout = "merged", services, validateWhen = false, completionContent, }, ref) {
147
+ // Read the outer PathShell's context BEFORE providing our own. Used for
148
+ // restoreKey: the outer context is null when this is a top-level shell.
149
+ const outerCtx = useContext(PathContext);
147
150
  const pathReturn = usePath({
148
151
  engine: externalEngine,
149
152
  onEvent(event) {
@@ -152,6 +155,10 @@ export const PathShell = forwardRef(function PathShell({ path: pathDef, engine:
152
155
  onComplete?.(event.data);
153
156
  if (event.type === "cancelled")
154
157
  onCancel?.(event.data);
158
+ // Auto-sync inner snapshot to the parent shell's data under restoreKey.
159
+ if (restoreKey && outerCtx && event.type === "stateChanged") {
160
+ outerCtx.path.setData(restoreKey, event.snapshot);
161
+ }
155
162
  }
156
163
  });
157
164
  const { snapshot, start, next, previous, cancel, goToStep, goToStepChecked, setData, restart, retry, suspend, validate } = pathReturn;
@@ -168,7 +175,20 @@ export const PathShell = forwardRef(function PathShell({ path: pathDef, engine:
168
175
  useEffect(() => {
169
176
  if (autoStart && !startedRef.current && !externalEngine) {
170
177
  startedRef.current = true;
171
- start(pathDef, initialData);
178
+ let startData = initialData;
179
+ let restoreStepId;
180
+ if (restoreKey && outerCtx) {
181
+ const stored = outerCtx.path.snapshot?.data[restoreKey];
182
+ if (stored != null && typeof stored === "object" && "stepId" in stored) {
183
+ startData = stored.data;
184
+ if (stored.stepIndex > 0)
185
+ restoreStepId = stored.stepId;
186
+ }
187
+ }
188
+ const p = start(pathDef, startData);
189
+ if (restoreStepId) {
190
+ Promise.resolve(p).then(() => goToStep(restoreStepId));
191
+ }
172
192
  }
173
193
  // eslint-disable-next-line react-hooks/exhaustive-deps
174
194
  }, []);
@@ -180,6 +200,8 @@ export const PathShell = forwardRef(function PathShell({ path: pathDef, engine:
180
200
  ? ((snapshot.formId ? steps[snapshot.formId] : undefined) ?? steps[snapshot.stepId] ?? null)
181
201
  : null;
182
202
  const contextValue = { path: pathReturn, services: services ?? null };
203
+ const effectiveHideProgress = hideProgress || layout === "tabs";
204
+ const effectiveHideFooter = hideFooter || layout === "tabs";
183
205
  if (!snapshot) {
184
206
  return createElement(PathContext.Provider, { value: contextValue }, createElement("div", { className: cls("pw-shell", className) }, createElement("div", { className: "pw-shell__empty" }, createElement("p", null, "No active path."), !autoStart && createElement("button", {
185
207
  type: "button",
@@ -187,14 +209,22 @@ export const PathShell = forwardRef(function PathShell({ path: pathDef, engine:
187
209
  onClick: () => start(pathDef, initialData)
188
210
  }, "Start"))));
189
211
  }
212
+ if (snapshot.status === "completed") {
213
+ const showCompletionProgress = !effectiveHideProgress && snapshot.stepCount > 1;
214
+ return createElement(PathContext.Provider, { value: contextValue }, createElement("div", { className: cls("pw-shell", className) }, showCompletionProgress && defaultHeader(snapshot), createElement("div", { className: "pw-shell__body" }, completionContent ?? createElement("div", { className: "pw-shell__completion" }, createElement("p", { className: "pw-shell__completion-message" }, "All done."), createElement("button", {
215
+ type: "button",
216
+ className: "pw-shell__completion-restart",
217
+ onClick: () => restart(),
218
+ }, "Start over")))));
219
+ }
190
220
  const actions = {
191
221
  next, previous, cancel, goToStep, goToStepChecked, setData,
192
222
  restart: () => restart(),
193
223
  retry: () => retry(),
194
224
  suspend: () => suspend(),
195
225
  };
196
- const showRoot = !hideProgress && !!snapshot.rootProgress && progressLayout !== "activeOnly";
197
- const showActive = !hideProgress && (renderHeader
226
+ const showRoot = !effectiveHideProgress && !!snapshot.rootProgress && progressLayout !== "activeOnly";
227
+ const showActive = !effectiveHideProgress && (renderHeader
198
228
  ? true
199
229
  : (snapshot.stepCount > 1 || snapshot.nestingLevel > 0) && progressLayout !== "rootOnly");
200
230
  return createElement(PathContext.Provider, { value: contextValue }, createElement("div", { className: cls("pw-shell", progressLayout !== "merged" && `pw-shell--progress-${progressLayout}`, className) },
@@ -217,11 +247,11 @@ export const PathShell = forwardRef(function PathShell({ path: pathDef, engine:
217
247
  snapshot.status === "error" && snapshot.error
218
248
  ? defaultErrorPanel(snapshot, actions)
219
249
  // Footer — navigation buttons
220
- : !hideFooter
250
+ : !effectiveHideFooter
221
251
  ? renderFooter
222
252
  ? renderFooter(snapshot, actions)
223
253
  : defaultFooter(snapshot, actions, {
224
- backLabel, nextLabel, completeLabel, loadingLabel, cancelLabel, hideCancel, footerLayout
254
+ backLabel, nextLabel, completeLabel, loadingLabel, cancelLabel, hideCancel, layout
225
255
  })
226
256
  : null));
227
257
  });
@@ -275,9 +305,9 @@ function defaultErrorPanel(snapshot, actions) {
275
305
  }
276
306
  function defaultFooter(snapshot, actions, labels) {
277
307
  // Auto-detect layout: single-step top-level paths use "form", everything else uses "wizard"
278
- const resolvedLayout = labels.footerLayout === "auto"
308
+ const resolvedLayout = labels.layout === "auto" || labels.layout === "tabs"
279
309
  ? (snapshot.stepCount === 1 && snapshot.nestingLevel === 0 ? "form" : "wizard")
280
- : labels.footerLayout;
310
+ : labels.layout;
281
311
  const isFormMode = resolvedLayout === "form";
282
312
  return createElement("div", { className: "pw-shell__footer" }, createElement("div", { className: "pw-shell__footer-left" },
283
313
  // Form mode: Cancel on the left
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@daltonr/pathwrite-react",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "React adapter for @daltonr/pathwrite-core — hooks, context provider, and optional <PathShell> default UI.",
@@ -46,7 +46,7 @@
46
46
  "react": ">=18.0.0"
47
47
  },
48
48
  "dependencies": {
49
- "@daltonr/pathwrite-core": "^0.11.0"
49
+ "@daltonr/pathwrite-core": "^0.12.0"
50
50
  },
51
51
  "devDependencies": {
52
52
  "react": "^18.3.1",
package/src/index.ts CHANGED
@@ -55,10 +55,10 @@ export interface UsePathReturn<TData extends PathData = PathData> {
55
55
  previous: () => void;
56
56
  /** Cancel the active path (or sub-path). */
57
57
  cancel: () => void;
58
- /** Jump directly to a step by ID. Calls onLeave / onEnter but bypasses guards and shouldSkip. */
59
- goToStep: (stepId: string) => void;
58
+ /** Jump directly to a step by ID. Calls onLeave / onEnter but bypasses guards and shouldSkip. Pass `{ validateOnLeave: true }` to mark the departing step as attempted before navigating, so inline errors are visible if the user returns to it. */
59
+ goToStep: (stepId: string, options?: { validateOnLeave?: boolean }) => void;
60
60
  /** Jump directly to a step by ID, checking the current step's canMoveNext (forward) or canMovePrevious (backward) guard first. Navigation is blocked if the guard returns false. */
61
- goToStepChecked: (stepId: string) => void;
61
+ goToStepChecked: (stepId: string, options?: { validateOnLeave?: boolean }) => void;
62
62
  /** Update a single data value; triggers a re-render via stateChanged. When `TData` is specified, `key` and `value` are type-checked against your data shape. */
63
63
  setData: <K extends string & keyof TData>(key: K, value: TData[K]) => void;
64
64
  /** Reset the current step's data to what it was when the step was entered. Useful for "Clear" or "Reset" buttons. */
@@ -134,7 +134,7 @@ export function usePath<TData extends PathData = PathData>(options?: UsePathOpti
134
134
  if (event.type === "stateChanged" || event.type === "resumed") {
135
135
  snapshotRef.current = event.snapshot as PathSnapshot<TData>;
136
136
  } else if (event.type === "completed" || event.type === "cancelled") {
137
- snapshotRef.current = null;
137
+ snapshotRef.current = engine.snapshot() as PathSnapshot<TData> | null;
138
138
  }
139
139
  onEventRef.current?.(event);
140
140
  callback();
@@ -164,12 +164,12 @@ export function usePath<TData extends PathData = PathData>(options?: UsePathOpti
164
164
  const cancel = useCallback(() => engine.cancel(), [engine]);
165
165
 
166
166
  const goToStep = useCallback(
167
- (stepId: string) => engine.goToStep(stepId),
167
+ (stepId: string, options?: { validateOnLeave?: boolean }) => engine.goToStep(stepId, options),
168
168
  [engine]
169
169
  );
170
170
 
171
171
  const goToStepChecked = useCallback(
172
- (stepId: string) => engine.goToStepChecked(stepId),
172
+ (stepId: string, options?: { validateOnLeave?: boolean }) => engine.goToStepChecked(stepId, options),
173
173
  [engine]
174
174
  );
175
175
 
@@ -299,8 +299,25 @@ export interface PathShellProps {
299
299
  engine?: PathEngine;
300
300
  /** Map of step ID → content. The shell renders `steps[snapshot.stepId]` for the current step. */
301
301
  steps: Record<string, ReactNode>;
302
- /** Initial data passed to `engine.start()`. */
302
+ /** Initial data passed to `engine.start()`. Used on first visit. Overridden by a stored snapshot when `restoreKey` is set. */
303
303
  initialData?: PathData;
304
+ /**
305
+ * When set, this shell automatically saves its state into the nearest outer `PathShell`'s
306
+ * data under this key on every change, and restores from that stored state on remount.
307
+ *
308
+ * Use this for nested shells (e.g. a tabbed inner shell inside a wizard step) so that
309
+ * navigating away and back preserves both the inner data and the active tab:
310
+ *
311
+ * ```tsx
312
+ * <PathShell path={detailsPath} restoreKey="details" initialData={DETAILS_INITIAL} ... />
313
+ * ```
314
+ *
315
+ * The outer path stores a full `PathSnapshot` under `data[restoreKey]`. Later steps in
316
+ * the outer path can read inner field values via `data.details?.data.fieldName`.
317
+ *
318
+ * No-op when used on a top-level shell with no outer `PathShell` ancestor.
319
+ */
320
+ restoreKey?: string;
304
321
  /** If true, the path is started automatically on mount. Defaults to `true`. */
305
322
  autoStart?: boolean;
306
323
  /** Called when the path completes. Receives the final data. */
@@ -328,12 +345,13 @@ export interface PathShellProps {
328
345
  /** When true, calls `validate()` on the engine 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`. */
329
346
  validateWhen?: boolean;
330
347
  /**
331
- * Footer layout mode:
348
+ * Shell layout mode:
332
349
  * - `"auto"` (default): Uses "form" for single-step top-level paths, "wizard" otherwise.
333
- * - `"wizard"`: Back button on left, Cancel and Submit together on right.
334
- * - `"form"`: Cancel on left, Submit alone on right. Back button never shown.
350
+ * - `"wizard"`: Progress header + Back button on left, Cancel and Submit together on right.
351
+ * - `"form"`: Progress header + Cancel on left, Submit alone on right. Back button never shown.
352
+ * - `"tabs"`: No progress header, no footer. Use for tabbed interfaces with a custom tab bar inside the step body.
335
353
  */
336
- footerLayout?: "wizard" | "form" | "auto";
354
+ layout?: "wizard" | "form" | "auto" | "tabs";
337
355
  /** Optional extra CSS class on the root element. */
338
356
  className?: string;
339
357
  /** Render prop to replace the entire header (progress area). Receives the snapshot. */
@@ -371,6 +389,17 @@ export interface PathShellProps {
371
389
  * ```
372
390
  */
373
391
  services?: unknown;
392
+ /**
393
+ * Content to render when `snapshot.status === "completed"` (i.e. after the
394
+ * path finishes with `completionBehaviour: "stayOnFinal"`).
395
+ *
396
+ * When provided, the shell replaces the step body with this content. If
397
+ * omitted, a default "All done." panel is shown with a Restart button.
398
+ *
399
+ * Has no effect when `completionBehaviour` is `"dismiss"` or `"reset"`,
400
+ * since those modes never produce a `"completed"` snapshot.
401
+ */
402
+ completionContent?: ReactNode;
374
403
  }
375
404
 
376
405
  export interface PathShellHandle {
@@ -382,8 +411,8 @@ export interface PathShellActions {
382
411
  next: () => void;
383
412
  previous: () => void;
384
413
  cancel: () => void;
385
- goToStep: (stepId: string) => void;
386
- goToStepChecked: (stepId: string) => void;
414
+ goToStep: (stepId: string, options?: { validateOnLeave?: boolean }) => void;
415
+ goToStepChecked: (stepId: string, options?: { validateOnLeave?: boolean }) => void;
387
416
  setData: (key: string, value: unknown) => void;
388
417
  /** Restart the shell's current path with its current `initialData`. */
389
418
  restart: () => void;
@@ -414,6 +443,7 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
414
443
  engine: externalEngine,
415
444
  steps,
416
445
  initialData = {},
446
+ restoreKey,
417
447
  autoStart = true,
418
448
  onComplete,
419
449
  onCancel,
@@ -426,7 +456,7 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
426
456
  hideCancel = false,
427
457
  hideProgress = false,
428
458
  hideFooter = false,
429
- footerLayout = "auto",
459
+ layout = "auto",
430
460
  className,
431
461
  renderHeader,
432
462
  renderFooter,
@@ -434,13 +464,24 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
434
464
  progressLayout = "merged",
435
465
  services,
436
466
  validateWhen = false,
467
+ completionContent,
437
468
  }: PathShellProps, ref): ReactElement {
469
+ // Read the outer PathShell's context BEFORE providing our own. Used for
470
+ // restoreKey: the outer context is null when this is a top-level shell.
471
+ const outerCtx = useContext(PathContext);
472
+
438
473
  const pathReturn = usePath({
439
474
  engine: externalEngine,
440
475
  onEvent(event) {
441
476
  onEvent?.(event);
442
477
  if (event.type === "completed") onComplete?.(event.data);
443
478
  if (event.type === "cancelled") onCancel?.(event.data);
479
+ // Auto-sync inner snapshot to the parent shell's data under restoreKey.
480
+ if (restoreKey && outerCtx && event.type === "stateChanged") {
481
+ (outerCtx.path.setData as unknown as (key: string, value: unknown) => void)(
482
+ restoreKey, event.snapshot
483
+ );
484
+ }
444
485
  }
445
486
  });
446
487
 
@@ -460,7 +501,19 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
460
501
  useEffect(() => {
461
502
  if (autoStart && !startedRef.current && !externalEngine) {
462
503
  startedRef.current = true;
463
- start(pathDef, initialData);
504
+ let startData: PathData = initialData;
505
+ let restoreStepId: string | undefined;
506
+ if (restoreKey && outerCtx) {
507
+ const stored = outerCtx.path.snapshot?.data[restoreKey] as PathSnapshot | undefined;
508
+ if (stored != null && typeof stored === "object" && "stepId" in stored) {
509
+ startData = stored.data as PathData;
510
+ if (stored.stepIndex > 0) restoreStepId = stored.stepId as string;
511
+ }
512
+ }
513
+ const p = start(pathDef, startData);
514
+ if (restoreStepId) {
515
+ Promise.resolve(p).then(() => goToStep(restoreStepId!));
516
+ }
464
517
  }
465
518
  // eslint-disable-next-line react-hooks/exhaustive-deps
466
519
  }, []);
@@ -475,6 +528,9 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
475
528
 
476
529
  const contextValue: PathContextValue = { path: pathReturn, services: services ?? null };
477
530
 
531
+ const effectiveHideProgress = hideProgress || layout === "tabs";
532
+ const effectiveHideFooter = hideFooter || layout === "tabs";
533
+
478
534
  if (!snapshot) {
479
535
  return createElement(PathContext.Provider, { value: contextValue },
480
536
  createElement("div", { className: cls("pw-shell", className) },
@@ -490,6 +546,25 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
490
546
  );
491
547
  }
492
548
 
549
+ if (snapshot.status === "completed") {
550
+ const showCompletionProgress = !effectiveHideProgress && snapshot.stepCount > 1;
551
+ return createElement(PathContext.Provider, { value: contextValue },
552
+ createElement("div", { className: cls("pw-shell", className) },
553
+ showCompletionProgress && defaultHeader(snapshot),
554
+ createElement("div", { className: "pw-shell__body" },
555
+ completionContent ?? createElement("div", { className: "pw-shell__completion" },
556
+ createElement("p", { className: "pw-shell__completion-message" }, "All done."),
557
+ createElement("button", {
558
+ type: "button",
559
+ className: "pw-shell__completion-restart",
560
+ onClick: () => restart(),
561
+ }, "Start over")
562
+ )
563
+ )
564
+ )
565
+ );
566
+ }
567
+
493
568
  const actions: PathShellActions = {
494
569
  next, previous, cancel, goToStep, goToStepChecked, setData,
495
570
  restart: () => restart(),
@@ -497,8 +572,8 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
497
572
  suspend: () => suspend(),
498
573
  };
499
574
 
500
- const showRoot = !hideProgress && !!snapshot.rootProgress && progressLayout !== "activeOnly";
501
- const showActive = !hideProgress && (renderHeader
575
+ const showRoot = !effectiveHideProgress && !!snapshot.rootProgress && progressLayout !== "activeOnly";
576
+ const showActive = !effectiveHideProgress && (renderHeader
502
577
  ? true
503
578
  : (snapshot.stepCount > 1 || snapshot.nestingLevel > 0) && progressLayout !== "rootOnly");
504
579
 
@@ -537,11 +612,11 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
537
612
  snapshot.status === "error" && snapshot.error
538
613
  ? defaultErrorPanel(snapshot, actions)
539
614
  // Footer — navigation buttons
540
- : !hideFooter
615
+ : !effectiveHideFooter
541
616
  ? renderFooter
542
617
  ? renderFooter(snapshot, actions)
543
618
  : defaultFooter(snapshot, actions, {
544
- backLabel, nextLabel, completeLabel, loadingLabel, cancelLabel, hideCancel, footerLayout
619
+ backLabel, nextLabel, completeLabel, loadingLabel, cancelLabel, hideCancel, layout
545
620
  })
546
621
  : null
547
622
  )
@@ -660,7 +735,7 @@ interface FooterLabels {
660
735
  loadingLabel?: string;
661
736
  cancelLabel: string;
662
737
  hideCancel: boolean;
663
- footerLayout: "wizard" | "form" | "auto";
738
+ layout: "wizard" | "form" | "auto" | "tabs";
664
739
  }
665
740
 
666
741
  function defaultFooter(
@@ -669,9 +744,9 @@ function defaultFooter(
669
744
  labels: FooterLabels
670
745
  ): ReactElement {
671
746
  // Auto-detect layout: single-step top-level paths use "form", everything else uses "wizard"
672
- const resolvedLayout = labels.footerLayout === "auto"
747
+ const resolvedLayout = labels.layout === "auto" || labels.layout === "tabs"
673
748
  ? (snapshot.stepCount === 1 && snapshot.nestingLevel === 0 ? "form" : "wizard")
674
- : labels.footerLayout;
749
+ : labels.layout;
675
750
 
676
751
  const isFormMode = resolvedLayout === "form";
677
752