@rilaykit/workflow 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,72 +1,21 @@
1
- RilayKit Workflow Commercial License
1
+ MIT License
2
2
 
3
3
  Copyright (c) 2025 AND YOU CREATE
4
4
 
5
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
-
7
- 1. DEFINITIONS
8
-
9
- "License" refers to the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
10
-
11
- "Software" refers to the RilayKit Workflow package and any associated documentation files.
12
-
13
- "Commercial Use" means any use of the Software that is primarily intended for or directed toward commercial advantage or monetary compensation.
14
-
15
- "Non-Commercial Use" means use of the Software for educational, research, personal, or other non-commercial purposes.
16
-
17
- 2. GRANT OF RIGHTS
18
-
19
- This Software requires a valid commercial license for ANY use. Without a valid license, the Software will display watermarks and licensing notices that cannot be removed.
20
-
21
- COMMERCIAL LICENSE REQUIRED: All use of this Software requires a valid commercial license. Contact license@andyoucreate.com to obtain a commercial license.
22
-
23
- 3. LICENSING AND WATERMARKS
24
-
25
- The Software will display watermarks and licensing notices in both the user interface and console when used without a valid commercial license. These watermarks cannot be removed or disabled without a proper license.
26
-
27
- Commercial licenses are available at:
28
-
29
- Website: https://rilay.io/pricing
30
- Email: license@andyoucreate.com
31
-
32
- 4. RESTRICTIONS
33
-
34
- You may NOT:
35
- - Use the Software without a valid commercial license
36
- - Remove or alter any copyright notices, license terms, or watermarks
37
- - Distribute the Software as part of any product without a license
38
- - Reverse engineer, decompile, or disassemble the Software
39
- - Use the Software to create competing workflow libraries
40
- - Attempt to bypass, remove, or disable the licensing watermarks
41
-
42
- 5. ATTRIBUTION
43
-
44
- You must retain all copyright notices and this license in all copies or substantial portions of the Software.
45
-
46
- 6. DISCLAIMER OF WARRANTY
47
-
48
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
49
-
50
- 7. LIMITATION OF LIABILITY
51
-
52
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
53
-
54
- 8. TERMINATION
55
-
56
- This License and the rights granted hereunder will terminate automatically if you fail to comply with the terms herein. Upon termination, you must cease all use of the Software and destroy all copies.
57
-
58
- 9. CONTACT INFORMATION
59
-
60
- For commercial licensing inquiries:
61
- Email: license@andyoucreate.com
62
- Website: https://rilay.io
63
-
64
- For technical support:
65
- Email: support@andyoucreate.com
66
- GitHub: https://github.com/andyoucreate/rilay
67
-
68
- ---
69
-
70
- This license allows free use for non-commercial purposes while requiring a commercial license for business use. For detailed pricing and licensing options, please visit https://rilay.io/pricing or contact us directly.
71
-
72
- Last updated: June 2025
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,299 @@
1
+ # @rilaykit/workflow
2
+
3
+ The multi-step workflow engine for [RilayKit](https://rilay.dev) — build complex, production-ready wizard flows with navigation, persistence, analytics, and plugins.
4
+
5
+ `@rilaykit/workflow` extends `@rilaykit/forms` with a real workflow engine: step navigation with guards, auto-persistence to any storage backend, analytics tracking, cross-step conditions, and a plugin system for reusable behavior.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ # pnpm (recommended)
11
+ pnpm add @rilaykit/core @rilaykit/forms @rilaykit/workflow
12
+
13
+ # npm
14
+ npm install @rilaykit/core @rilaykit/forms @rilaykit/workflow
15
+
16
+ # yarn
17
+ yarn add @rilaykit/core @rilaykit/forms @rilaykit/workflow
18
+
19
+ # bun
20
+ bun add @rilaykit/core @rilaykit/forms @rilaykit/workflow
21
+ ```
22
+
23
+ > `@rilaykit/core` and `@rilaykit/forms` are required peer dependencies.
24
+
25
+ ### Requirements
26
+
27
+ - React >= 18
28
+ - React DOM >= 18
29
+
30
+ ## Quick Start
31
+
32
+ ### 1. Define Step Forms
33
+
34
+ ```tsx
35
+ import { required, email, minLength } from '@rilaykit/core';
36
+
37
+ const accountForm = rilay.form('account')
38
+ .add({
39
+ id: 'email',
40
+ type: 'input',
41
+ props: { label: 'Email' },
42
+ validation: { validate: [required(), email()] },
43
+ })
44
+ .add({
45
+ id: 'password',
46
+ type: 'input',
47
+ props: { label: 'Password', type: 'password' },
48
+ validation: { validate: [required(), minLength(8)] },
49
+ });
50
+
51
+ const profileForm = rilay.form('profile')
52
+ .add(
53
+ { id: 'firstName', type: 'input', props: { label: 'First Name' } },
54
+ { id: 'lastName', type: 'input', props: { label: 'Last Name' } },
55
+ );
56
+ ```
57
+
58
+ ### 2. Build the Workflow
59
+
60
+ ```tsx
61
+ import { LocalStorageAdapter } from '@rilaykit/workflow';
62
+
63
+ const onboarding = rilay
64
+ .flow('onboarding', 'User Onboarding')
65
+ .addStep({
66
+ id: 'account',
67
+ title: 'Create Account',
68
+ formConfig: accountForm,
69
+ })
70
+ .addStep({
71
+ id: 'profile',
72
+ title: 'Your Profile',
73
+ formConfig: profileForm,
74
+ allowSkip: true,
75
+ })
76
+ .configure({
77
+ persistence: {
78
+ adapter: new LocalStorageAdapter({ maxAge: 7 * 24 * 60 * 60 * 1000 }),
79
+ options: { autoPersist: true, debounceMs: 500 },
80
+ },
81
+ analytics: {
82
+ onStepComplete: (stepId, duration) => {
83
+ trackEvent('step_complete', { stepId, duration });
84
+ },
85
+ onWorkflowComplete: (id, totalTime) => {
86
+ trackEvent('workflow_complete', { id, totalTime });
87
+ },
88
+ },
89
+ });
90
+ ```
91
+
92
+ ### 3. Render It
93
+
94
+ ```tsx
95
+ import {
96
+ Workflow,
97
+ WorkflowBody,
98
+ WorkflowStepper,
99
+ WorkflowNextButton,
100
+ WorkflowPreviousButton,
101
+ } from '@rilaykit/workflow';
102
+
103
+ function OnboardingFlow() {
104
+ const handleComplete = (data: Record<string, unknown>) => {
105
+ console.log('Workflow complete:', data);
106
+ };
107
+
108
+ return (
109
+ <Workflow workflowConfig={onboarding} onComplete={handleComplete}>
110
+ <WorkflowStepper />
111
+ <WorkflowBody />
112
+ <div>
113
+ <WorkflowPreviousButton />
114
+ <WorkflowNextButton />
115
+ </div>
116
+ </Workflow>
117
+ );
118
+ }
119
+ ```
120
+
121
+ ## Features
122
+
123
+ ### Fluent Workflow Builder
124
+
125
+ Chainable API for defining multi-step flows with step-level configuration.
126
+
127
+ ```tsx
128
+ const flow = rilay
129
+ .flow('checkout', 'Checkout Flow')
130
+ .addStep({ id: 'cart', title: 'Review Cart', formConfig: cartForm })
131
+ .addStep({ id: 'shipping', title: 'Shipping', formConfig: shippingForm })
132
+ .addStep({ id: 'payment', title: 'Payment', formConfig: paymentForm })
133
+ .configure({ persistence: { ... }, analytics: { ... } })
134
+ .use(myPlugin);
135
+ ```
136
+
137
+ ### Step Navigation
138
+
139
+ Navigation with validation guards — users can't advance until the current step validates. Steps can be optional with `allowSkip: true`.
140
+
141
+ ```tsx
142
+ .addStep({
143
+ id: 'profile',
144
+ title: 'Your Profile',
145
+ formConfig: profileForm,
146
+ allowSkip: true,
147
+ })
148
+ ```
149
+
150
+ ### Cross-Step Conditions
151
+
152
+ Use `when('stepId.fieldId')` to reference fields from other steps. Steps can be conditionally visible or skippable.
153
+
154
+ ```tsx
155
+ import { when } from '@rilaykit/core';
156
+
157
+ .addStep({
158
+ id: 'business-details',
159
+ title: 'Business Details',
160
+ formConfig: businessForm,
161
+ conditions: {
162
+ visible: when('account.accountType').equals('business'),
163
+ },
164
+ })
165
+ ```
166
+
167
+ ### Pre-fill Next Steps
168
+
169
+ Use `onAfterValidation` to pre-populate fields in upcoming steps based on current step data.
170
+
171
+ ```tsx
172
+ .addStep({
173
+ id: 'account',
174
+ title: 'Account',
175
+ formConfig: accountForm,
176
+ onAfterValidation: (stepData, helper) => {
177
+ helper.setNextStepValue('profile', 'email', stepData.email);
178
+ },
179
+ })
180
+ ```
181
+
182
+ ### Persistence
183
+
184
+ Auto-save workflow state to any storage backend through an adapter interface. Ships with `LocalStorageAdapter`, and you can implement your own for Supabase, your API, or any backend.
185
+
186
+ ```tsx
187
+ import { LocalStorageAdapter } from '@rilaykit/workflow';
188
+
189
+ .configure({
190
+ persistence: {
191
+ adapter: new LocalStorageAdapter({
192
+ prefix: 'rilay-',
193
+ maxAge: 7 * 24 * 60 * 60 * 1000, // 7 days
194
+ }),
195
+ options: {
196
+ autoPersist: true,
197
+ debounceMs: 500,
198
+ storageKey: 'onboarding-v1',
199
+ },
200
+ },
201
+ })
202
+ ```
203
+
204
+ **Custom adapter interface:**
205
+
206
+ ```tsx
207
+ interface WorkflowPersistenceAdapter {
208
+ save(key: string, data: unknown): Promise<void>;
209
+ load(key: string): Promise<unknown | null>;
210
+ remove(key: string): Promise<void>;
211
+ exists(key: string): Promise<boolean>;
212
+ listKeys?(): Promise<string[]>;
213
+ clear?(): Promise<void>;
214
+ }
215
+ ```
216
+
217
+ ### Analytics
218
+
219
+ Track step completions, drop-offs, time per step, and errors with callback hooks.
220
+
221
+ ```tsx
222
+ .configure({
223
+ analytics: {
224
+ onStepComplete: (stepId, duration) => { ... },
225
+ onStepSkip: (stepId) => { ... },
226
+ onWorkflowComplete: (id, totalTime) => { ... },
227
+ onError: (stepId, error) => { ... },
228
+ },
229
+ })
230
+ ```
231
+
232
+ ### Plugin System
233
+
234
+ Encapsulate reusable cross-cutting behavior with plugins. Plugins support dependency declaration.
235
+
236
+ ```tsx
237
+ const loggingPlugin = {
238
+ name: 'logging',
239
+ onStepEnter: (stepId) => console.log(`Entering ${stepId}`),
240
+ onStepLeave: (stepId) => console.log(`Leaving ${stepId}`),
241
+ };
242
+
243
+ const flow = rilay
244
+ .flow('checkout', 'Checkout')
245
+ .use(loggingPlugin);
246
+ ```
247
+
248
+ ### Headless React Components
249
+
250
+ | Component | Description |
251
+ |-----------|-------------|
252
+ | `<Workflow>` | Main wrapper — manages context and state |
253
+ | `<WorkflowProvider>` | Context provider (used separately when needed) |
254
+ | `<WorkflowBody>` | Renders the current step's form |
255
+ | `<WorkflowStepper>` | Progress indicator / step navigation |
256
+ | `<WorkflowNextButton>` | Advance to next step (or submit on last step) |
257
+ | `<WorkflowPreviousButton>` | Go back to previous step |
258
+ | `<WorkflowSkipButton>` | Skip the current step |
259
+
260
+ ### Hooks
261
+
262
+ | Hook | Description |
263
+ |------|-------------|
264
+ | `useWorkflowContext()` | Full workflow context |
265
+ | `useWorkflowState()` | Current workflow state |
266
+ | `useWorkflowNavigation()` | Navigation actions (next, previous, goTo) |
267
+ | `useWorkflowConditions()` | Evaluated step conditions |
268
+ | `useWorkflowSubmission()` | Submission state and handlers |
269
+ | `useWorkflowAnalytics()` | Analytics tracking |
270
+ | `useConditionEvaluation()` | Condition evaluation utilities |
271
+ | `usePersistence()` | Persistence state and actions |
272
+ | `useStepMetadata()` | Current step metadata |
273
+
274
+ ## Architecture
275
+
276
+ ```
277
+ @rilaykit/core (registry, types, validation, conditions)
278
+
279
+ @rilaykit/forms (form builder + React components)
280
+
281
+ @rilaykit/workflow ← you are here
282
+ ```
283
+
284
+ ## Documentation
285
+
286
+ Full documentation at [rilay.dev](https://rilay.dev):
287
+
288
+ - [Building Workflows](https://rilay.dev/workflow/building-workflows)
289
+ - [Rendering Workflows](https://rilay.dev/workflow/rendering-workflows)
290
+ - [Navigation](https://rilay.dev/workflow/navigation)
291
+ - [Persistence](https://rilay.dev/workflow/persistence)
292
+ - [Analytics](https://rilay.dev/workflow/analytics)
293
+ - [Plugins](https://rilay.dev/workflow/plugins)
294
+ - [Advanced Workflows](https://rilay.dev/workflow/advanced-workflows)
295
+ - [API Reference](https://rilay.dev/api)
296
+
297
+ ## License
298
+
299
+ MIT — see [LICENSE](./LICENSE) for details.
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { ril, FormConfiguration, CustomStepRenderer, StepConditionalBehavior, StepDataHelper, WorkflowContext, WorkflowAnalytics, WorkflowPlugin, StepConfig, WorkflowConfig, ConditionalBehavior, ComponentRendererBaseProps, WorkflowNextButtonRendererProps, WorkflowPreviousButtonRendererProps, WorkflowSkipButtonRendererProps, WorkflowStepperRendererProps } from '@rilaykit/core';
1
+ import { FormConfiguration, CustomStepRenderer, StepConditionalBehavior, StepDataHelper, WorkflowContext, ril, WorkflowAnalytics, WorkflowPlugin, StepConfig, WorkflowConfig, ConditionalBehavior, ComponentRendererBaseProps, WorkflowNextButtonRendererProps, WorkflowPreviousButtonRendererProps, WorkflowSkipButtonRendererProps, WorkflowStepperRendererProps } from '@rilaykit/core';
2
2
  import { form } from '@rilaykit/forms';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import * as React$1 from 'react';
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ril, FormConfiguration, CustomStepRenderer, StepConditionalBehavior, StepDataHelper, WorkflowContext, WorkflowAnalytics, WorkflowPlugin, StepConfig, WorkflowConfig, ConditionalBehavior, ComponentRendererBaseProps, WorkflowNextButtonRendererProps, WorkflowPreviousButtonRendererProps, WorkflowSkipButtonRendererProps, WorkflowStepperRendererProps } from '@rilaykit/core';
1
+ import { FormConfiguration, CustomStepRenderer, StepConditionalBehavior, StepDataHelper, WorkflowContext, ril, WorkflowAnalytics, WorkflowPlugin, StepConfig, WorkflowConfig, ConditionalBehavior, ComponentRendererBaseProps, WorkflowNextButtonRendererProps, WorkflowPreviousButtonRendererProps, WorkflowSkipButtonRendererProps, WorkflowStepperRendererProps } from '@rilaykit/core';
2
2
  import { form } from '@rilaykit/forms';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import * as React$1 from 'react';
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- 'use strict';var core=require('@rilaykit/core'),forms=require('@rilaykit/forms'),Dt=require('react'),zustand=require('zustand'),middleware=require('zustand/middleware'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Dt__default=/*#__PURE__*/_interopDefault(Dt);var J=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new core.IdGenerator;this.config=e,this.workflowId=r,this.workflowName=n,this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){return {id:e.id||this.idGenerator.next("step"),title:e.title,description:e.description,formConfig:e.formConfig instanceof forms.form?e.formConfig.build():e.formConfig,allowSkip:e.allowSkip||false,renderer:e.renderer,conditions:e.conditions,metadata:e.metadata,onAfterValidation:e.onAfterValidation}}addStep(e){let r=core.normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}configure(e){return e.analytics&&(this.analytics=e.analytics),e.persistence&&(this.persistenceConfig=e.persistence),this}use(e){this.validatePluginDependencies(e),this.plugins.push(e);try{e.install(this);}catch(r){throw new Error(`Failed to install plugin "${e.name}": ${r instanceof Error?r.message:String(r)}`)}return this}validatePluginDependencies(e){if(!e.dependencies)return;let r=e.dependencies.filter(n=>!this.plugins.some(i=>i.name===n));if(r.length>0)throw new Error(`Plugin "${e.name}" requires missing dependencies: ${r.join(", ")}`)}removePlugin(e){return this.plugins=this.plugins.filter(r=>r.name!==e),this}updateStep(e,r){let n=this.steps.findIndex(i=>i.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[n]={...this.steps[n],...r},this}addStepConditions(e,r){let n=this.steps.findIndex(s=>s.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);let i={...this.steps[n].conditions,...r};return this.steps[n]={...this.steps[n],conditions:i},this}removeStep(e){return this.steps=this.steps.filter(r=>r.id!==e),this}getStep(e){return this.steps.find(r=>r.id===e)}getSteps(){return [...this.steps]}clearSteps(){return this.steps=[],this.idGenerator.reset(),this}clone(e,r){let n=new t(this.config,e||`${this.workflowId}-clone`,r||this.workflowName);return n.steps=core.deepClone(this.steps),n.analytics=this.analytics?core.deepClone(this.analytics):void 0,n.persistenceConfig=this.persistenceConfig?core.deepClone(this.persistenceConfig):void 0,n.plugins=[...this.plugins],n}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let r=this.steps.map(n=>n.id);try{core.ensureUnique(r,"step");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of this.plugins)if(n.dependencies){let i=n.dependencies.filter(s=>!this.plugins.some(p=>p.name===s));i.length>0&&e.push(`Plugin "${n.name}" requires missing dependencies: ${i.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((n,i)=>n+i.formConfig.allFields.length,0),r=this.steps.map(n=>n.formConfig.allFields.length);return {totalSteps:this.steps.length,totalFields:e,averageFieldsPerStep:this.steps.length>0?e/this.steps.length:0,maxFieldsInStep:r.length>0?Math.max(...r):0,minFieldsInStep:r.length>0?Math.min(...r):0,hasAnalytics:!!this.analytics}}build(){let e=this.validate();if(e.length>0)throw new Error(`Workflow validation failed: ${e.join(", ")}`);return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins,renderConfig:this.config.getWorkflowRenderConfig()}}toJSON(){return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins.map(e=>({name:e.name,version:e.version}))}}fromJSON(e){return this.workflowId=e.workflowId,this.workflowName=e.workflowName,this.workflowDescription=e.workflowDescription,this.steps=e.steps,this.analytics=e.analytics,this.persistenceConfig=e.persistence,this.plugins=e.plugins||[],this}};function le(t,e={},r={}){return Dt.useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let n=i=>{try{let s;return i&&typeof i=="object"&&"build"in i?s=i.build():s=i,core.evaluateCondition(s,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:t.visible?n(t.visible):true,disabled:t.disabled?n(t.disabled):false,required:t.required?n(t.required):false,readonly:t.readonly?n(t.readonly):false}},[t,e,r])}function Fe(t,e={}){return Dt.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},i){let s=p=>{try{return p&&typeof p=="object"&&"build"in p?core.evaluateCondition(p.build(),e):core.evaluateCondition(p,e)}catch(o){return console.warn(`Error evaluating condition for field ${n}:`,o),false}};r[n]={visible:i.visible?s(i.visible):true,disabled:i.disabled?s(i.disabled):false,required:i.required?s(i.required):false,readonly:i.readonly?s(i.readonly):false};}return r},[t,e])}function Be(t,e={}){return Dt.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let s=Number.parseInt(n,10);if(r[s]={visible:true,disabled:false,required:false,readonly:false},i){let p=o=>{try{return o&&typeof o=="object"&&"build"in o?core.evaluateCondition(o.build(),e):core.evaluateCondition(o,e)}catch(f){return console.warn(`Error evaluating condition for step ${s}:`,f),false}};r[s]={visible:i.visible?p(i.visible):true,disabled:i.disabled?p(i.disabled):false,required:i.required?p(i.required):false,readonly:i.readonly?p(i.readonly):false};}}return r},[t,e])}var E=class extends Error{constructor(r,n,i){super(`[WorkflowPersistence] ${r} (Code: ${n})`);this.code=n;this.cause=i;this.name="WorkflowPersistenceError";}};function pe(t,e,r){return {workflowId:t,currentStepIndex:e.currentStepIndex,allData:{...e.allData},stepData:{...e.stepData},visitedSteps:Array.from(e.visitedSteps),passedSteps:Array.from(e.passedSteps),lastSaved:Date.now(),metadata:r}}function Me(t){return {currentStepIndex:t.currentStepIndex,allData:{...t.allData},stepData:{...t.stepData},visitedSteps:new Set(t.visitedSteps),passedSteps:new Set(t.passedSteps||[]),isSubmitting:false,isTransitioning:false}}function it(t){if(!t||typeof t!="object")return false;let e=["workflowId","currentStepIndex","allData","stepData","visitedSteps","lastSaved"];for(let r of e)if(!(r in t))return false;return !(typeof t.workflowId!="string"||typeof t.currentStepIndex!="number"||typeof t.allData!="object"||typeof t.stepData!="object"||!Array.isArray(t.visitedSteps)||typeof t.lastSaved!="number")}function de(t,e){return e?`${e}:${t}`:t}function ue(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function st(t,e,r="persist"){let n=Me(e);switch(r){case "persist":return {...n,isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};case "current":return {...t,visitedSteps:new Set([...t.visitedSteps,...n.visitedSteps]),passedSteps:new Set([...t.passedSteps,...n.passedSteps||[]])};case "merge":return {currentStepIndex:t.currentStepIndex,allData:{...n.allData,...t.allData},stepData:{...n.stepData,...t.stepData},visitedSteps:new Set([...n.visitedSteps,...t.visitedSteps]),passedSteps:new Set([...n.passedSteps||[],...t.passedSteps]),isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};default:return n}}function $({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[s,p]=Dt.useState(false),[o,f]=Dt.useState(null),[d,b]=Dt.useState(false),c=Dt.useRef(r),l=Dt.useRef(n),a=Dt.useRef({hasPendingChanges:false});Dt.useEffect(()=>{c.current=r,l.current=n;},[r,n]);let y=de(l.current.storageKey||t,i),k=Dt.useCallback(()=>{f(null);},[]),P=Dt.useCallback((u,D)=>{let I=u instanceof E?u:new E(`${D} failed: ${u.message}`,"OPERATION_FAILED",u);f(I),console.error("[WorkflowPersistence]",I);},[]),w=Dt.useCallback(async u=>{k(),p(true);try{let D=pe(t,u,l.current.metadata);await c.current.save(y,D),a.current.lastSavedState={...u},a.current.hasPendingChanges=!1;}catch(D){throw P(D,"Save"),D}finally{p(false);}},[t,y,k,P]),x=Dt.useRef(ue(async u=>{try{await w(u);}catch(D){console.debug("[WorkflowPersistence] Auto-save failed:",D);}},n.debounceMs||500)),h=Dt.useCallback((u,D)=>D?u.currentStepIndex!==D.currentStepIndex||JSON.stringify(u.allData)!==JSON.stringify(D.allData)||JSON.stringify(u.stepData)!==JSON.stringify(D.stepData)||u.visitedSteps.size!==D.visitedSteps.size||!Array.from(u.visitedSteps).every(I=>D.visitedSteps.has(I)):true,[]),m=Dt.useCallback(async()=>{k(),b(true);try{let u=await c.current.load(y);return u&&(a.current.lastSavedState={currentStepIndex:u.currentStepIndex,allData:u.allData,stepData:u.stepData,visitedSteps:new Set(u.visitedSteps),passedSteps:new Set(u.passedSteps||[]),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},a.current.hasPendingChanges=!1),u}catch(u){return P(u,"Load"),null}finally{setTimeout(()=>b(false),100);}},[y,k,P]),W=Dt.useCallback(async()=>{k();try{await c.current.remove(y),a.current.lastSavedState=void 0,a.current.hasPendingChanges=!1;}catch(u){throw P(u,"Clear"),u}},[y,k,P]),L=Dt.useCallback(async()=>{try{return await c.current.exists(y)}catch(u){return P(u,"Exists check"),false}},[y,P]);Dt.useEffect(()=>{l.current.autoPersist&&(s||d||e.isInitializing||e.isSubmitting||e.isTransitioning||h(e,a.current.lastSavedState)&&(a.current.hasPendingChanges=true,x.current(e)));},[e,s,d,h]);let S=Dt.useCallback(async()=>{await w(e);},[w,e]);return {isPersisting:s,persistenceError:o,persistNow:S,loadPersistedData:m,clearPersistedData:W,hasPersistedData:L}}function ot(){let{workflowConfig:t,currentStep:e}=V(),r=Dt.useMemo(()=>e?.metadata,[e?.metadata]),n=Dt.useMemo(()=>d=>t.steps.find(c=>c.id===d)?.metadata,[t.steps]),i=Dt.useMemo(()=>d=>t.steps[d]?.metadata,[t.steps]),s=Dt.useMemo(()=>d=>r?d in r:false,[r]),p=Dt.useMemo(()=>(d,b)=>r&&d in r?r[d]:b,[r]),o=Dt.useMemo(()=>()=>t.steps.map((d,b)=>({id:d.id,title:d.title,index:b,metadata:d.metadata})),[t.steps]),f=Dt.useMemo(()=>d=>t.steps.map((b,c)=>({step:b,index:c})).filter(({step:b,index:c})=>d(b.metadata,b.id,c)).map(({step:b})=>b.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:s,getCurrentValue:p,getAllStepsMetadata:o,findStepsByMetadata:f}}function fe({workflowConfig:t,workflowState:e,workflowContext:r}){let n=Dt.useRef(Date.now()),i=Dt.useRef(new Map),s=Dt.useRef(false),p=Dt.useRef(null),o=core.getGlobalMonitor();Dt.useEffect(()=>{t.analytics?.onWorkflowStart&&!s.current&&(s.current=true,t.analytics.onWorkflowStart(t.id,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"start",totalSteps:t.steps.length},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:0,navigationDuration:0,conditionEvaluationDuration:0},"low"));},[t.id,t.analytics,r,o,t.steps.length]),Dt.useEffect(()=>{let l=t.steps[e.currentStepIndex];if(l&&p.current!==l.id){if(p.current&&t.analytics?.onStepComplete){let a=i.current.get(p.current);if(a){let y=Date.now()-a;t.analytics.onStepComplete(p.current,y,e.stepData,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:p.current,duration:y},{timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:y,conditionEvaluationDuration:0},"low");}}p.current=l.id,i.current.set(l.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(l.id,Date.now(),r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:l.id,stepIndex:e.currentStepIndex},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:0},"low");}},[e.currentStepIndex,t.steps,t.analytics,r,e.stepData,o,t.id]);let f=Dt.useCallback((l,a)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(l,a,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:l,reason:a},void 0,"medium");},[t.analytics,r,o,t.id]),d=Dt.useCallback(l=>{t.analytics?.onError&&t.analytics.onError(l,r),o&&o.trackError(l,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,o,t.id,e.currentStepIndex,t.steps]),b=Dt.useCallback((l,a,y)=>{if(!o)return;let k={timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:a,navigationDuration:y,conditionEvaluationDuration:0};o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:l,toStep:a,direction:a>l?"forward":"backward"},k,y>1e3?"medium":"low");},[o,t.id,t.steps.length]),c=Dt.useCallback((l,a)=>{if(!o)return;let y={timestamp:Date.now(),duration:l,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:l};o.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:a,currentStepIndex:e.currentStepIndex},y,l>100?"medium":"low");},[o,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:f,trackError:d,trackNavigation:b,trackConditionEvaluation:c}}function te(t,e=""){let r={};for(let n in t)if(n in t){let i=t[n],s=e?`${e}.${n}`:n;i!==null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)?Object.assign(r,te(i,s)):r[s]=i;}return r}function Se(t,e){let r=te(t),n=te(e);return {...{...t,...e},...r,...n}}function Ue(t,e){return {visible:t.visible,skippable:e===true||t.required}}function me({workflowConfig:t,workflowState:e,currentStep:r}){let n=Dt.useMemo(()=>Se(e.allData,e.stepData),[e.allData,e.stepData]),i=Dt.useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),s=le(i,n,{visible:true,disabled:false,required:false,readonly:false}),p=Dt.useMemo(()=>Ue(s,r?.allowSkip),[s,r?.allowSkip]),o=Dt.useMemo(()=>{let x={};return t.steps.forEach((h,m)=>{h.conditions&&(x[m]={visible:h.conditions.visible,required:h.conditions.skippable});}),x},[t.steps]),f=Be(o,n),d=Dt.useMemo(()=>{let x={};return t.steps.forEach((h,m)=>{let W=f[m];W?x[m]=Ue(W,h.allowSkip):x[m]={visible:true,skippable:h.allowSkip===true};}),x},[t.steps,f]),b=Dt.useMemo(()=>{if(!r?.formConfig?.allFields)return {};let x={};for(let h of r.formConfig.allFields)h.conditions&&(x[h.id]=h.conditions);return x},[r?.formConfig?.allFields]),c=Fe(b,n),l=Dt.useCallback(x=>x<0||x>=t.steps.length?false:d[x]?.visible??true,[d,t.steps.length]),a=Dt.useCallback(x=>x<0||x>=t.steps.length?false:d[x]?.skippable??false,[d,t.steps.length]),y=Dt.useCallback(x=>c[x]?.visible??true,[c]),k=Dt.useCallback(x=>c[x]?.disabled??false,[c]),P=Dt.useCallback(x=>c[x]?.required??false,[c]),w=Dt.useCallback(x=>c[x]?.readonly??false,[c]);return {stepConditions:p,fieldConditions:c,allStepConditions:d,isStepVisible:l,isStepSkippable:a,isFieldVisible:y,isFieldDisabled:k,isFieldRequired:P,isFieldReadonly:w}}function ge({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:s,markStepVisited:p,markStepPassed:o,setStepData:f,onStepChange:d}){let b=Dt.useRef(d);b.current=d;let c=t.steps[e.currentStepIndex],l=Dt.useCallback(()=>({setStepData:(S,u)=>{f(u,S);},setStepFields:(S,u)=>{let I={...e.allData[S]||{},...u};f(I,S);},getStepData:S=>e.allData[S]||{},setNextStepField:(S,u)=>{let D=e.currentStepIndex+1;if(D<t.steps.length){let I=t.steps[D].id,A={...e.allData[I]||{},[S]:u};f(A,I);}},setNextStepFields:S=>{let u=e.currentStepIndex+1;if(u<t.steps.length){let D=t.steps[u].id,O={...e.allData[D]||{},...S};f(O,D);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,f]),a=Dt.useCallback(async S=>{if(S<0||S>=t.steps.length||!n.isStepVisible(S))return false;s(true);try{return b.current&&b.current(e.currentStepIndex,S,r),i(S),p(S,t.steps[S].id),!0}catch(u){return console.error("Step transition failed:",u),t.analytics?.onError&&t.analytics.onError(u,r),false}finally{s(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,s,i,p]),y=Dt.useCallback(S=>{for(let u=S+1;u<t.steps.length;u++)if(n.isStepVisible(u))return u;return null},[t.steps.length,n]),k=Dt.useCallback(S=>{for(let u=S-1;u>=0;u--)if(n.isStepVisible(u))return u;return null},[n]),P=Dt.useCallback(async()=>{if(c?.onAfterValidation)try{let u=l();await c.onAfterValidation(e.stepData,u,r);}catch(u){return console.error("onAfterValidation failed:",u),t.analytics?.onError&&t.analytics.onError(u,r),false}o(c.id);let S=y(e.currentStepIndex);return S===null?false:a(S)},[c,l,e.stepData,r,t.analytics,e.currentStepIndex,y,a,o]),w=Dt.useCallback(async()=>{let S=k(e.currentStepIndex);return S===null?false:a(S)},[e.currentStepIndex,k,a]),x=Dt.useCallback(async()=>!c?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(c.id,"user_skip",r),P()),[c,n,e.currentStepIndex,t.analytics,r,P]),h=Dt.useCallback(S=>S<0||S>=t.steps.length?false:n.isStepVisible(S),[t.steps.length,n]),m=Dt.useCallback(()=>{let S=y(e.currentStepIndex);return S!==null&&h(S)},[e.currentStepIndex,y,h]),W=Dt.useCallback(()=>{let S=k(e.currentStepIndex);return S!==null&&h(S)},[e.currentStepIndex,k,h]),L=Dt.useCallback(()=>c?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[c?.allowSkip,n,e.currentStepIndex]);return {goToStep:a,goNext:P,goPrevious:w,skipStep:x,canGoToStep:h,canGoNext:m,canGoPrevious:W,canSkipCurrentStep:L}}function dt(t,e){switch(e.type){case "SET_CURRENT_STEP":return {...t,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":return {...t,stepData:e.data,allData:{...t.allData,[e.stepId]:e.data}};case "SET_ALL_DATA":return {...t,allData:e.data};case "SET_FIELD_VALUE":{let r={...t.stepData,[e.fieldId]:e.value};return {...t,stepData:r,allData:{...t.allData,[e.stepId]:r}}}case "SET_SUBMITTING":return {...t,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...t,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...t,visitedSteps:new Set([...t.visitedSteps,e.stepId])};case "MARK_STEP_PASSED":return {...t,passedSteps:new Set([...t.passedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false};case "LOAD_PERSISTED_STATE":return {...t,...e.state};case "SET_INITIALIZATION_COMPLETE":return {...t,isInitializing:false};default:return t}}function ut({defaultValues:t={},defaultStepIndex:e,workflowSteps:r,persistence:n}){let i=Dt.useMemo(()=>{let m=new Set;if(e&&e>0&&r)for(let W=0;W<e;W++)r[W]&&m.add(r[W].id);return m},[e,r]),s=Dt.useMemo(()=>{let m=new Set;if(e&&e>0&&r)for(let W=0;W<e;W++)r[W]&&m.add(r[W].id);return m},[e,r]),p={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:i,passedSteps:s,isSubmitting:false,isTransitioning:false,isInitializing:true},[o,f]=Dt.useReducer(dt,p),d=n?.adapter?$({workflowId:n.workflowId,workflowState:o,adapter:n.adapter,options:n.options,userId:n.userId}):null,b=Dt.useCallback(m=>{f({type:"SET_CURRENT_STEP",stepIndex:m});},[]),c=Dt.useCallback((m,W)=>{f({type:"SET_STEP_DATA",data:m,stepId:W});},[]),l=Dt.useCallback((m,W,L)=>{f({type:"SET_FIELD_VALUE",fieldId:m,value:W,stepId:L});},[]),a=Dt.useCallback(m=>{f({type:"SET_SUBMITTING",isSubmitting:m});},[]),y=Dt.useCallback(m=>{f({type:"SET_TRANSITIONING",isTransitioning:m});},[]),k=Dt.useCallback((m,W)=>{f({type:"MARK_STEP_VISITED",stepIndex:m,stepId:W});},[]),P=Dt.useCallback(m=>{f({type:"MARK_STEP_PASSED",stepId:m});},[]),w=Dt.useCallback(()=>{f({type:"RESET_WORKFLOW"});},[]),x=Dt.useCallback(()=>{f({type:"SET_INITIALIZATION_COMPLETE"});},[]),h=Dt.useCallback(async()=>{if(!d)return x(),false;try{let m=await d.loadPersistedData();if(m){let W={currentStepIndex:m.currentStepIndex,allData:m.allData,stepData:m.stepData,visitedSteps:new Set(m.visitedSteps),passedSteps:new Set(m.passedSteps||[])};return f({type:"LOAD_PERSISTED_STATE",state:W}),x(),!0}}catch(m){console.error("Failed to load persisted state:",m);}return x(),false},[d,x]);return {workflowState:o,setCurrentStep:b,setStepData:c,setFieldValue:l,setSubmitting:a,setTransitioning:y,markStepVisited:k,markStepPassed:P,resetWorkflow:w,loadPersistedState:h,persistence:d?{isPersisting:d.isPersisting,persistenceError:d.persistenceError,persistNow:d.persistNow,clearPersistedData:d.clearPersistedData,hasPersistedData:d.hasPersistedData}:null}}function be({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:s}){let p=Dt.useRef(i);p.current=i;let o=Dt.useCallback(async()=>{n(true);try{if(p.current&&await p.current(e.allData),t.analytics?.onWorkflowComplete){let d=Date.now()-s.current;t.analytics.onWorkflowComplete(t.id,d,e.allData);}}catch(d){throw console.error("Workflow submission failed:",d),t.analytics?.onError&&t.analytics.onError(d,r),d}finally{n(false);}},[e.allData,t.analytics,t.id,r,s,n]),f=Dt.useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:o,isSubmitting:e.isSubmitting,canSubmit:f()}}function $e(t={}){let{defaultValues:e={},defaultStepIndex:r=0,initialVisitedSteps:n=new Set,initialPassedSteps:i=new Set}=t;return zustand.createStore()(middleware.subscribeWithSelector((s,p)=>({currentStepIndex:r,isTransitioning:false,isInitializing:true,allData:{...e},stepData:{},visitedSteps:new Set(n),passedSteps:new Set(i),isSubmitting:false,_defaultValues:{...e},_defaultStepIndex:r,_setCurrentStep:o=>{s({currentStepIndex:o});},_setStepData:(o,f)=>{s(d=>({stepData:o,allData:{...d.allData,[f]:o}}));},_setAllData:o=>{s({allData:o});},_setFieldValue:(o,f,d)=>{s(b=>{let c={...b.stepData,[o]:f};return {stepData:c,allData:{...b.allData,[d]:c}}});},_setSubmitting:o=>{s({isSubmitting:o});},_setTransitioning:o=>{s({isTransitioning:o});},_setInitializing:o=>{s({isInitializing:o});},_markStepVisited:o=>{s(f=>({visitedSteps:new Set([...f.visitedSteps,o])}));},_markStepPassed:o=>{s(f=>({passedSteps:new Set([...f.passedSteps,o])}));},_reset:()=>{let o=p();s({currentStepIndex:o._defaultStepIndex,allData:{...o._defaultValues},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false});},_loadPersistedState:o=>{s(f=>({...f,...o,isInitializing:false}));}})))}var ye=Dt.createContext(null);function _(){let t=Dt.useContext(ye);if(!t)throw new Error("useWorkflowStore must be used within a WorkflowProvider");return t}function $r(){let t=_();return zustand.useStore(t,e=>e.currentStepIndex)}function Kr(){let t=_();return zustand.useStore(t,e=>e.isTransitioning)}function qr(){let t=_();return zustand.useStore(t,e=>e.isInitializing)}function Jr(){let t=_();return zustand.useStore(t,e=>e.isSubmitting)}function jr(){let t=_();return zustand.useStore(t,e=>e.allData)}function Zr(){let t=_();return zustand.useStore(t,e=>e.stepData)}function Qr(t){let e=_();return zustand.useStore(e,r=>r.allData[t])}function Hr(){let t=_();return zustand.useStore(t,e=>e.visitedSteps)}function Xr(){let t=_();return zustand.useStore(t,e=>e.passedSteps)}function Yr(t){let e=_();return zustand.useStore(e,r=>r.visitedSteps.has(t))}function en(t){let e=_();return zustand.useStore(e,r=>r.passedSteps.has(t))}function tn(){let t=_(),e=zustand.useStore(t,i=>i.currentStepIndex),r=zustand.useStore(t,i=>i.isTransitioning),n=zustand.useStore(t,i=>i.isSubmitting);return {currentStepIndex:e,isTransitioning:r,isSubmitting:n}}function rn(){let t=_(),e=zustand.useStore(t,i=>i.isSubmitting),r=zustand.useStore(t,i=>i.isTransitioning),n=zustand.useStore(t,i=>i.isInitializing);return {isSubmitting:e,isTransitioning:r,isInitializing:n}}function nn(){let t=_();return {setCurrentStep:e=>t.getState()._setCurrentStep(e),setStepData:(e,r)=>t.getState()._setStepData(e,r),setAllData:e=>t.getState()._setAllData(e),setFieldValue:(e,r,n)=>t.getState()._setFieldValue(e,r,n),setSubmitting:e=>t.getState()._setSubmitting(e),setTransitioning:e=>t.getState()._setTransitioning(e),setInitializing:e=>t.getState()._setInitializing(e),markStepVisited:e=>t.getState()._markStepVisited(e),markStepPassed:e=>t.getState()._markStepPassed(e),reset:()=>t.getState()._reset(),loadPersistedState:e=>t.getState()._loadPersistedState(e)}}function sn(){return _()}var Ke=Dt.createContext(null);function xt(t,e){let r=new Set,n=new Set;if(t>0)for(let i=0;i<t;i++)e[i]&&(r.add(e[i].id),n.add(e[i].id));return {visitedSteps:r,passedSteps:n}}function ke({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:i,onWorkflowComplete:s,className:p}){let o=Dt.useRef(i),f=Dt.useRef(s);o.current=i,f.current=s;let d=Dt.useMemo(()=>{if(!n)return 0;let v=e.steps.findIndex(g=>g.id===n);return v===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):v},[n,e.steps]),b=Dt.useMemo(()=>xt(d,e.steps),[d,e.steps]),c=Dt.useRef(null);c.current||(c.current=$e({defaultValues:r,defaultStepIndex:d,initialVisitedSteps:b.visitedSteps,initialPassedSteps:b.passedSteps}));let l=c.current,[a,y]=Dt.useState(()=>{let v=l.getState();return {currentStepIndex:v.currentStepIndex,allData:v.allData,stepData:v.stepData,visitedSteps:v.visitedSteps,passedSteps:v.passedSteps,isSubmitting:v.isSubmitting,isTransitioning:v.isTransitioning,isInitializing:v.isInitializing}});Dt.useEffect(()=>l.subscribe(g=>{y({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:g.visitedSteps,passedSteps:g.passedSteps,isSubmitting:g.isSubmitting,isTransitioning:g.isTransitioning,isInitializing:g.isInitializing});}),[l]);let k=Dt.useCallback(v=>l.getState()._setCurrentStep(v),[l]),P=Dt.useCallback((v,g)=>l.getState()._setStepData(v,g),[l]),w=Dt.useCallback((v,g,T)=>l.getState()._setFieldValue(v,g,T),[l]),x=Dt.useCallback(v=>l.getState()._setSubmitting(v),[l]),h=Dt.useCallback(v=>l.getState()._setTransitioning(v),[l]),m=Dt.useCallback((v,g)=>l.getState()._markStepVisited(g),[l]),W=Dt.useCallback(v=>l.getState()._markStepPassed(v),[l]),L=Dt.useCallback(()=>l.getState()._reset(),[l]),S=e.persistence?.adapter?$({workflowId:e.id,workflowState:a,adapter:e.persistence.adapter,options:e.persistence.options,userId:e.persistence.userId}):null;Dt.useEffect(()=>{(async()=>{if(S)try{let g=await S.loadPersistedData();if(g){l.getState()._loadPersistedState({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:new Set(g.visitedSteps),passedSteps:new Set(g.passedSteps||[])});return}}catch(g){console.error("Failed to load persisted state:",g);}l.getState()._setInitializing(false);})();},[l,S]);let u=Dt.useMemo(()=>({isPersisting:S?.isPersisting??false,persistenceError:S?.persistenceError??null,persistNow:S?.persistNow}),[S?.isPersisting,S?.persistenceError,S?.persistNow]),D=Dt.useMemo(()=>({workflowId:e.id,currentStepIndex:a.currentStepIndex,totalSteps:e.steps.length,allData:a.allData,stepData:a.stepData,visitedSteps:a.visitedSteps}),[e.id,e.steps.length,a.currentStepIndex,a.allData,a.stepData,a.visitedSteps]),I=Dt.useMemo(()=>e.steps[a.currentStepIndex],[e.steps,a.currentStepIndex]),O=Dt.useMemo(()=>I?.formConfig,[I?.formConfig]),A=me({workflowConfig:e,workflowState:a,currentStep:I}),z=Dt.useMemo(()=>{let v=-1;for(let R=0;R<e.steps.length;R++)if(A.isStepVisible(R)){v=R;break}let g=-1;for(let R=e.steps.length-1;R>=0;R--)if(A.isStepVisible(R)){g=R;break}let T=new Set;for(let R=0;R<e.steps.length;R++){let H=e.steps[R];A.isStepVisible(R)&&a.visitedSteps.has(H.id)&&T.add(H.id);}return {...D,isFirstStep:a.currentStepIndex===v,isLastStep:a.currentStepIndex===g,visibleVisitedSteps:T,passedSteps:a.passedSteps}},[D,a.currentStepIndex,a.visitedSteps,a.passedSteps,A,e.steps]),{analyticsStartTime:Ze}=fe({workflowConfig:e,workflowState:a,workflowContext:z}),{goToStep:he,goNext:Z,goPrevious:Ie,skipStep:We,canGoToStep:De,canGoNext:we,canGoPrevious:Re,canSkipCurrentStep:Ee}=ge({workflowConfig:e,workflowState:a,workflowContext:z,conditionsHelpers:A,setCurrentStep:k,setTransitioning:h,markStepVisited:m,markStepPassed:W,setStepData:P,onStepChange:o.current}),ie=Dt.useRef(false);Dt.useEffect(()=>{if(ie.current)return;if(!A.isStepVisible(a.currentStepIndex)){for(let g=0;g<e.steps.length;g++)if(A.isStepVisible(g)){k(g),m(g,e.steps[g].id);break}}ie.current=true;},[a.currentStepIndex,e.steps,k,m,A]),Dt.useEffect(()=>{if(!ie.current)return;if(!A.isStepVisible(a.currentStepIndex)){let g=null;for(let T=a.currentStepIndex+1;T<e.steps.length;T++)if(A.isStepVisible(T)){g=T;break}if(g===null){for(let T=a.currentStepIndex-1;T>=0;T--)if(A.isStepVisible(T)){g=T;break}}g!==null&&(k(g),m(g,e.steps[g].id));}},[A,a.currentStepIndex,e.steps,k,m]);let{submitWorkflow:Q,isSubmitting:Te,canSubmit:Ce}=be({workflowConfig:e,workflowState:a,workflowContext:z,setSubmitting:x,onWorkflowComplete:f.current,analyticsStartTime:Ze}),se=Dt.useCallback((v,g)=>{w(v,g,I?.id||"");},[w,I?.id]),Ae=Dt.useCallback(v=>{P(v,I?.id||"");},[P,I?.id]),Qe=Dt.useCallback(async v=>{I?.id&&v&&P(v,I.id),z.isLastStep?await Q():await Z();},[z.isLastStep,Q,Z,I?.id,P]),_e=Dt.useMemo(()=>({goToStep:he,goNext:Z,goPrevious:Ie,skipStep:We,canGoToStep:De,canGoNext:we,canGoPrevious:Re,canSkipCurrentStep:Ee}),[he,Z,Ie,We,De,we,Re,Ee]),Ve=Dt.useMemo(()=>({setValue:se,setStepData:Ae,resetWorkflow:L}),[se,Ae,L]),Ne=Dt.useMemo(()=>({submitWorkflow:Q,isSubmitting:Te,canSubmit:Ce}),[Q,Te,Ce]),He=Dt.useMemo(()=>({workflowState:a,workflowConfig:e,currentStep:I,context:z,formConfig:O,conditionsHelpers:A,currentStepMetadata:I?.metadata,..._e,...Ve,...Ne,persistNow:u.persistNow,isPersisting:u.isPersisting,persistenceError:u.persistenceError}),[a,e,I,z,O,A,_e,Ve,Ne,u]),Xe=Dt.useMemo(()=>{if(!I?.id)return {};let v=a?.allData[I.id]||{};if(!O?.allFields)return v;let g=new Set(O.allFields.map(R=>R.id)),T={};for(let[R,H]of Object.entries(v))g.has(R)&&(T[R]=H);return T},[a?.allData,I?.id,O?.allFields]),Ye=Dt.useMemo(()=>a.isInitializing.toString(),[a.isInitializing]);return jsxRuntime.jsx(ye.Provider,{value:l,children:jsxRuntime.jsx(Ke.Provider,{value:He,children:jsxRuntime.jsx(forms.FormProvider,{formConfig:O,defaultValues:Xe,onFieldChange:se,"data-workflow-id":e.id,className:p,onSubmit:Qe,children:t},Ye)})})}function V(){let t=Dt.useContext(Ke);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function ht({children:t,workflowConfig:e,...r}){let n=Dt.useMemo(()=>e instanceof J?e.build():e,[e]);return jsxRuntime.jsx(ke,{...r,workflowConfig:n,children:t})}var wt=Dt__default.default.memo(function({stepId:e,children:r}){let{currentStep:n}=V();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:s}=n;return i?s?s(n):r??jsxRuntime.jsx(forms.FormBody,{}):null});var Nt=Dt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:s,workflowConfig:p,currentStep:o}=V(),{submit:f}=forms.useFormConfigContext(),d=forms.useFormSubmitting(),b=forms.useFormValues(),c=Dt.useMemo(()=>{let y=d||s.isSubmitting,k=r??y,P=!s.isTransitioning&&!k;return {finalIsSubmitting:k,canGoNext:P}},[d,s.isSubmitting,s.isTransitioning,r]),l=Dt.useCallback(async y=>{y?.preventDefault(),c.canGoNext&&await f(y);},[c.canGoNext,f]),a=Dt.useMemo(()=>({isLastStep:i.isLastStep,canGoNext:c.canGoNext,isSubmitting:c.finalIsSubmitting,onSubmit:l,className:e,currentStep:o,stepData:b,allData:i.allData,context:i}),[i.isLastStep,c.canGoNext,c.finalIsSubmitting,l,e,o,b,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:p.renderConfig?.nextButtonRenderer,props:a,...n})});var zt=Dt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:s,workflowState:p,workflowConfig:o,currentStep:f,canGoPrevious:d}=V(),b=forms.useFormSubmitting(),c=forms.useFormValues(),l=Dt.useMemo(()=>{let k=b||p.isSubmitting,P=r??k,w=d()&&!p.isTransitioning&&!P;return {finalIsSubmitting:P,canGoPrevious:w}},[b,p.isSubmitting,p.isTransitioning,d,r]),a=Dt.useCallback(async k=>{k?.preventDefault(),l.canGoPrevious&&await s();},[l.canGoPrevious,s]),y=Dt.useMemo(()=>({canGoPrevious:l.canGoPrevious,isSubmitting:l.finalIsSubmitting,onPrevious:a,className:e,currentStep:f,stepData:c,allData:i.allData,context:i}),[l.canGoPrevious,l.finalIsSubmitting,a,e,f,c,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:o.renderConfig?.previousButtonRenderer,props:y,...n})});var Zt=Dt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:s,workflowState:p,workflowConfig:o,context:f,conditionsHelpers:d}=V(),b=forms.useFormSubmitting(),c=forms.useFormValues(),l=Dt.useMemo(()=>{let k=b||p.isSubmitting,P=r??k,w=(!!i?.allowSkip||d.isStepSkippable(p.currentStepIndex))&&!p.isTransitioning&&!P;return {finalIsSubmitting:P,canSkip:w}},[b,p.isSubmitting,p.isTransitioning,p.currentStepIndex,i?.allowSkip,d.isStepSkippable,r]),a=Dt.useCallback(async k=>{k?.preventDefault(),l.canSkip&&await s();},[l.canSkip,s]),y=Dt.useMemo(()=>({canSkip:l.canSkip,isSubmitting:l.finalIsSubmitting,onSkip:a,className:e,currentStep:i,stepData:c,allData:f.allData,context:f}),[l.canSkip,l.finalIsSubmitting,a,e,i,c,f.allData,f]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:o.renderConfig?.skipButtonRenderer,props:y,...n})});var er=Dt__default.default.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:s,context:p,goToStep:o,conditionsHelpers:f}=V(),{visibleSteps:d,visibleToOriginalIndexMap:b,originalToVisibleIndexMap:c}=Dt.useMemo(()=>{let k=[],P=new Map,w=new Map;return i.steps.forEach((x,h)=>{if(f.isStepVisible(h)){let m=k.length;k.push(x),P.set(m,h),w.set(h,m);}}),{visibleSteps:k,visibleToOriginalIndexMap:P,originalToVisibleIndexMap:w}},[i.steps,f]),l=Dt.useCallback(k=>{let P=b.get(k);P!==void 0&&(e?e(P):o(P));},[b,e,o]),a=Dt.useMemo(()=>c.get(s.currentStepIndex)??-1,[c,s.currentStepIndex]),y=Dt.useMemo(()=>({steps:d,currentStepIndex:a,visitedSteps:p.visibleVisitedSteps,onStepClick:l,className:r}),[d,a,p.visibleVisitedSteps,l,r]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:y,...n})});var Pe=class{constructor(e={}){this.version="1.0.0";this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,this._isAvailable=this.isLocalStorageAvailable();}async save(e,r){if(this._isAvailable)try{let n=this.getStorageKey(e),i={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},s=JSON.stringify(i),p=this.compress?this.compressData(s):s;localStorage.setItem(n,p);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},p=JSON.stringify(s),o=this.compress?this.compressData(p):p;localStorage.setItem(i,o);}catch(i){throw new E("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",i)}}else throw new E(`Failed to save to localStorage: ${n.message}`,"SAVE_FAILED",n);else throw new E("Unknown error occurred while saving","SAVE_FAILED")}}async load(e){if(!this._isAvailable)return null;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return null;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),null):{...s.data,visitedSteps:Array.isArray(s.data.visitedSteps)?s.data.visitedSteps:[]}}catch(r){throw r instanceof Error?new E(`Failed to load from localStorage: ${r.message}`,"LOAD_FAILED",r):new E("Unknown error occurred while loading","LOAD_FAILED")}}async remove(e){if(this._isAvailable)try{let r=this.getStorageKey(e);localStorage.removeItem(r);}catch(r){throw r instanceof Error?new E(`Failed to remove from localStorage: ${r.message}`,"REMOVE_FAILED",r):new E("Unknown error occurred while removing","REMOVE_FAILED")}}async exists(e){if(!this._isAvailable)return false;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return !1;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){if(!this._isAvailable)return [];try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix)){let i=n.substring(this.keyPrefix.length);await this.exists(i)&&e.push(i);}}return e}catch(e){throw e instanceof Error?new E(`Failed to list keys: ${e.message}`,"LIST_FAILED",e):new E("Unknown error occurred while listing keys","LIST_FAILED")}}async clear(){try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n?.startsWith(this.keyPrefix)&&e.push(n);}for(let r of e)localStorage.removeItem(r);}catch(e){throw e instanceof Error?new E(`Failed to clear localStorage: ${e.message}`,"CLEAR_FAILED",e):new E("Unknown error occurred while clearing","CLEAR_FAILED")}}getStorageKey(e){return `${this.keyPrefix}${e}`}isLocalStorageAvailable(){try{let e="__rilay_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}compressData(e){return btoa(e)}decompressData(e){try{return atob(e)}catch{return e}}async clearExpiredData(){if(!this._isAvailable)return;let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix))try{let i=localStorage.getItem(n);if(i){let s=this.compress?this.decompressData(i):i,p=JSON.parse(s);p.expiresAt&&Date.now()>p.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};exports.LocalStorageAdapter=Pe;exports.Workflow=ht;exports.WorkflowBody=wt;exports.WorkflowNextButton=Nt;exports.WorkflowPersistenceError=E;exports.WorkflowPreviousButton=zt;exports.WorkflowProvider=ke;exports.WorkflowSkipButton=Zt;exports.WorkflowStepper=er;exports.WorkflowStoreContext=ye;exports.combineWorkflowDataForConditions=Se;exports.createWorkflowStore=$e;exports.debounce=ue;exports.flattenObject=te;exports.flow=J;exports.generateStorageKey=de;exports.mergePersistedState=st;exports.persistedToWorkflowState=Me;exports.useConditionEvaluation=le;exports.useCurrentStepIndex=$r;exports.useIsStepPassed=en;exports.useIsStepVisited=Yr;exports.usePassedSteps=Xr;exports.usePersistence=$;exports.useStepDataById=Qr;exports.useStepMetadata=ot;exports.useVisitedSteps=Hr;exports.useWorkflowActions=nn;exports.useWorkflowAllData=jr;exports.useWorkflowAnalytics=fe;exports.useWorkflowConditions=me;exports.useWorkflowContext=V;exports.useWorkflowInitializing=qr;exports.useWorkflowNavigation=ge;exports.useWorkflowNavigationState=tn;exports.useWorkflowState=ut;exports.useWorkflowStepData=Zr;exports.useWorkflowStore=_;exports.useWorkflowStoreApi=sn;exports.useWorkflowSubmission=be;exports.useWorkflowSubmitState=rn;exports.useWorkflowSubmitting=Jr;exports.useWorkflowTransitioning=Kr;exports.validatePersistedData=it;exports.workflowStateToPersisted=pe;
1
+ 'use strict';var core=require('@rilaykit/core'),forms=require('@rilaykit/forms'),Tt=require('react'),zustand=require('zustand'),middleware=require('zustand/middleware'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Tt__default=/*#__PURE__*/_interopDefault(Tt);var H=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new core.IdGenerator;this.config=e,this.workflowId=r,this.workflowName=n,this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){return {id:e.id||this.idGenerator.next("step"),title:e.title,description:e.description,formConfig:e.formConfig instanceof forms.form?e.formConfig.build():e.formConfig,allowSkip:e.allowSkip||false,renderer:e.renderer,conditions:e.conditions,metadata:e.metadata,onAfterValidation:e.onAfterValidation}}addStep(e){let r=core.normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}configure(e){return e.analytics&&(this.analytics=e.analytics),e.persistence&&(this.persistenceConfig=e.persistence),this}use(e){this.validatePluginDependencies(e),this.plugins.push(e);try{e.install(this);}catch(r){throw new Error(`Failed to install plugin "${e.name}": ${r instanceof Error?r.message:String(r)}`)}return this}validatePluginDependencies(e){if(!e.dependencies)return;let r=e.dependencies.filter(n=>!this.plugins.some(i=>i.name===n));if(r.length>0)throw new Error(`Plugin "${e.name}" requires missing dependencies: ${r.join(", ")}`)}removePlugin(e){return this.plugins=this.plugins.filter(r=>r.name!==e),this}updateStep(e,r){let n=this.steps.findIndex(i=>i.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[n]={...this.steps[n],...r},this}addStepConditions(e,r){let n=this.steps.findIndex(s=>s.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);let i={...this.steps[n].conditions,...r};return this.steps[n]={...this.steps[n],conditions:i},this}removeStep(e){return this.steps=this.steps.filter(r=>r.id!==e),this}getStep(e){return this.steps.find(r=>r.id===e)}getSteps(){return [...this.steps]}clearSteps(){return this.steps=[],this.idGenerator.reset(),this}clone(e,r){let n=new t(this.config,e||`${this.workflowId}-clone`,r||this.workflowName);return n.steps=core.deepClone(this.steps),n.analytics=this.analytics?core.deepClone(this.analytics):void 0,n.persistenceConfig=this.persistenceConfig?core.deepClone(this.persistenceConfig):void 0,n.plugins=[...this.plugins],n}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let r=this.steps.map(n=>n.id);try{core.ensureUnique(r,"step");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of this.plugins)if(n.dependencies){let i=n.dependencies.filter(s=>!this.plugins.some(d=>d.name===s));i.length>0&&e.push(`Plugin "${n.name}" requires missing dependencies: ${i.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((n,i)=>n+i.formConfig.allFields.length,0),r=this.steps.map(n=>n.formConfig.allFields.length);return {totalSteps:this.steps.length,totalFields:e,averageFieldsPerStep:this.steps.length>0?e/this.steps.length:0,maxFieldsInStep:r.length>0?Math.max(...r):0,minFieldsInStep:r.length>0?Math.min(...r):0,hasAnalytics:!!this.analytics}}build(){let e=this.validate();if(e.length>0)throw new Error(`Workflow validation failed: ${e.join(", ")}`);return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins,renderConfig:this.config.getWorkflowRenderConfig()}}toJSON(){return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins.map(e=>({name:e.name,version:e.version}))}}fromJSON(e){return this.workflowId=e.workflowId,this.workflowName=e.workflowName,this.workflowDescription=e.workflowDescription,this.steps=e.steps,this.analytics=e.analytics,this.persistenceConfig=e.persistence,this.plugins=e.plugins||[],this}};function ue(t,e={},r={}){return Tt.useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let n=i=>{try{let s;return i&&typeof i=="object"&&"build"in i?s=i.build():s=i,core.evaluateCondition(s,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:t.visible?n(t.visible):true,disabled:t.disabled?n(t.disabled):false,required:t.required?n(t.required):false,readonly:t.readonly?n(t.readonly):false}},[t,e,r])}function Oe(t,e={}){return Tt.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},i){let s=d=>{try{return d&&typeof d=="object"&&"build"in d?core.evaluateCondition(d.build(),e):core.evaluateCondition(d,e)}catch(o){return console.warn(`Error evaluating condition for field ${n}:`,o),false}};r[n]={visible:i.visible?s(i.visible):true,disabled:i.disabled?s(i.disabled):false,required:i.required?s(i.required):false,readonly:i.readonly?s(i.readonly):false};}return r},[t,e])}function Le(t,e={}){return Tt.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let s=Number.parseInt(n,10);if(r[s]={visible:true,disabled:false,required:false,readonly:false},i){let d=o=>{try{return o&&typeof o=="object"&&"build"in o?core.evaluateCondition(o.build(),e):core.evaluateCondition(o,e)}catch(f){return console.warn(`Error evaluating condition for step ${s}:`,f),false}};r[s]={visible:i.visible?d(i.visible):true,disabled:i.disabled?d(i.disabled):false,required:i.required?d(i.required):false,readonly:i.readonly?d(i.readonly):false};}}return r},[t,e])}var R=class extends Error{constructor(r,n,i){super(`[WorkflowPersistence] ${r} (Code: ${n})`);this.code=n;this.cause=i;this.name="WorkflowPersistenceError";}};function ce(t,e,r){return {workflowId:t,currentStepIndex:e.currentStepIndex,allData:{...e.allData},stepData:{...e.stepData},visitedSteps:Array.from(e.visitedSteps),passedSteps:Array.from(e.passedSteps),lastSaved:Date.now(),metadata:r}}function Ue(t){return {currentStepIndex:t.currentStepIndex,allData:{...t.allData},stepData:{...t.stepData},visitedSteps:new Set(t.visitedSteps),passedSteps:new Set(t.passedSteps||[]),isSubmitting:false,isTransitioning:false}}function at(t){if(!t||typeof t!="object")return false;let e=["workflowId","currentStepIndex","allData","stepData","visitedSteps","lastSaved"];for(let r of e)if(!(r in t))return false;return !(typeof t.workflowId!="string"||typeof t.currentStepIndex!="number"||typeof t.allData!="object"||typeof t.stepData!="object"||!Array.isArray(t.visitedSteps)||typeof t.lastSaved!="number")}function fe(t,e){return e?`${e}:${t}`:t}function Se(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function lt(t,e,r="persist"){let n=Ue(e);switch(r){case "persist":return {...n,isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};case "current":return {...t,visitedSteps:new Set([...t.visitedSteps,...n.visitedSteps]),passedSteps:new Set([...t.passedSteps,...n.passedSteps||[]])};case "merge":return {currentStepIndex:t.currentStepIndex,allData:{...n.allData,...t.allData},stepData:{...n.stepData,...t.stepData},visitedSteps:new Set([...n.visitedSteps,...t.visitedSteps]),passedSteps:new Set([...n.passedSteps||[],...t.passedSteps]),isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};default:return n}}function q({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[s,d]=Tt.useState(false),[o,f]=Tt.useState(null),[u,b]=Tt.useState(false),c=Tt.useRef(r),l=Tt.useRef(n),a=Tt.useRef({hasPendingChanges:false});Tt.useEffect(()=>{c.current=r,l.current=n;},[r,n]);let y=fe(l.current.storageKey||t,i),k=Tt.useCallback(()=>{f(null);},[]),P=Tt.useCallback((p,W)=>{let V=p instanceof R?p:new R(`${W} failed: ${p.message}`,"OPERATION_FAILED",p);f(V),console.error("[WorkflowPersistence]",V);},[]),D=Tt.useCallback(async p=>{k(),d(true);try{let W=ce(t,p,l.current.metadata);await c.current.save(y,W),a.current.lastSavedState={...p},a.current.hasPendingChanges=!1;}catch(W){throw P(W,"Save"),W}finally{d(false);}},[t,y,k,P]),x=Tt.useRef(Se(async p=>{try{await D(p);}catch(W){console.debug("[WorkflowPersistence] Auto-save failed:",W);}},n.debounceMs||500)),h=Tt.useCallback((p,W)=>W?p.currentStepIndex!==W.currentStepIndex||JSON.stringify(p.allData)!==JSON.stringify(W.allData)||JSON.stringify(p.stepData)!==JSON.stringify(W.stepData)||p.visitedSteps.size!==W.visitedSteps.size||!Array.from(p.visitedSteps).every(V=>W.visitedSteps.has(V)):true,[]),S=Tt.useCallback(async()=>{k(),b(true);try{let p=await c.current.load(y);return p&&(a.current.lastSavedState={currentStepIndex:p.currentStepIndex,allData:p.allData,stepData:p.stepData,visitedSteps:new Set(p.visitedSteps),passedSteps:new Set(p.passedSteps||[]),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},a.current.hasPendingChanges=!1),p}catch(p){return P(p,"Load"),null}finally{setTimeout(()=>b(false),100);}},[y,k,P]),I=Tt.useCallback(async()=>{k();try{await c.current.remove(y),a.current.lastSavedState=void 0,a.current.hasPendingChanges=!1;}catch(p){throw P(p,"Clear"),p}},[y,k,P]),L=Tt.useCallback(async()=>{try{return await c.current.exists(y)}catch(p){return P(p,"Exists check"),false}},[y,P]);Tt.useEffect(()=>{l.current.autoPersist&&(s||u||e.isInitializing||e.isSubmitting||e.isTransitioning||h(e,a.current.lastSavedState)&&(a.current.hasPendingChanges=true,x.current(e)));},[e,s,u,h]);let m=Tt.useCallback(async()=>{await D(e);},[D,e]);return {isPersisting:s,persistenceError:o,persistNow:m,loadPersistedData:S,clearPersistedData:I,hasPersistedData:L}}function pt(){let{workflowConfig:t,currentStep:e}=N(),r=Tt.useMemo(()=>e?.metadata,[e?.metadata]),n=Tt.useMemo(()=>u=>t.steps.find(c=>c.id===u)?.metadata,[t.steps]),i=Tt.useMemo(()=>u=>t.steps[u]?.metadata,[t.steps]),s=Tt.useMemo(()=>u=>r?u in r:false,[r]),d=Tt.useMemo(()=>(u,b)=>r&&u in r?r[u]:b,[r]),o=Tt.useMemo(()=>()=>t.steps.map((u,b)=>({id:u.id,title:u.title,index:b,metadata:u.metadata})),[t.steps]),f=Tt.useMemo(()=>u=>t.steps.map((b,c)=>({step:b,index:c})).filter(({step:b,index:c})=>u(b.metadata,b.id,c)).map(({step:b})=>b.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:s,getCurrentValue:d,getAllStepsMetadata:o,findStepsByMetadata:f}}function ge({workflowConfig:t,workflowState:e,workflowContext:r}){let n=Tt.useRef(Date.now()),i=Tt.useRef(new Map),s=Tt.useRef(false),d=Tt.useRef(null),o=core.getGlobalMonitor();Tt.useEffect(()=>{t.analytics?.onWorkflowStart&&!s.current&&(s.current=true,t.analytics.onWorkflowStart(t.id,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"start",totalSteps:t.steps.length},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:0,navigationDuration:0,conditionEvaluationDuration:0},"low"));},[t.id,t.analytics,r,o,t.steps.length]),Tt.useEffect(()=>{let l=t.steps[e.currentStepIndex];if(l&&d.current!==l.id){if(d.current&&t.analytics?.onStepComplete){let a=i.current.get(d.current);if(a){let y=Date.now()-a;t.analytics.onStepComplete(d.current,y,e.stepData,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:d.current,duration:y},{timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:y,conditionEvaluationDuration:0},"low");}}d.current=l.id,i.current.set(l.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(l.id,Date.now(),r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:l.id,stepIndex:e.currentStepIndex},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:0},"low");}},[e.currentStepIndex,t.steps,t.analytics,r,e.stepData,o,t.id]);let f=Tt.useCallback((l,a)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(l,a,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:l,reason:a},void 0,"medium");},[t.analytics,r,o,t.id]),u=Tt.useCallback(l=>{t.analytics?.onError&&t.analytics.onError(l,r),o&&o.trackError(l,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,o,t.id,e.currentStepIndex,t.steps]),b=Tt.useCallback((l,a,y)=>{if(!o)return;let k={timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:a,navigationDuration:y,conditionEvaluationDuration:0};o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:l,toStep:a,direction:a>l?"forward":"backward"},k,y>1e3?"medium":"low");},[o,t.id,t.steps.length]),c=Tt.useCallback((l,a)=>{if(!o)return;let y={timestamp:Date.now(),duration:l,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:l};o.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:a,currentStepIndex:e.currentStepIndex},y,l>100?"medium":"low");},[o,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:f,trackError:u,trackNavigation:b,trackConditionEvaluation:c}}function se(t,e=""){let r={};for(let n in t)if(n in t){let i=t[n],s=e?`${e}.${n}`:n;i!==null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)?Object.assign(r,se(i,s)):r[s]=i;}return r}function be(t,e){let r=se(t),n=se(e);return {...{...t,...e},...r,...n}}function $e(t,e){return {visible:t.visible,skippable:e===true||t.required}}function ye({workflowConfig:t,workflowState:e,currentStep:r}){let n=Tt.useMemo(()=>be(e.allData,e.stepData),[e.allData,e.stepData]),i=Tt.useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),s=ue(i,n,{visible:true,disabled:false,required:false,readonly:false}),d=Tt.useMemo(()=>$e(s,r?.allowSkip),[s,r?.allowSkip]),o=Tt.useMemo(()=>{let x={};return t.steps.forEach((h,S)=>{h.conditions&&(x[S]={visible:h.conditions.visible,required:h.conditions.skippable});}),x},[t.steps]),f=Le(o,n),u=Tt.useMemo(()=>{let x={};return t.steps.forEach((h,S)=>{let I=f[S];I?x[S]=$e(I,h.allowSkip):x[S]={visible:true,skippable:h.allowSkip===true};}),x},[t.steps,f]),b=Tt.useMemo(()=>{if(!r?.formConfig?.allFields)return {};let x={};for(let h of r.formConfig.allFields)h.conditions&&(x[h.id]=h.conditions);return x},[r?.formConfig?.allFields]),c=Oe(b,n),l=Tt.useCallback(x=>x<0||x>=t.steps.length?false:u[x]?.visible??true,[u,t.steps.length]),a=Tt.useCallback(x=>x<0||x>=t.steps.length?false:u[x]?.skippable??false,[u,t.steps.length]),y=Tt.useCallback(x=>c[x]?.visible??true,[c]),k=Tt.useCallback(x=>c[x]?.disabled??false,[c]),P=Tt.useCallback(x=>c[x]?.required??false,[c]),D=Tt.useCallback(x=>c[x]?.readonly??false,[c]);return {stepConditions:d,fieldConditions:c,allStepConditions:u,isStepVisible:l,isStepSkippable:a,isFieldVisible:y,isFieldDisabled:k,isFieldRequired:P,isFieldReadonly:D}}function ve({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:s,markStepVisited:d,markStepPassed:o,setStepData:f,onStepChange:u}){let b=Tt.useRef(u);b.current=u;let c=t.steps[e.currentStepIndex],l=Tt.useCallback(()=>({setStepData:(m,p)=>{f(p,m);},setStepFields:(m,p)=>{let V={...e.allData[m]||{},...p};f(V,m);},getStepData:m=>e.allData[m]||{},setNextStepField:(m,p)=>{let W=e.currentStepIndex+1;if(W<t.steps.length){let V=t.steps[W].id,X={...e.allData[V]||{},[m]:p};f(X,V);}},setNextStepFields:m=>{let p=e.currentStepIndex+1;if(p<t.steps.length){let W=t.steps[p].id,z={...e.allData[W]||{},...m};f(z,W);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,f]),a=Tt.useCallback(async m=>{if(m<0||m>=t.steps.length||!n.isStepVisible(m))return false;s(true);try{return b.current&&b.current(e.currentStepIndex,m,r),i(m),d(m,t.steps[m].id),!0}catch(p){return console.error("Step transition failed:",p),t.analytics?.onError&&t.analytics.onError(p,r),false}finally{s(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,s,i,d]),y=Tt.useCallback(m=>{for(let p=m+1;p<t.steps.length;p++)if(n.isStepVisible(p))return p;return null},[t.steps.length,n]),k=Tt.useCallback(m=>{for(let p=m-1;p>=0;p--)if(n.isStepVisible(p))return p;return null},[n]),P=Tt.useCallback(async()=>{if(c?.onAfterValidation)try{let p=l();await c.onAfterValidation(e.stepData,p,r);}catch(p){return console.error("onAfterValidation failed:",p),t.analytics?.onError&&t.analytics.onError(p,r),false}o(c.id);let m=y(e.currentStepIndex);return m===null?false:a(m)},[c,l,e.stepData,r,t.analytics,e.currentStepIndex,y,a,o]),D=Tt.useCallback(async()=>{let m=k(e.currentStepIndex);return m===null?false:a(m)},[e.currentStepIndex,k,a]),x=Tt.useCallback(async()=>!c?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(c.id,"user_skip",r),P()),[c,n,e.currentStepIndex,t.analytics,r,P]),h=Tt.useCallback(m=>m<0||m>=t.steps.length?false:n.isStepVisible(m),[t.steps.length,n]),S=Tt.useCallback(()=>{let m=y(e.currentStepIndex);return m!==null&&h(m)},[e.currentStepIndex,y,h]),I=Tt.useCallback(()=>{let m=k(e.currentStepIndex);return m!==null&&h(m)},[e.currentStepIndex,k,h]),L=Tt.useCallback(()=>c?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[c?.allowSkip,n,e.currentStepIndex]);return {goToStep:a,goNext:P,goPrevious:D,skipStep:x,canGoToStep:h,canGoNext:S,canGoPrevious:I,canSkipCurrentStep:L}}function ft(t,e){switch(e.type){case "SET_CURRENT_STEP":return {...t,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":return {...t,stepData:e.data,allData:{...t.allData,[e.stepId]:e.data}};case "SET_ALL_DATA":return {...t,allData:e.data};case "SET_FIELD_VALUE":{let r={...t.stepData,[e.fieldId]:e.value};return {...t,stepData:r,allData:{...t.allData,[e.stepId]:r}}}case "SET_SUBMITTING":return {...t,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...t,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...t,visitedSteps:new Set([...t.visitedSteps,e.stepId])};case "MARK_STEP_PASSED":return {...t,passedSteps:new Set([...t.passedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false};case "LOAD_PERSISTED_STATE":return {...t,...e.state};case "SET_INITIALIZATION_COMPLETE":return {...t,isInitializing:false};default:return t}}function St({defaultValues:t={},defaultStepIndex:e,workflowSteps:r,persistence:n}){let i=Tt.useMemo(()=>{let S=new Set;if(e&&e>0&&r)for(let I=0;I<e;I++)r[I]&&S.add(r[I].id);return S},[e,r]),s=Tt.useMemo(()=>{let S=new Set;if(e&&e>0&&r)for(let I=0;I<e;I++)r[I]&&S.add(r[I].id);return S},[e,r]),d={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:i,passedSteps:s,isSubmitting:false,isTransitioning:false,isInitializing:true},[o,f]=Tt.useReducer(ft,d),u=n?.adapter?q({workflowId:n.workflowId,workflowState:o,adapter:n.adapter,options:n.options,userId:n.userId}):null,b=Tt.useCallback(S=>{f({type:"SET_CURRENT_STEP",stepIndex:S});},[]),c=Tt.useCallback((S,I)=>{f({type:"SET_STEP_DATA",data:S,stepId:I});},[]),l=Tt.useCallback((S,I,L)=>{f({type:"SET_FIELD_VALUE",fieldId:S,value:I,stepId:L});},[]),a=Tt.useCallback(S=>{f({type:"SET_SUBMITTING",isSubmitting:S});},[]),y=Tt.useCallback(S=>{f({type:"SET_TRANSITIONING",isTransitioning:S});},[]),k=Tt.useCallback((S,I)=>{f({type:"MARK_STEP_VISITED",stepIndex:S,stepId:I});},[]),P=Tt.useCallback(S=>{f({type:"MARK_STEP_PASSED",stepId:S});},[]),D=Tt.useCallback(()=>{f({type:"RESET_WORKFLOW"});},[]),x=Tt.useCallback(()=>{f({type:"SET_INITIALIZATION_COMPLETE"});},[]),h=Tt.useCallback(async()=>{if(!u)return x(),false;try{let S=await u.loadPersistedData();if(S){let I={currentStepIndex:S.currentStepIndex,allData:S.allData,stepData:S.stepData,visitedSteps:new Set(S.visitedSteps),passedSteps:new Set(S.passedSteps||[])};return f({type:"LOAD_PERSISTED_STATE",state:I}),x(),!0}}catch(S){console.error("Failed to load persisted state:",S);}return x(),false},[u,x]);return {workflowState:o,setCurrentStep:b,setStepData:c,setFieldValue:l,setSubmitting:a,setTransitioning:y,markStepVisited:k,markStepPassed:P,resetWorkflow:D,loadPersistedState:h,persistence:u?{isPersisting:u.isPersisting,persistenceError:u.persistenceError,persistNow:u.persistNow,clearPersistedData:u.clearPersistedData,hasPersistedData:u.hasPersistedData}:null}}function ke({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:s}){let d=Tt.useRef(i);d.current=i;let o=Tt.useCallback(async()=>{n(true);try{if(d.current&&await d.current(e.allData),t.analytics?.onWorkflowComplete){let u=Date.now()-s.current;t.analytics.onWorkflowComplete(t.id,u,e.allData);}}catch(u){throw console.error("Workflow submission failed:",u),t.analytics?.onError&&t.analytics.onError(u,r),u}finally{n(false);}},[e.allData,t.analytics,t.id,r,s,n]),f=Tt.useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:o,isSubmitting:e.isSubmitting,canSubmit:f()}}function Je(t={}){let{defaultValues:e={},defaultStepIndex:r=0,initialVisitedSteps:n=new Set,initialPassedSteps:i=new Set}=t;return zustand.createStore()(middleware.subscribeWithSelector((s,d)=>({currentStepIndex:r,isTransitioning:false,isInitializing:true,allData:{...e},stepData:{},visitedSteps:new Set(n),passedSteps:new Set(i),isSubmitting:false,_defaultValues:{...e},_defaultStepIndex:r,_setCurrentStep:o=>{s({currentStepIndex:o});},_setStepData:(o,f)=>{s(u=>({stepData:o,allData:{...u.allData,[f]:o}}));},_setAllData:o=>{s({allData:o});},_setFieldValue:(o,f,u)=>{s(b=>{let c={...b.stepData,[o]:f};return {stepData:c,allData:{...b.allData,[u]:c}}});},_setSubmitting:o=>{s({isSubmitting:o});},_setTransitioning:o=>{s({isTransitioning:o});},_setInitializing:o=>{s({isInitializing:o});},_markStepVisited:o=>{s(f=>({visitedSteps:new Set([...f.visitedSteps,o])}));},_markStepPassed:o=>{s(f=>({passedSteps:new Set([...f.passedSteps,o])}));},_reset:()=>{let o=d();s({currentStepIndex:o._defaultStepIndex,allData:{...o._defaultValues},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false});},_loadPersistedState:o=>{s(f=>({...f,...o,isInitializing:false}));}})))}var xe=Tt.createContext(null);function A(){let t=Tt.useContext(xe);if(!t)throw new Error("useWorkflowStore must be used within a WorkflowProvider");return t}function jr(){let t=A();return zustand.useStore(t,e=>e.currentStepIndex)}function Zr(){let t=A();return zustand.useStore(t,e=>e.isTransitioning)}function Hr(){let t=A();return zustand.useStore(t,e=>e.isInitializing)}function Qr(){let t=A();return zustand.useStore(t,e=>e.isSubmitting)}function Xr(){let t=A();return zustand.useStore(t,e=>e.allData)}function Yr(){let t=A();return zustand.useStore(t,e=>e.stepData)}function en(t){let e=A();return zustand.useStore(e,r=>r.allData[t])}function tn(){let t=A();return zustand.useStore(t,e=>e.visitedSteps)}function rn(){let t=A();return zustand.useStore(t,e=>e.passedSteps)}function nn(t){let e=A();return zustand.useStore(e,r=>r.visitedSteps.has(t))}function sn(t){let e=A();return zustand.useStore(e,r=>r.passedSteps.has(t))}function on(){let t=A(),e=zustand.useStore(t,i=>i.currentStepIndex),r=zustand.useStore(t,i=>i.isTransitioning),n=zustand.useStore(t,i=>i.isSubmitting);return {currentStepIndex:e,isTransitioning:r,isSubmitting:n}}function an(){let t=A(),e=zustand.useStore(t,i=>i.isSubmitting),r=zustand.useStore(t,i=>i.isTransitioning),n=zustand.useStore(t,i=>i.isInitializing);return {isSubmitting:e,isTransitioning:r,isInitializing:n}}function ln(){let t=A();return {setCurrentStep:e=>t.getState()._setCurrentStep(e),setStepData:(e,r)=>t.getState()._setStepData(e,r),setAllData:e=>t.getState()._setAllData(e),setFieldValue:(e,r,n)=>t.getState()._setFieldValue(e,r,n),setSubmitting:e=>t.getState()._setSubmitting(e),setTransitioning:e=>t.getState()._setTransitioning(e),setInitializing:e=>t.getState()._setInitializing(e),markStepVisited:e=>t.getState()._markStepVisited(e),markStepPassed:e=>t.getState()._markStepPassed(e),reset:()=>t.getState()._reset(),loadPersistedState:e=>t.getState()._loadPersistedState(e)}}function pn(){return A()}var It={save:async()=>{},load:async()=>null,remove:async()=>{},exists:async()=>false},je=Tt.createContext(null);function Wt(t,e){let r=new Set,n=new Set;if(t>0)for(let i=0;i<t;i++)e[i]&&(r.add(e[i].id),n.add(e[i].id));return {visitedSteps:r,passedSteps:n}}function he({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:i,onWorkflowComplete:s,className:d}){let o=Tt.useRef(i),f=Tt.useRef(s);o.current=i,f.current=s;let u=Tt.useMemo(()=>{if(!n)return 0;let v=e.steps.findIndex(g=>g.id===n);return v===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):v},[n,e.steps]),b=Tt.useMemo(()=>Wt(u,e.steps),[u,e.steps]),c=Tt.useRef(null);c.current||(c.current=Je({defaultValues:r,defaultStepIndex:u,initialVisitedSteps:b.visitedSteps,initialPassedSteps:b.passedSteps}));let l=c.current,[a,y]=Tt.useState(()=>{let v=l.getState();return {currentStepIndex:v.currentStepIndex,allData:v.allData,stepData:v.stepData,visitedSteps:v.visitedSteps,passedSteps:v.passedSteps,isSubmitting:v.isSubmitting,isTransitioning:v.isTransitioning,isInitializing:v.isInitializing}});Tt.useEffect(()=>l.subscribe(g=>{y({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:g.visitedSteps,passedSteps:g.passedSteps,isSubmitting:g.isSubmitting,isTransitioning:g.isTransitioning,isInitializing:g.isInitializing});}),[l]);let k=Tt.useCallback(v=>l.getState()._setCurrentStep(v),[l]),P=Tt.useCallback((v,g)=>l.getState()._setStepData(v,g),[l]),D=Tt.useCallback((v,g,E)=>l.getState()._setFieldValue(v,g,E),[l]),x=Tt.useCallback(v=>l.getState()._setSubmitting(v),[l]),h=Tt.useCallback(v=>l.getState()._setTransitioning(v),[l]),S=Tt.useCallback((v,g)=>l.getState()._markStepVisited(g),[l]),I=Tt.useCallback(v=>l.getState()._markStepPassed(v),[l]),L=Tt.useCallback(()=>l.getState()._reset(),[l]),m=!!e.persistence?.adapter,p=q({workflowId:e.id,workflowState:a,adapter:e.persistence?.adapter??It,options:e.persistence?.options,userId:e.persistence?.userId}),W=Tt.useRef(p);W.current=p;let V=Tt.useRef(false);Tt.useEffect(()=>{if(V.current)return;V.current=true,(async()=>{if(m)try{let g=await W.current.loadPersistedData();if(g){l.getState()._loadPersistedState({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:new Set(g.visitedSteps),passedSteps:new Set(g.passedSteps||[])});return}}catch(g){console.error("Failed to load persisted state:",g);}l.getState()._setInitializing(false);})();},[l,m]);let z=Tt.useMemo(()=>({isPersisting:m?p.isPersisting:false,persistenceError:m?p.persistenceError:null,persistNow:m?p.persistNow:void 0}),[m,p.isPersisting,p.persistenceError,p.persistNow]),X=Tt.useMemo(()=>({workflowId:e.id,currentStepIndex:a.currentStepIndex,totalSteps:e.steps.length,allData:a.allData,stepData:a.stepData,visitedSteps:a.visitedSteps}),[e.id,e.steps.length,a.currentStepIndex,a.allData,a.stepData,a.visitedSteps]),C=Tt.useMemo(()=>e.steps[a.currentStepIndex],[e.steps,a.currentStepIndex]),K=Tt.useMemo(()=>C?.formConfig,[C?.formConfig]),_=ye({workflowConfig:e,workflowState:a,currentStep:C}),G=Tt.useMemo(()=>{let v=-1;for(let w=0;w<e.steps.length;w++)if(_.isStepVisible(w)){v=w;break}let g=-1;for(let w=e.steps.length-1;w>=0;w--)if(_.isStepVisible(w)){g=w;break}let E=new Set;for(let w=0;w<e.steps.length;w++){let te=e.steps[w];_.isStepVisible(w)&&a.visitedSteps.has(te.id)&&E.add(te.id);}return {...X,isFirstStep:a.currentStepIndex===v,isLastStep:a.currentStepIndex===g,visibleVisitedSteps:E,passedSteps:a.passedSteps}},[X,a.currentStepIndex,a.visitedSteps,a.passedSteps,_,e.steps]),{analyticsStartTime:Xe}=ge({workflowConfig:e,workflowState:a,workflowContext:G}),{goToStep:De,goNext:Y,goPrevious:we,skipStep:Re,canGoToStep:Ee,canGoNext:Te,canGoPrevious:Ce,canSkipCurrentStep:Ae}=ve({workflowConfig:e,workflowState:a,workflowContext:G,conditionsHelpers:_,setCurrentStep:k,setTransitioning:h,markStepVisited:S,markStepPassed:I,setStepData:P,onStepChange:o.current}),ae=Tt.useRef(false);Tt.useEffect(()=>{if(ae.current)return;if(!_.isStepVisible(a.currentStepIndex)){for(let g=0;g<e.steps.length;g++)if(_.isStepVisible(g)){k(g),S(g,e.steps[g].id);break}}ae.current=true;},[a.currentStepIndex,e.steps,k,S,_]),Tt.useEffect(()=>{if(!ae.current)return;if(!_.isStepVisible(a.currentStepIndex)){let g=null;for(let E=a.currentStepIndex+1;E<e.steps.length;E++)if(_.isStepVisible(E)){g=E;break}if(g===null){for(let E=a.currentStepIndex-1;E>=0;E--)if(_.isStepVisible(E)){g=E;break}}g!==null&&(k(g),S(g,e.steps[g].id));}},[_,a.currentStepIndex,e.steps,k,S]);let{submitWorkflow:ee,isSubmitting:_e,canSubmit:Ve}=ke({workflowConfig:e,workflowState:a,workflowContext:G,setSubmitting:x,onWorkflowComplete:f.current,analyticsStartTime:Xe}),le=Tt.useCallback((v,g)=>{D(v,g,C?.id||"");},[D,C?.id]),Ne=Tt.useCallback(v=>{P(v,C?.id||"");},[P,C?.id]),Ye=Tt.useCallback(async v=>{C?.id&&v&&P(v,C.id),G.isLastStep?await ee():await Y();},[G.isLastStep,ee,Y,C?.id,P]),Fe=Tt.useMemo(()=>({goToStep:De,goNext:Y,goPrevious:we,skipStep:Re,canGoToStep:Ee,canGoNext:Te,canGoPrevious:Ce,canSkipCurrentStep:Ae}),[De,Y,we,Re,Ee,Te,Ce,Ae]),Be=Tt.useMemo(()=>({setValue:le,setStepData:Ne,resetWorkflow:L}),[le,Ne,L]),Me=Tt.useMemo(()=>({submitWorkflow:ee,isSubmitting:_e,canSubmit:Ve}),[ee,_e,Ve]),et=Tt.useMemo(()=>({workflowState:a,workflowConfig:e,currentStep:C,context:G,formConfig:K,conditionsHelpers:_,currentStepMetadata:C?.metadata,...Fe,...Be,...Me,persistNow:z.persistNow,isPersisting:z.isPersisting,persistenceError:z.persistenceError}),[a,e,C,G,K,_,Fe,Be,Me,z]),tt=Tt.useMemo(()=>{if(!C?.id)return {};let v=a?.allData[C.id]||{};if(!K?.allFields)return v;let g=new Set(K.allFields.map(w=>w.id)),E={};for(let[w,te]of Object.entries(v))g.has(w)&&(E[w]=te);return E},[a?.allData,C?.id,K?.allFields]),rt=Tt.useMemo(()=>a.isInitializing.toString(),[a.isInitializing]);return jsxRuntime.jsx(xe.Provider,{value:l,children:jsxRuntime.jsx(je.Provider,{value:et,children:jsxRuntime.jsx(forms.FormProvider,{formConfig:K,defaultValues:tt,onFieldChange:le,"data-workflow-id":e.id,className:d,onSubmit:Ye,children:t},rt)})})}function N(){let t=Tt.useContext(je);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function wt({children:t,workflowConfig:e,...r}){let n=Tt.useMemo(()=>e instanceof H?e.build():e,[e]);return jsxRuntime.jsx(he,{...r,workflowConfig:n,children:t})}var Ct=Tt__default.default.memo(function({stepId:e,children:r}){let{currentStep:n}=N();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:s}=n;return i?s?s(n):r??jsxRuntime.jsx(forms.FormBody,{}):null});var Ot=Tt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:s,workflowConfig:d,currentStep:o}=N(),{submit:f}=forms.useFormConfigContext(),u=forms.useFormSubmitting(),b=forms.useFormValues(),c=Tt.useMemo(()=>{let y=u||s.isSubmitting,k=r??y,P=!s.isTransitioning&&!k;return {finalIsSubmitting:k,canGoNext:P}},[u,s.isSubmitting,s.isTransitioning,r]),l=Tt.useCallback(async y=>{y?.preventDefault(),c.canGoNext&&await f(y);},[c.canGoNext,f]),a=Tt.useMemo(()=>({isLastStep:i.isLastStep,canGoNext:c.canGoNext,isSubmitting:c.finalIsSubmitting,onSubmit:l,className:e,currentStep:o,stepData:b,allData:i.allData,context:i}),[i.isLastStep,c.canGoNext,c.finalIsSubmitting,l,e,o,b,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:d.renderConfig?.nextButtonRenderer,props:a,...n})});var qt=Tt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:s,workflowState:d,workflowConfig:o,currentStep:f,canGoPrevious:u}=N(),b=forms.useFormSubmitting(),c=forms.useFormValues(),l=Tt.useMemo(()=>{let k=b||d.isSubmitting,P=r??k,D=u()&&!d.isTransitioning&&!P;return {finalIsSubmitting:P,canGoPrevious:D}},[b,d.isSubmitting,d.isTransitioning,u,r]),a=Tt.useCallback(async k=>{k?.preventDefault(),l.canGoPrevious&&await s();},[l.canGoPrevious,s]),y=Tt.useMemo(()=>({canGoPrevious:l.canGoPrevious,isSubmitting:l.finalIsSubmitting,onPrevious:a,className:e,currentStep:f,stepData:c,allData:i.allData,context:i}),[l.canGoPrevious,l.finalIsSubmitting,a,e,f,c,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:o.renderConfig?.previousButtonRenderer,props:y,...n})});var Yt=Tt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:s,workflowState:d,workflowConfig:o,context:f,conditionsHelpers:u}=N(),b=forms.useFormSubmitting(),c=forms.useFormValues(),l=Tt.useMemo(()=>{let k=b||d.isSubmitting,P=r??k,D=(!!i?.allowSkip||u.isStepSkippable(d.currentStepIndex))&&!d.isTransitioning&&!P;return {finalIsSubmitting:P,canSkip:D}},[b,d.isSubmitting,d.isTransitioning,d.currentStepIndex,i?.allowSkip,u.isStepSkippable,r]),a=Tt.useCallback(async k=>{k?.preventDefault(),l.canSkip&&await s();},[l.canSkip,s]),y=Tt.useMemo(()=>({canSkip:l.canSkip,isSubmitting:l.finalIsSubmitting,onSkip:a,className:e,currentStep:i,stepData:c,allData:f.allData,context:f}),[l.canSkip,l.finalIsSubmitting,a,e,i,c,f.allData,f]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:o.renderConfig?.skipButtonRenderer,props:y,...n})});var ir=Tt__default.default.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:s,context:d,goToStep:o,conditionsHelpers:f}=N(),{visibleSteps:u,visibleToOriginalIndexMap:b,originalToVisibleIndexMap:c}=Tt.useMemo(()=>{let k=[],P=new Map,D=new Map;return i.steps.forEach((x,h)=>{if(f.isStepVisible(h)){let S=k.length;k.push(x),P.set(S,h),D.set(h,S);}}),{visibleSteps:k,visibleToOriginalIndexMap:P,originalToVisibleIndexMap:D}},[i.steps,f]),l=Tt.useCallback(k=>{let P=b.get(k);P!==void 0&&(e?e(P):o(P));},[b,e,o]),a=Tt.useMemo(()=>c.get(s.currentStepIndex)??-1,[c,s.currentStepIndex]),y=Tt.useMemo(()=>({steps:u,currentStepIndex:a,visitedSteps:d.visibleVisitedSteps,onStepClick:l,className:r}),[u,a,d.visibleVisitedSteps,l,r]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:y,...n})});var We=class{constructor(e={}){this.version="1.0.0";this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,this._isAvailable=this.isLocalStorageAvailable();}async save(e,r){if(this._isAvailable)try{let n=this.getStorageKey(e),i={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},s=JSON.stringify(i),d=this.compress?this.compressData(s):s;localStorage.setItem(n,d);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},d=JSON.stringify(s),o=this.compress?this.compressData(d):d;localStorage.setItem(i,o);}catch(i){throw new R("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",i)}}else throw new R(`Failed to save to localStorage: ${n.message}`,"SAVE_FAILED",n);else throw new R("Unknown error occurred while saving","SAVE_FAILED")}}async load(e){if(!this._isAvailable)return null;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return null;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),null):{...s.data,visitedSteps:Array.isArray(s.data.visitedSteps)?s.data.visitedSteps:[]}}catch(r){throw r instanceof Error?new R(`Failed to load from localStorage: ${r.message}`,"LOAD_FAILED",r):new R("Unknown error occurred while loading","LOAD_FAILED")}}async remove(e){if(this._isAvailable)try{let r=this.getStorageKey(e);localStorage.removeItem(r);}catch(r){throw r instanceof Error?new R(`Failed to remove from localStorage: ${r.message}`,"REMOVE_FAILED",r):new R("Unknown error occurred while removing","REMOVE_FAILED")}}async exists(e){if(!this._isAvailable)return false;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return !1;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){if(!this._isAvailable)return [];try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix)){let i=n.substring(this.keyPrefix.length);await this.exists(i)&&e.push(i);}}return e}catch(e){throw e instanceof Error?new R(`Failed to list keys: ${e.message}`,"LIST_FAILED",e):new R("Unknown error occurred while listing keys","LIST_FAILED")}}async clear(){try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n?.startsWith(this.keyPrefix)&&e.push(n);}for(let r of e)localStorage.removeItem(r);}catch(e){throw e instanceof Error?new R(`Failed to clear localStorage: ${e.message}`,"CLEAR_FAILED",e):new R("Unknown error occurred while clearing","CLEAR_FAILED")}}getStorageKey(e){return `${this.keyPrefix}${e}`}isLocalStorageAvailable(){try{let e="__rilay_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}compressData(e){return btoa(e)}decompressData(e){try{return atob(e)}catch{return e}}async clearExpiredData(){if(!this._isAvailable)return;let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix))try{let i=localStorage.getItem(n);if(i){let s=this.compress?this.decompressData(i):i,d=JSON.parse(s);d.expiresAt&&Date.now()>d.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};exports.LocalStorageAdapter=We;exports.Workflow=wt;exports.WorkflowBody=Ct;exports.WorkflowNextButton=Ot;exports.WorkflowPersistenceError=R;exports.WorkflowPreviousButton=qt;exports.WorkflowProvider=he;exports.WorkflowSkipButton=Yt;exports.WorkflowStepper=ir;exports.WorkflowStoreContext=xe;exports.combineWorkflowDataForConditions=be;exports.createWorkflowStore=Je;exports.debounce=Se;exports.flattenObject=se;exports.flow=H;exports.generateStorageKey=fe;exports.mergePersistedState=lt;exports.persistedToWorkflowState=Ue;exports.useConditionEvaluation=ue;exports.useCurrentStepIndex=jr;exports.useIsStepPassed=sn;exports.useIsStepVisited=nn;exports.usePassedSteps=rn;exports.usePersistence=q;exports.useStepDataById=en;exports.useStepMetadata=pt;exports.useVisitedSteps=tn;exports.useWorkflowActions=ln;exports.useWorkflowAllData=Xr;exports.useWorkflowAnalytics=ge;exports.useWorkflowConditions=ye;exports.useWorkflowContext=N;exports.useWorkflowInitializing=Hr;exports.useWorkflowNavigation=ve;exports.useWorkflowNavigationState=on;exports.useWorkflowState=St;exports.useWorkflowStepData=Yr;exports.useWorkflowStore=A;exports.useWorkflowStoreApi=pn;exports.useWorkflowSubmission=ke;exports.useWorkflowSubmitState=an;exports.useWorkflowSubmitting=Qr;exports.useWorkflowTransitioning=Zr;exports.validatePersistedData=at;exports.workflowStateToPersisted=ce;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import {ComponentRendererWrapper,IdGenerator,normalizeToArray,deepClone,ensureUnique,getGlobalMonitor,evaluateCondition}from'@rilaykit/core';import {FormBody,useFormConfigContext,useFormSubmitting,useFormValues,form,FormProvider}from'@rilaykit/forms';import Dt,{createContext,useMemo,useCallback,useContext,useState,useRef,useEffect,useReducer}from'react';import {createStore,useStore}from'zustand';import {subscribeWithSelector}from'zustand/middleware';import {jsx}from'react/jsx-runtime';var J=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new IdGenerator;this.config=e,this.workflowId=r,this.workflowName=n,this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){return {id:e.id||this.idGenerator.next("step"),title:e.title,description:e.description,formConfig:e.formConfig instanceof form?e.formConfig.build():e.formConfig,allowSkip:e.allowSkip||false,renderer:e.renderer,conditions:e.conditions,metadata:e.metadata,onAfterValidation:e.onAfterValidation}}addStep(e){let r=normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}configure(e){return e.analytics&&(this.analytics=e.analytics),e.persistence&&(this.persistenceConfig=e.persistence),this}use(e){this.validatePluginDependencies(e),this.plugins.push(e);try{e.install(this);}catch(r){throw new Error(`Failed to install plugin "${e.name}": ${r instanceof Error?r.message:String(r)}`)}return this}validatePluginDependencies(e){if(!e.dependencies)return;let r=e.dependencies.filter(n=>!this.plugins.some(i=>i.name===n));if(r.length>0)throw new Error(`Plugin "${e.name}" requires missing dependencies: ${r.join(", ")}`)}removePlugin(e){return this.plugins=this.plugins.filter(r=>r.name!==e),this}updateStep(e,r){let n=this.steps.findIndex(i=>i.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[n]={...this.steps[n],...r},this}addStepConditions(e,r){let n=this.steps.findIndex(s=>s.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);let i={...this.steps[n].conditions,...r};return this.steps[n]={...this.steps[n],conditions:i},this}removeStep(e){return this.steps=this.steps.filter(r=>r.id!==e),this}getStep(e){return this.steps.find(r=>r.id===e)}getSteps(){return [...this.steps]}clearSteps(){return this.steps=[],this.idGenerator.reset(),this}clone(e,r){let n=new t(this.config,e||`${this.workflowId}-clone`,r||this.workflowName);return n.steps=deepClone(this.steps),n.analytics=this.analytics?deepClone(this.analytics):void 0,n.persistenceConfig=this.persistenceConfig?deepClone(this.persistenceConfig):void 0,n.plugins=[...this.plugins],n}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let r=this.steps.map(n=>n.id);try{ensureUnique(r,"step");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of this.plugins)if(n.dependencies){let i=n.dependencies.filter(s=>!this.plugins.some(p=>p.name===s));i.length>0&&e.push(`Plugin "${n.name}" requires missing dependencies: ${i.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((n,i)=>n+i.formConfig.allFields.length,0),r=this.steps.map(n=>n.formConfig.allFields.length);return {totalSteps:this.steps.length,totalFields:e,averageFieldsPerStep:this.steps.length>0?e/this.steps.length:0,maxFieldsInStep:r.length>0?Math.max(...r):0,minFieldsInStep:r.length>0?Math.min(...r):0,hasAnalytics:!!this.analytics}}build(){let e=this.validate();if(e.length>0)throw new Error(`Workflow validation failed: ${e.join(", ")}`);return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins,renderConfig:this.config.getWorkflowRenderConfig()}}toJSON(){return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins.map(e=>({name:e.name,version:e.version}))}}fromJSON(e){return this.workflowId=e.workflowId,this.workflowName=e.workflowName,this.workflowDescription=e.workflowDescription,this.steps=e.steps,this.analytics=e.analytics,this.persistenceConfig=e.persistence,this.plugins=e.plugins||[],this}};function le(t,e={},r={}){return useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let n=i=>{try{let s;return i&&typeof i=="object"&&"build"in i?s=i.build():s=i,evaluateCondition(s,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:t.visible?n(t.visible):true,disabled:t.disabled?n(t.disabled):false,required:t.required?n(t.required):false,readonly:t.readonly?n(t.readonly):false}},[t,e,r])}function Fe(t,e={}){return useMemo(()=>{let r={};for(let[n,i]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},i){let s=p=>{try{return p&&typeof p=="object"&&"build"in p?evaluateCondition(p.build(),e):evaluateCondition(p,e)}catch(o){return console.warn(`Error evaluating condition for field ${n}:`,o),false}};r[n]={visible:i.visible?s(i.visible):true,disabled:i.disabled?s(i.disabled):false,required:i.required?s(i.required):false,readonly:i.readonly?s(i.readonly):false};}return r},[t,e])}function Be(t,e={}){return useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let s=Number.parseInt(n,10);if(r[s]={visible:true,disabled:false,required:false,readonly:false},i){let p=o=>{try{return o&&typeof o=="object"&&"build"in o?evaluateCondition(o.build(),e):evaluateCondition(o,e)}catch(f){return console.warn(`Error evaluating condition for step ${s}:`,f),false}};r[s]={visible:i.visible?p(i.visible):true,disabled:i.disabled?p(i.disabled):false,required:i.required?p(i.required):false,readonly:i.readonly?p(i.readonly):false};}}return r},[t,e])}var E=class extends Error{constructor(r,n,i){super(`[WorkflowPersistence] ${r} (Code: ${n})`);this.code=n;this.cause=i;this.name="WorkflowPersistenceError";}};function pe(t,e,r){return {workflowId:t,currentStepIndex:e.currentStepIndex,allData:{...e.allData},stepData:{...e.stepData},visitedSteps:Array.from(e.visitedSteps),passedSteps:Array.from(e.passedSteps),lastSaved:Date.now(),metadata:r}}function Me(t){return {currentStepIndex:t.currentStepIndex,allData:{...t.allData},stepData:{...t.stepData},visitedSteps:new Set(t.visitedSteps),passedSteps:new Set(t.passedSteps||[]),isSubmitting:false,isTransitioning:false}}function it(t){if(!t||typeof t!="object")return false;let e=["workflowId","currentStepIndex","allData","stepData","visitedSteps","lastSaved"];for(let r of e)if(!(r in t))return false;return !(typeof t.workflowId!="string"||typeof t.currentStepIndex!="number"||typeof t.allData!="object"||typeof t.stepData!="object"||!Array.isArray(t.visitedSteps)||typeof t.lastSaved!="number")}function de(t,e){return e?`${e}:${t}`:t}function ue(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function st(t,e,r="persist"){let n=Me(e);switch(r){case "persist":return {...n,isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};case "current":return {...t,visitedSteps:new Set([...t.visitedSteps,...n.visitedSteps]),passedSteps:new Set([...t.passedSteps,...n.passedSteps||[]])};case "merge":return {currentStepIndex:t.currentStepIndex,allData:{...n.allData,...t.allData},stepData:{...n.stepData,...t.stepData},visitedSteps:new Set([...n.visitedSteps,...t.visitedSteps]),passedSteps:new Set([...n.passedSteps||[],...t.passedSteps]),isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};default:return n}}function $({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[s,p]=useState(false),[o,f]=useState(null),[d,b]=useState(false),c=useRef(r),l=useRef(n),a=useRef({hasPendingChanges:false});useEffect(()=>{c.current=r,l.current=n;},[r,n]);let y=de(l.current.storageKey||t,i),k=useCallback(()=>{f(null);},[]),P=useCallback((u,D)=>{let I=u instanceof E?u:new E(`${D} failed: ${u.message}`,"OPERATION_FAILED",u);f(I),console.error("[WorkflowPersistence]",I);},[]),w=useCallback(async u=>{k(),p(true);try{let D=pe(t,u,l.current.metadata);await c.current.save(y,D),a.current.lastSavedState={...u},a.current.hasPendingChanges=!1;}catch(D){throw P(D,"Save"),D}finally{p(false);}},[t,y,k,P]),x=useRef(ue(async u=>{try{await w(u);}catch(D){console.debug("[WorkflowPersistence] Auto-save failed:",D);}},n.debounceMs||500)),h=useCallback((u,D)=>D?u.currentStepIndex!==D.currentStepIndex||JSON.stringify(u.allData)!==JSON.stringify(D.allData)||JSON.stringify(u.stepData)!==JSON.stringify(D.stepData)||u.visitedSteps.size!==D.visitedSteps.size||!Array.from(u.visitedSteps).every(I=>D.visitedSteps.has(I)):true,[]),m=useCallback(async()=>{k(),b(true);try{let u=await c.current.load(y);return u&&(a.current.lastSavedState={currentStepIndex:u.currentStepIndex,allData:u.allData,stepData:u.stepData,visitedSteps:new Set(u.visitedSteps),passedSteps:new Set(u.passedSteps||[]),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},a.current.hasPendingChanges=!1),u}catch(u){return P(u,"Load"),null}finally{setTimeout(()=>b(false),100);}},[y,k,P]),W=useCallback(async()=>{k();try{await c.current.remove(y),a.current.lastSavedState=void 0,a.current.hasPendingChanges=!1;}catch(u){throw P(u,"Clear"),u}},[y,k,P]),L=useCallback(async()=>{try{return await c.current.exists(y)}catch(u){return P(u,"Exists check"),false}},[y,P]);useEffect(()=>{l.current.autoPersist&&(s||d||e.isInitializing||e.isSubmitting||e.isTransitioning||h(e,a.current.lastSavedState)&&(a.current.hasPendingChanges=true,x.current(e)));},[e,s,d,h]);let S=useCallback(async()=>{await w(e);},[w,e]);return {isPersisting:s,persistenceError:o,persistNow:S,loadPersistedData:m,clearPersistedData:W,hasPersistedData:L}}function ot(){let{workflowConfig:t,currentStep:e}=V(),r=useMemo(()=>e?.metadata,[e?.metadata]),n=useMemo(()=>d=>t.steps.find(c=>c.id===d)?.metadata,[t.steps]),i=useMemo(()=>d=>t.steps[d]?.metadata,[t.steps]),s=useMemo(()=>d=>r?d in r:false,[r]),p=useMemo(()=>(d,b)=>r&&d in r?r[d]:b,[r]),o=useMemo(()=>()=>t.steps.map((d,b)=>({id:d.id,title:d.title,index:b,metadata:d.metadata})),[t.steps]),f=useMemo(()=>d=>t.steps.map((b,c)=>({step:b,index:c})).filter(({step:b,index:c})=>d(b.metadata,b.id,c)).map(({step:b})=>b.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:s,getCurrentValue:p,getAllStepsMetadata:o,findStepsByMetadata:f}}function fe({workflowConfig:t,workflowState:e,workflowContext:r}){let n=useRef(Date.now()),i=useRef(new Map),s=useRef(false),p=useRef(null),o=getGlobalMonitor();useEffect(()=>{t.analytics?.onWorkflowStart&&!s.current&&(s.current=true,t.analytics.onWorkflowStart(t.id,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"start",totalSteps:t.steps.length},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:0,navigationDuration:0,conditionEvaluationDuration:0},"low"));},[t.id,t.analytics,r,o,t.steps.length]),useEffect(()=>{let l=t.steps[e.currentStepIndex];if(l&&p.current!==l.id){if(p.current&&t.analytics?.onStepComplete){let a=i.current.get(p.current);if(a){let y=Date.now()-a;t.analytics.onStepComplete(p.current,y,e.stepData,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:p.current,duration:y},{timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:y,conditionEvaluationDuration:0},"low");}}p.current=l.id,i.current.set(l.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(l.id,Date.now(),r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:l.id,stepIndex:e.currentStepIndex},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:0},"low");}},[e.currentStepIndex,t.steps,t.analytics,r,e.stepData,o,t.id]);let f=useCallback((l,a)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(l,a,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:l,reason:a},void 0,"medium");},[t.analytics,r,o,t.id]),d=useCallback(l=>{t.analytics?.onError&&t.analytics.onError(l,r),o&&o.trackError(l,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,o,t.id,e.currentStepIndex,t.steps]),b=useCallback((l,a,y)=>{if(!o)return;let k={timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:a,navigationDuration:y,conditionEvaluationDuration:0};o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:l,toStep:a,direction:a>l?"forward":"backward"},k,y>1e3?"medium":"low");},[o,t.id,t.steps.length]),c=useCallback((l,a)=>{if(!o)return;let y={timestamp:Date.now(),duration:l,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:l};o.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:a,currentStepIndex:e.currentStepIndex},y,l>100?"medium":"low");},[o,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:f,trackError:d,trackNavigation:b,trackConditionEvaluation:c}}function te(t,e=""){let r={};for(let n in t)if(n in t){let i=t[n],s=e?`${e}.${n}`:n;i!==null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)?Object.assign(r,te(i,s)):r[s]=i;}return r}function Se(t,e){let r=te(t),n=te(e);return {...{...t,...e},...r,...n}}function Ue(t,e){return {visible:t.visible,skippable:e===true||t.required}}function me({workflowConfig:t,workflowState:e,currentStep:r}){let n=useMemo(()=>Se(e.allData,e.stepData),[e.allData,e.stepData]),i=useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),s=le(i,n,{visible:true,disabled:false,required:false,readonly:false}),p=useMemo(()=>Ue(s,r?.allowSkip),[s,r?.allowSkip]),o=useMemo(()=>{let x={};return t.steps.forEach((h,m)=>{h.conditions&&(x[m]={visible:h.conditions.visible,required:h.conditions.skippable});}),x},[t.steps]),f=Be(o,n),d=useMemo(()=>{let x={};return t.steps.forEach((h,m)=>{let W=f[m];W?x[m]=Ue(W,h.allowSkip):x[m]={visible:true,skippable:h.allowSkip===true};}),x},[t.steps,f]),b=useMemo(()=>{if(!r?.formConfig?.allFields)return {};let x={};for(let h of r.formConfig.allFields)h.conditions&&(x[h.id]=h.conditions);return x},[r?.formConfig?.allFields]),c=Fe(b,n),l=useCallback(x=>x<0||x>=t.steps.length?false:d[x]?.visible??true,[d,t.steps.length]),a=useCallback(x=>x<0||x>=t.steps.length?false:d[x]?.skippable??false,[d,t.steps.length]),y=useCallback(x=>c[x]?.visible??true,[c]),k=useCallback(x=>c[x]?.disabled??false,[c]),P=useCallback(x=>c[x]?.required??false,[c]),w=useCallback(x=>c[x]?.readonly??false,[c]);return {stepConditions:p,fieldConditions:c,allStepConditions:d,isStepVisible:l,isStepSkippable:a,isFieldVisible:y,isFieldDisabled:k,isFieldRequired:P,isFieldReadonly:w}}function ge({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:s,markStepVisited:p,markStepPassed:o,setStepData:f,onStepChange:d}){let b=useRef(d);b.current=d;let c=t.steps[e.currentStepIndex],l=useCallback(()=>({setStepData:(S,u)=>{f(u,S);},setStepFields:(S,u)=>{let I={...e.allData[S]||{},...u};f(I,S);},getStepData:S=>e.allData[S]||{},setNextStepField:(S,u)=>{let D=e.currentStepIndex+1;if(D<t.steps.length){let I=t.steps[D].id,A={...e.allData[I]||{},[S]:u};f(A,I);}},setNextStepFields:S=>{let u=e.currentStepIndex+1;if(u<t.steps.length){let D=t.steps[u].id,O={...e.allData[D]||{},...S};f(O,D);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,f]),a=useCallback(async S=>{if(S<0||S>=t.steps.length||!n.isStepVisible(S))return false;s(true);try{return b.current&&b.current(e.currentStepIndex,S,r),i(S),p(S,t.steps[S].id),!0}catch(u){return console.error("Step transition failed:",u),t.analytics?.onError&&t.analytics.onError(u,r),false}finally{s(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,s,i,p]),y=useCallback(S=>{for(let u=S+1;u<t.steps.length;u++)if(n.isStepVisible(u))return u;return null},[t.steps.length,n]),k=useCallback(S=>{for(let u=S-1;u>=0;u--)if(n.isStepVisible(u))return u;return null},[n]),P=useCallback(async()=>{if(c?.onAfterValidation)try{let u=l();await c.onAfterValidation(e.stepData,u,r);}catch(u){return console.error("onAfterValidation failed:",u),t.analytics?.onError&&t.analytics.onError(u,r),false}o(c.id);let S=y(e.currentStepIndex);return S===null?false:a(S)},[c,l,e.stepData,r,t.analytics,e.currentStepIndex,y,a,o]),w=useCallback(async()=>{let S=k(e.currentStepIndex);return S===null?false:a(S)},[e.currentStepIndex,k,a]),x=useCallback(async()=>!c?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(c.id,"user_skip",r),P()),[c,n,e.currentStepIndex,t.analytics,r,P]),h=useCallback(S=>S<0||S>=t.steps.length?false:n.isStepVisible(S),[t.steps.length,n]),m=useCallback(()=>{let S=y(e.currentStepIndex);return S!==null&&h(S)},[e.currentStepIndex,y,h]),W=useCallback(()=>{let S=k(e.currentStepIndex);return S!==null&&h(S)},[e.currentStepIndex,k,h]),L=useCallback(()=>c?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[c?.allowSkip,n,e.currentStepIndex]);return {goToStep:a,goNext:P,goPrevious:w,skipStep:x,canGoToStep:h,canGoNext:m,canGoPrevious:W,canSkipCurrentStep:L}}function dt(t,e){switch(e.type){case "SET_CURRENT_STEP":return {...t,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":return {...t,stepData:e.data,allData:{...t.allData,[e.stepId]:e.data}};case "SET_ALL_DATA":return {...t,allData:e.data};case "SET_FIELD_VALUE":{let r={...t.stepData,[e.fieldId]:e.value};return {...t,stepData:r,allData:{...t.allData,[e.stepId]:r}}}case "SET_SUBMITTING":return {...t,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...t,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...t,visitedSteps:new Set([...t.visitedSteps,e.stepId])};case "MARK_STEP_PASSED":return {...t,passedSteps:new Set([...t.passedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false};case "LOAD_PERSISTED_STATE":return {...t,...e.state};case "SET_INITIALIZATION_COMPLETE":return {...t,isInitializing:false};default:return t}}function ut({defaultValues:t={},defaultStepIndex:e,workflowSteps:r,persistence:n}){let i=useMemo(()=>{let m=new Set;if(e&&e>0&&r)for(let W=0;W<e;W++)r[W]&&m.add(r[W].id);return m},[e,r]),s=useMemo(()=>{let m=new Set;if(e&&e>0&&r)for(let W=0;W<e;W++)r[W]&&m.add(r[W].id);return m},[e,r]),p={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:i,passedSteps:s,isSubmitting:false,isTransitioning:false,isInitializing:true},[o,f]=useReducer(dt,p),d=n?.adapter?$({workflowId:n.workflowId,workflowState:o,adapter:n.adapter,options:n.options,userId:n.userId}):null,b=useCallback(m=>{f({type:"SET_CURRENT_STEP",stepIndex:m});},[]),c=useCallback((m,W)=>{f({type:"SET_STEP_DATA",data:m,stepId:W});},[]),l=useCallback((m,W,L)=>{f({type:"SET_FIELD_VALUE",fieldId:m,value:W,stepId:L});},[]),a=useCallback(m=>{f({type:"SET_SUBMITTING",isSubmitting:m});},[]),y=useCallback(m=>{f({type:"SET_TRANSITIONING",isTransitioning:m});},[]),k=useCallback((m,W)=>{f({type:"MARK_STEP_VISITED",stepIndex:m,stepId:W});},[]),P=useCallback(m=>{f({type:"MARK_STEP_PASSED",stepId:m});},[]),w=useCallback(()=>{f({type:"RESET_WORKFLOW"});},[]),x=useCallback(()=>{f({type:"SET_INITIALIZATION_COMPLETE"});},[]),h=useCallback(async()=>{if(!d)return x(),false;try{let m=await d.loadPersistedData();if(m){let W={currentStepIndex:m.currentStepIndex,allData:m.allData,stepData:m.stepData,visitedSteps:new Set(m.visitedSteps),passedSteps:new Set(m.passedSteps||[])};return f({type:"LOAD_PERSISTED_STATE",state:W}),x(),!0}}catch(m){console.error("Failed to load persisted state:",m);}return x(),false},[d,x]);return {workflowState:o,setCurrentStep:b,setStepData:c,setFieldValue:l,setSubmitting:a,setTransitioning:y,markStepVisited:k,markStepPassed:P,resetWorkflow:w,loadPersistedState:h,persistence:d?{isPersisting:d.isPersisting,persistenceError:d.persistenceError,persistNow:d.persistNow,clearPersistedData:d.clearPersistedData,hasPersistedData:d.hasPersistedData}:null}}function be({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:s}){let p=useRef(i);p.current=i;let o=useCallback(async()=>{n(true);try{if(p.current&&await p.current(e.allData),t.analytics?.onWorkflowComplete){let d=Date.now()-s.current;t.analytics.onWorkflowComplete(t.id,d,e.allData);}}catch(d){throw console.error("Workflow submission failed:",d),t.analytics?.onError&&t.analytics.onError(d,r),d}finally{n(false);}},[e.allData,t.analytics,t.id,r,s,n]),f=useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:o,isSubmitting:e.isSubmitting,canSubmit:f()}}function $e(t={}){let{defaultValues:e={},defaultStepIndex:r=0,initialVisitedSteps:n=new Set,initialPassedSteps:i=new Set}=t;return createStore()(subscribeWithSelector((s,p)=>({currentStepIndex:r,isTransitioning:false,isInitializing:true,allData:{...e},stepData:{},visitedSteps:new Set(n),passedSteps:new Set(i),isSubmitting:false,_defaultValues:{...e},_defaultStepIndex:r,_setCurrentStep:o=>{s({currentStepIndex:o});},_setStepData:(o,f)=>{s(d=>({stepData:o,allData:{...d.allData,[f]:o}}));},_setAllData:o=>{s({allData:o});},_setFieldValue:(o,f,d)=>{s(b=>{let c={...b.stepData,[o]:f};return {stepData:c,allData:{...b.allData,[d]:c}}});},_setSubmitting:o=>{s({isSubmitting:o});},_setTransitioning:o=>{s({isTransitioning:o});},_setInitializing:o=>{s({isInitializing:o});},_markStepVisited:o=>{s(f=>({visitedSteps:new Set([...f.visitedSteps,o])}));},_markStepPassed:o=>{s(f=>({passedSteps:new Set([...f.passedSteps,o])}));},_reset:()=>{let o=p();s({currentStepIndex:o._defaultStepIndex,allData:{...o._defaultValues},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false});},_loadPersistedState:o=>{s(f=>({...f,...o,isInitializing:false}));}})))}var ye=createContext(null);function _(){let t=useContext(ye);if(!t)throw new Error("useWorkflowStore must be used within a WorkflowProvider");return t}function $r(){let t=_();return useStore(t,e=>e.currentStepIndex)}function Kr(){let t=_();return useStore(t,e=>e.isTransitioning)}function qr(){let t=_();return useStore(t,e=>e.isInitializing)}function Jr(){let t=_();return useStore(t,e=>e.isSubmitting)}function jr(){let t=_();return useStore(t,e=>e.allData)}function Zr(){let t=_();return useStore(t,e=>e.stepData)}function Qr(t){let e=_();return useStore(e,r=>r.allData[t])}function Hr(){let t=_();return useStore(t,e=>e.visitedSteps)}function Xr(){let t=_();return useStore(t,e=>e.passedSteps)}function Yr(t){let e=_();return useStore(e,r=>r.visitedSteps.has(t))}function en(t){let e=_();return useStore(e,r=>r.passedSteps.has(t))}function tn(){let t=_(),e=useStore(t,i=>i.currentStepIndex),r=useStore(t,i=>i.isTransitioning),n=useStore(t,i=>i.isSubmitting);return {currentStepIndex:e,isTransitioning:r,isSubmitting:n}}function rn(){let t=_(),e=useStore(t,i=>i.isSubmitting),r=useStore(t,i=>i.isTransitioning),n=useStore(t,i=>i.isInitializing);return {isSubmitting:e,isTransitioning:r,isInitializing:n}}function nn(){let t=_();return {setCurrentStep:e=>t.getState()._setCurrentStep(e),setStepData:(e,r)=>t.getState()._setStepData(e,r),setAllData:e=>t.getState()._setAllData(e),setFieldValue:(e,r,n)=>t.getState()._setFieldValue(e,r,n),setSubmitting:e=>t.getState()._setSubmitting(e),setTransitioning:e=>t.getState()._setTransitioning(e),setInitializing:e=>t.getState()._setInitializing(e),markStepVisited:e=>t.getState()._markStepVisited(e),markStepPassed:e=>t.getState()._markStepPassed(e),reset:()=>t.getState()._reset(),loadPersistedState:e=>t.getState()._loadPersistedState(e)}}function sn(){return _()}var Ke=createContext(null);function xt(t,e){let r=new Set,n=new Set;if(t>0)for(let i=0;i<t;i++)e[i]&&(r.add(e[i].id),n.add(e[i].id));return {visitedSteps:r,passedSteps:n}}function ke({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:i,onWorkflowComplete:s,className:p}){let o=useRef(i),f=useRef(s);o.current=i,f.current=s;let d=useMemo(()=>{if(!n)return 0;let v=e.steps.findIndex(g=>g.id===n);return v===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):v},[n,e.steps]),b=useMemo(()=>xt(d,e.steps),[d,e.steps]),c=useRef(null);c.current||(c.current=$e({defaultValues:r,defaultStepIndex:d,initialVisitedSteps:b.visitedSteps,initialPassedSteps:b.passedSteps}));let l=c.current,[a,y]=useState(()=>{let v=l.getState();return {currentStepIndex:v.currentStepIndex,allData:v.allData,stepData:v.stepData,visitedSteps:v.visitedSteps,passedSteps:v.passedSteps,isSubmitting:v.isSubmitting,isTransitioning:v.isTransitioning,isInitializing:v.isInitializing}});useEffect(()=>l.subscribe(g=>{y({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:g.visitedSteps,passedSteps:g.passedSteps,isSubmitting:g.isSubmitting,isTransitioning:g.isTransitioning,isInitializing:g.isInitializing});}),[l]);let k=useCallback(v=>l.getState()._setCurrentStep(v),[l]),P=useCallback((v,g)=>l.getState()._setStepData(v,g),[l]),w=useCallback((v,g,T)=>l.getState()._setFieldValue(v,g,T),[l]),x=useCallback(v=>l.getState()._setSubmitting(v),[l]),h=useCallback(v=>l.getState()._setTransitioning(v),[l]),m=useCallback((v,g)=>l.getState()._markStepVisited(g),[l]),W=useCallback(v=>l.getState()._markStepPassed(v),[l]),L=useCallback(()=>l.getState()._reset(),[l]),S=e.persistence?.adapter?$({workflowId:e.id,workflowState:a,adapter:e.persistence.adapter,options:e.persistence.options,userId:e.persistence.userId}):null;useEffect(()=>{(async()=>{if(S)try{let g=await S.loadPersistedData();if(g){l.getState()._loadPersistedState({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:new Set(g.visitedSteps),passedSteps:new Set(g.passedSteps||[])});return}}catch(g){console.error("Failed to load persisted state:",g);}l.getState()._setInitializing(false);})();},[l,S]);let u=useMemo(()=>({isPersisting:S?.isPersisting??false,persistenceError:S?.persistenceError??null,persistNow:S?.persistNow}),[S?.isPersisting,S?.persistenceError,S?.persistNow]),D=useMemo(()=>({workflowId:e.id,currentStepIndex:a.currentStepIndex,totalSteps:e.steps.length,allData:a.allData,stepData:a.stepData,visitedSteps:a.visitedSteps}),[e.id,e.steps.length,a.currentStepIndex,a.allData,a.stepData,a.visitedSteps]),I=useMemo(()=>e.steps[a.currentStepIndex],[e.steps,a.currentStepIndex]),O=useMemo(()=>I?.formConfig,[I?.formConfig]),A=me({workflowConfig:e,workflowState:a,currentStep:I}),z=useMemo(()=>{let v=-1;for(let R=0;R<e.steps.length;R++)if(A.isStepVisible(R)){v=R;break}let g=-1;for(let R=e.steps.length-1;R>=0;R--)if(A.isStepVisible(R)){g=R;break}let T=new Set;for(let R=0;R<e.steps.length;R++){let H=e.steps[R];A.isStepVisible(R)&&a.visitedSteps.has(H.id)&&T.add(H.id);}return {...D,isFirstStep:a.currentStepIndex===v,isLastStep:a.currentStepIndex===g,visibleVisitedSteps:T,passedSteps:a.passedSteps}},[D,a.currentStepIndex,a.visitedSteps,a.passedSteps,A,e.steps]),{analyticsStartTime:Ze}=fe({workflowConfig:e,workflowState:a,workflowContext:z}),{goToStep:he,goNext:Z,goPrevious:Ie,skipStep:We,canGoToStep:De,canGoNext:we,canGoPrevious:Re,canSkipCurrentStep:Ee}=ge({workflowConfig:e,workflowState:a,workflowContext:z,conditionsHelpers:A,setCurrentStep:k,setTransitioning:h,markStepVisited:m,markStepPassed:W,setStepData:P,onStepChange:o.current}),ie=useRef(false);useEffect(()=>{if(ie.current)return;if(!A.isStepVisible(a.currentStepIndex)){for(let g=0;g<e.steps.length;g++)if(A.isStepVisible(g)){k(g),m(g,e.steps[g].id);break}}ie.current=true;},[a.currentStepIndex,e.steps,k,m,A]),useEffect(()=>{if(!ie.current)return;if(!A.isStepVisible(a.currentStepIndex)){let g=null;for(let T=a.currentStepIndex+1;T<e.steps.length;T++)if(A.isStepVisible(T)){g=T;break}if(g===null){for(let T=a.currentStepIndex-1;T>=0;T--)if(A.isStepVisible(T)){g=T;break}}g!==null&&(k(g),m(g,e.steps[g].id));}},[A,a.currentStepIndex,e.steps,k,m]);let{submitWorkflow:Q,isSubmitting:Te,canSubmit:Ce}=be({workflowConfig:e,workflowState:a,workflowContext:z,setSubmitting:x,onWorkflowComplete:f.current,analyticsStartTime:Ze}),se=useCallback((v,g)=>{w(v,g,I?.id||"");},[w,I?.id]),Ae=useCallback(v=>{P(v,I?.id||"");},[P,I?.id]),Qe=useCallback(async v=>{I?.id&&v&&P(v,I.id),z.isLastStep?await Q():await Z();},[z.isLastStep,Q,Z,I?.id,P]),_e=useMemo(()=>({goToStep:he,goNext:Z,goPrevious:Ie,skipStep:We,canGoToStep:De,canGoNext:we,canGoPrevious:Re,canSkipCurrentStep:Ee}),[he,Z,Ie,We,De,we,Re,Ee]),Ve=useMemo(()=>({setValue:se,setStepData:Ae,resetWorkflow:L}),[se,Ae,L]),Ne=useMemo(()=>({submitWorkflow:Q,isSubmitting:Te,canSubmit:Ce}),[Q,Te,Ce]),He=useMemo(()=>({workflowState:a,workflowConfig:e,currentStep:I,context:z,formConfig:O,conditionsHelpers:A,currentStepMetadata:I?.metadata,..._e,...Ve,...Ne,persistNow:u.persistNow,isPersisting:u.isPersisting,persistenceError:u.persistenceError}),[a,e,I,z,O,A,_e,Ve,Ne,u]),Xe=useMemo(()=>{if(!I?.id)return {};let v=a?.allData[I.id]||{};if(!O?.allFields)return v;let g=new Set(O.allFields.map(R=>R.id)),T={};for(let[R,H]of Object.entries(v))g.has(R)&&(T[R]=H);return T},[a?.allData,I?.id,O?.allFields]),Ye=useMemo(()=>a.isInitializing.toString(),[a.isInitializing]);return jsx(ye.Provider,{value:l,children:jsx(Ke.Provider,{value:He,children:jsx(FormProvider,{formConfig:O,defaultValues:Xe,onFieldChange:se,"data-workflow-id":e.id,className:p,onSubmit:Qe,children:t},Ye)})})}function V(){let t=useContext(Ke);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function ht({children:t,workflowConfig:e,...r}){let n=useMemo(()=>e instanceof J?e.build():e,[e]);return jsx(ke,{...r,workflowConfig:n,children:t})}var wt=Dt.memo(function({stepId:e,children:r}){let{currentStep:n}=V();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:s}=n;return i?s?s(n):r??jsx(FormBody,{}):null});var Nt=Dt.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:s,workflowConfig:p,currentStep:o}=V(),{submit:f}=useFormConfigContext(),d=useFormSubmitting(),b=useFormValues(),c=useMemo(()=>{let y=d||s.isSubmitting,k=r??y,P=!s.isTransitioning&&!k;return {finalIsSubmitting:k,canGoNext:P}},[d,s.isSubmitting,s.isTransitioning,r]),l=useCallback(async y=>{y?.preventDefault(),c.canGoNext&&await f(y);},[c.canGoNext,f]),a=useMemo(()=>({isLastStep:i.isLastStep,canGoNext:c.canGoNext,isSubmitting:c.finalIsSubmitting,onSubmit:l,className:e,currentStep:o,stepData:b,allData:i.allData,context:i}),[i.isLastStep,c.canGoNext,c.finalIsSubmitting,l,e,o,b,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:p.renderConfig?.nextButtonRenderer,props:a,...n})});var zt=Dt.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:s,workflowState:p,workflowConfig:o,currentStep:f,canGoPrevious:d}=V(),b=useFormSubmitting(),c=useFormValues(),l=useMemo(()=>{let k=b||p.isSubmitting,P=r??k,w=d()&&!p.isTransitioning&&!P;return {finalIsSubmitting:P,canGoPrevious:w}},[b,p.isSubmitting,p.isTransitioning,d,r]),a=useCallback(async k=>{k?.preventDefault(),l.canGoPrevious&&await s();},[l.canGoPrevious,s]),y=useMemo(()=>({canGoPrevious:l.canGoPrevious,isSubmitting:l.finalIsSubmitting,onPrevious:a,className:e,currentStep:f,stepData:c,allData:i.allData,context:i}),[l.canGoPrevious,l.finalIsSubmitting,a,e,f,c,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:o.renderConfig?.previousButtonRenderer,props:y,...n})});var Zt=Dt.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:s,workflowState:p,workflowConfig:o,context:f,conditionsHelpers:d}=V(),b=useFormSubmitting(),c=useFormValues(),l=useMemo(()=>{let k=b||p.isSubmitting,P=r??k,w=(!!i?.allowSkip||d.isStepSkippable(p.currentStepIndex))&&!p.isTransitioning&&!P;return {finalIsSubmitting:P,canSkip:w}},[b,p.isSubmitting,p.isTransitioning,p.currentStepIndex,i?.allowSkip,d.isStepSkippable,r]),a=useCallback(async k=>{k?.preventDefault(),l.canSkip&&await s();},[l.canSkip,s]),y=useMemo(()=>({canSkip:l.canSkip,isSubmitting:l.finalIsSubmitting,onSkip:a,className:e,currentStep:i,stepData:c,allData:f.allData,context:f}),[l.canSkip,l.finalIsSubmitting,a,e,i,c,f.allData,f]);return jsx(ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:o.renderConfig?.skipButtonRenderer,props:y,...n})});var er=Dt.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:s,context:p,goToStep:o,conditionsHelpers:f}=V(),{visibleSteps:d,visibleToOriginalIndexMap:b,originalToVisibleIndexMap:c}=useMemo(()=>{let k=[],P=new Map,w=new Map;return i.steps.forEach((x,h)=>{if(f.isStepVisible(h)){let m=k.length;k.push(x),P.set(m,h),w.set(h,m);}}),{visibleSteps:k,visibleToOriginalIndexMap:P,originalToVisibleIndexMap:w}},[i.steps,f]),l=useCallback(k=>{let P=b.get(k);P!==void 0&&(e?e(P):o(P));},[b,e,o]),a=useMemo(()=>c.get(s.currentStepIndex)??-1,[c,s.currentStepIndex]),y=useMemo(()=>({steps:d,currentStepIndex:a,visitedSteps:p.visibleVisitedSteps,onStepClick:l,className:r}),[d,a,p.visibleVisitedSteps,l,r]);return jsx(ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:y,...n})});var Pe=class{constructor(e={}){this.version="1.0.0";this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,this._isAvailable=this.isLocalStorageAvailable();}async save(e,r){if(this._isAvailable)try{let n=this.getStorageKey(e),i={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},s=JSON.stringify(i),p=this.compress?this.compressData(s):s;localStorage.setItem(n,p);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},p=JSON.stringify(s),o=this.compress?this.compressData(p):p;localStorage.setItem(i,o);}catch(i){throw new E("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",i)}}else throw new E(`Failed to save to localStorage: ${n.message}`,"SAVE_FAILED",n);else throw new E("Unknown error occurred while saving","SAVE_FAILED")}}async load(e){if(!this._isAvailable)return null;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return null;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),null):{...s.data,visitedSteps:Array.isArray(s.data.visitedSteps)?s.data.visitedSteps:[]}}catch(r){throw r instanceof Error?new E(`Failed to load from localStorage: ${r.message}`,"LOAD_FAILED",r):new E("Unknown error occurred while loading","LOAD_FAILED")}}async remove(e){if(this._isAvailable)try{let r=this.getStorageKey(e);localStorage.removeItem(r);}catch(r){throw r instanceof Error?new E(`Failed to remove from localStorage: ${r.message}`,"REMOVE_FAILED",r):new E("Unknown error occurred while removing","REMOVE_FAILED")}}async exists(e){if(!this._isAvailable)return false;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return !1;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){if(!this._isAvailable)return [];try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix)){let i=n.substring(this.keyPrefix.length);await this.exists(i)&&e.push(i);}}return e}catch(e){throw e instanceof Error?new E(`Failed to list keys: ${e.message}`,"LIST_FAILED",e):new E("Unknown error occurred while listing keys","LIST_FAILED")}}async clear(){try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n?.startsWith(this.keyPrefix)&&e.push(n);}for(let r of e)localStorage.removeItem(r);}catch(e){throw e instanceof Error?new E(`Failed to clear localStorage: ${e.message}`,"CLEAR_FAILED",e):new E("Unknown error occurred while clearing","CLEAR_FAILED")}}getStorageKey(e){return `${this.keyPrefix}${e}`}isLocalStorageAvailable(){try{let e="__rilay_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}compressData(e){return btoa(e)}decompressData(e){try{return atob(e)}catch{return e}}async clearExpiredData(){if(!this._isAvailable)return;let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix))try{let i=localStorage.getItem(n);if(i){let s=this.compress?this.decompressData(i):i,p=JSON.parse(s);p.expiresAt&&Date.now()>p.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};export{Pe as LocalStorageAdapter,ht as Workflow,wt as WorkflowBody,Nt as WorkflowNextButton,E as WorkflowPersistenceError,zt as WorkflowPreviousButton,ke as WorkflowProvider,Zt as WorkflowSkipButton,er as WorkflowStepper,ye as WorkflowStoreContext,Se as combineWorkflowDataForConditions,$e as createWorkflowStore,ue as debounce,te as flattenObject,J as flow,de as generateStorageKey,st as mergePersistedState,Me as persistedToWorkflowState,le as useConditionEvaluation,$r as useCurrentStepIndex,en as useIsStepPassed,Yr as useIsStepVisited,Xr as usePassedSteps,$ as usePersistence,Qr as useStepDataById,ot as useStepMetadata,Hr as useVisitedSteps,nn as useWorkflowActions,jr as useWorkflowAllData,fe as useWorkflowAnalytics,me as useWorkflowConditions,V as useWorkflowContext,qr as useWorkflowInitializing,ge as useWorkflowNavigation,tn as useWorkflowNavigationState,ut as useWorkflowState,Zr as useWorkflowStepData,_ as useWorkflowStore,sn as useWorkflowStoreApi,be as useWorkflowSubmission,rn as useWorkflowSubmitState,Jr as useWorkflowSubmitting,Kr as useWorkflowTransitioning,it as validatePersistedData,pe as workflowStateToPersisted};
1
+ import {ComponentRendererWrapper,IdGenerator,normalizeToArray,deepClone,ensureUnique,getGlobalMonitor,evaluateCondition}from'@rilaykit/core';import {FormBody,useFormConfigContext,useFormSubmitting,useFormValues,form,FormProvider}from'@rilaykit/forms';import Tt,{createContext,useMemo,useCallback,useContext,useState,useRef,useEffect,useReducer}from'react';import {createStore,useStore}from'zustand';import {subscribeWithSelector}from'zustand/middleware';import {jsx}from'react/jsx-runtime';var H=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new IdGenerator;this.config=e,this.workflowId=r,this.workflowName=n,this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){return {id:e.id||this.idGenerator.next("step"),title:e.title,description:e.description,formConfig:e.formConfig instanceof form?e.formConfig.build():e.formConfig,allowSkip:e.allowSkip||false,renderer:e.renderer,conditions:e.conditions,metadata:e.metadata,onAfterValidation:e.onAfterValidation}}addStep(e){let r=normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}configure(e){return e.analytics&&(this.analytics=e.analytics),e.persistence&&(this.persistenceConfig=e.persistence),this}use(e){this.validatePluginDependencies(e),this.plugins.push(e);try{e.install(this);}catch(r){throw new Error(`Failed to install plugin "${e.name}": ${r instanceof Error?r.message:String(r)}`)}return this}validatePluginDependencies(e){if(!e.dependencies)return;let r=e.dependencies.filter(n=>!this.plugins.some(i=>i.name===n));if(r.length>0)throw new Error(`Plugin "${e.name}" requires missing dependencies: ${r.join(", ")}`)}removePlugin(e){return this.plugins=this.plugins.filter(r=>r.name!==e),this}updateStep(e,r){let n=this.steps.findIndex(i=>i.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[n]={...this.steps[n],...r},this}addStepConditions(e,r){let n=this.steps.findIndex(s=>s.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);let i={...this.steps[n].conditions,...r};return this.steps[n]={...this.steps[n],conditions:i},this}removeStep(e){return this.steps=this.steps.filter(r=>r.id!==e),this}getStep(e){return this.steps.find(r=>r.id===e)}getSteps(){return [...this.steps]}clearSteps(){return this.steps=[],this.idGenerator.reset(),this}clone(e,r){let n=new t(this.config,e||`${this.workflowId}-clone`,r||this.workflowName);return n.steps=deepClone(this.steps),n.analytics=this.analytics?deepClone(this.analytics):void 0,n.persistenceConfig=this.persistenceConfig?deepClone(this.persistenceConfig):void 0,n.plugins=[...this.plugins],n}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let r=this.steps.map(n=>n.id);try{ensureUnique(r,"step");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of this.plugins)if(n.dependencies){let i=n.dependencies.filter(s=>!this.plugins.some(d=>d.name===s));i.length>0&&e.push(`Plugin "${n.name}" requires missing dependencies: ${i.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((n,i)=>n+i.formConfig.allFields.length,0),r=this.steps.map(n=>n.formConfig.allFields.length);return {totalSteps:this.steps.length,totalFields:e,averageFieldsPerStep:this.steps.length>0?e/this.steps.length:0,maxFieldsInStep:r.length>0?Math.max(...r):0,minFieldsInStep:r.length>0?Math.min(...r):0,hasAnalytics:!!this.analytics}}build(){let e=this.validate();if(e.length>0)throw new Error(`Workflow validation failed: ${e.join(", ")}`);return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins,renderConfig:this.config.getWorkflowRenderConfig()}}toJSON(){return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins.map(e=>({name:e.name,version:e.version}))}}fromJSON(e){return this.workflowId=e.workflowId,this.workflowName=e.workflowName,this.workflowDescription=e.workflowDescription,this.steps=e.steps,this.analytics=e.analytics,this.persistenceConfig=e.persistence,this.plugins=e.plugins||[],this}};function ue(t,e={},r={}){return useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let n=i=>{try{let s;return i&&typeof i=="object"&&"build"in i?s=i.build():s=i,evaluateCondition(s,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:t.visible?n(t.visible):true,disabled:t.disabled?n(t.disabled):false,required:t.required?n(t.required):false,readonly:t.readonly?n(t.readonly):false}},[t,e,r])}function Oe(t,e={}){return useMemo(()=>{let r={};for(let[n,i]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},i){let s=d=>{try{return d&&typeof d=="object"&&"build"in d?evaluateCondition(d.build(),e):evaluateCondition(d,e)}catch(o){return console.warn(`Error evaluating condition for field ${n}:`,o),false}};r[n]={visible:i.visible?s(i.visible):true,disabled:i.disabled?s(i.disabled):false,required:i.required?s(i.required):false,readonly:i.readonly?s(i.readonly):false};}return r},[t,e])}function Le(t,e={}){return useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let s=Number.parseInt(n,10);if(r[s]={visible:true,disabled:false,required:false,readonly:false},i){let d=o=>{try{return o&&typeof o=="object"&&"build"in o?evaluateCondition(o.build(),e):evaluateCondition(o,e)}catch(f){return console.warn(`Error evaluating condition for step ${s}:`,f),false}};r[s]={visible:i.visible?d(i.visible):true,disabled:i.disabled?d(i.disabled):false,required:i.required?d(i.required):false,readonly:i.readonly?d(i.readonly):false};}}return r},[t,e])}var R=class extends Error{constructor(r,n,i){super(`[WorkflowPersistence] ${r} (Code: ${n})`);this.code=n;this.cause=i;this.name="WorkflowPersistenceError";}};function ce(t,e,r){return {workflowId:t,currentStepIndex:e.currentStepIndex,allData:{...e.allData},stepData:{...e.stepData},visitedSteps:Array.from(e.visitedSteps),passedSteps:Array.from(e.passedSteps),lastSaved:Date.now(),metadata:r}}function Ue(t){return {currentStepIndex:t.currentStepIndex,allData:{...t.allData},stepData:{...t.stepData},visitedSteps:new Set(t.visitedSteps),passedSteps:new Set(t.passedSteps||[]),isSubmitting:false,isTransitioning:false}}function at(t){if(!t||typeof t!="object")return false;let e=["workflowId","currentStepIndex","allData","stepData","visitedSteps","lastSaved"];for(let r of e)if(!(r in t))return false;return !(typeof t.workflowId!="string"||typeof t.currentStepIndex!="number"||typeof t.allData!="object"||typeof t.stepData!="object"||!Array.isArray(t.visitedSteps)||typeof t.lastSaved!="number")}function fe(t,e){return e?`${e}:${t}`:t}function Se(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function lt(t,e,r="persist"){let n=Ue(e);switch(r){case "persist":return {...n,isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};case "current":return {...t,visitedSteps:new Set([...t.visitedSteps,...n.visitedSteps]),passedSteps:new Set([...t.passedSteps,...n.passedSteps||[]])};case "merge":return {currentStepIndex:t.currentStepIndex,allData:{...n.allData,...t.allData},stepData:{...n.stepData,...t.stepData},visitedSteps:new Set([...n.visitedSteps,...t.visitedSteps]),passedSteps:new Set([...n.passedSteps||[],...t.passedSteps]),isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};default:return n}}function q({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[s,d]=useState(false),[o,f]=useState(null),[u,b]=useState(false),c=useRef(r),l=useRef(n),a=useRef({hasPendingChanges:false});useEffect(()=>{c.current=r,l.current=n;},[r,n]);let y=fe(l.current.storageKey||t,i),k=useCallback(()=>{f(null);},[]),P=useCallback((p,W)=>{let V=p instanceof R?p:new R(`${W} failed: ${p.message}`,"OPERATION_FAILED",p);f(V),console.error("[WorkflowPersistence]",V);},[]),D=useCallback(async p=>{k(),d(true);try{let W=ce(t,p,l.current.metadata);await c.current.save(y,W),a.current.lastSavedState={...p},a.current.hasPendingChanges=!1;}catch(W){throw P(W,"Save"),W}finally{d(false);}},[t,y,k,P]),x=useRef(Se(async p=>{try{await D(p);}catch(W){console.debug("[WorkflowPersistence] Auto-save failed:",W);}},n.debounceMs||500)),h=useCallback((p,W)=>W?p.currentStepIndex!==W.currentStepIndex||JSON.stringify(p.allData)!==JSON.stringify(W.allData)||JSON.stringify(p.stepData)!==JSON.stringify(W.stepData)||p.visitedSteps.size!==W.visitedSteps.size||!Array.from(p.visitedSteps).every(V=>W.visitedSteps.has(V)):true,[]),S=useCallback(async()=>{k(),b(true);try{let p=await c.current.load(y);return p&&(a.current.lastSavedState={currentStepIndex:p.currentStepIndex,allData:p.allData,stepData:p.stepData,visitedSteps:new Set(p.visitedSteps),passedSteps:new Set(p.passedSteps||[]),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},a.current.hasPendingChanges=!1),p}catch(p){return P(p,"Load"),null}finally{setTimeout(()=>b(false),100);}},[y,k,P]),I=useCallback(async()=>{k();try{await c.current.remove(y),a.current.lastSavedState=void 0,a.current.hasPendingChanges=!1;}catch(p){throw P(p,"Clear"),p}},[y,k,P]),L=useCallback(async()=>{try{return await c.current.exists(y)}catch(p){return P(p,"Exists check"),false}},[y,P]);useEffect(()=>{l.current.autoPersist&&(s||u||e.isInitializing||e.isSubmitting||e.isTransitioning||h(e,a.current.lastSavedState)&&(a.current.hasPendingChanges=true,x.current(e)));},[e,s,u,h]);let m=useCallback(async()=>{await D(e);},[D,e]);return {isPersisting:s,persistenceError:o,persistNow:m,loadPersistedData:S,clearPersistedData:I,hasPersistedData:L}}function pt(){let{workflowConfig:t,currentStep:e}=N(),r=useMemo(()=>e?.metadata,[e?.metadata]),n=useMemo(()=>u=>t.steps.find(c=>c.id===u)?.metadata,[t.steps]),i=useMemo(()=>u=>t.steps[u]?.metadata,[t.steps]),s=useMemo(()=>u=>r?u in r:false,[r]),d=useMemo(()=>(u,b)=>r&&u in r?r[u]:b,[r]),o=useMemo(()=>()=>t.steps.map((u,b)=>({id:u.id,title:u.title,index:b,metadata:u.metadata})),[t.steps]),f=useMemo(()=>u=>t.steps.map((b,c)=>({step:b,index:c})).filter(({step:b,index:c})=>u(b.metadata,b.id,c)).map(({step:b})=>b.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:s,getCurrentValue:d,getAllStepsMetadata:o,findStepsByMetadata:f}}function ge({workflowConfig:t,workflowState:e,workflowContext:r}){let n=useRef(Date.now()),i=useRef(new Map),s=useRef(false),d=useRef(null),o=getGlobalMonitor();useEffect(()=>{t.analytics?.onWorkflowStart&&!s.current&&(s.current=true,t.analytics.onWorkflowStart(t.id,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"start",totalSteps:t.steps.length},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:0,navigationDuration:0,conditionEvaluationDuration:0},"low"));},[t.id,t.analytics,r,o,t.steps.length]),useEffect(()=>{let l=t.steps[e.currentStepIndex];if(l&&d.current!==l.id){if(d.current&&t.analytics?.onStepComplete){let a=i.current.get(d.current);if(a){let y=Date.now()-a;t.analytics.onStepComplete(d.current,y,e.stepData,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:d.current,duration:y},{timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:y,conditionEvaluationDuration:0},"low");}}d.current=l.id,i.current.set(l.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(l.id,Date.now(),r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:l.id,stepIndex:e.currentStepIndex},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:0},"low");}},[e.currentStepIndex,t.steps,t.analytics,r,e.stepData,o,t.id]);let f=useCallback((l,a)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(l,a,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:l,reason:a},void 0,"medium");},[t.analytics,r,o,t.id]),u=useCallback(l=>{t.analytics?.onError&&t.analytics.onError(l,r),o&&o.trackError(l,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,o,t.id,e.currentStepIndex,t.steps]),b=useCallback((l,a,y)=>{if(!o)return;let k={timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:a,navigationDuration:y,conditionEvaluationDuration:0};o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:l,toStep:a,direction:a>l?"forward":"backward"},k,y>1e3?"medium":"low");},[o,t.id,t.steps.length]),c=useCallback((l,a)=>{if(!o)return;let y={timestamp:Date.now(),duration:l,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:l};o.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:a,currentStepIndex:e.currentStepIndex},y,l>100?"medium":"low");},[o,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:f,trackError:u,trackNavigation:b,trackConditionEvaluation:c}}function se(t,e=""){let r={};for(let n in t)if(n in t){let i=t[n],s=e?`${e}.${n}`:n;i!==null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)?Object.assign(r,se(i,s)):r[s]=i;}return r}function be(t,e){let r=se(t),n=se(e);return {...{...t,...e},...r,...n}}function $e(t,e){return {visible:t.visible,skippable:e===true||t.required}}function ye({workflowConfig:t,workflowState:e,currentStep:r}){let n=useMemo(()=>be(e.allData,e.stepData),[e.allData,e.stepData]),i=useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),s=ue(i,n,{visible:true,disabled:false,required:false,readonly:false}),d=useMemo(()=>$e(s,r?.allowSkip),[s,r?.allowSkip]),o=useMemo(()=>{let x={};return t.steps.forEach((h,S)=>{h.conditions&&(x[S]={visible:h.conditions.visible,required:h.conditions.skippable});}),x},[t.steps]),f=Le(o,n),u=useMemo(()=>{let x={};return t.steps.forEach((h,S)=>{let I=f[S];I?x[S]=$e(I,h.allowSkip):x[S]={visible:true,skippable:h.allowSkip===true};}),x},[t.steps,f]),b=useMemo(()=>{if(!r?.formConfig?.allFields)return {};let x={};for(let h of r.formConfig.allFields)h.conditions&&(x[h.id]=h.conditions);return x},[r?.formConfig?.allFields]),c=Oe(b,n),l=useCallback(x=>x<0||x>=t.steps.length?false:u[x]?.visible??true,[u,t.steps.length]),a=useCallback(x=>x<0||x>=t.steps.length?false:u[x]?.skippable??false,[u,t.steps.length]),y=useCallback(x=>c[x]?.visible??true,[c]),k=useCallback(x=>c[x]?.disabled??false,[c]),P=useCallback(x=>c[x]?.required??false,[c]),D=useCallback(x=>c[x]?.readonly??false,[c]);return {stepConditions:d,fieldConditions:c,allStepConditions:u,isStepVisible:l,isStepSkippable:a,isFieldVisible:y,isFieldDisabled:k,isFieldRequired:P,isFieldReadonly:D}}function ve({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:s,markStepVisited:d,markStepPassed:o,setStepData:f,onStepChange:u}){let b=useRef(u);b.current=u;let c=t.steps[e.currentStepIndex],l=useCallback(()=>({setStepData:(m,p)=>{f(p,m);},setStepFields:(m,p)=>{let V={...e.allData[m]||{},...p};f(V,m);},getStepData:m=>e.allData[m]||{},setNextStepField:(m,p)=>{let W=e.currentStepIndex+1;if(W<t.steps.length){let V=t.steps[W].id,X={...e.allData[V]||{},[m]:p};f(X,V);}},setNextStepFields:m=>{let p=e.currentStepIndex+1;if(p<t.steps.length){let W=t.steps[p].id,z={...e.allData[W]||{},...m};f(z,W);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,f]),a=useCallback(async m=>{if(m<0||m>=t.steps.length||!n.isStepVisible(m))return false;s(true);try{return b.current&&b.current(e.currentStepIndex,m,r),i(m),d(m,t.steps[m].id),!0}catch(p){return console.error("Step transition failed:",p),t.analytics?.onError&&t.analytics.onError(p,r),false}finally{s(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,s,i,d]),y=useCallback(m=>{for(let p=m+1;p<t.steps.length;p++)if(n.isStepVisible(p))return p;return null},[t.steps.length,n]),k=useCallback(m=>{for(let p=m-1;p>=0;p--)if(n.isStepVisible(p))return p;return null},[n]),P=useCallback(async()=>{if(c?.onAfterValidation)try{let p=l();await c.onAfterValidation(e.stepData,p,r);}catch(p){return console.error("onAfterValidation failed:",p),t.analytics?.onError&&t.analytics.onError(p,r),false}o(c.id);let m=y(e.currentStepIndex);return m===null?false:a(m)},[c,l,e.stepData,r,t.analytics,e.currentStepIndex,y,a,o]),D=useCallback(async()=>{let m=k(e.currentStepIndex);return m===null?false:a(m)},[e.currentStepIndex,k,a]),x=useCallback(async()=>!c?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(c.id,"user_skip",r),P()),[c,n,e.currentStepIndex,t.analytics,r,P]),h=useCallback(m=>m<0||m>=t.steps.length?false:n.isStepVisible(m),[t.steps.length,n]),S=useCallback(()=>{let m=y(e.currentStepIndex);return m!==null&&h(m)},[e.currentStepIndex,y,h]),I=useCallback(()=>{let m=k(e.currentStepIndex);return m!==null&&h(m)},[e.currentStepIndex,k,h]),L=useCallback(()=>c?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[c?.allowSkip,n,e.currentStepIndex]);return {goToStep:a,goNext:P,goPrevious:D,skipStep:x,canGoToStep:h,canGoNext:S,canGoPrevious:I,canSkipCurrentStep:L}}function ft(t,e){switch(e.type){case "SET_CURRENT_STEP":return {...t,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":return {...t,stepData:e.data,allData:{...t.allData,[e.stepId]:e.data}};case "SET_ALL_DATA":return {...t,allData:e.data};case "SET_FIELD_VALUE":{let r={...t.stepData,[e.fieldId]:e.value};return {...t,stepData:r,allData:{...t.allData,[e.stepId]:r}}}case "SET_SUBMITTING":return {...t,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...t,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...t,visitedSteps:new Set([...t.visitedSteps,e.stepId])};case "MARK_STEP_PASSED":return {...t,passedSteps:new Set([...t.passedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false};case "LOAD_PERSISTED_STATE":return {...t,...e.state};case "SET_INITIALIZATION_COMPLETE":return {...t,isInitializing:false};default:return t}}function St({defaultValues:t={},defaultStepIndex:e,workflowSteps:r,persistence:n}){let i=useMemo(()=>{let S=new Set;if(e&&e>0&&r)for(let I=0;I<e;I++)r[I]&&S.add(r[I].id);return S},[e,r]),s=useMemo(()=>{let S=new Set;if(e&&e>0&&r)for(let I=0;I<e;I++)r[I]&&S.add(r[I].id);return S},[e,r]),d={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:i,passedSteps:s,isSubmitting:false,isTransitioning:false,isInitializing:true},[o,f]=useReducer(ft,d),u=n?.adapter?q({workflowId:n.workflowId,workflowState:o,adapter:n.adapter,options:n.options,userId:n.userId}):null,b=useCallback(S=>{f({type:"SET_CURRENT_STEP",stepIndex:S});},[]),c=useCallback((S,I)=>{f({type:"SET_STEP_DATA",data:S,stepId:I});},[]),l=useCallback((S,I,L)=>{f({type:"SET_FIELD_VALUE",fieldId:S,value:I,stepId:L});},[]),a=useCallback(S=>{f({type:"SET_SUBMITTING",isSubmitting:S});},[]),y=useCallback(S=>{f({type:"SET_TRANSITIONING",isTransitioning:S});},[]),k=useCallback((S,I)=>{f({type:"MARK_STEP_VISITED",stepIndex:S,stepId:I});},[]),P=useCallback(S=>{f({type:"MARK_STEP_PASSED",stepId:S});},[]),D=useCallback(()=>{f({type:"RESET_WORKFLOW"});},[]),x=useCallback(()=>{f({type:"SET_INITIALIZATION_COMPLETE"});},[]),h=useCallback(async()=>{if(!u)return x(),false;try{let S=await u.loadPersistedData();if(S){let I={currentStepIndex:S.currentStepIndex,allData:S.allData,stepData:S.stepData,visitedSteps:new Set(S.visitedSteps),passedSteps:new Set(S.passedSteps||[])};return f({type:"LOAD_PERSISTED_STATE",state:I}),x(),!0}}catch(S){console.error("Failed to load persisted state:",S);}return x(),false},[u,x]);return {workflowState:o,setCurrentStep:b,setStepData:c,setFieldValue:l,setSubmitting:a,setTransitioning:y,markStepVisited:k,markStepPassed:P,resetWorkflow:D,loadPersistedState:h,persistence:u?{isPersisting:u.isPersisting,persistenceError:u.persistenceError,persistNow:u.persistNow,clearPersistedData:u.clearPersistedData,hasPersistedData:u.hasPersistedData}:null}}function ke({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:s}){let d=useRef(i);d.current=i;let o=useCallback(async()=>{n(true);try{if(d.current&&await d.current(e.allData),t.analytics?.onWorkflowComplete){let u=Date.now()-s.current;t.analytics.onWorkflowComplete(t.id,u,e.allData);}}catch(u){throw console.error("Workflow submission failed:",u),t.analytics?.onError&&t.analytics.onError(u,r),u}finally{n(false);}},[e.allData,t.analytics,t.id,r,s,n]),f=useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:o,isSubmitting:e.isSubmitting,canSubmit:f()}}function Je(t={}){let{defaultValues:e={},defaultStepIndex:r=0,initialVisitedSteps:n=new Set,initialPassedSteps:i=new Set}=t;return createStore()(subscribeWithSelector((s,d)=>({currentStepIndex:r,isTransitioning:false,isInitializing:true,allData:{...e},stepData:{},visitedSteps:new Set(n),passedSteps:new Set(i),isSubmitting:false,_defaultValues:{...e},_defaultStepIndex:r,_setCurrentStep:o=>{s({currentStepIndex:o});},_setStepData:(o,f)=>{s(u=>({stepData:o,allData:{...u.allData,[f]:o}}));},_setAllData:o=>{s({allData:o});},_setFieldValue:(o,f,u)=>{s(b=>{let c={...b.stepData,[o]:f};return {stepData:c,allData:{...b.allData,[u]:c}}});},_setSubmitting:o=>{s({isSubmitting:o});},_setTransitioning:o=>{s({isTransitioning:o});},_setInitializing:o=>{s({isInitializing:o});},_markStepVisited:o=>{s(f=>({visitedSteps:new Set([...f.visitedSteps,o])}));},_markStepPassed:o=>{s(f=>({passedSteps:new Set([...f.passedSteps,o])}));},_reset:()=>{let o=d();s({currentStepIndex:o._defaultStepIndex,allData:{...o._defaultValues},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false});},_loadPersistedState:o=>{s(f=>({...f,...o,isInitializing:false}));}})))}var xe=createContext(null);function A(){let t=useContext(xe);if(!t)throw new Error("useWorkflowStore must be used within a WorkflowProvider");return t}function jr(){let t=A();return useStore(t,e=>e.currentStepIndex)}function Zr(){let t=A();return useStore(t,e=>e.isTransitioning)}function Hr(){let t=A();return useStore(t,e=>e.isInitializing)}function Qr(){let t=A();return useStore(t,e=>e.isSubmitting)}function Xr(){let t=A();return useStore(t,e=>e.allData)}function Yr(){let t=A();return useStore(t,e=>e.stepData)}function en(t){let e=A();return useStore(e,r=>r.allData[t])}function tn(){let t=A();return useStore(t,e=>e.visitedSteps)}function rn(){let t=A();return useStore(t,e=>e.passedSteps)}function nn(t){let e=A();return useStore(e,r=>r.visitedSteps.has(t))}function sn(t){let e=A();return useStore(e,r=>r.passedSteps.has(t))}function on(){let t=A(),e=useStore(t,i=>i.currentStepIndex),r=useStore(t,i=>i.isTransitioning),n=useStore(t,i=>i.isSubmitting);return {currentStepIndex:e,isTransitioning:r,isSubmitting:n}}function an(){let t=A(),e=useStore(t,i=>i.isSubmitting),r=useStore(t,i=>i.isTransitioning),n=useStore(t,i=>i.isInitializing);return {isSubmitting:e,isTransitioning:r,isInitializing:n}}function ln(){let t=A();return {setCurrentStep:e=>t.getState()._setCurrentStep(e),setStepData:(e,r)=>t.getState()._setStepData(e,r),setAllData:e=>t.getState()._setAllData(e),setFieldValue:(e,r,n)=>t.getState()._setFieldValue(e,r,n),setSubmitting:e=>t.getState()._setSubmitting(e),setTransitioning:e=>t.getState()._setTransitioning(e),setInitializing:e=>t.getState()._setInitializing(e),markStepVisited:e=>t.getState()._markStepVisited(e),markStepPassed:e=>t.getState()._markStepPassed(e),reset:()=>t.getState()._reset(),loadPersistedState:e=>t.getState()._loadPersistedState(e)}}function pn(){return A()}var It={save:async()=>{},load:async()=>null,remove:async()=>{},exists:async()=>false},je=createContext(null);function Wt(t,e){let r=new Set,n=new Set;if(t>0)for(let i=0;i<t;i++)e[i]&&(r.add(e[i].id),n.add(e[i].id));return {visitedSteps:r,passedSteps:n}}function he({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:i,onWorkflowComplete:s,className:d}){let o=useRef(i),f=useRef(s);o.current=i,f.current=s;let u=useMemo(()=>{if(!n)return 0;let v=e.steps.findIndex(g=>g.id===n);return v===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):v},[n,e.steps]),b=useMemo(()=>Wt(u,e.steps),[u,e.steps]),c=useRef(null);c.current||(c.current=Je({defaultValues:r,defaultStepIndex:u,initialVisitedSteps:b.visitedSteps,initialPassedSteps:b.passedSteps}));let l=c.current,[a,y]=useState(()=>{let v=l.getState();return {currentStepIndex:v.currentStepIndex,allData:v.allData,stepData:v.stepData,visitedSteps:v.visitedSteps,passedSteps:v.passedSteps,isSubmitting:v.isSubmitting,isTransitioning:v.isTransitioning,isInitializing:v.isInitializing}});useEffect(()=>l.subscribe(g=>{y({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:g.visitedSteps,passedSteps:g.passedSteps,isSubmitting:g.isSubmitting,isTransitioning:g.isTransitioning,isInitializing:g.isInitializing});}),[l]);let k=useCallback(v=>l.getState()._setCurrentStep(v),[l]),P=useCallback((v,g)=>l.getState()._setStepData(v,g),[l]),D=useCallback((v,g,E)=>l.getState()._setFieldValue(v,g,E),[l]),x=useCallback(v=>l.getState()._setSubmitting(v),[l]),h=useCallback(v=>l.getState()._setTransitioning(v),[l]),S=useCallback((v,g)=>l.getState()._markStepVisited(g),[l]),I=useCallback(v=>l.getState()._markStepPassed(v),[l]),L=useCallback(()=>l.getState()._reset(),[l]),m=!!e.persistence?.adapter,p=q({workflowId:e.id,workflowState:a,adapter:e.persistence?.adapter??It,options:e.persistence?.options,userId:e.persistence?.userId}),W=useRef(p);W.current=p;let V=useRef(false);useEffect(()=>{if(V.current)return;V.current=true,(async()=>{if(m)try{let g=await W.current.loadPersistedData();if(g){l.getState()._loadPersistedState({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:new Set(g.visitedSteps),passedSteps:new Set(g.passedSteps||[])});return}}catch(g){console.error("Failed to load persisted state:",g);}l.getState()._setInitializing(false);})();},[l,m]);let z=useMemo(()=>({isPersisting:m?p.isPersisting:false,persistenceError:m?p.persistenceError:null,persistNow:m?p.persistNow:void 0}),[m,p.isPersisting,p.persistenceError,p.persistNow]),X=useMemo(()=>({workflowId:e.id,currentStepIndex:a.currentStepIndex,totalSteps:e.steps.length,allData:a.allData,stepData:a.stepData,visitedSteps:a.visitedSteps}),[e.id,e.steps.length,a.currentStepIndex,a.allData,a.stepData,a.visitedSteps]),C=useMemo(()=>e.steps[a.currentStepIndex],[e.steps,a.currentStepIndex]),K=useMemo(()=>C?.formConfig,[C?.formConfig]),_=ye({workflowConfig:e,workflowState:a,currentStep:C}),G=useMemo(()=>{let v=-1;for(let w=0;w<e.steps.length;w++)if(_.isStepVisible(w)){v=w;break}let g=-1;for(let w=e.steps.length-1;w>=0;w--)if(_.isStepVisible(w)){g=w;break}let E=new Set;for(let w=0;w<e.steps.length;w++){let te=e.steps[w];_.isStepVisible(w)&&a.visitedSteps.has(te.id)&&E.add(te.id);}return {...X,isFirstStep:a.currentStepIndex===v,isLastStep:a.currentStepIndex===g,visibleVisitedSteps:E,passedSteps:a.passedSteps}},[X,a.currentStepIndex,a.visitedSteps,a.passedSteps,_,e.steps]),{analyticsStartTime:Xe}=ge({workflowConfig:e,workflowState:a,workflowContext:G}),{goToStep:De,goNext:Y,goPrevious:we,skipStep:Re,canGoToStep:Ee,canGoNext:Te,canGoPrevious:Ce,canSkipCurrentStep:Ae}=ve({workflowConfig:e,workflowState:a,workflowContext:G,conditionsHelpers:_,setCurrentStep:k,setTransitioning:h,markStepVisited:S,markStepPassed:I,setStepData:P,onStepChange:o.current}),ae=useRef(false);useEffect(()=>{if(ae.current)return;if(!_.isStepVisible(a.currentStepIndex)){for(let g=0;g<e.steps.length;g++)if(_.isStepVisible(g)){k(g),S(g,e.steps[g].id);break}}ae.current=true;},[a.currentStepIndex,e.steps,k,S,_]),useEffect(()=>{if(!ae.current)return;if(!_.isStepVisible(a.currentStepIndex)){let g=null;for(let E=a.currentStepIndex+1;E<e.steps.length;E++)if(_.isStepVisible(E)){g=E;break}if(g===null){for(let E=a.currentStepIndex-1;E>=0;E--)if(_.isStepVisible(E)){g=E;break}}g!==null&&(k(g),S(g,e.steps[g].id));}},[_,a.currentStepIndex,e.steps,k,S]);let{submitWorkflow:ee,isSubmitting:_e,canSubmit:Ve}=ke({workflowConfig:e,workflowState:a,workflowContext:G,setSubmitting:x,onWorkflowComplete:f.current,analyticsStartTime:Xe}),le=useCallback((v,g)=>{D(v,g,C?.id||"");},[D,C?.id]),Ne=useCallback(v=>{P(v,C?.id||"");},[P,C?.id]),Ye=useCallback(async v=>{C?.id&&v&&P(v,C.id),G.isLastStep?await ee():await Y();},[G.isLastStep,ee,Y,C?.id,P]),Fe=useMemo(()=>({goToStep:De,goNext:Y,goPrevious:we,skipStep:Re,canGoToStep:Ee,canGoNext:Te,canGoPrevious:Ce,canSkipCurrentStep:Ae}),[De,Y,we,Re,Ee,Te,Ce,Ae]),Be=useMemo(()=>({setValue:le,setStepData:Ne,resetWorkflow:L}),[le,Ne,L]),Me=useMemo(()=>({submitWorkflow:ee,isSubmitting:_e,canSubmit:Ve}),[ee,_e,Ve]),et=useMemo(()=>({workflowState:a,workflowConfig:e,currentStep:C,context:G,formConfig:K,conditionsHelpers:_,currentStepMetadata:C?.metadata,...Fe,...Be,...Me,persistNow:z.persistNow,isPersisting:z.isPersisting,persistenceError:z.persistenceError}),[a,e,C,G,K,_,Fe,Be,Me,z]),tt=useMemo(()=>{if(!C?.id)return {};let v=a?.allData[C.id]||{};if(!K?.allFields)return v;let g=new Set(K.allFields.map(w=>w.id)),E={};for(let[w,te]of Object.entries(v))g.has(w)&&(E[w]=te);return E},[a?.allData,C?.id,K?.allFields]),rt=useMemo(()=>a.isInitializing.toString(),[a.isInitializing]);return jsx(xe.Provider,{value:l,children:jsx(je.Provider,{value:et,children:jsx(FormProvider,{formConfig:K,defaultValues:tt,onFieldChange:le,"data-workflow-id":e.id,className:d,onSubmit:Ye,children:t},rt)})})}function N(){let t=useContext(je);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function wt({children:t,workflowConfig:e,...r}){let n=useMemo(()=>e instanceof H?e.build():e,[e]);return jsx(he,{...r,workflowConfig:n,children:t})}var Ct=Tt.memo(function({stepId:e,children:r}){let{currentStep:n}=N();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:s}=n;return i?s?s(n):r??jsx(FormBody,{}):null});var Ot=Tt.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:s,workflowConfig:d,currentStep:o}=N(),{submit:f}=useFormConfigContext(),u=useFormSubmitting(),b=useFormValues(),c=useMemo(()=>{let y=u||s.isSubmitting,k=r??y,P=!s.isTransitioning&&!k;return {finalIsSubmitting:k,canGoNext:P}},[u,s.isSubmitting,s.isTransitioning,r]),l=useCallback(async y=>{y?.preventDefault(),c.canGoNext&&await f(y);},[c.canGoNext,f]),a=useMemo(()=>({isLastStep:i.isLastStep,canGoNext:c.canGoNext,isSubmitting:c.finalIsSubmitting,onSubmit:l,className:e,currentStep:o,stepData:b,allData:i.allData,context:i}),[i.isLastStep,c.canGoNext,c.finalIsSubmitting,l,e,o,b,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:d.renderConfig?.nextButtonRenderer,props:a,...n})});var qt=Tt.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:s,workflowState:d,workflowConfig:o,currentStep:f,canGoPrevious:u}=N(),b=useFormSubmitting(),c=useFormValues(),l=useMemo(()=>{let k=b||d.isSubmitting,P=r??k,D=u()&&!d.isTransitioning&&!P;return {finalIsSubmitting:P,canGoPrevious:D}},[b,d.isSubmitting,d.isTransitioning,u,r]),a=useCallback(async k=>{k?.preventDefault(),l.canGoPrevious&&await s();},[l.canGoPrevious,s]),y=useMemo(()=>({canGoPrevious:l.canGoPrevious,isSubmitting:l.finalIsSubmitting,onPrevious:a,className:e,currentStep:f,stepData:c,allData:i.allData,context:i}),[l.canGoPrevious,l.finalIsSubmitting,a,e,f,c,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:o.renderConfig?.previousButtonRenderer,props:y,...n})});var Yt=Tt.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:s,workflowState:d,workflowConfig:o,context:f,conditionsHelpers:u}=N(),b=useFormSubmitting(),c=useFormValues(),l=useMemo(()=>{let k=b||d.isSubmitting,P=r??k,D=(!!i?.allowSkip||u.isStepSkippable(d.currentStepIndex))&&!d.isTransitioning&&!P;return {finalIsSubmitting:P,canSkip:D}},[b,d.isSubmitting,d.isTransitioning,d.currentStepIndex,i?.allowSkip,u.isStepSkippable,r]),a=useCallback(async k=>{k?.preventDefault(),l.canSkip&&await s();},[l.canSkip,s]),y=useMemo(()=>({canSkip:l.canSkip,isSubmitting:l.finalIsSubmitting,onSkip:a,className:e,currentStep:i,stepData:c,allData:f.allData,context:f}),[l.canSkip,l.finalIsSubmitting,a,e,i,c,f.allData,f]);return jsx(ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:o.renderConfig?.skipButtonRenderer,props:y,...n})});var ir=Tt.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:s,context:d,goToStep:o,conditionsHelpers:f}=N(),{visibleSteps:u,visibleToOriginalIndexMap:b,originalToVisibleIndexMap:c}=useMemo(()=>{let k=[],P=new Map,D=new Map;return i.steps.forEach((x,h)=>{if(f.isStepVisible(h)){let S=k.length;k.push(x),P.set(S,h),D.set(h,S);}}),{visibleSteps:k,visibleToOriginalIndexMap:P,originalToVisibleIndexMap:D}},[i.steps,f]),l=useCallback(k=>{let P=b.get(k);P!==void 0&&(e?e(P):o(P));},[b,e,o]),a=useMemo(()=>c.get(s.currentStepIndex)??-1,[c,s.currentStepIndex]),y=useMemo(()=>({steps:u,currentStepIndex:a,visitedSteps:d.visibleVisitedSteps,onStepClick:l,className:r}),[u,a,d.visibleVisitedSteps,l,r]);return jsx(ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:y,...n})});var We=class{constructor(e={}){this.version="1.0.0";this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,this._isAvailable=this.isLocalStorageAvailable();}async save(e,r){if(this._isAvailable)try{let n=this.getStorageKey(e),i={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},s=JSON.stringify(i),d=this.compress?this.compressData(s):s;localStorage.setItem(n,d);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},d=JSON.stringify(s),o=this.compress?this.compressData(d):d;localStorage.setItem(i,o);}catch(i){throw new R("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",i)}}else throw new R(`Failed to save to localStorage: ${n.message}`,"SAVE_FAILED",n);else throw new R("Unknown error occurred while saving","SAVE_FAILED")}}async load(e){if(!this._isAvailable)return null;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return null;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),null):{...s.data,visitedSteps:Array.isArray(s.data.visitedSteps)?s.data.visitedSteps:[]}}catch(r){throw r instanceof Error?new R(`Failed to load from localStorage: ${r.message}`,"LOAD_FAILED",r):new R("Unknown error occurred while loading","LOAD_FAILED")}}async remove(e){if(this._isAvailable)try{let r=this.getStorageKey(e);localStorage.removeItem(r);}catch(r){throw r instanceof Error?new R(`Failed to remove from localStorage: ${r.message}`,"REMOVE_FAILED",r):new R("Unknown error occurred while removing","REMOVE_FAILED")}}async exists(e){if(!this._isAvailable)return false;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return !1;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){if(!this._isAvailable)return [];try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix)){let i=n.substring(this.keyPrefix.length);await this.exists(i)&&e.push(i);}}return e}catch(e){throw e instanceof Error?new R(`Failed to list keys: ${e.message}`,"LIST_FAILED",e):new R("Unknown error occurred while listing keys","LIST_FAILED")}}async clear(){try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n?.startsWith(this.keyPrefix)&&e.push(n);}for(let r of e)localStorage.removeItem(r);}catch(e){throw e instanceof Error?new R(`Failed to clear localStorage: ${e.message}`,"CLEAR_FAILED",e):new R("Unknown error occurred while clearing","CLEAR_FAILED")}}getStorageKey(e){return `${this.keyPrefix}${e}`}isLocalStorageAvailable(){try{let e="__rilay_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}compressData(e){return btoa(e)}decompressData(e){try{return atob(e)}catch{return e}}async clearExpiredData(){if(!this._isAvailable)return;let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix))try{let i=localStorage.getItem(n);if(i){let s=this.compress?this.decompressData(i):i,d=JSON.parse(s);d.expiresAt&&Date.now()>d.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};export{We as LocalStorageAdapter,wt as Workflow,Ct as WorkflowBody,Ot as WorkflowNextButton,R as WorkflowPersistenceError,qt as WorkflowPreviousButton,he as WorkflowProvider,Yt as WorkflowSkipButton,ir as WorkflowStepper,xe as WorkflowStoreContext,be as combineWorkflowDataForConditions,Je as createWorkflowStore,Se as debounce,se as flattenObject,H as flow,fe as generateStorageKey,lt as mergePersistedState,Ue as persistedToWorkflowState,ue as useConditionEvaluation,jr as useCurrentStepIndex,sn as useIsStepPassed,nn as useIsStepVisited,rn as usePassedSteps,q as usePersistence,en as useStepDataById,pt as useStepMetadata,tn as useVisitedSteps,ln as useWorkflowActions,Xr as useWorkflowAllData,ge as useWorkflowAnalytics,ye as useWorkflowConditions,N as useWorkflowContext,Hr as useWorkflowInitializing,ve as useWorkflowNavigation,on as useWorkflowNavigationState,St as useWorkflowState,Yr as useWorkflowStepData,A as useWorkflowStore,pn as useWorkflowStoreApi,ke as useWorkflowSubmission,an as useWorkflowSubmitState,Qr as useWorkflowSubmitting,Zr as useWorkflowTransitioning,at as validatePersistedData,ce as workflowStateToPersisted};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rilaykit/workflow",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "private": false,
5
5
  "description": "Workflow and multi-step form utilities for RilayKit",
6
6
  "main": "dist/index.js",
@@ -16,6 +16,9 @@
16
16
  "files": [
17
17
  "dist"
18
18
  ],
19
+ "publishConfig": {
20
+ "provenance": true
21
+ },
19
22
  "keywords": [
20
23
  "react",
21
24
  "workflow",
@@ -24,29 +27,29 @@
24
27
  "typescript"
25
28
  ],
26
29
  "author": "AND YOU CREATE <contact@andyoucreate.com>",
27
- "license": "SEE LICENSE IN LICENSE",
28
- "homepage": "https://rilay.io",
30
+ "license": "MIT",
31
+ "homepage": "https://rilay.dev",
29
32
  "repository": {
30
33
  "type": "git",
31
- "url": "https://github.com/andyoucreate/rilay.git"
34
+ "url": "https://github.com/andyoucreate/rilaykit.git"
32
35
  },
33
36
  "bugs": {
34
- "url": "https://github.com/andyoucreate/rilay/issues"
37
+ "url": "https://github.com/andyoucreate/rilaykit/issues"
35
38
  },
36
39
  "dependencies": {
37
40
  "zustand": "^5.0.9",
38
- "@rilaykit/core": "0.1.0",
39
- "@rilaykit/forms": "0.1.0"
41
+ "@rilaykit/core": "0.1.2",
42
+ "@rilaykit/forms": "0.1.2"
40
43
  },
41
44
  "peerDependencies": {
42
45
  "react": ">=18.0.0",
43
46
  "react-dom": ">=18.0.0"
44
47
  },
45
48
  "devDependencies": {
46
- "@types/react": "^18.3.23",
47
- "@types/react-dom": "^18.3.0",
48
- "react": "^18.3.1",
49
- "react-dom": "^18.3.1",
49
+ "@types/react": "^19.0.0",
50
+ "@types/react-dom": "^19.0.0",
51
+ "react": "^19.0.0",
52
+ "react-dom": "^19.0.0",
50
53
  "typescript": "^5.8.3"
51
54
  },
52
55
  "scripts": {