@daltonr/pathwrite-react 0.10.1 → 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. */
@@ -53,6 +57,8 @@ export interface UsePathReturn<TData extends PathData = PathData> {
53
57
  * listens for to dismiss the wizard UI. All state and data are preserved.
54
58
  */
55
59
  suspend: () => void;
60
+ /** Trigger inline validation on all steps without navigating. Sets `snapshot.hasValidated`. */
61
+ validate: () => void;
56
62
  }
57
63
  export type PathProviderProps = PropsWithChildren<{
58
64
  /** Forwarded to the internal usePath hook. */
@@ -128,8 +134,25 @@ export interface PathShellProps {
128
134
  engine?: PathEngine;
129
135
  /** Map of step ID → content. The shell renders `steps[snapshot.stepId]` for the current step. */
130
136
  steps: Record<string, ReactNode>;
131
- /** 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. */
132
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;
133
156
  /** If true, the path is started automatically on mount. Defaults to `true`. */
134
157
  autoStart?: boolean;
135
158
  /** Called when the path completes. Receives the final data. */
@@ -152,13 +175,18 @@ export interface PathShellProps {
152
175
  hideCancel?: boolean;
153
176
  /** If true, hide the progress indicator. Also hidden automatically when the path has only one step. Defaults to `false`. */
154
177
  hideProgress?: boolean;
178
+ /** If true, hide the footer (navigation buttons). Defaults to `false`. The error panel is still shown on async failure regardless of this prop. */
179
+ hideFooter?: boolean;
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`. */
181
+ validateWhen?: boolean;
155
182
  /**
156
- * Footer layout mode:
183
+ * Shell layout mode:
157
184
  * - `"auto"` (default): Uses "form" for single-step top-level paths, "wizard" otherwise.
158
- * - `"wizard"`: Back button on left, Cancel and Submit together on right.
159
- * - `"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.
160
188
  */
161
- footerLayout?: "wizard" | "form" | "auto";
189
+ layout?: "wizard" | "form" | "auto" | "tabs";
162
190
  /** Optional extra CSS class on the root element. */
163
191
  className?: string;
164
192
  /** Render prop to replace the entire header (progress area). Receives the snapshot. */
@@ -196,6 +224,17 @@ export interface PathShellProps {
196
224
  * ```
197
225
  */
198
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;
199
238
  }
200
239
  export interface PathShellHandle {
201
240
  /** Restart the shell's current path with its original `initialData`, without unmounting. */
@@ -205,8 +244,12 @@ export interface PathShellActions {
205
244
  next: () => void;
206
245
  previous: () => void;
207
246
  cancel: () => void;
208
- goToStep: (stepId: string) => void;
209
- goToStepChecked: (stepId: string) => void;
247
+ goToStep: (stepId: string, options?: {
248
+ validateOnLeave?: boolean;
249
+ }) => void;
250
+ goToStepChecked: (stepId: string, options?: {
251
+ validateOnLeave?: boolean;
252
+ }) => void;
210
253
  setData: (key: string, value: unknown) => void;
211
254
  /** Restart the shell's current path with its current `initialData`. */
212
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,14 +47,15 @@ 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]);
55
55
  const retry = useCallback(() => engine.retry(), [engine]);
56
56
  const suspend = useCallback(() => engine.suspend(), [engine]);
57
- return { snapshot, start, startSubPath, next, previous, cancel, goToStep, goToStepChecked, setData, resetStep, restart, retry, suspend };
57
+ const validate = useCallback(() => engine.validate(), [engine]);
58
+ return { snapshot, start, startSubPath, next, previous, cancel, goToStep, goToStepChecked, setData, resetStep, restart, retry, suspend, validate };
58
59
  }
59
60
  const PathContext = createContext(null);
60
61
  /**
@@ -142,7 +143,10 @@ export function useField(field) {
142
143
  * />
143
144
  * ```
144
145
  */
145
- 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, footerLayout = "auto", className, renderHeader, renderFooter, validationDisplay = "summary", progressLayout = "merged", services, }, 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);
146
150
  const pathReturn = usePath({
147
151
  engine: externalEngine,
148
152
  onEvent(event) {
@@ -151,9 +155,17 @@ export const PathShell = forwardRef(function PathShell({ path: pathDef, engine:
151
155
  onComplete?.(event.data);
152
156
  if (event.type === "cancelled")
153
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
+ }
154
162
  }
155
163
  });
156
- const { snapshot, start, next, previous, cancel, goToStep, goToStepChecked, setData, restart, retry, suspend } = pathReturn;
164
+ const { snapshot, start, next, previous, cancel, goToStep, goToStepChecked, setData, restart, retry, suspend, validate } = pathReturn;
165
+ useEffect(() => {
166
+ if (validateWhen)
167
+ validate();
168
+ }, [validateWhen, validate]);
157
169
  useImperativeHandle(ref, () => ({
158
170
  restart: () => restart(),
159
171
  }));
@@ -163,7 +175,20 @@ export const PathShell = forwardRef(function PathShell({ path: pathDef, engine:
163
175
  useEffect(() => {
164
176
  if (autoStart && !startedRef.current && !externalEngine) {
165
177
  startedRef.current = true;
166
- 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
+ }
167
192
  }
168
193
  // eslint-disable-next-line react-hooks/exhaustive-deps
169
194
  }, []);
@@ -175,6 +200,8 @@ export const PathShell = forwardRef(function PathShell({ path: pathDef, engine:
175
200
  ? ((snapshot.formId ? steps[snapshot.formId] : undefined) ?? steps[snapshot.stepId] ?? null)
176
201
  : null;
177
202
  const contextValue = { path: pathReturn, services: services ?? null };
203
+ const effectiveHideProgress = hideProgress || layout === "tabs";
204
+ const effectiveHideFooter = hideFooter || layout === "tabs";
178
205
  if (!snapshot) {
179
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", {
180
207
  type: "button",
@@ -182,14 +209,22 @@ export const PathShell = forwardRef(function PathShell({ path: pathDef, engine:
182
209
  onClick: () => start(pathDef, initialData)
183
210
  }, "Start"))));
184
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
+ }
185
220
  const actions = {
186
221
  next, previous, cancel, goToStep, goToStepChecked, setData,
187
222
  restart: () => restart(),
188
223
  retry: () => retry(),
189
224
  suspend: () => suspend(),
190
225
  };
191
- const showRoot = !hideProgress && !!snapshot.rootProgress && progressLayout !== "activeOnly";
192
- const showActive = !hideProgress && (renderHeader
226
+ const showRoot = !effectiveHideProgress && !!snapshot.rootProgress && progressLayout !== "activeOnly";
227
+ const showActive = !effectiveHideProgress && (renderHeader
193
228
  ? true
194
229
  : (snapshot.stepCount > 1 || snapshot.nestingLevel > 0) && progressLayout !== "rootOnly");
195
230
  return createElement(PathContext.Provider, { value: contextValue }, createElement("div", { className: cls("pw-shell", progressLayout !== "merged" && `pw-shell--progress-${progressLayout}`, className) },
@@ -202,21 +237,23 @@ export const PathShell = forwardRef(function PathShell({ path: pathDef, engine:
202
237
  // Body — step content
203
238
  createElement("div", { className: "pw-shell__body" }, stepContent),
204
239
  // Validation messages — suppressed when validationDisplay="inline"
205
- validationDisplay !== "inline" && snapshot.hasAttemptedNext && Object.keys(snapshot.fieldErrors).length > 0 && createElement("ul", { className: "pw-shell__validation" }, ...Object.entries(snapshot.fieldErrors).map(([key, msg]) => createElement("li", { key, className: "pw-shell__validation-item" }, key !== "_" && createElement("span", { className: "pw-shell__validation-label" }, formatFieldKey(key)), msg))),
240
+ validationDisplay !== "inline" && (snapshot.hasAttemptedNext || snapshot.hasValidated) && Object.keys(snapshot.fieldErrors).length > 0 && createElement("ul", { className: "pw-shell__validation" }, ...Object.entries(snapshot.fieldErrors).map(([key, msg]) => createElement("li", { key, className: "pw-shell__validation-item" }, key !== "_" && createElement("span", { className: "pw-shell__validation-label" }, formatFieldKey(key)), msg))),
206
241
  // Warning messages — non-blocking, shown immediately (no hasAttemptedNext gate)
207
242
  validationDisplay !== "inline" && Object.keys(snapshot.fieldWarnings).length > 0 && createElement("ul", { className: "pw-shell__warnings" }, ...Object.entries(snapshot.fieldWarnings).map(([key, msg]) => createElement("li", { key, className: "pw-shell__warnings-item" }, key !== "_" && createElement("span", { className: "pw-shell__warnings-label" }, formatFieldKey(key)), msg))),
208
243
  // Blocking error — guard returned { allowed: false, reason }
209
- validationDisplay !== "inline" && snapshot.hasAttemptedNext && snapshot.blockingError &&
244
+ validationDisplay !== "inline" && (snapshot.hasAttemptedNext || snapshot.hasValidated) && snapshot.blockingError &&
210
245
  createElement("p", { className: "pw-shell__blocking-error" }, snapshot.blockingError),
211
246
  // Error panel — replaces footer when an async operation has failed
212
247
  snapshot.status === "error" && snapshot.error
213
248
  ? defaultErrorPanel(snapshot, actions)
214
249
  // Footer — navigation buttons
215
- : renderFooter
216
- ? renderFooter(snapshot, actions)
217
- : defaultFooter(snapshot, actions, {
218
- backLabel, nextLabel, completeLabel, loadingLabel, cancelLabel, hideCancel, footerLayout
219
- })));
250
+ : !effectiveHideFooter
251
+ ? renderFooter
252
+ ? renderFooter(snapshot, actions)
253
+ : defaultFooter(snapshot, actions, {
254
+ backLabel, nextLabel, completeLabel, loadingLabel, cancelLabel, hideCancel, layout
255
+ })
256
+ : null));
220
257
  });
221
258
  // ---------------------------------------------------------------------------
222
259
  // Root progress (compact top-level bar visible during sub-paths)
@@ -268,9 +305,9 @@ function defaultErrorPanel(snapshot, actions) {
268
305
  }
269
306
  function defaultFooter(snapshot, actions, labels) {
270
307
  // Auto-detect layout: single-step top-level paths use "form", everything else uses "wizard"
271
- const resolvedLayout = labels.footerLayout === "auto"
308
+ const resolvedLayout = labels.layout === "auto" || labels.layout === "tabs"
272
309
  ? (snapshot.stepCount === 1 && snapshot.nestingLevel === 0 ? "form" : "wizard")
273
- : labels.footerLayout;
310
+ : labels.layout;
274
311
  const isFormMode = resolvedLayout === "form";
275
312
  return createElement("div", { className: "pw-shell__footer" }, createElement("div", { className: "pw-shell__footer-left" },
276
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.10.1",
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.10.1"
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. */
@@ -80,6 +80,8 @@ export interface UsePathReturn<TData extends PathData = PathData> {
80
80
  * listens for to dismiss the wizard UI. All state and data are preserved.
81
81
  */
82
82
  suspend: () => void;
83
+ /** Trigger inline validation on all steps without navigating. Sets `snapshot.hasValidated`. */
84
+ validate: () => void;
83
85
  }
84
86
 
85
87
  export type PathProviderProps = PropsWithChildren<{
@@ -132,7 +134,7 @@ export function usePath<TData extends PathData = PathData>(options?: UsePathOpti
132
134
  if (event.type === "stateChanged" || event.type === "resumed") {
133
135
  snapshotRef.current = event.snapshot as PathSnapshot<TData>;
134
136
  } else if (event.type === "completed" || event.type === "cancelled") {
135
- snapshotRef.current = null;
137
+ snapshotRef.current = engine.snapshot() as PathSnapshot<TData> | null;
136
138
  }
137
139
  onEventRef.current?.(event);
138
140
  callback();
@@ -162,12 +164,12 @@ export function usePath<TData extends PathData = PathData>(options?: UsePathOpti
162
164
  const cancel = useCallback(() => engine.cancel(), [engine]);
163
165
 
164
166
  const goToStep = useCallback(
165
- (stepId: string) => engine.goToStep(stepId),
167
+ (stepId: string, options?: { validateOnLeave?: boolean }) => engine.goToStep(stepId, options),
166
168
  [engine]
167
169
  );
168
170
 
169
171
  const goToStepChecked = useCallback(
170
- (stepId: string) => engine.goToStepChecked(stepId),
172
+ (stepId: string, options?: { validateOnLeave?: boolean }) => engine.goToStepChecked(stepId, options),
171
173
  [engine]
172
174
  );
173
175
 
@@ -184,7 +186,9 @@ export function usePath<TData extends PathData = PathData>(options?: UsePathOpti
184
186
 
185
187
  const suspend = useCallback(() => engine.suspend(), [engine]);
186
188
 
187
- return { snapshot, start, startSubPath, next, previous, cancel, goToStep, goToStepChecked, setData, resetStep, restart, retry, suspend };
189
+ const validate = useCallback(() => engine.validate(), [engine]);
190
+
191
+ return { snapshot, start, startSubPath, next, previous, cancel, goToStep, goToStepChecked, setData, resetStep, restart, retry, suspend, validate };
188
192
  }
189
193
 
190
194
  // ---------------------------------------------------------------------------
@@ -295,8 +299,25 @@ export interface PathShellProps {
295
299
  engine?: PathEngine;
296
300
  /** Map of step ID → content. The shell renders `steps[snapshot.stepId]` for the current step. */
297
301
  steps: Record<string, ReactNode>;
298
- /** 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. */
299
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;
300
321
  /** If true, the path is started automatically on mount. Defaults to `true`. */
301
322
  autoStart?: boolean;
302
323
  /** Called when the path completes. Receives the final data. */
@@ -319,13 +340,18 @@ export interface PathShellProps {
319
340
  hideCancel?: boolean;
320
341
  /** If true, hide the progress indicator. Also hidden automatically when the path has only one step. Defaults to `false`. */
321
342
  hideProgress?: boolean;
343
+ /** If true, hide the footer (navigation buttons). Defaults to `false`. The error panel is still shown on async failure regardless of this prop. */
344
+ hideFooter?: boolean;
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`. */
346
+ validateWhen?: boolean;
322
347
  /**
323
- * Footer layout mode:
348
+ * Shell layout mode:
324
349
  * - `"auto"` (default): Uses "form" for single-step top-level paths, "wizard" otherwise.
325
- * - `"wizard"`: Back button on left, Cancel and Submit together on right.
326
- * - `"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.
327
353
  */
328
- footerLayout?: "wizard" | "form" | "auto";
354
+ layout?: "wizard" | "form" | "auto" | "tabs";
329
355
  /** Optional extra CSS class on the root element. */
330
356
  className?: string;
331
357
  /** Render prop to replace the entire header (progress area). Receives the snapshot. */
@@ -363,6 +389,17 @@ export interface PathShellProps {
363
389
  * ```
364
390
  */
365
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;
366
403
  }
367
404
 
368
405
  export interface PathShellHandle {
@@ -374,8 +411,8 @@ export interface PathShellActions {
374
411
  next: () => void;
375
412
  previous: () => void;
376
413
  cancel: () => void;
377
- goToStep: (stepId: string) => void;
378
- goToStepChecked: (stepId: string) => void;
414
+ goToStep: (stepId: string, options?: { validateOnLeave?: boolean }) => void;
415
+ goToStepChecked: (stepId: string, options?: { validateOnLeave?: boolean }) => void;
379
416
  setData: (key: string, value: unknown) => void;
380
417
  /** Restart the shell's current path with its current `initialData`. */
381
418
  restart: () => void;
@@ -406,6 +443,7 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
406
443
  engine: externalEngine,
407
444
  steps,
408
445
  initialData = {},
446
+ restoreKey,
409
447
  autoStart = true,
410
448
  onComplete,
411
449
  onCancel,
@@ -417,24 +455,41 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
417
455
  cancelLabel = "Cancel",
418
456
  hideCancel = false,
419
457
  hideProgress = false,
420
- footerLayout = "auto",
458
+ hideFooter = false,
459
+ layout = "auto",
421
460
  className,
422
461
  renderHeader,
423
462
  renderFooter,
424
463
  validationDisplay = "summary",
425
464
  progressLayout = "merged",
426
465
  services,
466
+ validateWhen = false,
467
+ completionContent,
427
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
+
428
473
  const pathReturn = usePath({
429
474
  engine: externalEngine,
430
475
  onEvent(event) {
431
476
  onEvent?.(event);
432
477
  if (event.type === "completed") onComplete?.(event.data);
433
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
+ }
434
485
  }
435
486
  });
436
487
 
437
- const { snapshot, start, next, previous, cancel, goToStep, goToStepChecked, setData, restart, retry, suspend } = pathReturn;
488
+ const { snapshot, start, next, previous, cancel, goToStep, goToStepChecked, setData, restart, retry, suspend, validate } = pathReturn;
489
+
490
+ useEffect(() => {
491
+ if (validateWhen) validate();
492
+ }, [validateWhen, validate]);
438
493
 
439
494
  useImperativeHandle(ref, () => ({
440
495
  restart: () => restart(),
@@ -446,7 +501,19 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
446
501
  useEffect(() => {
447
502
  if (autoStart && !startedRef.current && !externalEngine) {
448
503
  startedRef.current = true;
449
- 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
+ }
450
517
  }
451
518
  // eslint-disable-next-line react-hooks/exhaustive-deps
452
519
  }, []);
@@ -461,6 +528,9 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
461
528
 
462
529
  const contextValue: PathContextValue = { path: pathReturn, services: services ?? null };
463
530
 
531
+ const effectiveHideProgress = hideProgress || layout === "tabs";
532
+ const effectiveHideFooter = hideFooter || layout === "tabs";
533
+
464
534
  if (!snapshot) {
465
535
  return createElement(PathContext.Provider, { value: contextValue },
466
536
  createElement("div", { className: cls("pw-shell", className) },
@@ -476,6 +546,25 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
476
546
  );
477
547
  }
478
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
+
479
568
  const actions: PathShellActions = {
480
569
  next, previous, cancel, goToStep, goToStepChecked, setData,
481
570
  restart: () => restart(),
@@ -483,8 +572,8 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
483
572
  suspend: () => suspend(),
484
573
  };
485
574
 
486
- const showRoot = !hideProgress && !!snapshot.rootProgress && progressLayout !== "activeOnly";
487
- const showActive = !hideProgress && (renderHeader
575
+ const showRoot = !effectiveHideProgress && !!snapshot.rootProgress && progressLayout !== "activeOnly";
576
+ const showActive = !effectiveHideProgress && (renderHeader
488
577
  ? true
489
578
  : (snapshot.stepCount > 1 || snapshot.nestingLevel > 0) && progressLayout !== "rootOnly");
490
579
 
@@ -499,7 +588,7 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
499
588
  // Body — step content
500
589
  createElement("div", { className: "pw-shell__body" }, stepContent),
501
590
  // Validation messages — suppressed when validationDisplay="inline"
502
- validationDisplay !== "inline" && snapshot.hasAttemptedNext && Object.keys(snapshot.fieldErrors).length > 0 && createElement("ul", { className: "pw-shell__validation" },
591
+ validationDisplay !== "inline" && (snapshot.hasAttemptedNext || snapshot.hasValidated) && Object.keys(snapshot.fieldErrors).length > 0 && createElement("ul", { className: "pw-shell__validation" },
503
592
  ...Object.entries(snapshot.fieldErrors).map(([key, msg]) =>
504
593
  createElement("li", { key, className: "pw-shell__validation-item" },
505
594
  key !== "_" && createElement("span", { className: "pw-shell__validation-label" }, formatFieldKey(key)),
@@ -517,17 +606,19 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
517
606
  )
518
607
  ),
519
608
  // Blocking error — guard returned { allowed: false, reason }
520
- validationDisplay !== "inline" && snapshot.hasAttemptedNext && snapshot.blockingError &&
609
+ validationDisplay !== "inline" && (snapshot.hasAttemptedNext || snapshot.hasValidated) && snapshot.blockingError &&
521
610
  createElement("p", { className: "pw-shell__blocking-error" }, snapshot.blockingError),
522
611
  // Error panel — replaces footer when an async operation has failed
523
612
  snapshot.status === "error" && snapshot.error
524
613
  ? defaultErrorPanel(snapshot, actions)
525
614
  // Footer — navigation buttons
526
- : renderFooter
527
- ? renderFooter(snapshot, actions)
528
- : defaultFooter(snapshot, actions, {
529
- backLabel, nextLabel, completeLabel, loadingLabel, cancelLabel, hideCancel, footerLayout
530
- })
615
+ : !effectiveHideFooter
616
+ ? renderFooter
617
+ ? renderFooter(snapshot, actions)
618
+ : defaultFooter(snapshot, actions, {
619
+ backLabel, nextLabel, completeLabel, loadingLabel, cancelLabel, hideCancel, layout
620
+ })
621
+ : null
531
622
  )
532
623
  );
533
624
  });
@@ -644,7 +735,7 @@ interface FooterLabels {
644
735
  loadingLabel?: string;
645
736
  cancelLabel: string;
646
737
  hideCancel: boolean;
647
- footerLayout: "wizard" | "form" | "auto";
738
+ layout: "wizard" | "form" | "auto" | "tabs";
648
739
  }
649
740
 
650
741
  function defaultFooter(
@@ -653,9 +744,9 @@ function defaultFooter(
653
744
  labels: FooterLabels
654
745
  ): ReactElement {
655
746
  // Auto-detect layout: single-step top-level paths use "form", everything else uses "wizard"
656
- const resolvedLayout = labels.footerLayout === "auto"
747
+ const resolvedLayout = labels.layout === "auto" || labels.layout === "tabs"
657
748
  ? (snapshot.stepCount === 1 && snapshot.nestingLevel === 0 ? "form" : "wizard")
658
- : labels.footerLayout;
749
+ : labels.layout;
659
750
 
660
751
  const isFormMode = resolvedLayout === "form";
661
752