@secmia/openui-flow 4.2.7 → 4.2.8

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/dist/index.js CHANGED
@@ -1430,10 +1430,11 @@ var defaultStyles = {
1430
1430
  gap: 12,
1431
1431
  width: "100%",
1432
1432
  maxWidth: 560,
1433
- border: "1px solid #e5e7eb",
1433
+ border: "1px solid #cbd5e1",
1434
1434
  borderRadius: 14,
1435
1435
  padding: 16,
1436
- background: "#ffffff",
1436
+ background: "#f8fafc",
1437
+ color: "#0f172a",
1437
1438
  fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, sans-serif"
1438
1439
  },
1439
1440
  headerRow: {
@@ -1446,7 +1447,7 @@ var defaultStyles = {
1446
1447
  fontSize: 12,
1447
1448
  textTransform: "uppercase",
1448
1449
  letterSpacing: 1.2,
1449
- color: "#6b7280",
1450
+ color: "#475569",
1450
1451
  marginBottom: 4
1451
1452
  },
1452
1453
  title: {
@@ -1455,12 +1456,13 @@ var defaultStyles = {
1455
1456
  lineHeight: "28px"
1456
1457
  },
1457
1458
  badge: {
1458
- border: "1px solid #d1d5db",
1459
+ border: "1px solid #cbd5e1",
1459
1460
  borderRadius: 999,
1460
1461
  padding: "4px 10px",
1461
1462
  fontSize: 12,
1462
1463
  fontWeight: 600,
1463
- color: "#374151"
1464
+ color: "#1e293b",
1465
+ background: "#ffffff"
1464
1466
  },
1465
1467
  success: {
1466
1468
  border: "1px solid #bbf7d0",
@@ -1488,7 +1490,7 @@ var defaultStyles = {
1488
1490
  },
1489
1491
  caption: {
1490
1492
  margin: 0,
1491
- color: "#4b5563",
1493
+ color: "#334155",
1492
1494
  fontSize: 14
1493
1495
  },
1494
1496
  formRow: {
@@ -1503,19 +1505,22 @@ var defaultStyles = {
1503
1505
  },
1504
1506
  input: {
1505
1507
  width: "100%",
1506
- border: "1px solid #d1d5db",
1508
+ border: "1px solid #94a3b8",
1507
1509
  borderRadius: 8,
1508
1510
  height: 40,
1509
1511
  padding: "0 12px",
1510
- fontSize: 14
1512
+ fontSize: 14,
1513
+ background: "#ffffff",
1514
+ color: "#0f172a"
1511
1515
  },
1512
1516
  button: {
1513
- border: "1px solid #d1d5db",
1517
+ border: "1px solid #94a3b8",
1514
1518
  borderRadius: 8,
1515
1519
  height: 40,
1516
1520
  padding: "0 14px",
1517
1521
  fontWeight: 600,
1518
1522
  background: "#ffffff",
1523
+ color: "#0f172a",
1519
1524
  whiteSpace: "nowrap",
1520
1525
  cursor: "pointer"
1521
1526
  },
@@ -1540,10 +1545,11 @@ var defaultStyles = {
1540
1545
  },
1541
1546
  oauthButton: {
1542
1547
  flex: 1,
1543
- border: "1px solid #d1d5db",
1548
+ border: "1px solid #94a3b8",
1544
1549
  borderRadius: 8,
1545
1550
  padding: "10px 12px",
1546
- background: "#f9fafb",
1551
+ background: "#ffffff",
1552
+ color: "#0f172a",
1547
1553
  cursor: "pointer"
1548
1554
  }
1549
1555
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/AdaptiveFlow.tsx","../src/engine.ts"],"sourcesContent":["export {\r\n\tuseAdaptiveFlow,\r\n\tAdaptiveFlow,\r\n\ttype AdaptiveFlowAdapter,\r\n\ttype AdaptiveFlowClassNames,\r\n\ttype AdaptiveFlowFieldErrors,\r\n\ttype AdaptiveFlowOAuthProvider,\r\n\ttype AdaptiveFlowPersistence,\r\n\ttype AdaptiveFlowProps,\r\n\ttype AdaptiveFlowSchema,\r\n\ttype AdaptiveFlowSchemas,\r\n\ttype AdaptiveFlowRetryPolicy,\r\n\ttype AdaptiveFlowValidationIssue,\r\n\ttype AdaptiveFlowValidationResult,\r\n\ttype AdaptiveStepRegistry,\r\n\ttype AdaptiveStepRendererArgs,\r\n\ttype AdaptiveStepTransition,\r\n\ttype AdaptiveFlowStorageDriver,\r\n\ttype AdaptiveFlowStyleSlot,\r\n\ttype AdaptiveFlowStyles,\r\n\ttype AdaptiveFlowValidationContext,\r\n\ttype AdaptiveFlowValidators,\r\n\ttype AdaptiveStepRenderArgs,\r\n\ttype UseAdaptiveFlowOptions,\r\n\ttype UseAdaptiveFlowResult,\r\n\ttype IdentityResolution,\r\n\ttype OAuthProvider,\r\n\ttype PersistedAdaptiveFlowState,\r\n} from \"./AdaptiveFlow\";\r\nexport {\r\n\tdefaultRequirements,\r\n\tcreateDefaultRequirementGraph,\r\n\tcreateRequirementGraph,\r\n\tdefaultRequirementResolvers,\r\n\tevaluateNextStep,\r\n\tgetMissingRequirements,\r\n\tinitialContext,\r\n\ttype RequirementGraph,\r\n\ttype RequirementGraphNode,\r\n\ttype MaybePromise,\r\n\tDefaultAdaptiveSteps,\r\n\tDefaultAppRequirements,\r\n\ttype AdaptiveContext,\r\n\ttype AdaptiveContextBase,\r\n\ttype AdaptiveStep,\r\n\ttype AppRequirement,\r\n\ttype DefaultAdaptiveStep,\r\n\ttype DefaultAppRequirement,\r\n\ttype RequirementResolver,\r\n} from \"./engine\";","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport {\r\n createDefaultRequirementGraph,\r\n defaultRequirementResolvers,\r\n defaultRequirements,\r\n evaluateNextStep,\r\n getMissingRequirements,\r\n initialContext,\r\n type AdaptiveContext,\r\n type AdaptiveContextBase,\r\n type AdaptiveStep,\r\n type AppRequirement,\r\n type MaybePromise,\r\n type RequirementGraph,\r\n type RequirementResolver,\r\n} from \"./engine\";\r\n\r\n/** Supported OAuth provider identifiers accepted by the adapter and default UI. */\r\nexport type OAuthProvider = \"google\" | \"apple\" | (string & {});\r\n\r\n/** Configurable OAuth provider label/id pair used by the default footer buttons. */\r\nexport type AdaptiveFlowOAuthProvider = {\r\n id: OAuthProvider | (string & {});\r\n label: string;\r\n};\r\n\r\n/** Result returned by lookupByEmail to seed the flow with backend identity state. */\r\nexport type IdentityResolution = {\r\n accountExists: boolean;\r\n hasPassword?: boolean;\r\n isVerified?: boolean;\r\n agreedToTos?: boolean;\r\n profile?: Partial<AdaptiveContextBase[\"profile\"]>;\r\n};\r\n\r\n/** Backend adapter contract used by the flow to delegate all side effects. */\r\nexport type AdaptiveFlowAdapter<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n lookupByEmail?: (email: string) => Promise<IdentityResolution | null>;\r\n requestOtp?: (email: string) => Promise<void>;\r\n verifyOtp?: (email: string, code: string) => Promise<void>;\r\n signInWithPassword?: (email: string, password: string) => Promise<void>;\r\n createPassword?: (password: string) => Promise<void>;\r\n saveProfile?: (context: TContext) => Promise<void>;\r\n acceptTos?: (context: TContext) => Promise<void>;\r\n startOAuth?: (provider: OAuthProvider, context: TContext) => Promise<void>;\r\n completeOAuth?: (\r\n provider: OAuthProvider | null,\r\n context: TContext,\r\n ) => Promise<Partial<TContext> | void>;\r\n};\r\n\r\n/** Named style slots used by the built-in component shell and step renderers. */\r\nexport type AdaptiveFlowStyleSlot =\r\n | \"shell\"\r\n | \"headerRow\"\r\n | \"eyebrow\"\r\n | \"title\"\r\n | \"badge\"\r\n | \"success\"\r\n | \"error\"\r\n | \"info\"\r\n | \"caption\"\r\n | \"formRow\"\r\n | \"formColumn\"\r\n | \"input\"\r\n | \"button\"\r\n | \"checkboxRow\"\r\n | \"complete\"\r\n | \"footer\"\r\n | \"oauthButton\";\r\n\r\n/** Inline style overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowStyles = Partial<Record<AdaptiveFlowStyleSlot, React.CSSProperties>>;\r\n/** CSS class overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowClassNames = Partial<Record<AdaptiveFlowStyleSlot, string>>;\r\n\r\n/** Minimal storage interface used by persistence drivers. */\r\nexport type AdaptiveFlowStorageDriver = Pick<Storage, \"getItem\" | \"setItem\" | \"removeItem\">;\r\n\r\n/** Persistence settings for storing and restoring flow state across reloads. */\r\nexport type AdaptiveFlowPersistence<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n key: string;\r\n storage?: \"session\" | \"local\" | AdaptiveFlowStorageDriver;\r\n serialize?: (state: PersistedAdaptiveFlowState<TContext>) => string;\r\n deserialize?: (value: string) => PersistedAdaptiveFlowState<TContext>;\r\n clearOnComplete?: boolean;\r\n onError?: (error: Error, phase: \"read\" | \"write\" | \"clear\") => void;\r\n};\r\n\r\n/** Persisted flow payload written to session/local/custom storage. */\r\nexport type PersistedAdaptiveFlowState<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n context: TContext;\r\n oauthPendingProvider: OAuthProvider | null;\r\n};\r\n\r\n/** Context wrapper passed into validators so they can inspect the current flow state. */\r\nexport type AdaptiveFlowValidationContext<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n> = {\r\n context: TContext;\r\n};\r\n\r\n/** Validator failure payload that can target a specific field or the whole form. */\r\nexport type AdaptiveFlowValidationIssue = {\r\n message: string;\r\n field?: string;\r\n};\r\n\r\n/** Validator return type supported by the component and hook. */\r\nexport type AdaptiveFlowValidationResult =\r\n | string\r\n | AdaptiveFlowValidationIssue\r\n | void\r\n | Promise<string | AdaptiveFlowValidationIssue | void>;\r\n\r\n/** Schema adapter contract used for optional Zod-friendly validation. */\r\nexport type AdaptiveFlowSchema<TValue> = {\r\n safeParse?: (value: TValue) => {\r\n success: boolean;\r\n error?: {\r\n message?: string;\r\n issues?: Array<{\r\n message?: string;\r\n path?: Array<string | number>;\r\n }>;\r\n };\r\n };\r\n parse?: (value: TValue) => unknown;\r\n};\r\n\r\n/** Optional schema map for built-in step fields. */\r\nexport type AdaptiveFlowSchemas = {\r\n email?: AdaptiveFlowSchema<string>;\r\n otp?: AdaptiveFlowSchema<string>;\r\n password?: AdaptiveFlowSchema<string>;\r\n profile?: AdaptiveFlowSchema<AdaptiveContextBase[\"profile\"]>;\r\n tos?: AdaptiveFlowSchema<boolean>;\r\n};\r\n\r\n/** Backoff settings used to retry transient adapter calls and OAuth completion. */\r\nexport type AdaptiveFlowRetryPolicy = {\r\n maxAttempts?: number;\r\n initialDelayMs?: number;\r\n factor?: number;\r\n maxDelayMs?: number;\r\n jitter?: boolean;\r\n shouldRetry?: (error: Error, attempt: number) => boolean;\r\n delay?: (attempt: number) => number;\r\n};\r\n\r\n/** Field error bag keyed by field path or logical field name. */\r\nexport type AdaptiveFlowFieldErrors = Partial<Record<string, string>>;\r\n\r\n/** Validator map for the built-in flow fields. */\r\nexport type AdaptiveFlowValidators<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n email?: (input: string, payload: AdaptiveFlowValidationContext<TContext>) => AdaptiveFlowValidationResult;\r\n otp?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { email: string },\r\n ) => AdaptiveFlowValidationResult;\r\n password?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { hasPassword: boolean },\r\n ) => AdaptiveFlowValidationResult;\r\n profile?: (\r\n input: AdaptiveContextBase[\"profile\"],\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n tos?: (\r\n accepted: boolean,\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n};\r\n\r\n/** Transition record emitted whenever the evaluated step changes. */\r\nexport type AdaptiveStepTransition<TStep extends string = AdaptiveStep> = {\r\n from: TStep | null;\r\n to: TStep;\r\n at: number;\r\n attempt: number;\r\n};\r\n\r\n/** Arguments supplied to a stepRegistry renderer for a specific step. */\r\nexport type AdaptiveStepRendererArgs<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Registry that overrides the UI for selected steps. */\r\nexport type AdaptiveStepRegistry<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = Partial<\r\n Record<TStep, (args: AdaptiveStepRendererArgs<TContext, TRequirement, TStep>) => React.ReactNode>\r\n>;\r\n\r\n/** Arguments supplied to renderStep for full step-body customization. */\r\nexport type AdaptiveStepRenderArgs<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n defaultView: React.ReactNode;\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Props accepted by the AdaptiveFlow component. */\r\nexport type AdaptiveFlowProps<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n requirements?: readonly TRequirement[];\r\n requirementGraph?: RequirementGraph<TContext, TRequirement, TStep>;\r\n requirementGraphConfig?: {\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n };\r\n requirementResolvers?: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>;\r\n completeStep?: TStep;\r\n stepTitles?: Partial<Record<TStep, string>>;\r\n renderStep?: (args: AdaptiveStepRenderArgs<TContext, TRequirement, TStep>) => React.ReactNode;\r\n stepRegistry?: AdaptiveStepRegistry<TContext, TRequirement, TStep>;\r\n initialValue?: Partial<TContext>;\r\n onComplete?: (context: TContext) => void;\r\n onError?: (error: Error) => void;\r\n onStepTransition?: (transition: AdaptiveStepTransition<TStep>, context: TContext) => void;\r\n className?: string;\r\n classNames?: AdaptiveFlowClassNames;\r\n styles?: AdaptiveFlowStyles;\r\n unstyled?: boolean;\r\n persistence?: AdaptiveFlowPersistence<TContext>;\r\n validators?: AdaptiveFlowValidators<TContext>;\r\n schemas?: AdaptiveFlowSchemas;\r\n oauthProviders?: readonly AdaptiveFlowOAuthProvider[];\r\n retryPolicy?: AdaptiveFlowRetryPolicy;\r\n};\r\n\r\n/** Options accepted by the headless useAdaptiveFlow hook. */\r\nexport type UseAdaptiveFlowOptions<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = Omit<\r\n AdaptiveFlowProps<TContext, TRequirement, TStep>,\r\n \"stepTitles\" | \"renderStep\" | \"stepRegistry\" | \"className\" | \"classNames\" | \"styles\" | \"unstyled\"\r\n>;\r\n\r\n/** Result object returned by useAdaptiveFlow. */\r\nexport type UseAdaptiveFlowResult<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n context: TContext;\r\n step: TStep;\r\n hasEvaluated: boolean;\r\n completeStep: TStep;\r\n requirements: readonly TRequirement[];\r\n missingRequirements: TRequirement[];\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n handleEmail: (emailInput: string) => void;\r\n handleOtp: (code: string) => void;\r\n handlePassword: (password: string) => void;\r\n handleProfile: (profile: AdaptiveContextBase[\"profile\"]) => void;\r\n handleTos: () => void;\r\n handleOAuth: (provider: OAuthProvider) => void;\r\n};\r\n\r\ntype PlainObject = Record<string, unknown>;\r\n\r\n/** Default provider buttons rendered by the component footer when no provider list is supplied. */\r\nconst defaultOAuthProviders: readonly AdaptiveFlowOAuthProvider[] = [\r\n { id: \"google\", label: \"Continue with Google\" },\r\n { id: \"apple\", label: \"Continue with Apple\" },\r\n];\r\n\r\n/** Human-friendly labels used when a step title override is not supplied. */\r\nconst defaultStepTitle: Record<string, string> = {\r\n COLLECT_EMAIL: \"Enter your email\",\r\n VERIFY_OTP: \"Verify your email\",\r\n COLLECT_PASSWORD: \"Set up your password\",\r\n COLLECT_PROFILE: \"Complete your profile\",\r\n COLLECT_TOS: \"Accept terms\",\r\n COMPLETE: \"Done\",\r\n};\r\n\r\n/** Built-in step keys that have a default renderer in the component shell. */\r\nconst builtInDefaultSteps = new Set<string>([\r\n \"COLLECT_EMAIL\",\r\n \"VERIFY_OTP\",\r\n \"COLLECT_PASSWORD\",\r\n \"COLLECT_PROFILE\",\r\n \"COLLECT_TOS\",\r\n \"COMPLETE\",\r\n]);\r\n\r\nconst styleSlots: AdaptiveFlowStyleSlot[] = [\r\n \"shell\",\r\n \"headerRow\",\r\n \"eyebrow\",\r\n \"title\",\r\n \"badge\",\r\n \"success\",\r\n \"error\",\r\n \"info\",\r\n \"caption\",\r\n \"formRow\",\r\n \"formColumn\",\r\n \"input\",\r\n \"button\",\r\n \"checkboxRow\",\r\n \"complete\",\r\n \"footer\",\r\n \"oauthButton\",\r\n];\r\n\r\n/**\r\n * Deeply merge a patch into the current context.\r\n *\r\n * Plain nested objects are merged recursively, while arrays and non-plain values are replaced.\r\n */\r\nfunction mergeContext<TContext extends AdaptiveContextBase>(\r\n current: TContext,\r\n patch: Partial<TContext>,\r\n): TContext {\r\n const mergeValue = (baseValue: unknown, patchValue: unknown): unknown => {\r\n if (Array.isArray(baseValue) || Array.isArray(patchValue)) {\r\n return patchValue;\r\n }\r\n\r\n const baseIsObject = Boolean(baseValue) && typeof baseValue === \"object\";\r\n const patchIsObject = Boolean(patchValue) && typeof patchValue === \"object\";\r\n\r\n if (!baseIsObject || !patchIsObject) {\r\n return patchValue === undefined ? baseValue : patchValue;\r\n }\r\n\r\n const baseObject = baseValue as PlainObject;\r\n const patchObject = patchValue as PlainObject;\r\n const result: PlainObject = { ...baseObject };\r\n\r\n for (const key of Object.keys(patchObject)) {\r\n result[key] = mergeValue(baseObject[key], patchObject[key]);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n return mergeValue(current, patch) as TContext;\r\n}\r\n\r\n/** Merge the supplied initial value into the library's default context shape. */\r\nfunction withDefaults<TContext extends AdaptiveContextBase>(initialValue?: Partial<TContext>): TContext {\r\n if (!initialValue) {\r\n return initialContext as TContext;\r\n }\r\n\r\n return mergeContext(initialContext as TContext, initialValue);\r\n}\r\n\r\n/** Normalize any thrown value into an Error instance while preserving message and code when available. */\r\nfunction toError(error: unknown): Error {\r\n if (error instanceof Error) {\r\n return error;\r\n }\r\n\r\n if (typeof error === \"string\") {\r\n return new Error(error);\r\n }\r\n\r\n if (error && typeof error === \"object\") {\r\n const maybeError = error as { message?: unknown; code?: unknown };\r\n const message = typeof maybeError.message === \"string\" && maybeError.message.trim().length > 0\r\n ? maybeError.message\r\n : \"Unknown error while processing adaptive flow\";\r\n const normalized = new Error(message);\r\n if (typeof maybeError.code === \"string\" && maybeError.code.trim().length > 0) {\r\n normalized.name = maybeError.code;\r\n }\r\n (normalized as Error & { cause?: unknown }).cause = error;\r\n return normalized;\r\n }\r\n\r\n return new Error(`Unknown error while processing adaptive flow: ${String(error)}`);\r\n}\r\n\r\n/** Pause execution for the requested number of milliseconds. */\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n\r\n/** Clamp and normalize a retry delay into a safe non-negative millisecond value. */\r\nfunction normalizeDelay(delay: number | undefined, fallback: number): number {\r\n if (typeof delay !== \"number\" || Number.isNaN(delay) || delay < 0) {\r\n return fallback;\r\n }\r\n return delay;\r\n}\r\n\r\n/** Compute the delay for the current retry attempt using exponential backoff and optional jitter. */\r\n/** Compute the delay for a retry attempt using exponential backoff and optional jitter. */\r\nfunction computeRetryDelay(policy: AdaptiveFlowRetryPolicy | undefined, attempt: number): number {\r\n if (policy?.delay) {\r\n return normalizeDelay(policy.delay(attempt), 0);\r\n }\r\n\r\n const initialDelayMs = normalizeDelay(policy?.initialDelayMs, 250);\r\n const factor = typeof policy?.factor === \"number\" && policy.factor > 0 ? policy.factor : 2;\r\n const maxDelayMs = normalizeDelay(policy?.maxDelayMs, Number.POSITIVE_INFINITY);\r\n let delay = initialDelayMs * Math.pow(factor, Math.max(0, attempt - 1));\r\n\r\n if (policy?.jitter) {\r\n delay = delay * (0.5 + Math.random() * 0.5);\r\n }\r\n\r\n return Math.min(delay, maxDelayMs);\r\n}\r\n\r\n/** Execute an async operation with configurable retry/backoff behavior. */\r\nasync function withRetry<T>(\r\n operation: () => Promise<T>,\r\n retryPolicy: AdaptiveFlowRetryPolicy | undefined,\r\n): Promise<T> {\r\n if (!retryPolicy) {\r\n return operation();\r\n }\r\n\r\n const maxAttempts = Math.max(1, Math.trunc(retryPolicy.maxAttempts ?? 3));\r\n let lastError: unknown;\r\n\r\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\r\n try {\r\n return await operation();\r\n } catch (error) {\r\n lastError = error;\r\n const normalized = toError(error);\r\n const shouldRetry = retryPolicy.shouldRetry?.(normalized, attempt) ?? attempt < maxAttempts;\r\n if (!shouldRetry || attempt === maxAttempts) {\r\n throw normalized;\r\n }\r\n\r\n await sleep(computeRetryDelay(retryPolicy, attempt));\r\n }\r\n }\r\n\r\n throw toError(lastError);\r\n}\r\n\r\n/** Join class names while dropping falsy entries. */\r\nfunction cx(...names: Array<string | undefined | false | null>): string | undefined {\r\n const value = names.filter(Boolean).join(\" \").trim();\r\n return value.length > 0 ? value : undefined;\r\n}\r\n\r\n/** Resolve the configured storage driver or return null when running outside the browser. */\r\nfunction pickStorage(storage?: \"session\" | \"local\" | AdaptiveFlowStorageDriver): AdaptiveFlowStorageDriver | null {\r\n if (typeof window === \"undefined\") {\r\n return null;\r\n }\r\n\r\n if (!storage || storage === \"session\") {\r\n return window.sessionStorage;\r\n }\r\n\r\n if (storage === \"local\") {\r\n return window.localStorage;\r\n }\r\n\r\n return storage;\r\n}\r\n\r\n/** Read and deserialize persisted flow state from storage. */\r\nfunction readPersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n): PersistedAdaptiveFlowState<TContext> | null {\r\n if (!persistence) {\r\n return null;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return null;\r\n }\r\n\r\n const raw = storage.getItem(persistence.key);\r\n if (!raw) {\r\n return null;\r\n }\r\n\r\n const deserialize = persistence.deserialize ?? ((value: string) => JSON.parse(value));\r\n return deserialize(raw);\r\n}\r\n\r\n/** Serialize and persist the current flow state to storage. */\r\nfunction writePersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n state: PersistedAdaptiveFlowState<TContext>,\r\n): void {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return;\r\n }\r\n\r\n const serialize = persistence.serialize ?? ((value: PersistedAdaptiveFlowState<TContext>) => JSON.stringify(value));\r\n storage.setItem(persistence.key, serialize(state));\r\n}\r\n\r\n/** Remove persisted flow state from storage. */\r\nfunction clearPersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n): void {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return;\r\n }\r\n\r\n storage.removeItem(persistence.key);\r\n}\r\n\r\n/** Internal error type used to carry field-level validation failures. */\r\nclass FlowValidationError extends Error {\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n\r\n constructor(message: string, fieldErrors: AdaptiveFlowFieldErrors) {\r\n super(message);\r\n this.name = \"FlowValidationError\";\r\n this.fieldErrors = fieldErrors;\r\n }\r\n}\r\n\r\n/** Convert a validation issue into the internal validation error shape. */\r\nfunction toValidationError(\r\n issue: AdaptiveFlowValidationIssue,\r\n fallbackField?: string,\r\n): FlowValidationError {\r\n const field = issue.field ?? fallbackField;\r\n if (field) {\r\n return new FlowValidationError(issue.message, { [field]: issue.message });\r\n }\r\n return new FlowValidationError(issue.message, {});\r\n}\r\n\r\n/** Map schema validation issues into field error messages keyed by path. */\r\nfunction normalizeSchemaIssues(\r\n error: { message?: string; issues?: Array<{ message?: string; path?: Array<string | number> }> } | undefined,\r\n fallbackField?: string,\r\n): AdaptiveFlowFieldErrors {\r\n const fieldErrors: AdaptiveFlowFieldErrors = {};\r\n const issues = error?.issues ?? [];\r\n\r\n for (const issue of issues) {\r\n const path = issue.path?.length ? issue.path.map(String).join(\".\") : fallbackField;\r\n const message = issue.message?.trim() || error?.message || \"Validation failed.\";\r\n if (path && !fieldErrors[path]) {\r\n fieldErrors[path] = message;\r\n }\r\n }\r\n\r\n if (Object.keys(fieldErrors).length === 0 && fallbackField) {\r\n fieldErrors[fallbackField] = error?.message || \"Validation failed.\";\r\n }\r\n\r\n return fieldErrors;\r\n}\r\n\r\n/** Execute a validator result and raise a field-aware validation error when needed. */\r\nasync function assertValid(result: AdaptiveFlowValidationResult, fallbackField?: string): Promise<void> {\r\n const outcome = await result;\r\n if (!outcome) {\r\n return;\r\n }\r\n\r\n if (typeof outcome === \"string\") {\r\n const message = outcome.trim();\r\n if (message.length > 0) {\r\n throw new FlowValidationError(message, fallbackField ? { [fallbackField]: message } : {});\r\n }\r\n return;\r\n }\r\n\r\n if (outcome.message.trim().length > 0) {\r\n throw toValidationError(outcome, fallbackField);\r\n }\r\n}\r\n\r\n/** Execute an optional schema validator before running the custom validator chain. */\r\nasync function assertSchema<TValue>(\r\n schema: AdaptiveFlowSchema<TValue> | undefined,\r\n value: TValue,\r\n fallbackField?: string,\r\n): Promise<void> {\r\n if (!schema) {\r\n return;\r\n }\r\n\r\n if (schema.safeParse) {\r\n const result = schema.safeParse(value);\r\n if (!result.success) {\r\n const fieldErrors = normalizeSchemaIssues(result.error, fallbackField);\r\n throw new FlowValidationError(result.error?.message || \"Validation failed.\", fieldErrors);\r\n }\r\n return;\r\n }\r\n\r\n if (!schema.parse) {\r\n return;\r\n }\r\n\r\n try {\r\n schema.parse(value);\r\n } catch (error) {\r\n const normalized = error as {\r\n message?: string;\r\n issues?: Array<{ message?: string; path?: Array<string | number> }>;\r\n };\r\n const fieldErrors = normalizeSchemaIssues(\r\n {\r\n message: normalized?.message,\r\n issues: normalized?.issues,\r\n },\r\n fallbackField,\r\n );\r\n throw new FlowValidationError(normalized?.message || \"Validation failed.\", fieldErrors);\r\n }\r\n}\r\n\r\n/** Merge built-in style defaults with user overrides or return raw overrides in unstyled mode. */\r\nfunction resolveStyles(\r\n unstyled: boolean,\r\n styleOverrides?: AdaptiveFlowStyles,\r\n): Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined> {\r\n const resolved = {} as Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n\r\n for (const slot of styleSlots) {\r\n if (unstyled) {\r\n resolved[slot] = styleOverrides?.[slot];\r\n continue;\r\n }\r\n\r\n resolved[slot] = {\r\n ...defaultStyles[slot],\r\n ...(styleOverrides?.[slot] ?? {}),\r\n };\r\n }\r\n\r\n return resolved;\r\n}\r\n\r\n/** Headless flow hook that owns state, evaluation, persistence, retries, and adapter wiring. */\r\nexport function useAdaptiveFlow<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n}: UseAdaptiveFlowOptions<TContext, TRequirement, TStep>): UseAdaptiveFlowResult<\r\n TContext,\r\n TRequirement,\r\n TStep\r\n> {\r\n const normalizedRequirements = React.useMemo(\r\n () => (requirements ?? (defaultRequirements as unknown as readonly TRequirement[])),\r\n [requirements],\r\n );\r\n const normalizedCompleteStep = React.useMemo(\r\n () => (completeStep ?? (\"COMPLETE\" as TStep)),\r\n [completeStep],\r\n );\r\n const resolvers = React.useMemo(\r\n () =>\r\n ({\r\n ...(defaultRequirementResolvers as unknown as Partial<\r\n Record<TRequirement, RequirementResolver<TContext, TStep>>\r\n >),\r\n ...(requirementResolvers ?? {}),\r\n }) as Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>,\r\n [requirementResolvers],\r\n );\r\n const graph = React.useMemo(\r\n () =>\r\n requirementGraph ??\r\n createDefaultRequirementGraph({\r\n requirements: normalizedRequirements,\r\n resolvers,\r\n priorities: requirementGraphConfig?.priorities,\r\n conditions: requirementGraphConfig?.conditions,\r\n dependencies: requirementGraphConfig?.dependencies,\r\n }),\r\n [\r\n requirementGraph,\r\n normalizedRequirements,\r\n resolvers,\r\n requirementGraphConfig?.priorities,\r\n requirementGraphConfig?.conditions,\r\n requirementGraphConfig?.dependencies,\r\n ],\r\n );\r\n\r\n type RuntimeState = {\r\n step: TStep;\r\n hasEvaluated: boolean;\r\n missingRequirements: TRequirement[];\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n oauthPendingProvider: OAuthProvider | null;\r\n persistenceHydrated: boolean;\r\n };\r\n\r\n type RuntimeAction =\r\n | {\r\n type: \"evaluated\";\r\n missingRequirements: TRequirement[];\r\n step: TStep;\r\n transition: AdaptiveStepTransition<TStep>;\r\n }\r\n | { type: \"set_busy\"; busy: boolean }\r\n | { type: \"set_message\"; message: string | null }\r\n | { type: \"set_error\"; errorMessage: string | null }\r\n | { type: \"set_field_errors\"; fieldErrors: AdaptiveFlowFieldErrors }\r\n | { type: \"start_job\" }\r\n | { type: \"set_oauth_pending\"; provider: OAuthProvider | null }\r\n | { type: \"set_hydrated\"; hydrated: boolean };\r\n\r\n const runtimeReducer = (state: RuntimeState, action: RuntimeAction): RuntimeState => {\r\n switch (action.type) {\r\n case \"evaluated\":\r\n return {\r\n ...state,\r\n step: action.step,\r\n hasEvaluated: true,\r\n missingRequirements: action.missingRequirements,\r\n transitions: [...state.transitions, action.transition].slice(-100),\r\n };\r\n case \"set_busy\":\r\n return { ...state, busy: action.busy };\r\n case \"set_message\":\r\n return { ...state, message: action.message };\r\n case \"set_error\":\r\n return { ...state, errorMessage: action.errorMessage };\r\n case \"set_field_errors\":\r\n return { ...state, fieldErrors: action.fieldErrors };\r\n case \"start_job\":\r\n return { ...state, busy: true, errorMessage: null, fieldErrors: {} };\r\n case \"set_oauth_pending\":\r\n return { ...state, oauthPendingProvider: action.provider };\r\n case \"set_hydrated\":\r\n return { ...state, persistenceHydrated: action.hydrated };\r\n default:\r\n return state;\r\n }\r\n };\r\n\r\n const [context, setContext] = React.useState<TContext>(() => withDefaults(initialValue));\r\n const [runtime, dispatch] = React.useReducer(runtimeReducer, {\r\n step: normalizedCompleteStep,\r\n hasEvaluated: false,\r\n missingRequirements: [],\r\n transitions: [],\r\n busy: false,\r\n message: null,\r\n errorMessage: null,\r\n fieldErrors: {},\r\n oauthPendingProvider: null,\r\n persistenceHydrated: !persistence,\r\n } satisfies RuntimeState);\r\n\r\n const {\r\n step,\r\n hasEvaluated,\r\n missingRequirements,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n oauthPendingProvider,\r\n persistenceHydrated,\r\n } = runtime;\r\n const attemptByStepRef = React.useRef<Record<string, number>>({});\r\n const previousStepRef = React.useRef<TStep | null>(null);\r\n const evaluationRef = React.useRef(0);\r\n const completed = React.useRef(false);\r\n\r\n const reportPersistenceError = React.useCallback(\r\n (error: unknown, phase: \"read\" | \"write\" | \"clear\") => {\r\n const normalized = toError(error);\r\n persistence?.onError?.(normalized, phase);\r\n onError?.(normalized);\r\n },\r\n [onError, persistence],\r\n );\r\n\r\n React.useEffect(() => {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n try {\r\n const persisted = readPersistedState(persistence);\r\n if (persisted?.context) {\r\n setContext(mergeContext(withDefaults(initialValue), persisted.context));\r\n }\r\n if (persisted?.oauthPendingProvider) {\r\n dispatch({ type: \"set_oauth_pending\", provider: persisted.oauthPendingProvider });\r\n }\r\n } catch (error) {\r\n reportPersistenceError(error, \"read\");\r\n } finally {\r\n dispatch({ type: \"set_hydrated\", hydrated: true });\r\n }\r\n }, [initialValue, persistence, reportPersistenceError]);\r\n\r\n React.useEffect(() => {\r\n const currentEvaluation = ++evaluationRef.current;\r\n\r\n void (async () => {\r\n const [missing, next] = await Promise.all([\r\n getMissingRequirements(context, graph as RequirementGraph<TContext, TRequirement, TStep>),\r\n evaluateNextStep(context, graph as RequirementGraph<TContext, TRequirement, TStep>, normalizedCompleteStep),\r\n ]);\r\n\r\n if (currentEvaluation !== evaluationRef.current) {\r\n return;\r\n }\r\n\r\n const from = previousStepRef.current;\r\n const attemptKey = String(next);\r\n const nextAttempt = from === next ? (attemptByStepRef.current[attemptKey] ?? 0) + 1 : 1;\r\n attemptByStepRef.current[attemptKey] = nextAttempt;\r\n\r\n const transition: AdaptiveStepTransition<TStep> = {\r\n from,\r\n to: next,\r\n at: Date.now(),\r\n attempt: nextAttempt,\r\n };\r\n\r\n dispatch({\r\n type: \"evaluated\",\r\n missingRequirements: missing,\r\n step: next,\r\n transition,\r\n });\r\n previousStepRef.current = next;\r\n onStepTransition?.(transition, context);\r\n })().catch((error) => {\r\n if (currentEvaluation !== evaluationRef.current) {\r\n return;\r\n }\r\n\r\n const normalized = toError(error);\r\n dispatch({ type: \"set_field_errors\", fieldErrors: {} });\r\n dispatch({ type: \"set_error\", errorMessage: normalized.message });\r\n onError?.(normalized);\r\n });\r\n }, [context, graph, normalizedCompleteStep, onError, onStepTransition]);\r\n\r\n React.useEffect(() => {\r\n if (step === normalizedCompleteStep) {\r\n if (!completed.current) {\r\n completed.current = true;\r\n onComplete?.(context);\r\n\r\n const shouldClearPersistence = persistence?.clearOnComplete ?? true;\r\n if (shouldClearPersistence) {\r\n try {\r\n clearPersistedState(persistence);\r\n } catch (error) {\r\n reportPersistenceError(error, \"clear\");\r\n }\r\n }\r\n }\r\n } else {\r\n completed.current = false;\r\n }\r\n }, [context, normalizedCompleteStep, onComplete, persistence, reportPersistenceError, step]);\r\n\r\n React.useEffect(() => {\r\n if (!persistence || !persistenceHydrated) {\r\n return;\r\n }\r\n\r\n try {\r\n writePersistedState(persistence, { context, oauthPendingProvider });\r\n } catch (error) {\r\n reportPersistenceError(error, \"write\");\r\n }\r\n }, [context, oauthPendingProvider, persistence, persistenceHydrated, reportPersistenceError]);\r\n\r\n const run = React.useCallback(\r\n async (job: () => Promise<void>) => {\r\n dispatch({ type: \"start_job\" });\r\n try {\r\n await job();\r\n } catch (error) {\r\n if (error instanceof FlowValidationError) {\r\n dispatch({ type: \"set_field_errors\", fieldErrors: error.fieldErrors });\r\n if (Object.keys(error.fieldErrors).length === 0) {\r\n dispatch({ type: \"set_error\", errorMessage: error.message });\r\n onError?.(error);\r\n }\r\n } else {\r\n const normalized = toError(error);\r\n dispatch({ type: \"set_error\", errorMessage: normalized.message });\r\n onError?.(normalized);\r\n }\r\n } finally {\r\n dispatch({ type: \"set_busy\", busy: false });\r\n }\r\n },\r\n [onError],\r\n );\r\n\r\n const patchContext = React.useCallback((patch: Partial<TContext>) => {\r\n setContext((prev) => mergeContext(prev, patch));\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n const completeOAuth = adapter?.completeOAuth;\r\n if (!oauthPendingProvider || !completeOAuth) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n const patch = await withRetry(\r\n () => completeOAuth(oauthPendingProvider, context),\r\n retryPolicy,\r\n );\r\n if (patch) {\r\n patchContext(patch);\r\n }\r\n dispatch({ type: \"set_oauth_pending\", provider: null });\r\n dispatch({ type: \"set_message\", message: \"OAuth sign-in completed.\" });\r\n });\r\n }, [adapter, context, oauthPendingProvider, patchContext, retryPolicy, run]);\r\n\r\n const handleEmail = (emailInput: string) => {\r\n const email = emailInput.trim().toLowerCase();\r\n if (!email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.email, email, \"email\");\r\n if (validators?.email) {\r\n await assertValid(validators.email(email, { context }), \"email\");\r\n }\r\n\r\n const identity = adapter?.lookupByEmail\r\n ? await withRetry(() => adapter.lookupByEmail!(email), retryPolicy)\r\n : null;\r\n\r\n patchContext({\r\n email,\r\n hasPassword: Boolean(identity?.hasPassword),\r\n isVerified: Boolean(identity?.isVerified),\r\n agreedToTos: Boolean(identity?.agreedToTos),\r\n profile: {\r\n firstName: identity?.profile?.firstName ?? null,\r\n lastName: identity?.profile?.lastName ?? null,\r\n jobTitle: identity?.profile?.jobTitle ?? null,\r\n },\r\n } as Partial<TContext>);\r\n\r\n if (identity?.accountExists && identity.hasPassword) {\r\n dispatch({ type: \"set_message\", message: \"Welcome back. Enter your password to continue.\" });\r\n return;\r\n }\r\n\r\n if (adapter?.requestOtp) {\r\n await withRetry(() => adapter.requestOtp!(email), retryPolicy);\r\n dispatch({ type: \"set_message\", message: \"We sent a 6-digit code to your inbox.\" });\r\n } else {\r\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\r\n const isDev = env !== \"production\";\r\n if (!isDev) {\r\n throw new Error(\"OTP adapter is required in production. Provide adapter.requestOtp.\");\r\n }\r\n\r\n patchContext({ isVerified: true } as Partial<TContext>);\r\n dispatch({\r\n type: \"set_message\",\r\n message: \"No OTP adapter configured. Verification was skipped in development mode.\",\r\n });\r\n }\r\n });\r\n };\r\n\r\n const handleOtp = (code: string) => {\r\n if (!context.email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.otp, code, \"otp\");\r\n if (validators?.otp) {\r\n await assertValid(validators.otp(code, { context, email: context.email as string }), \"otp\");\r\n }\r\n\r\n if (adapter?.verifyOtp) {\r\n await withRetry(() => adapter.verifyOtp!(context.email as string, code), retryPolicy);\r\n }\r\n patchContext({ isVerified: true } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Email verified.\" });\r\n });\r\n };\r\n\r\n const handlePassword = (password: string) => {\r\n if (!context.email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.password, password, \"password\");\r\n if (validators?.password) {\r\n await assertValid(\r\n validators.password(password, { context, hasPassword: context.hasPassword }),\r\n \"password\",\r\n );\r\n }\r\n\r\n if (context.hasPassword) {\r\n if (adapter?.signInWithPassword) {\r\n await withRetry(\r\n () => adapter.signInWithPassword!(context.email as string, password),\r\n retryPolicy,\r\n );\r\n }\r\n } else {\r\n if (adapter?.createPassword) {\r\n await withRetry(() => adapter.createPassword!(password), retryPolicy);\r\n }\r\n patchContext({ hasPassword: true } as Partial<TContext>);\r\n }\r\n dispatch({ type: \"set_message\", message: \"Password step complete.\" });\r\n });\r\n };\r\n\r\n const handleProfile = (profile: AdaptiveContextBase[\"profile\"]) => {\r\n void run(async () => {\r\n await assertSchema(schemas?.profile, profile, \"profile\");\r\n if (validators?.profile) {\r\n await assertValid(validators.profile(profile, { context }), \"profile\");\r\n }\r\n\r\n const next = mergeContext(context, {\r\n profile: {\r\n firstName: profile.firstName || null,\r\n lastName: profile.lastName || null,\r\n jobTitle: profile.jobTitle || null,\r\n },\r\n } as Partial<TContext>);\r\n\r\n if (adapter?.saveProfile) {\r\n await withRetry(() => adapter.saveProfile!(next), retryPolicy);\r\n }\r\n\r\n patchContext({ profile: next.profile } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Profile saved.\" });\r\n });\r\n };\r\n\r\n const handleTos = () => {\r\n void run(async () => {\r\n await assertSchema(schemas?.tos, true, \"tos\");\r\n if (validators?.tos) {\r\n await assertValid(validators.tos(true, { context }), \"tos\");\r\n }\r\n\r\n const next = mergeContext(context, { agreedToTos: true } as Partial<TContext>);\r\n if (adapter?.acceptTos) {\r\n await withRetry(() => adapter.acceptTos!(next), retryPolicy);\r\n }\r\n patchContext({ agreedToTos: true } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Terms accepted.\" });\r\n });\r\n };\r\n\r\n const handleOAuth = (provider: OAuthProvider) => {\r\n const startOAuth = adapter?.startOAuth;\r\n if (!startOAuth) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n dispatch({ type: \"set_oauth_pending\", provider });\r\n dispatch({ type: \"set_message\", message: `Starting ${provider} sign-in...` });\r\n await withRetry(() => startOAuth(provider, context), retryPolicy);\r\n });\r\n };\r\n\r\n return {\r\n context,\r\n step,\r\n hasEvaluated,\r\n completeStep: normalizedCompleteStep,\r\n requirements: normalizedRequirements,\r\n missingRequirements,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n setContextPatch: patchContext,\r\n run,\r\n handleEmail,\r\n handleOtp,\r\n handlePassword,\r\n handleProfile,\r\n handleTos,\r\n handleOAuth,\r\n };\r\n}\r\n\r\n/** Default UI wrapper around useAdaptiveFlow that renders the built-in flow shell and step UI. */\r\nexport function AdaptiveFlow<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n stepTitles,\r\n renderStep,\r\n stepRegistry,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n className,\r\n classNames,\r\n styles,\r\n unstyled = false,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n}: AdaptiveFlowProps<TContext, TRequirement, TStep>) {\r\n const uiStyles = React.useMemo(() => resolveStyles(unstyled, styles), [unstyled, styles]);\r\n\r\n const {\r\n context,\r\n step,\r\n hasEvaluated,\r\n completeStep: normalizedCompleteStep,\r\n requirements: normalizedRequirements,\r\n missingRequirements: missing,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n setContextPatch: patchContext,\r\n run,\r\n handleEmail,\r\n handleOtp,\r\n handlePassword,\r\n handleProfile,\r\n handleTos,\r\n handleOAuth,\r\n } = useAdaptiveFlow<TContext, TRequirement, TStep>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n });\r\n\r\n const normalizedOAuthProviders = React.useMemo(\r\n () => (oauthProviders && oauthProviders.length > 0 ? oauthProviders : defaultOAuthProviders),\r\n [oauthProviders],\r\n );\r\n\r\n const completedCount = hasEvaluated\r\n ? normalizedRequirements.length - missing.length\r\n : 0;\r\n const needsJobTitle = normalizedRequirements.includes(\"has_job_title\" as TRequirement);\r\n const stepLabel = hasEvaluated\r\n ? (stepTitles?.[step] ?? defaultStepTitle[step] ?? step)\r\n : \"Loading flow\";\r\n\r\n const defaultView = (\r\n <>\r\n {!hasEvaluated ? (\r\n <div className={classNames?.info} style={uiStyles.info}>\r\n Evaluating required steps...\r\n </div>\r\n ) : null}\r\n {step === \"COLLECT_EMAIL\" ? (\r\n <EmailBlock\r\n onSubmit={handleEmail}\r\n disabled={busy}\r\n error={fieldErrors.email}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"VERIFY_OTP\" ? (\r\n <OtpBlock\r\n onSubmit={handleOtp}\r\n email={context.email ?? \"your email\"}\r\n disabled={busy}\r\n error={fieldErrors.otp}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_PASSWORD\" ? (\r\n <PasswordBlock\r\n onSubmit={handlePassword}\r\n disabled={busy}\r\n hasPassword={context.hasPassword}\r\n error={fieldErrors.password}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_PROFILE\" ? (\r\n <ProfileBlock\r\n defaultValue={context.profile}\r\n requireJobTitle={needsJobTitle}\r\n onSubmit={handleProfile}\r\n disabled={busy}\r\n errors={fieldErrors}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_TOS\" ? (\r\n <TosBlock\r\n onSubmit={handleTos}\r\n disabled={busy}\r\n error={fieldErrors.tos}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === normalizedCompleteStep ? (\r\n <CompleteBlock styles={uiStyles} classNames={classNames} />\r\n ) : null}\r\n {!builtInDefaultSteps.has(String(step)) && step !== normalizedCompleteStep ? (\r\n <div className={classNames?.info} style={uiStyles.info}>\r\n No default renderer for step \"{step}\". Provide renderStep to handle custom steps.\r\n </div>\r\n ) : null}\r\n </>\r\n );\r\n\r\n const customView = renderStep\r\n ? renderStep({\r\n step,\r\n context,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n missingRequirements: missing,\r\n requirements: normalizedRequirements,\r\n defaultView,\r\n setContextPatch: patchContext,\r\n run,\r\n adapter,\r\n transitions,\r\n })\r\n : null;\r\n const registryView = stepRegistry?.[step]\r\n ? stepRegistry[step]?.({\r\n step,\r\n context,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n missingRequirements: missing,\r\n requirements: normalizedRequirements,\r\n setContextPatch: patchContext,\r\n run,\r\n adapter,\r\n transitions,\r\n })\r\n : null;\r\n\r\n return (\r\n <div className={cx(className, classNames?.shell)} style={uiStyles.shell}>\r\n <div className={classNames?.headerRow} style={uiStyles.headerRow}>\r\n <div>\r\n <div className={classNames?.eyebrow} style={uiStyles.eyebrow}>\r\n Adaptive flow\r\n </div>\r\n <h2 className={classNames?.title} style={uiStyles.title}>\r\n {stepLabel}\r\n </h2>\r\n </div>\r\n <div className={classNames?.badge} style={uiStyles.badge}>\r\n {completedCount}/{normalizedRequirements.length}\r\n </div>\r\n </div>\r\n\r\n {message ? (\r\n <div className={classNames?.success} style={uiStyles.success}>\r\n {message}\r\n </div>\r\n ) : null}\r\n {errorMessage ? (\r\n <div className={classNames?.error} style={uiStyles.error}>\r\n {errorMessage}\r\n </div>\r\n ) : null}\r\n\r\n {customView ?? registryView ?? defaultView}\r\n\r\n <div className={classNames?.footer} style={uiStyles.footer}>\r\n {normalizedOAuthProviders.map((provider) => (\r\n <button\r\n key={provider.id}\r\n type=\"button\"\r\n className={classNames?.oauthButton}\r\n style={uiStyles.oauthButton}\r\n disabled={busy || !adapter?.startOAuth}\r\n onClick={() => {\r\n handleOAuth(provider.id);\r\n }}\r\n >\r\n {provider.label}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ntype BlockBaseProps = {\r\n disabled?: boolean;\r\n styles: Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n classNames?: AdaptiveFlowClassNames;\r\n};\r\n\r\n/** Default email collection form used by the built-in component. */\r\nfunction EmailBlock({\r\n onSubmit,\r\n disabled,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (email: string) => void; error?: string }) {\r\n const [email, setEmail] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-email-error\";\r\n return (\r\n <form\r\n className={classNames?.formRow}\r\n style={styles.formRow}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(email);\r\n }}\r\n >\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"email\"\r\n autoComplete=\"email\"\r\n placeholder=\"Enter your email\"\r\n value={email}\r\n onChange={(event) => setEmail(event.target.value)}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n />\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </form>\r\n );\r\n}\r\n\r\n/** Default OTP form used by the built-in component. */\r\nfunction OtpBlock({\r\n onSubmit,\r\n disabled,\r\n email,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (code: string) => void; email: string; error?: string }) {\r\n const [code, setCode] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-otp-error\";\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(code);\r\n }}\r\n >\r\n <p className={classNames?.caption} style={styles.caption}>\r\n Use the verification code sent to {email}.\r\n </p>\r\n <div className={classNames?.formRow} style={styles.formRow}>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n inputMode=\"numeric\"\r\n placeholder=\"Enter 6-digit code\"\r\n value={code}\r\n onChange={(event) => setCode(event.target.value.replace(/\\D/g, \"\").slice(0, 6))}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n maxLength={6}\r\n pattern=\"[0-9]{6}\"\r\n />\r\n <button\r\n className={classNames?.button}\r\n style={styles.button}\r\n disabled={disabled || code.length !== 6}\r\n type=\"submit\"\r\n >\r\n Verify\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </div>\r\n </form>\r\n );\r\n}\r\n\r\n/** Default password form used by the built-in component. */\r\nfunction PasswordBlock({\r\n onSubmit,\r\n disabled,\r\n hasPassword,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (password: string) => void; hasPassword: boolean; error?: string }) {\r\n const [password, setPassword] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-password-error\";\r\n return (\r\n <form\r\n className={classNames?.formRow}\r\n style={styles.formRow}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(password);\r\n }}\r\n >\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"password\"\r\n autoComplete={hasPassword ? \"current-password\" : \"new-password\"}\r\n placeholder={hasPassword ? \"Enter your password\" : \"Create a password\"}\r\n value={password}\r\n onChange={(event) => setPassword(event.target.value)}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n minLength={8}\r\n />\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </form>\r\n );\r\n}\r\n\r\n/** Default profile form used by the built-in component. */\r\nfunction ProfileBlock({\r\n onSubmit,\r\n disabled,\r\n defaultValue,\r\n requireJobTitle,\r\n errors,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & {\r\n onSubmit: (profile: AdaptiveContext[\"profile\"]) => void;\r\n defaultValue: AdaptiveContext[\"profile\"];\r\n requireJobTitle: boolean;\r\n errors?: AdaptiveFlowFieldErrors;\r\n}) {\r\n const [firstName, setFirstName] = React.useState(defaultValue.firstName ?? \"\");\r\n const [lastName, setLastName] = React.useState(defaultValue.lastName ?? \"\");\r\n const [jobTitle, setJobTitle] = React.useState(defaultValue.jobTitle ?? \"\");\r\n const firstNameError = errors?.firstName ?? errors?.[\"profile.firstName\"];\r\n const lastNameError = errors?.lastName ?? errors?.[\"profile.lastName\"];\r\n const jobTitleError = errors?.jobTitle ?? errors?.[\"profile.jobTitle\"];\r\n const profileError = errors?.profile;\r\n\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit({\r\n firstName: firstName || null,\r\n lastName: lastName || null,\r\n jobTitle: jobTitle || null,\r\n });\r\n }}\r\n >\r\n <div className={classNames?.formRow} style={styles.formRow}>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"given-name\"\r\n placeholder=\"First name\"\r\n value={firstName}\r\n onChange={(event) => setFirstName(event.target.value)}\r\n aria-invalid={Boolean(firstNameError)}\r\n required\r\n />\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"family-name\"\r\n placeholder=\"Last name\"\r\n value={lastName}\r\n onChange={(event) => setLastName(event.target.value)}\r\n aria-invalid={Boolean(lastNameError)}\r\n required\r\n />\r\n </div>\r\n {firstNameError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {firstNameError}\r\n </div>\r\n ) : null}\r\n {lastNameError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {lastNameError}\r\n </div>\r\n ) : null}\r\n {requireJobTitle ? (\r\n <>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"organization-title\"\r\n placeholder=\"Job title\"\r\n value={jobTitle}\r\n onChange={(event) => setJobTitle(event.target.value)}\r\n aria-invalid={Boolean(jobTitleError)}\r\n required\r\n />\r\n {jobTitleError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {jobTitleError}\r\n </div>\r\n ) : null}\r\n </>\r\n ) : null}\r\n {profileError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {profileError}\r\n </div>\r\n ) : null}\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n/** Default terms acceptance form used by the built-in component. */\r\nfunction TosBlock({\r\n onSubmit,\r\n disabled,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: () => void; error?: string }) {\r\n const [checked, setChecked] = React.useState(false);\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n if (checked) {\r\n onSubmit();\r\n }\r\n }}\r\n >\r\n <label className={classNames?.checkboxRow} style={styles.checkboxRow}>\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={(event) => setChecked(event.target.checked)}\r\n aria-invalid={Boolean(error)}\r\n />\r\n <span>I agree to the Terms of Service and Privacy Policy.</span>\r\n </label>\r\n {error ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n <button\r\n className={classNames?.button}\r\n style={styles.button}\r\n disabled={disabled || !checked}\r\n type=\"submit\"\r\n >\r\n Accept and Continue\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n/** Completion panel shown when the flow reaches the terminal step. */\r\nfunction CompleteBlock({\r\n styles,\r\n classNames,\r\n}: {\r\n styles: Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n classNames?: AdaptiveFlowClassNames;\r\n}) {\r\n return (\r\n <div className={classNames?.complete} style={styles.complete}>\r\n <strong>You are all set.</strong>\r\n <p className={classNames?.caption} style={styles.caption}>\r\n All requirements are complete.\r\n </p>\r\n </div>\r\n );\r\n}\r\n\r\nconst defaultStyles: Record<AdaptiveFlowStyleSlot, React.CSSProperties> = {\r\n shell: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 12,\r\n width: \"100%\",\r\n maxWidth: 560,\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 14,\r\n padding: 16,\r\n background: \"#ffffff\",\r\n fontFamily: \"system-ui, -apple-system, Segoe UI, Roboto, sans-serif\",\r\n },\r\n headerRow: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n gap: 12,\r\n },\r\n eyebrow: {\r\n fontSize: 12,\r\n textTransform: \"uppercase\",\r\n letterSpacing: 1.2,\r\n color: \"#6b7280\",\r\n marginBottom: 4,\r\n },\r\n title: {\r\n margin: 0,\r\n fontSize: 22,\r\n lineHeight: \"28px\",\r\n },\r\n badge: {\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 999,\r\n padding: \"4px 10px\",\r\n fontSize: 12,\r\n fontWeight: 600,\r\n color: \"#374151\",\r\n },\r\n success: {\r\n border: \"1px solid #bbf7d0\",\r\n background: \"#f0fdf4\",\r\n color: \"#166534\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n error: {\r\n border: \"1px solid #fecaca\",\r\n background: \"#fef2f2\",\r\n color: \"#991b1b\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n info: {\r\n border: \"1px solid #bfdbfe\",\r\n background: \"#eff6ff\",\r\n color: \"#1e3a8a\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n caption: {\r\n margin: 0,\r\n color: \"#4b5563\",\r\n fontSize: 14,\r\n },\r\n formRow: {\r\n display: \"flex\",\r\n gap: 8,\r\n alignItems: \"center\",\r\n },\r\n formColumn: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 10,\r\n },\r\n input: {\r\n width: \"100%\",\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 12px\",\r\n fontSize: 14,\r\n },\r\n button: {\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 14px\",\r\n fontWeight: 600,\r\n background: \"#ffffff\",\r\n whiteSpace: \"nowrap\",\r\n cursor: \"pointer\",\r\n },\r\n checkboxRow: {\r\n display: \"flex\",\r\n gap: 8,\r\n alignItems: \"flex-start\",\r\n fontSize: 14,\r\n color: \"#374151\",\r\n },\r\n complete: {\r\n border: \"1px solid #bbf7d0\",\r\n background: \"#f0fdf4\",\r\n color: \"#166534\",\r\n borderRadius: 12,\r\n padding: 12,\r\n },\r\n footer: {\r\n display: \"flex\",\r\n gap: 8,\r\n marginTop: 4,\r\n },\r\n oauthButton: {\r\n flex: 1,\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n padding: \"10px 12px\",\r\n background: \"#f9fafb\",\r\n cursor: \"pointer\",\r\n },\r\n};\r\n","/**\r\n * Built-in requirement keys that cover the default flow states supported by the package.\r\n */\r\nexport const DefaultAppRequirements = {\r\n HAS_EMAIL: \"has_email\",\r\n EMAIL_VERIFIED: \"email_verified\",\r\n HAS_PASSWORD: \"has_password\",\r\n HAS_FIRST_NAME: \"has_first_name\",\r\n HAS_LAST_NAME: \"has_last_name\",\r\n ACCEPTED_TOS: \"accepted_tos\",\r\n HAS_JOB_TITLE: \"has_job_title\",\r\n} as const;\r\n\r\n/**\r\n * Built-in step keys used by the default flow UI and default requirement resolvers.\r\n */\r\nexport const DefaultAdaptiveSteps = {\r\n COLLECT_EMAIL: \"COLLECT_EMAIL\",\r\n VERIFY_OTP: \"VERIFY_OTP\",\r\n COLLECT_PASSWORD: \"COLLECT_PASSWORD\",\r\n COLLECT_PROFILE: \"COLLECT_PROFILE\",\r\n COLLECT_TOS: \"COLLECT_TOS\",\r\n COMPLETE: \"COMPLETE\",\r\n} as const;\r\n\r\n/** Requirement key from the built-in default requirement set. */\r\nexport type DefaultAppRequirement = (typeof DefaultAppRequirements)[keyof typeof DefaultAppRequirements];\r\n/** Step key from the built-in default step set. */\r\nexport type DefaultAdaptiveStep = (typeof DefaultAdaptiveSteps)[keyof typeof DefaultAdaptiveSteps];\r\n\r\n/** Requirement key used by the engine, including custom app-specific requirements. */\r\nexport type AppRequirement = DefaultAppRequirement | (string & {});\r\n/** Step key used by the engine, including custom app-specific steps. */\r\nexport type AdaptiveStep = DefaultAdaptiveStep | (string & {});\r\n\r\n/** Base context shape managed by the default flow helpers and UI. */\r\nexport type AdaptiveContextBase = {\r\n email: string | null;\r\n isVerified: boolean;\r\n hasPassword: boolean;\r\n profile: {\r\n firstName: string | null;\r\n lastName: string | null;\r\n jobTitle: string | null;\r\n };\r\n agreedToTos: boolean;\r\n};\r\n\r\n/** Alias for the default context shape used by the built-in component and hook. */\r\nexport type AdaptiveContext = AdaptiveContextBase;\r\n\r\n/** Default set of requirements used when a flow does not provide its own list. */\r\nexport const defaultRequirements: DefaultAppRequirement[] = [\r\n DefaultAppRequirements.HAS_EMAIL,\r\n DefaultAppRequirements.EMAIL_VERIFIED,\r\n DefaultAppRequirements.HAS_PASSWORD,\r\n DefaultAppRequirements.HAS_FIRST_NAME,\r\n DefaultAppRequirements.HAS_LAST_NAME,\r\n DefaultAppRequirements.HAS_JOB_TITLE,\r\n DefaultAppRequirements.ACCEPTED_TOS,\r\n];\r\n\r\n/** Default initial context used by the component and hook when no initialValue is provided. */\r\nexport const initialContext: AdaptiveContextBase = {\r\n email: null,\r\n isVerified: false,\r\n hasPassword: false,\r\n profile: {\r\n firstName: null,\r\n lastName: null,\r\n jobTitle: null,\r\n },\r\n agreedToTos: false,\r\n};\r\n\r\n/** Utility type for APIs that may return either a synchronous or asynchronous value. */\r\nexport type MaybePromise<T> = T | Promise<T>;\r\n\r\n/** Resolver contract that maps one requirement to the step shown when it is unmet. */\r\nexport type RequirementResolver<\r\n TContext = AdaptiveContextBase,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n isMet: (context: TContext) => MaybePromise<boolean>;\r\n step: TStep;\r\n};\r\n\r\n/**\r\n * Single requirement node in the requirement graph.\r\n * The engine evaluates nodes by priority, dependency readiness, and custom conditions.\r\n */\r\nexport type RequirementGraphNode<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n requirement: TRequirement;\r\n step: TStep;\r\n isMet: (context: TContext) => MaybePromise<boolean>;\r\n when?: (context: TContext) => MaybePromise<boolean>;\r\n priority?: number;\r\n dependsOn?: readonly TRequirement[];\r\n};\r\n\r\n/** Ordered requirement graph consumed by the engine evaluation helpers. */\r\nexport type RequirementGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = readonly RequirementGraphNode<TContext, TRequirement, TStep>[];\r\n\r\n/** Default requirement-to-step resolvers used by the built-in flow UI. */\r\nexport const defaultRequirementResolvers: Record<\r\n DefaultAppRequirement,\r\n RequirementResolver<AdaptiveContextBase, AdaptiveStep>\r\n> = {\r\n has_email: {\r\n isMet: (context) => Boolean(context.email),\r\n step: DefaultAdaptiveSteps.COLLECT_EMAIL,\r\n },\r\n email_verified: {\r\n isMet: (context) => context.isVerified,\r\n step: DefaultAdaptiveSteps.VERIFY_OTP,\r\n },\r\n has_password: {\r\n isMet: (context) => context.hasPassword,\r\n step: DefaultAdaptiveSteps.COLLECT_PASSWORD,\r\n },\r\n has_first_name: {\r\n isMet: (context) => Boolean(context.profile.firstName),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n has_last_name: {\r\n isMet: (context) => Boolean(context.profile.lastName),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n accepted_tos: {\r\n isMet: (context) => context.agreedToTos,\r\n step: DefaultAdaptiveSteps.COLLECT_TOS,\r\n },\r\n has_job_title: {\r\n isMet: (context) => Boolean(context.profile.jobTitle),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n};\r\n\r\n/**\r\n * Build a requirement graph from a requirement list, resolver map, and optional graph metadata.\r\n *\r\n * The function validates that dependencies refer to known resolver-backed requirements and\r\n * rejects circular dependency chains at graph creation time.\r\n */\r\nexport function createRequirementGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n requirements: readonly TRequirement[],\r\n resolvers: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>,\r\n options?: {\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n },\r\n): RequirementGraph<TContext, TRequirement, TStep> {\r\n const graph: RequirementGraphNode<TContext, TRequirement, TStep>[] = [];\r\n const requirementSet = new Set(requirements);\r\n const resolverBackedRequirements = new Set(\r\n requirements.filter((requirement) => Boolean(resolvers[requirement])),\r\n );\r\n\r\n for (const requirement of requirements) {\r\n const resolver = resolvers[requirement];\r\n if (!resolver) {\r\n continue;\r\n }\r\n\r\n const dependsOn = options?.dependencies?.[requirement] ?? [];\r\n for (const dependency of dependsOn) {\r\n if (!requirementSet.has(dependency)) {\r\n throw new Error(\r\n `Invalid dependency \\\"${String(dependency)}\\\" referenced by requirement \\\"${String(requirement)}\\\".`,\r\n );\r\n }\r\n if (!resolverBackedRequirements.has(dependency)) {\r\n throw new Error(\r\n `Dependency \\\"${String(dependency)}\\\" referenced by requirement \\\"${String(requirement)}\\\" has no resolver.`,\r\n );\r\n }\r\n }\r\n\r\n graph.push({\r\n requirement,\r\n step: resolver.step,\r\n isMet: resolver.isMet,\r\n when: options?.conditions?.[requirement],\r\n priority: options?.priorities?.[requirement] ?? 0,\r\n dependsOn,\r\n });\r\n }\r\n\r\n const byRequirement = new Map(\r\n graph.map((node) => [node.requirement, node] as const),\r\n );\r\n\r\n const visited = new Set<TRequirement>();\r\n const visiting = new Set<TRequirement>();\r\n\r\n const dfs = (requirement: TRequirement, stack: TRequirement[]) => {\r\n if (visited.has(requirement)) {\r\n return;\r\n }\r\n\r\n if (visiting.has(requirement)) {\r\n const cycleStart = stack.indexOf(requirement);\r\n const cyclePath = [...stack.slice(cycleStart), requirement]\r\n .map((value) => String(value))\r\n .join(\" -> \");\r\n throw new Error(`Circular dependency detected in requirement graph: ${cyclePath}`);\r\n }\r\n\r\n visiting.add(requirement);\r\n const node = byRequirement.get(requirement);\r\n if (node?.dependsOn?.length) {\r\n for (const dep of node.dependsOn) {\r\n if (byRequirement.has(dep)) {\r\n dfs(dep, [...stack, requirement]);\r\n }\r\n }\r\n }\r\n\r\n visiting.delete(requirement);\r\n visited.add(requirement);\r\n };\r\n\r\n for (const node of graph) {\r\n dfs(node.requirement, []);\r\n }\r\n\r\n return graph;\r\n}\r\n\r\n/**\r\n * Build a requirement graph using the built-in default resolvers plus any app-specific overrides.\r\n */\r\nexport function createDefaultRequirementGraph<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n TRequirement extends string = DefaultAppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>(\r\n options?: {\r\n requirements?: readonly TRequirement[];\r\n resolvers?: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>;\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n },\r\n): RequirementGraph<TContext, TRequirement, TStep> {\r\n const requirements =\r\n (options?.requirements ?? (defaultRequirements as unknown as readonly TRequirement[]));\r\n\r\n const resolvers = {\r\n ...(defaultRequirementResolvers as unknown as Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>),\r\n ...(options?.resolvers ?? {}),\r\n };\r\n\r\n return createRequirementGraph(requirements, resolvers, {\r\n priorities: options?.priorities,\r\n conditions: options?.conditions,\r\n dependencies: options?.dependencies,\r\n });\r\n}\r\n\r\nfunction sortGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(graph: RequirementGraph<TContext, TRequirement, TStep>) {\r\n const entries = graph.map((node, index) => ({ node, index }));\r\n const byRequirement = new Map(entries.map((entry) => [entry.node.requirement, entry] as const));\r\n\r\n const indegree = new Map<TRequirement, number>();\r\n const adjacency = new Map<TRequirement, TRequirement[]>();\r\n\r\n for (const entry of entries) {\r\n indegree.set(entry.node.requirement, 0);\r\n adjacency.set(entry.node.requirement, []);\r\n }\r\n\r\n for (const entry of entries) {\r\n const current = entry.node.requirement;\r\n for (const dependency of entry.node.dependsOn ?? []) {\r\n const depEntry = byRequirement.get(dependency);\r\n if (!depEntry) {\r\n continue;\r\n }\r\n\r\n const outgoing = adjacency.get(depEntry.node.requirement);\r\n if (outgoing) {\r\n outgoing.push(current);\r\n }\r\n indegree.set(current, (indegree.get(current) ?? 0) + 1);\r\n }\r\n }\r\n\r\n const compare = (\r\n left: { node: RequirementGraphNode<TContext, TRequirement, TStep>; index: number },\r\n right: { node: RequirementGraphNode<TContext, TRequirement, TStep>; index: number },\r\n ) => {\r\n const byPriority = (right.node.priority ?? 0) - (left.node.priority ?? 0);\r\n if (byPriority !== 0) {\r\n return byPriority;\r\n }\r\n // Keep declaration order for equal-priority nodes to avoid surprising step jumps.\r\n return left.index - right.index;\r\n };\r\n\r\n const ready = entries\r\n .filter((entry) => (indegree.get(entry.node.requirement) ?? 0) === 0)\r\n .sort(compare);\r\n\r\n const ordered: RequirementGraphNode<TContext, TRequirement, TStep>[] = [];\r\n\r\n while (ready.length > 0) {\r\n const current = ready.shift();\r\n if (!current) {\r\n break;\r\n }\r\n\r\n ordered.push(current.node);\r\n\r\n for (const dependent of adjacency.get(current.node.requirement) ?? []) {\r\n const next = (indegree.get(dependent) ?? 0) - 1;\r\n indegree.set(dependent, next);\r\n if (next === 0) {\r\n const dependentEntry = byRequirement.get(dependent);\r\n if (dependentEntry) {\r\n ready.push(dependentEntry);\r\n ready.sort(compare);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (ordered.length !== graph.length) {\r\n throw new Error(\"Unable to topologically sort requirement graph. Check for dependency cycles.\");\r\n }\r\n\r\n return ordered;\r\n}\r\n\r\n/**\r\n * Evaluate the graph against the current context and return the next unmet step.\r\n *\r\n * Nodes are evaluated in dependency-aware order with deterministic tie-breaking.\r\n */\r\nexport async function evaluateNextStep<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n context: TContext,\r\n graph: RequirementGraph<TContext, TRequirement, TStep>,\r\n completeStep: TStep,\r\n): Promise<TStep> {\r\n for (const node of sortGraph(graph)) {\r\n if (node.when && !(await node.when(context))) {\r\n continue;\r\n }\r\n\r\n if (node.dependsOn && node.dependsOn.length > 0) {\r\n const prerequisiteNodes = graph.filter((candidate) =>\r\n node.dependsOn?.includes(candidate.requirement),\r\n );\r\n\r\n if (prerequisiteNodes.length > 0) {\r\n const prerequisitesMet = await Promise.all(\r\n prerequisiteNodes.map(async (candidate) => candidate.isMet(context)),\r\n );\r\n if (prerequisitesMet.includes(false)) {\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n if (!(await node.isMet(context))) {\r\n return node.step;\r\n }\r\n }\r\n\r\n return completeStep;\r\n}\r\n\r\n/**\r\n * Return every unmet requirement for the current context in graph evaluation order.\r\n */\r\nexport async function getMissingRequirements<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n context: TContext,\r\n graph: RequirementGraph<TContext, TRequirement, TStep>,\r\n): Promise<TRequirement[]> {\r\n const missing: TRequirement[] = [];\r\n\r\n for (const node of sortGraph(graph)) {\r\n if (node.when && !(await node.when(context))) {\r\n continue;\r\n }\r\n\r\n if (!(await node.isMet(context))) {\r\n missing.push(node.requirement);\r\n }\r\n }\r\n\r\n return missing;\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/AdaptiveFlow.tsx","../src/engine.ts"],"sourcesContent":["export {\r\n\tuseAdaptiveFlow,\r\n\tAdaptiveFlow,\r\n\ttype AdaptiveFlowAdapter,\r\n\ttype AdaptiveFlowClassNames,\r\n\ttype AdaptiveFlowFieldErrors,\r\n\ttype AdaptiveFlowOAuthProvider,\r\n\ttype AdaptiveFlowPersistence,\r\n\ttype AdaptiveFlowProps,\r\n\ttype AdaptiveFlowSchema,\r\n\ttype AdaptiveFlowSchemas,\r\n\ttype AdaptiveFlowRetryPolicy,\r\n\ttype AdaptiveFlowValidationIssue,\r\n\ttype AdaptiveFlowValidationResult,\r\n\ttype AdaptiveStepRegistry,\r\n\ttype AdaptiveStepRendererArgs,\r\n\ttype AdaptiveStepTransition,\r\n\ttype AdaptiveFlowStorageDriver,\r\n\ttype AdaptiveFlowStyleSlot,\r\n\ttype AdaptiveFlowStyles,\r\n\ttype AdaptiveFlowValidationContext,\r\n\ttype AdaptiveFlowValidators,\r\n\ttype AdaptiveStepRenderArgs,\r\n\ttype UseAdaptiveFlowOptions,\r\n\ttype UseAdaptiveFlowResult,\r\n\ttype IdentityResolution,\r\n\ttype OAuthProvider,\r\n\ttype PersistedAdaptiveFlowState,\r\n} from \"./AdaptiveFlow\";\r\nexport {\r\n\tdefaultRequirements,\r\n\tcreateDefaultRequirementGraph,\r\n\tcreateRequirementGraph,\r\n\tdefaultRequirementResolvers,\r\n\tevaluateNextStep,\r\n\tgetMissingRequirements,\r\n\tinitialContext,\r\n\ttype RequirementGraph,\r\n\ttype RequirementGraphNode,\r\n\ttype MaybePromise,\r\n\tDefaultAdaptiveSteps,\r\n\tDefaultAppRequirements,\r\n\ttype AdaptiveContext,\r\n\ttype AdaptiveContextBase,\r\n\ttype AdaptiveStep,\r\n\ttype AppRequirement,\r\n\ttype DefaultAdaptiveStep,\r\n\ttype DefaultAppRequirement,\r\n\ttype RequirementResolver,\r\n} from \"./engine\";","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport {\r\n createDefaultRequirementGraph,\r\n defaultRequirementResolvers,\r\n defaultRequirements,\r\n evaluateNextStep,\r\n getMissingRequirements,\r\n initialContext,\r\n type AdaptiveContext,\r\n type AdaptiveContextBase,\r\n type AdaptiveStep,\r\n type AppRequirement,\r\n type MaybePromise,\r\n type RequirementGraph,\r\n type RequirementResolver,\r\n} from \"./engine\";\r\n\r\n/** Supported OAuth provider identifiers accepted by the adapter and default UI. */\r\nexport type OAuthProvider = \"google\" | \"apple\" | (string & {});\r\n\r\n/** Configurable OAuth provider label/id pair used by the default footer buttons. */\r\nexport type AdaptiveFlowOAuthProvider = {\r\n id: OAuthProvider | (string & {});\r\n label: string;\r\n};\r\n\r\n/** Result returned by lookupByEmail to seed the flow with backend identity state. */\r\nexport type IdentityResolution = {\r\n accountExists: boolean;\r\n hasPassword?: boolean;\r\n isVerified?: boolean;\r\n agreedToTos?: boolean;\r\n profile?: Partial<AdaptiveContextBase[\"profile\"]>;\r\n};\r\n\r\n/** Backend adapter contract used by the flow to delegate all side effects. */\r\nexport type AdaptiveFlowAdapter<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n lookupByEmail?: (email: string) => Promise<IdentityResolution | null>;\r\n requestOtp?: (email: string) => Promise<void>;\r\n verifyOtp?: (email: string, code: string) => Promise<void>;\r\n signInWithPassword?: (email: string, password: string) => Promise<void>;\r\n createPassword?: (password: string) => Promise<void>;\r\n saveProfile?: (context: TContext) => Promise<void>;\r\n acceptTos?: (context: TContext) => Promise<void>;\r\n startOAuth?: (provider: OAuthProvider, context: TContext) => Promise<void>;\r\n completeOAuth?: (\r\n provider: OAuthProvider | null,\r\n context: TContext,\r\n ) => Promise<Partial<TContext> | void>;\r\n};\r\n\r\n/** Named style slots used by the built-in component shell and step renderers. */\r\nexport type AdaptiveFlowStyleSlot =\r\n | \"shell\"\r\n | \"headerRow\"\r\n | \"eyebrow\"\r\n | \"title\"\r\n | \"badge\"\r\n | \"success\"\r\n | \"error\"\r\n | \"info\"\r\n | \"caption\"\r\n | \"formRow\"\r\n | \"formColumn\"\r\n | \"input\"\r\n | \"button\"\r\n | \"checkboxRow\"\r\n | \"complete\"\r\n | \"footer\"\r\n | \"oauthButton\";\r\n\r\n/** Inline style overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowStyles = Partial<Record<AdaptiveFlowStyleSlot, React.CSSProperties>>;\r\n/** CSS class overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowClassNames = Partial<Record<AdaptiveFlowStyleSlot, string>>;\r\n\r\n/** Minimal storage interface used by persistence drivers. */\r\nexport type AdaptiveFlowStorageDriver = Pick<Storage, \"getItem\" | \"setItem\" | \"removeItem\">;\r\n\r\n/** Persistence settings for storing and restoring flow state across reloads. */\r\nexport type AdaptiveFlowPersistence<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n key: string;\r\n storage?: \"session\" | \"local\" | AdaptiveFlowStorageDriver;\r\n serialize?: (state: PersistedAdaptiveFlowState<TContext>) => string;\r\n deserialize?: (value: string) => PersistedAdaptiveFlowState<TContext>;\r\n clearOnComplete?: boolean;\r\n onError?: (error: Error, phase: \"read\" | \"write\" | \"clear\") => void;\r\n};\r\n\r\n/** Persisted flow payload written to session/local/custom storage. */\r\nexport type PersistedAdaptiveFlowState<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n context: TContext;\r\n oauthPendingProvider: OAuthProvider | null;\r\n};\r\n\r\n/** Context wrapper passed into validators so they can inspect the current flow state. */\r\nexport type AdaptiveFlowValidationContext<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n> = {\r\n context: TContext;\r\n};\r\n\r\n/** Validator failure payload that can target a specific field or the whole form. */\r\nexport type AdaptiveFlowValidationIssue = {\r\n message: string;\r\n field?: string;\r\n};\r\n\r\n/** Validator return type supported by the component and hook. */\r\nexport type AdaptiveFlowValidationResult =\r\n | string\r\n | AdaptiveFlowValidationIssue\r\n | void\r\n | Promise<string | AdaptiveFlowValidationIssue | void>;\r\n\r\n/** Schema adapter contract used for optional Zod-friendly validation. */\r\nexport type AdaptiveFlowSchema<TValue> = {\r\n safeParse?: (value: TValue) => {\r\n success: boolean;\r\n error?: {\r\n message?: string;\r\n issues?: Array<{\r\n message?: string;\r\n path?: Array<string | number>;\r\n }>;\r\n };\r\n };\r\n parse?: (value: TValue) => unknown;\r\n};\r\n\r\n/** Optional schema map for built-in step fields. */\r\nexport type AdaptiveFlowSchemas = {\r\n email?: AdaptiveFlowSchema<string>;\r\n otp?: AdaptiveFlowSchema<string>;\r\n password?: AdaptiveFlowSchema<string>;\r\n profile?: AdaptiveFlowSchema<AdaptiveContextBase[\"profile\"]>;\r\n tos?: AdaptiveFlowSchema<boolean>;\r\n};\r\n\r\n/** Backoff settings used to retry transient adapter calls and OAuth completion. */\r\nexport type AdaptiveFlowRetryPolicy = {\r\n maxAttempts?: number;\r\n initialDelayMs?: number;\r\n factor?: number;\r\n maxDelayMs?: number;\r\n jitter?: boolean;\r\n shouldRetry?: (error: Error, attempt: number) => boolean;\r\n delay?: (attempt: number) => number;\r\n};\r\n\r\n/** Field error bag keyed by field path or logical field name. */\r\nexport type AdaptiveFlowFieldErrors = Partial<Record<string, string>>;\r\n\r\n/** Validator map for the built-in flow fields. */\r\nexport type AdaptiveFlowValidators<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n email?: (input: string, payload: AdaptiveFlowValidationContext<TContext>) => AdaptiveFlowValidationResult;\r\n otp?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { email: string },\r\n ) => AdaptiveFlowValidationResult;\r\n password?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { hasPassword: boolean },\r\n ) => AdaptiveFlowValidationResult;\r\n profile?: (\r\n input: AdaptiveContextBase[\"profile\"],\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n tos?: (\r\n accepted: boolean,\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n};\r\n\r\n/** Transition record emitted whenever the evaluated step changes. */\r\nexport type AdaptiveStepTransition<TStep extends string = AdaptiveStep> = {\r\n from: TStep | null;\r\n to: TStep;\r\n at: number;\r\n attempt: number;\r\n};\r\n\r\n/** Arguments supplied to a stepRegistry renderer for a specific step. */\r\nexport type AdaptiveStepRendererArgs<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Registry that overrides the UI for selected steps. */\r\nexport type AdaptiveStepRegistry<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = Partial<\r\n Record<TStep, (args: AdaptiveStepRendererArgs<TContext, TRequirement, TStep>) => React.ReactNode>\r\n>;\r\n\r\n/** Arguments supplied to renderStep for full step-body customization. */\r\nexport type AdaptiveStepRenderArgs<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n defaultView: React.ReactNode;\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Props accepted by the AdaptiveFlow component. */\r\nexport type AdaptiveFlowProps<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n requirements?: readonly TRequirement[];\r\n requirementGraph?: RequirementGraph<TContext, TRequirement, TStep>;\r\n requirementGraphConfig?: {\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n };\r\n requirementResolvers?: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>;\r\n completeStep?: TStep;\r\n stepTitles?: Partial<Record<TStep, string>>;\r\n renderStep?: (args: AdaptiveStepRenderArgs<TContext, TRequirement, TStep>) => React.ReactNode;\r\n stepRegistry?: AdaptiveStepRegistry<TContext, TRequirement, TStep>;\r\n initialValue?: Partial<TContext>;\r\n onComplete?: (context: TContext) => void;\r\n onError?: (error: Error) => void;\r\n onStepTransition?: (transition: AdaptiveStepTransition<TStep>, context: TContext) => void;\r\n className?: string;\r\n classNames?: AdaptiveFlowClassNames;\r\n styles?: AdaptiveFlowStyles;\r\n unstyled?: boolean;\r\n persistence?: AdaptiveFlowPersistence<TContext>;\r\n validators?: AdaptiveFlowValidators<TContext>;\r\n schemas?: AdaptiveFlowSchemas;\r\n oauthProviders?: readonly AdaptiveFlowOAuthProvider[];\r\n retryPolicy?: AdaptiveFlowRetryPolicy;\r\n};\r\n\r\n/** Options accepted by the headless useAdaptiveFlow hook. */\r\nexport type UseAdaptiveFlowOptions<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = Omit<\r\n AdaptiveFlowProps<TContext, TRequirement, TStep>,\r\n \"stepTitles\" | \"renderStep\" | \"stepRegistry\" | \"className\" | \"classNames\" | \"styles\" | \"unstyled\"\r\n>;\r\n\r\n/** Result object returned by useAdaptiveFlow. */\r\nexport type UseAdaptiveFlowResult<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n context: TContext;\r\n step: TStep;\r\n hasEvaluated: boolean;\r\n completeStep: TStep;\r\n requirements: readonly TRequirement[];\r\n missingRequirements: TRequirement[];\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n handleEmail: (emailInput: string) => void;\r\n handleOtp: (code: string) => void;\r\n handlePassword: (password: string) => void;\r\n handleProfile: (profile: AdaptiveContextBase[\"profile\"]) => void;\r\n handleTos: () => void;\r\n handleOAuth: (provider: OAuthProvider) => void;\r\n};\r\n\r\ntype PlainObject = Record<string, unknown>;\r\n\r\n/** Default provider buttons rendered by the component footer when no provider list is supplied. */\r\nconst defaultOAuthProviders: readonly AdaptiveFlowOAuthProvider[] = [\r\n { id: \"google\", label: \"Continue with Google\" },\r\n { id: \"apple\", label: \"Continue with Apple\" },\r\n];\r\n\r\n/** Human-friendly labels used when a step title override is not supplied. */\r\nconst defaultStepTitle: Record<string, string> = {\r\n COLLECT_EMAIL: \"Enter your email\",\r\n VERIFY_OTP: \"Verify your email\",\r\n COLLECT_PASSWORD: \"Set up your password\",\r\n COLLECT_PROFILE: \"Complete your profile\",\r\n COLLECT_TOS: \"Accept terms\",\r\n COMPLETE: \"Done\",\r\n};\r\n\r\n/** Built-in step keys that have a default renderer in the component shell. */\r\nconst builtInDefaultSteps = new Set<string>([\r\n \"COLLECT_EMAIL\",\r\n \"VERIFY_OTP\",\r\n \"COLLECT_PASSWORD\",\r\n \"COLLECT_PROFILE\",\r\n \"COLLECT_TOS\",\r\n \"COMPLETE\",\r\n]);\r\n\r\nconst styleSlots: AdaptiveFlowStyleSlot[] = [\r\n \"shell\",\r\n \"headerRow\",\r\n \"eyebrow\",\r\n \"title\",\r\n \"badge\",\r\n \"success\",\r\n \"error\",\r\n \"info\",\r\n \"caption\",\r\n \"formRow\",\r\n \"formColumn\",\r\n \"input\",\r\n \"button\",\r\n \"checkboxRow\",\r\n \"complete\",\r\n \"footer\",\r\n \"oauthButton\",\r\n];\r\n\r\n/**\r\n * Deeply merge a patch into the current context.\r\n *\r\n * Plain nested objects are merged recursively, while arrays and non-plain values are replaced.\r\n */\r\nfunction mergeContext<TContext extends AdaptiveContextBase>(\r\n current: TContext,\r\n patch: Partial<TContext>,\r\n): TContext {\r\n const mergeValue = (baseValue: unknown, patchValue: unknown): unknown => {\r\n if (Array.isArray(baseValue) || Array.isArray(patchValue)) {\r\n return patchValue;\r\n }\r\n\r\n const baseIsObject = Boolean(baseValue) && typeof baseValue === \"object\";\r\n const patchIsObject = Boolean(patchValue) && typeof patchValue === \"object\";\r\n\r\n if (!baseIsObject || !patchIsObject) {\r\n return patchValue === undefined ? baseValue : patchValue;\r\n }\r\n\r\n const baseObject = baseValue as PlainObject;\r\n const patchObject = patchValue as PlainObject;\r\n const result: PlainObject = { ...baseObject };\r\n\r\n for (const key of Object.keys(patchObject)) {\r\n result[key] = mergeValue(baseObject[key], patchObject[key]);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n return mergeValue(current, patch) as TContext;\r\n}\r\n\r\n/** Merge the supplied initial value into the library's default context shape. */\r\nfunction withDefaults<TContext extends AdaptiveContextBase>(initialValue?: Partial<TContext>): TContext {\r\n if (!initialValue) {\r\n return initialContext as TContext;\r\n }\r\n\r\n return mergeContext(initialContext as TContext, initialValue);\r\n}\r\n\r\n/** Normalize any thrown value into an Error instance while preserving message and code when available. */\r\nfunction toError(error: unknown): Error {\r\n if (error instanceof Error) {\r\n return error;\r\n }\r\n\r\n if (typeof error === \"string\") {\r\n return new Error(error);\r\n }\r\n\r\n if (error && typeof error === \"object\") {\r\n const maybeError = error as { message?: unknown; code?: unknown };\r\n const message = typeof maybeError.message === \"string\" && maybeError.message.trim().length > 0\r\n ? maybeError.message\r\n : \"Unknown error while processing adaptive flow\";\r\n const normalized = new Error(message);\r\n if (typeof maybeError.code === \"string\" && maybeError.code.trim().length > 0) {\r\n normalized.name = maybeError.code;\r\n }\r\n (normalized as Error & { cause?: unknown }).cause = error;\r\n return normalized;\r\n }\r\n\r\n return new Error(`Unknown error while processing adaptive flow: ${String(error)}`);\r\n}\r\n\r\n/** Pause execution for the requested number of milliseconds. */\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n\r\n/** Clamp and normalize a retry delay into a safe non-negative millisecond value. */\r\nfunction normalizeDelay(delay: number | undefined, fallback: number): number {\r\n if (typeof delay !== \"number\" || Number.isNaN(delay) || delay < 0) {\r\n return fallback;\r\n }\r\n return delay;\r\n}\r\n\r\n/** Compute the delay for the current retry attempt using exponential backoff and optional jitter. */\r\n/** Compute the delay for a retry attempt using exponential backoff and optional jitter. */\r\nfunction computeRetryDelay(policy: AdaptiveFlowRetryPolicy | undefined, attempt: number): number {\r\n if (policy?.delay) {\r\n return normalizeDelay(policy.delay(attempt), 0);\r\n }\r\n\r\n const initialDelayMs = normalizeDelay(policy?.initialDelayMs, 250);\r\n const factor = typeof policy?.factor === \"number\" && policy.factor > 0 ? policy.factor : 2;\r\n const maxDelayMs = normalizeDelay(policy?.maxDelayMs, Number.POSITIVE_INFINITY);\r\n let delay = initialDelayMs * Math.pow(factor, Math.max(0, attempt - 1));\r\n\r\n if (policy?.jitter) {\r\n delay = delay * (0.5 + Math.random() * 0.5);\r\n }\r\n\r\n return Math.min(delay, maxDelayMs);\r\n}\r\n\r\n/** Execute an async operation with configurable retry/backoff behavior. */\r\nasync function withRetry<T>(\r\n operation: () => Promise<T>,\r\n retryPolicy: AdaptiveFlowRetryPolicy | undefined,\r\n): Promise<T> {\r\n if (!retryPolicy) {\r\n return operation();\r\n }\r\n\r\n const maxAttempts = Math.max(1, Math.trunc(retryPolicy.maxAttempts ?? 3));\r\n let lastError: unknown;\r\n\r\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\r\n try {\r\n return await operation();\r\n } catch (error) {\r\n lastError = error;\r\n const normalized = toError(error);\r\n const shouldRetry = retryPolicy.shouldRetry?.(normalized, attempt) ?? attempt < maxAttempts;\r\n if (!shouldRetry || attempt === maxAttempts) {\r\n throw normalized;\r\n }\r\n\r\n await sleep(computeRetryDelay(retryPolicy, attempt));\r\n }\r\n }\r\n\r\n throw toError(lastError);\r\n}\r\n\r\n/** Join class names while dropping falsy entries. */\r\nfunction cx(...names: Array<string | undefined | false | null>): string | undefined {\r\n const value = names.filter(Boolean).join(\" \").trim();\r\n return value.length > 0 ? value : undefined;\r\n}\r\n\r\n/** Resolve the configured storage driver or return null when running outside the browser. */\r\nfunction pickStorage(storage?: \"session\" | \"local\" | AdaptiveFlowStorageDriver): AdaptiveFlowStorageDriver | null {\r\n if (typeof window === \"undefined\") {\r\n return null;\r\n }\r\n\r\n if (!storage || storage === \"session\") {\r\n return window.sessionStorage;\r\n }\r\n\r\n if (storage === \"local\") {\r\n return window.localStorage;\r\n }\r\n\r\n return storage;\r\n}\r\n\r\n/** Read and deserialize persisted flow state from storage. */\r\nfunction readPersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n): PersistedAdaptiveFlowState<TContext> | null {\r\n if (!persistence) {\r\n return null;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return null;\r\n }\r\n\r\n const raw = storage.getItem(persistence.key);\r\n if (!raw) {\r\n return null;\r\n }\r\n\r\n const deserialize = persistence.deserialize ?? ((value: string) => JSON.parse(value));\r\n return deserialize(raw);\r\n}\r\n\r\n/** Serialize and persist the current flow state to storage. */\r\nfunction writePersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n state: PersistedAdaptiveFlowState<TContext>,\r\n): void {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return;\r\n }\r\n\r\n const serialize = persistence.serialize ?? ((value: PersistedAdaptiveFlowState<TContext>) => JSON.stringify(value));\r\n storage.setItem(persistence.key, serialize(state));\r\n}\r\n\r\n/** Remove persisted flow state from storage. */\r\nfunction clearPersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n): void {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return;\r\n }\r\n\r\n storage.removeItem(persistence.key);\r\n}\r\n\r\n/** Internal error type used to carry field-level validation failures. */\r\nclass FlowValidationError extends Error {\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n\r\n constructor(message: string, fieldErrors: AdaptiveFlowFieldErrors) {\r\n super(message);\r\n this.name = \"FlowValidationError\";\r\n this.fieldErrors = fieldErrors;\r\n }\r\n}\r\n\r\n/** Convert a validation issue into the internal validation error shape. */\r\nfunction toValidationError(\r\n issue: AdaptiveFlowValidationIssue,\r\n fallbackField?: string,\r\n): FlowValidationError {\r\n const field = issue.field ?? fallbackField;\r\n if (field) {\r\n return new FlowValidationError(issue.message, { [field]: issue.message });\r\n }\r\n return new FlowValidationError(issue.message, {});\r\n}\r\n\r\n/** Map schema validation issues into field error messages keyed by path. */\r\nfunction normalizeSchemaIssues(\r\n error: { message?: string; issues?: Array<{ message?: string; path?: Array<string | number> }> } | undefined,\r\n fallbackField?: string,\r\n): AdaptiveFlowFieldErrors {\r\n const fieldErrors: AdaptiveFlowFieldErrors = {};\r\n const issues = error?.issues ?? [];\r\n\r\n for (const issue of issues) {\r\n const path = issue.path?.length ? issue.path.map(String).join(\".\") : fallbackField;\r\n const message = issue.message?.trim() || error?.message || \"Validation failed.\";\r\n if (path && !fieldErrors[path]) {\r\n fieldErrors[path] = message;\r\n }\r\n }\r\n\r\n if (Object.keys(fieldErrors).length === 0 && fallbackField) {\r\n fieldErrors[fallbackField] = error?.message || \"Validation failed.\";\r\n }\r\n\r\n return fieldErrors;\r\n}\r\n\r\n/** Execute a validator result and raise a field-aware validation error when needed. */\r\nasync function assertValid(result: AdaptiveFlowValidationResult, fallbackField?: string): Promise<void> {\r\n const outcome = await result;\r\n if (!outcome) {\r\n return;\r\n }\r\n\r\n if (typeof outcome === \"string\") {\r\n const message = outcome.trim();\r\n if (message.length > 0) {\r\n throw new FlowValidationError(message, fallbackField ? { [fallbackField]: message } : {});\r\n }\r\n return;\r\n }\r\n\r\n if (outcome.message.trim().length > 0) {\r\n throw toValidationError(outcome, fallbackField);\r\n }\r\n}\r\n\r\n/** Execute an optional schema validator before running the custom validator chain. */\r\nasync function assertSchema<TValue>(\r\n schema: AdaptiveFlowSchema<TValue> | undefined,\r\n value: TValue,\r\n fallbackField?: string,\r\n): Promise<void> {\r\n if (!schema) {\r\n return;\r\n }\r\n\r\n if (schema.safeParse) {\r\n const result = schema.safeParse(value);\r\n if (!result.success) {\r\n const fieldErrors = normalizeSchemaIssues(result.error, fallbackField);\r\n throw new FlowValidationError(result.error?.message || \"Validation failed.\", fieldErrors);\r\n }\r\n return;\r\n }\r\n\r\n if (!schema.parse) {\r\n return;\r\n }\r\n\r\n try {\r\n schema.parse(value);\r\n } catch (error) {\r\n const normalized = error as {\r\n message?: string;\r\n issues?: Array<{ message?: string; path?: Array<string | number> }>;\r\n };\r\n const fieldErrors = normalizeSchemaIssues(\r\n {\r\n message: normalized?.message,\r\n issues: normalized?.issues,\r\n },\r\n fallbackField,\r\n );\r\n throw new FlowValidationError(normalized?.message || \"Validation failed.\", fieldErrors);\r\n }\r\n}\r\n\r\n/** Merge built-in style defaults with user overrides or return raw overrides in unstyled mode. */\r\nfunction resolveStyles(\r\n unstyled: boolean,\r\n styleOverrides?: AdaptiveFlowStyles,\r\n): Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined> {\r\n const resolved = {} as Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n\r\n for (const slot of styleSlots) {\r\n if (unstyled) {\r\n resolved[slot] = styleOverrides?.[slot];\r\n continue;\r\n }\r\n\r\n resolved[slot] = {\r\n ...defaultStyles[slot],\r\n ...(styleOverrides?.[slot] ?? {}),\r\n };\r\n }\r\n\r\n return resolved;\r\n}\r\n\r\n/** Headless flow hook that owns state, evaluation, persistence, retries, and adapter wiring. */\r\nexport function useAdaptiveFlow<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n}: UseAdaptiveFlowOptions<TContext, TRequirement, TStep>): UseAdaptiveFlowResult<\r\n TContext,\r\n TRequirement,\r\n TStep\r\n> {\r\n const normalizedRequirements = React.useMemo(\r\n () => (requirements ?? (defaultRequirements as unknown as readonly TRequirement[])),\r\n [requirements],\r\n );\r\n const normalizedCompleteStep = React.useMemo(\r\n () => (completeStep ?? (\"COMPLETE\" as TStep)),\r\n [completeStep],\r\n );\r\n const resolvers = React.useMemo(\r\n () =>\r\n ({\r\n ...(defaultRequirementResolvers as unknown as Partial<\r\n Record<TRequirement, RequirementResolver<TContext, TStep>>\r\n >),\r\n ...(requirementResolvers ?? {}),\r\n }) as Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>,\r\n [requirementResolvers],\r\n );\r\n const graph = React.useMemo(\r\n () =>\r\n requirementGraph ??\r\n createDefaultRequirementGraph({\r\n requirements: normalizedRequirements,\r\n resolvers,\r\n priorities: requirementGraphConfig?.priorities,\r\n conditions: requirementGraphConfig?.conditions,\r\n dependencies: requirementGraphConfig?.dependencies,\r\n }),\r\n [\r\n requirementGraph,\r\n normalizedRequirements,\r\n resolvers,\r\n requirementGraphConfig?.priorities,\r\n requirementGraphConfig?.conditions,\r\n requirementGraphConfig?.dependencies,\r\n ],\r\n );\r\n\r\n type RuntimeState = {\r\n step: TStep;\r\n hasEvaluated: boolean;\r\n missingRequirements: TRequirement[];\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n oauthPendingProvider: OAuthProvider | null;\r\n persistenceHydrated: boolean;\r\n };\r\n\r\n type RuntimeAction =\r\n | {\r\n type: \"evaluated\";\r\n missingRequirements: TRequirement[];\r\n step: TStep;\r\n transition: AdaptiveStepTransition<TStep>;\r\n }\r\n | { type: \"set_busy\"; busy: boolean }\r\n | { type: \"set_message\"; message: string | null }\r\n | { type: \"set_error\"; errorMessage: string | null }\r\n | { type: \"set_field_errors\"; fieldErrors: AdaptiveFlowFieldErrors }\r\n | { type: \"start_job\" }\r\n | { type: \"set_oauth_pending\"; provider: OAuthProvider | null }\r\n | { type: \"set_hydrated\"; hydrated: boolean };\r\n\r\n const runtimeReducer = (state: RuntimeState, action: RuntimeAction): RuntimeState => {\r\n switch (action.type) {\r\n case \"evaluated\":\r\n return {\r\n ...state,\r\n step: action.step,\r\n hasEvaluated: true,\r\n missingRequirements: action.missingRequirements,\r\n transitions: [...state.transitions, action.transition].slice(-100),\r\n };\r\n case \"set_busy\":\r\n return { ...state, busy: action.busy };\r\n case \"set_message\":\r\n return { ...state, message: action.message };\r\n case \"set_error\":\r\n return { ...state, errorMessage: action.errorMessage };\r\n case \"set_field_errors\":\r\n return { ...state, fieldErrors: action.fieldErrors };\r\n case \"start_job\":\r\n return { ...state, busy: true, errorMessage: null, fieldErrors: {} };\r\n case \"set_oauth_pending\":\r\n return { ...state, oauthPendingProvider: action.provider };\r\n case \"set_hydrated\":\r\n return { ...state, persistenceHydrated: action.hydrated };\r\n default:\r\n return state;\r\n }\r\n };\r\n\r\n const [context, setContext] = React.useState<TContext>(() => withDefaults(initialValue));\r\n const [runtime, dispatch] = React.useReducer(runtimeReducer, {\r\n step: normalizedCompleteStep,\r\n hasEvaluated: false,\r\n missingRequirements: [],\r\n transitions: [],\r\n busy: false,\r\n message: null,\r\n errorMessage: null,\r\n fieldErrors: {},\r\n oauthPendingProvider: null,\r\n persistenceHydrated: !persistence,\r\n } satisfies RuntimeState);\r\n\r\n const {\r\n step,\r\n hasEvaluated,\r\n missingRequirements,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n oauthPendingProvider,\r\n persistenceHydrated,\r\n } = runtime;\r\n const attemptByStepRef = React.useRef<Record<string, number>>({});\r\n const previousStepRef = React.useRef<TStep | null>(null);\r\n const evaluationRef = React.useRef(0);\r\n const completed = React.useRef(false);\r\n\r\n const reportPersistenceError = React.useCallback(\r\n (error: unknown, phase: \"read\" | \"write\" | \"clear\") => {\r\n const normalized = toError(error);\r\n persistence?.onError?.(normalized, phase);\r\n onError?.(normalized);\r\n },\r\n [onError, persistence],\r\n );\r\n\r\n React.useEffect(() => {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n try {\r\n const persisted = readPersistedState(persistence);\r\n if (persisted?.context) {\r\n setContext(mergeContext(withDefaults(initialValue), persisted.context));\r\n }\r\n if (persisted?.oauthPendingProvider) {\r\n dispatch({ type: \"set_oauth_pending\", provider: persisted.oauthPendingProvider });\r\n }\r\n } catch (error) {\r\n reportPersistenceError(error, \"read\");\r\n } finally {\r\n dispatch({ type: \"set_hydrated\", hydrated: true });\r\n }\r\n }, [initialValue, persistence, reportPersistenceError]);\r\n\r\n React.useEffect(() => {\r\n const currentEvaluation = ++evaluationRef.current;\r\n\r\n void (async () => {\r\n const [missing, next] = await Promise.all([\r\n getMissingRequirements(context, graph as RequirementGraph<TContext, TRequirement, TStep>),\r\n evaluateNextStep(context, graph as RequirementGraph<TContext, TRequirement, TStep>, normalizedCompleteStep),\r\n ]);\r\n\r\n if (currentEvaluation !== evaluationRef.current) {\r\n return;\r\n }\r\n\r\n const from = previousStepRef.current;\r\n const attemptKey = String(next);\r\n const nextAttempt = from === next ? (attemptByStepRef.current[attemptKey] ?? 0) + 1 : 1;\r\n attemptByStepRef.current[attemptKey] = nextAttempt;\r\n\r\n const transition: AdaptiveStepTransition<TStep> = {\r\n from,\r\n to: next,\r\n at: Date.now(),\r\n attempt: nextAttempt,\r\n };\r\n\r\n dispatch({\r\n type: \"evaluated\",\r\n missingRequirements: missing,\r\n step: next,\r\n transition,\r\n });\r\n previousStepRef.current = next;\r\n onStepTransition?.(transition, context);\r\n })().catch((error) => {\r\n if (currentEvaluation !== evaluationRef.current) {\r\n return;\r\n }\r\n\r\n const normalized = toError(error);\r\n dispatch({ type: \"set_field_errors\", fieldErrors: {} });\r\n dispatch({ type: \"set_error\", errorMessage: normalized.message });\r\n onError?.(normalized);\r\n });\r\n }, [context, graph, normalizedCompleteStep, onError, onStepTransition]);\r\n\r\n React.useEffect(() => {\r\n if (step === normalizedCompleteStep) {\r\n if (!completed.current) {\r\n completed.current = true;\r\n onComplete?.(context);\r\n\r\n const shouldClearPersistence = persistence?.clearOnComplete ?? true;\r\n if (shouldClearPersistence) {\r\n try {\r\n clearPersistedState(persistence);\r\n } catch (error) {\r\n reportPersistenceError(error, \"clear\");\r\n }\r\n }\r\n }\r\n } else {\r\n completed.current = false;\r\n }\r\n }, [context, normalizedCompleteStep, onComplete, persistence, reportPersistenceError, step]);\r\n\r\n React.useEffect(() => {\r\n if (!persistence || !persistenceHydrated) {\r\n return;\r\n }\r\n\r\n try {\r\n writePersistedState(persistence, { context, oauthPendingProvider });\r\n } catch (error) {\r\n reportPersistenceError(error, \"write\");\r\n }\r\n }, [context, oauthPendingProvider, persistence, persistenceHydrated, reportPersistenceError]);\r\n\r\n const run = React.useCallback(\r\n async (job: () => Promise<void>) => {\r\n dispatch({ type: \"start_job\" });\r\n try {\r\n await job();\r\n } catch (error) {\r\n if (error instanceof FlowValidationError) {\r\n dispatch({ type: \"set_field_errors\", fieldErrors: error.fieldErrors });\r\n if (Object.keys(error.fieldErrors).length === 0) {\r\n dispatch({ type: \"set_error\", errorMessage: error.message });\r\n onError?.(error);\r\n }\r\n } else {\r\n const normalized = toError(error);\r\n dispatch({ type: \"set_error\", errorMessage: normalized.message });\r\n onError?.(normalized);\r\n }\r\n } finally {\r\n dispatch({ type: \"set_busy\", busy: false });\r\n }\r\n },\r\n [onError],\r\n );\r\n\r\n const patchContext = React.useCallback((patch: Partial<TContext>) => {\r\n setContext((prev) => mergeContext(prev, patch));\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n const completeOAuth = adapter?.completeOAuth;\r\n if (!oauthPendingProvider || !completeOAuth) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n const patch = await withRetry(\r\n () => completeOAuth(oauthPendingProvider, context),\r\n retryPolicy,\r\n );\r\n if (patch) {\r\n patchContext(patch);\r\n }\r\n dispatch({ type: \"set_oauth_pending\", provider: null });\r\n dispatch({ type: \"set_message\", message: \"OAuth sign-in completed.\" });\r\n });\r\n }, [adapter, context, oauthPendingProvider, patchContext, retryPolicy, run]);\r\n\r\n const handleEmail = (emailInput: string) => {\r\n const email = emailInput.trim().toLowerCase();\r\n if (!email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.email, email, \"email\");\r\n if (validators?.email) {\r\n await assertValid(validators.email(email, { context }), \"email\");\r\n }\r\n\r\n const identity = adapter?.lookupByEmail\r\n ? await withRetry(() => adapter.lookupByEmail!(email), retryPolicy)\r\n : null;\r\n\r\n patchContext({\r\n email,\r\n hasPassword: Boolean(identity?.hasPassword),\r\n isVerified: Boolean(identity?.isVerified),\r\n agreedToTos: Boolean(identity?.agreedToTos),\r\n profile: {\r\n firstName: identity?.profile?.firstName ?? null,\r\n lastName: identity?.profile?.lastName ?? null,\r\n jobTitle: identity?.profile?.jobTitle ?? null,\r\n },\r\n } as Partial<TContext>);\r\n\r\n if (identity?.accountExists && identity.hasPassword) {\r\n dispatch({ type: \"set_message\", message: \"Welcome back. Enter your password to continue.\" });\r\n return;\r\n }\r\n\r\n if (adapter?.requestOtp) {\r\n await withRetry(() => adapter.requestOtp!(email), retryPolicy);\r\n dispatch({ type: \"set_message\", message: \"We sent a 6-digit code to your inbox.\" });\r\n } else {\r\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\r\n const isDev = env !== \"production\";\r\n if (!isDev) {\r\n throw new Error(\"OTP adapter is required in production. Provide adapter.requestOtp.\");\r\n }\r\n\r\n patchContext({ isVerified: true } as Partial<TContext>);\r\n dispatch({\r\n type: \"set_message\",\r\n message: \"No OTP adapter configured. Verification was skipped in development mode.\",\r\n });\r\n }\r\n });\r\n };\r\n\r\n const handleOtp = (code: string) => {\r\n if (!context.email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.otp, code, \"otp\");\r\n if (validators?.otp) {\r\n await assertValid(validators.otp(code, { context, email: context.email as string }), \"otp\");\r\n }\r\n\r\n if (adapter?.verifyOtp) {\r\n await withRetry(() => adapter.verifyOtp!(context.email as string, code), retryPolicy);\r\n }\r\n patchContext({ isVerified: true } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Email verified.\" });\r\n });\r\n };\r\n\r\n const handlePassword = (password: string) => {\r\n if (!context.email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.password, password, \"password\");\r\n if (validators?.password) {\r\n await assertValid(\r\n validators.password(password, { context, hasPassword: context.hasPassword }),\r\n \"password\",\r\n );\r\n }\r\n\r\n if (context.hasPassword) {\r\n if (adapter?.signInWithPassword) {\r\n await withRetry(\r\n () => adapter.signInWithPassword!(context.email as string, password),\r\n retryPolicy,\r\n );\r\n }\r\n } else {\r\n if (adapter?.createPassword) {\r\n await withRetry(() => adapter.createPassword!(password), retryPolicy);\r\n }\r\n patchContext({ hasPassword: true } as Partial<TContext>);\r\n }\r\n dispatch({ type: \"set_message\", message: \"Password step complete.\" });\r\n });\r\n };\r\n\r\n const handleProfile = (profile: AdaptiveContextBase[\"profile\"]) => {\r\n void run(async () => {\r\n await assertSchema(schemas?.profile, profile, \"profile\");\r\n if (validators?.profile) {\r\n await assertValid(validators.profile(profile, { context }), \"profile\");\r\n }\r\n\r\n const next = mergeContext(context, {\r\n profile: {\r\n firstName: profile.firstName || null,\r\n lastName: profile.lastName || null,\r\n jobTitle: profile.jobTitle || null,\r\n },\r\n } as Partial<TContext>);\r\n\r\n if (adapter?.saveProfile) {\r\n await withRetry(() => adapter.saveProfile!(next), retryPolicy);\r\n }\r\n\r\n patchContext({ profile: next.profile } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Profile saved.\" });\r\n });\r\n };\r\n\r\n const handleTos = () => {\r\n void run(async () => {\r\n await assertSchema(schemas?.tos, true, \"tos\");\r\n if (validators?.tos) {\r\n await assertValid(validators.tos(true, { context }), \"tos\");\r\n }\r\n\r\n const next = mergeContext(context, { agreedToTos: true } as Partial<TContext>);\r\n if (adapter?.acceptTos) {\r\n await withRetry(() => adapter.acceptTos!(next), retryPolicy);\r\n }\r\n patchContext({ agreedToTos: true } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Terms accepted.\" });\r\n });\r\n };\r\n\r\n const handleOAuth = (provider: OAuthProvider) => {\r\n const startOAuth = adapter?.startOAuth;\r\n if (!startOAuth) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n dispatch({ type: \"set_oauth_pending\", provider });\r\n dispatch({ type: \"set_message\", message: `Starting ${provider} sign-in...` });\r\n await withRetry(() => startOAuth(provider, context), retryPolicy);\r\n });\r\n };\r\n\r\n return {\r\n context,\r\n step,\r\n hasEvaluated,\r\n completeStep: normalizedCompleteStep,\r\n requirements: normalizedRequirements,\r\n missingRequirements,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n setContextPatch: patchContext,\r\n run,\r\n handleEmail,\r\n handleOtp,\r\n handlePassword,\r\n handleProfile,\r\n handleTos,\r\n handleOAuth,\r\n };\r\n}\r\n\r\n/** Default UI wrapper around useAdaptiveFlow that renders the built-in flow shell and step UI. */\r\nexport function AdaptiveFlow<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n stepTitles,\r\n renderStep,\r\n stepRegistry,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n className,\r\n classNames,\r\n styles,\r\n unstyled = false,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n}: AdaptiveFlowProps<TContext, TRequirement, TStep>) {\r\n const uiStyles = React.useMemo(() => resolveStyles(unstyled, styles), [unstyled, styles]);\r\n\r\n const {\r\n context,\r\n step,\r\n hasEvaluated,\r\n completeStep: normalizedCompleteStep,\r\n requirements: normalizedRequirements,\r\n missingRequirements: missing,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n setContextPatch: patchContext,\r\n run,\r\n handleEmail,\r\n handleOtp,\r\n handlePassword,\r\n handleProfile,\r\n handleTos,\r\n handleOAuth,\r\n } = useAdaptiveFlow<TContext, TRequirement, TStep>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n });\r\n\r\n const normalizedOAuthProviders = React.useMemo(\r\n () => (oauthProviders && oauthProviders.length > 0 ? oauthProviders : defaultOAuthProviders),\r\n [oauthProviders],\r\n );\r\n\r\n const completedCount = hasEvaluated\r\n ? normalizedRequirements.length - missing.length\r\n : 0;\r\n const needsJobTitle = normalizedRequirements.includes(\"has_job_title\" as TRequirement);\r\n const stepLabel = hasEvaluated\r\n ? (stepTitles?.[step] ?? defaultStepTitle[step] ?? step)\r\n : \"Loading flow\";\r\n\r\n const defaultView = (\r\n <>\r\n {!hasEvaluated ? (\r\n <div className={classNames?.info} style={uiStyles.info}>\r\n Evaluating required steps...\r\n </div>\r\n ) : null}\r\n {step === \"COLLECT_EMAIL\" ? (\r\n <EmailBlock\r\n onSubmit={handleEmail}\r\n disabled={busy}\r\n error={fieldErrors.email}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"VERIFY_OTP\" ? (\r\n <OtpBlock\r\n onSubmit={handleOtp}\r\n email={context.email ?? \"your email\"}\r\n disabled={busy}\r\n error={fieldErrors.otp}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_PASSWORD\" ? (\r\n <PasswordBlock\r\n onSubmit={handlePassword}\r\n disabled={busy}\r\n hasPassword={context.hasPassword}\r\n error={fieldErrors.password}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_PROFILE\" ? (\r\n <ProfileBlock\r\n defaultValue={context.profile}\r\n requireJobTitle={needsJobTitle}\r\n onSubmit={handleProfile}\r\n disabled={busy}\r\n errors={fieldErrors}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_TOS\" ? (\r\n <TosBlock\r\n onSubmit={handleTos}\r\n disabled={busy}\r\n error={fieldErrors.tos}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === normalizedCompleteStep ? (\r\n <CompleteBlock styles={uiStyles} classNames={classNames} />\r\n ) : null}\r\n {!builtInDefaultSteps.has(String(step)) && step !== normalizedCompleteStep ? (\r\n <div className={classNames?.info} style={uiStyles.info}>\r\n No default renderer for step \"{step}\". Provide renderStep to handle custom steps.\r\n </div>\r\n ) : null}\r\n </>\r\n );\r\n\r\n const customView = renderStep\r\n ? renderStep({\r\n step,\r\n context,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n missingRequirements: missing,\r\n requirements: normalizedRequirements,\r\n defaultView,\r\n setContextPatch: patchContext,\r\n run,\r\n adapter,\r\n transitions,\r\n })\r\n : null;\r\n const registryView = stepRegistry?.[step]\r\n ? stepRegistry[step]?.({\r\n step,\r\n context,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n missingRequirements: missing,\r\n requirements: normalizedRequirements,\r\n setContextPatch: patchContext,\r\n run,\r\n adapter,\r\n transitions,\r\n })\r\n : null;\r\n\r\n return (\r\n <div className={cx(className, classNames?.shell)} style={uiStyles.shell}>\r\n <div className={classNames?.headerRow} style={uiStyles.headerRow}>\r\n <div>\r\n <div className={classNames?.eyebrow} style={uiStyles.eyebrow}>\r\n Adaptive flow\r\n </div>\r\n <h2 className={classNames?.title} style={uiStyles.title}>\r\n {stepLabel}\r\n </h2>\r\n </div>\r\n <div className={classNames?.badge} style={uiStyles.badge}>\r\n {completedCount}/{normalizedRequirements.length}\r\n </div>\r\n </div>\r\n\r\n {message ? (\r\n <div className={classNames?.success} style={uiStyles.success}>\r\n {message}\r\n </div>\r\n ) : null}\r\n {errorMessage ? (\r\n <div className={classNames?.error} style={uiStyles.error}>\r\n {errorMessage}\r\n </div>\r\n ) : null}\r\n\r\n {customView ?? registryView ?? defaultView}\r\n\r\n <div className={classNames?.footer} style={uiStyles.footer}>\r\n {normalizedOAuthProviders.map((provider) => (\r\n <button\r\n key={provider.id}\r\n type=\"button\"\r\n className={classNames?.oauthButton}\r\n style={uiStyles.oauthButton}\r\n disabled={busy || !adapter?.startOAuth}\r\n onClick={() => {\r\n handleOAuth(provider.id);\r\n }}\r\n >\r\n {provider.label}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ntype BlockBaseProps = {\r\n disabled?: boolean;\r\n styles: Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n classNames?: AdaptiveFlowClassNames;\r\n};\r\n\r\n/** Default email collection form used by the built-in component. */\r\nfunction EmailBlock({\r\n onSubmit,\r\n disabled,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (email: string) => void; error?: string }) {\r\n const [email, setEmail] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-email-error\";\r\n return (\r\n <form\r\n className={classNames?.formRow}\r\n style={styles.formRow}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(email);\r\n }}\r\n >\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"email\"\r\n autoComplete=\"email\"\r\n placeholder=\"Enter your email\"\r\n value={email}\r\n onChange={(event) => setEmail(event.target.value)}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n />\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </form>\r\n );\r\n}\r\n\r\n/** Default OTP form used by the built-in component. */\r\nfunction OtpBlock({\r\n onSubmit,\r\n disabled,\r\n email,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (code: string) => void; email: string; error?: string }) {\r\n const [code, setCode] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-otp-error\";\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(code);\r\n }}\r\n >\r\n <p className={classNames?.caption} style={styles.caption}>\r\n Use the verification code sent to {email}.\r\n </p>\r\n <div className={classNames?.formRow} style={styles.formRow}>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n inputMode=\"numeric\"\r\n placeholder=\"Enter 6-digit code\"\r\n value={code}\r\n onChange={(event) => setCode(event.target.value.replace(/\\D/g, \"\").slice(0, 6))}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n maxLength={6}\r\n pattern=\"[0-9]{6}\"\r\n />\r\n <button\r\n className={classNames?.button}\r\n style={styles.button}\r\n disabled={disabled || code.length !== 6}\r\n type=\"submit\"\r\n >\r\n Verify\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </div>\r\n </form>\r\n );\r\n}\r\n\r\n/** Default password form used by the built-in component. */\r\nfunction PasswordBlock({\r\n onSubmit,\r\n disabled,\r\n hasPassword,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (password: string) => void; hasPassword: boolean; error?: string }) {\r\n const [password, setPassword] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-password-error\";\r\n return (\r\n <form\r\n className={classNames?.formRow}\r\n style={styles.formRow}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(password);\r\n }}\r\n >\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"password\"\r\n autoComplete={hasPassword ? \"current-password\" : \"new-password\"}\r\n placeholder={hasPassword ? \"Enter your password\" : \"Create a password\"}\r\n value={password}\r\n onChange={(event) => setPassword(event.target.value)}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n minLength={8}\r\n />\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </form>\r\n );\r\n}\r\n\r\n/** Default profile form used by the built-in component. */\r\nfunction ProfileBlock({\r\n onSubmit,\r\n disabled,\r\n defaultValue,\r\n requireJobTitle,\r\n errors,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & {\r\n onSubmit: (profile: AdaptiveContext[\"profile\"]) => void;\r\n defaultValue: AdaptiveContext[\"profile\"];\r\n requireJobTitle: boolean;\r\n errors?: AdaptiveFlowFieldErrors;\r\n}) {\r\n const [firstName, setFirstName] = React.useState(defaultValue.firstName ?? \"\");\r\n const [lastName, setLastName] = React.useState(defaultValue.lastName ?? \"\");\r\n const [jobTitle, setJobTitle] = React.useState(defaultValue.jobTitle ?? \"\");\r\n const firstNameError = errors?.firstName ?? errors?.[\"profile.firstName\"];\r\n const lastNameError = errors?.lastName ?? errors?.[\"profile.lastName\"];\r\n const jobTitleError = errors?.jobTitle ?? errors?.[\"profile.jobTitle\"];\r\n const profileError = errors?.profile;\r\n\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit({\r\n firstName: firstName || null,\r\n lastName: lastName || null,\r\n jobTitle: jobTitle || null,\r\n });\r\n }}\r\n >\r\n <div className={classNames?.formRow} style={styles.formRow}>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"given-name\"\r\n placeholder=\"First name\"\r\n value={firstName}\r\n onChange={(event) => setFirstName(event.target.value)}\r\n aria-invalid={Boolean(firstNameError)}\r\n required\r\n />\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"family-name\"\r\n placeholder=\"Last name\"\r\n value={lastName}\r\n onChange={(event) => setLastName(event.target.value)}\r\n aria-invalid={Boolean(lastNameError)}\r\n required\r\n />\r\n </div>\r\n {firstNameError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {firstNameError}\r\n </div>\r\n ) : null}\r\n {lastNameError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {lastNameError}\r\n </div>\r\n ) : null}\r\n {requireJobTitle ? (\r\n <>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"organization-title\"\r\n placeholder=\"Job title\"\r\n value={jobTitle}\r\n onChange={(event) => setJobTitle(event.target.value)}\r\n aria-invalid={Boolean(jobTitleError)}\r\n required\r\n />\r\n {jobTitleError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {jobTitleError}\r\n </div>\r\n ) : null}\r\n </>\r\n ) : null}\r\n {profileError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {profileError}\r\n </div>\r\n ) : null}\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n/** Default terms acceptance form used by the built-in component. */\r\nfunction TosBlock({\r\n onSubmit,\r\n disabled,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: () => void; error?: string }) {\r\n const [checked, setChecked] = React.useState(false);\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n if (checked) {\r\n onSubmit();\r\n }\r\n }}\r\n >\r\n <label className={classNames?.checkboxRow} style={styles.checkboxRow}>\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={(event) => setChecked(event.target.checked)}\r\n aria-invalid={Boolean(error)}\r\n />\r\n <span>I agree to the Terms of Service and Privacy Policy.</span>\r\n </label>\r\n {error ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n <button\r\n className={classNames?.button}\r\n style={styles.button}\r\n disabled={disabled || !checked}\r\n type=\"submit\"\r\n >\r\n Accept and Continue\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n/** Completion panel shown when the flow reaches the terminal step. */\r\nfunction CompleteBlock({\r\n styles,\r\n classNames,\r\n}: {\r\n styles: Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n classNames?: AdaptiveFlowClassNames;\r\n}) {\r\n return (\r\n <div className={classNames?.complete} style={styles.complete}>\r\n <strong>You are all set.</strong>\r\n <p className={classNames?.caption} style={styles.caption}>\r\n All requirements are complete.\r\n </p>\r\n </div>\r\n );\r\n}\r\n\r\nconst defaultStyles: Record<AdaptiveFlowStyleSlot, React.CSSProperties> = {\r\n shell: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 12,\r\n width: \"100%\",\r\n maxWidth: 560,\r\n border: \"1px solid #cbd5e1\",\r\n borderRadius: 14,\r\n padding: 16,\r\n background: \"#f8fafc\",\r\n color: \"#0f172a\",\r\n fontFamily: \"system-ui, -apple-system, Segoe UI, Roboto, sans-serif\",\r\n },\r\n headerRow: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n gap: 12,\r\n },\r\n eyebrow: {\r\n fontSize: 12,\r\n textTransform: \"uppercase\",\r\n letterSpacing: 1.2,\r\n color: \"#475569\",\r\n marginBottom: 4,\r\n },\r\n title: {\r\n margin: 0,\r\n fontSize: 22,\r\n lineHeight: \"28px\",\r\n },\r\n badge: {\r\n border: \"1px solid #cbd5e1\",\r\n borderRadius: 999,\r\n padding: \"4px 10px\",\r\n fontSize: 12,\r\n fontWeight: 600,\r\n color: \"#1e293b\",\r\n background: \"#ffffff\",\r\n },\r\n success: {\r\n border: \"1px solid #bbf7d0\",\r\n background: \"#f0fdf4\",\r\n color: \"#166534\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n error: {\r\n border: \"1px solid #fecaca\",\r\n background: \"#fef2f2\",\r\n color: \"#991b1b\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n info: {\r\n border: \"1px solid #bfdbfe\",\r\n background: \"#eff6ff\",\r\n color: \"#1e3a8a\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n caption: {\r\n margin: 0,\r\n color: \"#334155\",\r\n fontSize: 14,\r\n },\r\n formRow: {\r\n display: \"flex\",\r\n gap: 8,\r\n alignItems: \"center\",\r\n },\r\n formColumn: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 10,\r\n },\r\n input: {\r\n width: \"100%\",\r\n border: \"1px solid #94a3b8\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 12px\",\r\n fontSize: 14,\r\n background: \"#ffffff\",\r\n color: \"#0f172a\",\r\n },\r\n button: {\r\n border: \"1px solid #94a3b8\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 14px\",\r\n fontWeight: 600,\r\n background: \"#ffffff\",\r\n color: \"#0f172a\",\r\n whiteSpace: \"nowrap\",\r\n cursor: \"pointer\",\r\n },\r\n checkboxRow: {\r\n display: \"flex\",\r\n gap: 8,\r\n alignItems: \"flex-start\",\r\n fontSize: 14,\r\n color: \"#374151\",\r\n },\r\n complete: {\r\n border: \"1px solid #bbf7d0\",\r\n background: \"#f0fdf4\",\r\n color: \"#166534\",\r\n borderRadius: 12,\r\n padding: 12,\r\n },\r\n footer: {\r\n display: \"flex\",\r\n gap: 8,\r\n marginTop: 4,\r\n },\r\n oauthButton: {\r\n flex: 1,\r\n border: \"1px solid #94a3b8\",\r\n borderRadius: 8,\r\n padding: \"10px 12px\",\r\n background: \"#ffffff\",\r\n color: \"#0f172a\",\r\n cursor: \"pointer\",\r\n },\r\n};\r\n","/**\r\n * Built-in requirement keys that cover the default flow states supported by the package.\r\n */\r\nexport const DefaultAppRequirements = {\r\n HAS_EMAIL: \"has_email\",\r\n EMAIL_VERIFIED: \"email_verified\",\r\n HAS_PASSWORD: \"has_password\",\r\n HAS_FIRST_NAME: \"has_first_name\",\r\n HAS_LAST_NAME: \"has_last_name\",\r\n ACCEPTED_TOS: \"accepted_tos\",\r\n HAS_JOB_TITLE: \"has_job_title\",\r\n} as const;\r\n\r\n/**\r\n * Built-in step keys used by the default flow UI and default requirement resolvers.\r\n */\r\nexport const DefaultAdaptiveSteps = {\r\n COLLECT_EMAIL: \"COLLECT_EMAIL\",\r\n VERIFY_OTP: \"VERIFY_OTP\",\r\n COLLECT_PASSWORD: \"COLLECT_PASSWORD\",\r\n COLLECT_PROFILE: \"COLLECT_PROFILE\",\r\n COLLECT_TOS: \"COLLECT_TOS\",\r\n COMPLETE: \"COMPLETE\",\r\n} as const;\r\n\r\n/** Requirement key from the built-in default requirement set. */\r\nexport type DefaultAppRequirement = (typeof DefaultAppRequirements)[keyof typeof DefaultAppRequirements];\r\n/** Step key from the built-in default step set. */\r\nexport type DefaultAdaptiveStep = (typeof DefaultAdaptiveSteps)[keyof typeof DefaultAdaptiveSteps];\r\n\r\n/** Requirement key used by the engine, including custom app-specific requirements. */\r\nexport type AppRequirement = DefaultAppRequirement | (string & {});\r\n/** Step key used by the engine, including custom app-specific steps. */\r\nexport type AdaptiveStep = DefaultAdaptiveStep | (string & {});\r\n\r\n/** Base context shape managed by the default flow helpers and UI. */\r\nexport type AdaptiveContextBase = {\r\n email: string | null;\r\n isVerified: boolean;\r\n hasPassword: boolean;\r\n profile: {\r\n firstName: string | null;\r\n lastName: string | null;\r\n jobTitle: string | null;\r\n };\r\n agreedToTos: boolean;\r\n};\r\n\r\n/** Alias for the default context shape used by the built-in component and hook. */\r\nexport type AdaptiveContext = AdaptiveContextBase;\r\n\r\n/** Default set of requirements used when a flow does not provide its own list. */\r\nexport const defaultRequirements: DefaultAppRequirement[] = [\r\n DefaultAppRequirements.HAS_EMAIL,\r\n DefaultAppRequirements.EMAIL_VERIFIED,\r\n DefaultAppRequirements.HAS_PASSWORD,\r\n DefaultAppRequirements.HAS_FIRST_NAME,\r\n DefaultAppRequirements.HAS_LAST_NAME,\r\n DefaultAppRequirements.HAS_JOB_TITLE,\r\n DefaultAppRequirements.ACCEPTED_TOS,\r\n];\r\n\r\n/** Default initial context used by the component and hook when no initialValue is provided. */\r\nexport const initialContext: AdaptiveContextBase = {\r\n email: null,\r\n isVerified: false,\r\n hasPassword: false,\r\n profile: {\r\n firstName: null,\r\n lastName: null,\r\n jobTitle: null,\r\n },\r\n agreedToTos: false,\r\n};\r\n\r\n/** Utility type for APIs that may return either a synchronous or asynchronous value. */\r\nexport type MaybePromise<T> = T | Promise<T>;\r\n\r\n/** Resolver contract that maps one requirement to the step shown when it is unmet. */\r\nexport type RequirementResolver<\r\n TContext = AdaptiveContextBase,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n isMet: (context: TContext) => MaybePromise<boolean>;\r\n step: TStep;\r\n};\r\n\r\n/**\r\n * Single requirement node in the requirement graph.\r\n * The engine evaluates nodes by priority, dependency readiness, and custom conditions.\r\n */\r\nexport type RequirementGraphNode<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n requirement: TRequirement;\r\n step: TStep;\r\n isMet: (context: TContext) => MaybePromise<boolean>;\r\n when?: (context: TContext) => MaybePromise<boolean>;\r\n priority?: number;\r\n dependsOn?: readonly TRequirement[];\r\n};\r\n\r\n/** Ordered requirement graph consumed by the engine evaluation helpers. */\r\nexport type RequirementGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = readonly RequirementGraphNode<TContext, TRequirement, TStep>[];\r\n\r\n/** Default requirement-to-step resolvers used by the built-in flow UI. */\r\nexport const defaultRequirementResolvers: Record<\r\n DefaultAppRequirement,\r\n RequirementResolver<AdaptiveContextBase, AdaptiveStep>\r\n> = {\r\n has_email: {\r\n isMet: (context) => Boolean(context.email),\r\n step: DefaultAdaptiveSteps.COLLECT_EMAIL,\r\n },\r\n email_verified: {\r\n isMet: (context) => context.isVerified,\r\n step: DefaultAdaptiveSteps.VERIFY_OTP,\r\n },\r\n has_password: {\r\n isMet: (context) => context.hasPassword,\r\n step: DefaultAdaptiveSteps.COLLECT_PASSWORD,\r\n },\r\n has_first_name: {\r\n isMet: (context) => Boolean(context.profile.firstName),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n has_last_name: {\r\n isMet: (context) => Boolean(context.profile.lastName),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n accepted_tos: {\r\n isMet: (context) => context.agreedToTos,\r\n step: DefaultAdaptiveSteps.COLLECT_TOS,\r\n },\r\n has_job_title: {\r\n isMet: (context) => Boolean(context.profile.jobTitle),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n};\r\n\r\n/**\r\n * Build a requirement graph from a requirement list, resolver map, and optional graph metadata.\r\n *\r\n * The function validates that dependencies refer to known resolver-backed requirements and\r\n * rejects circular dependency chains at graph creation time.\r\n */\r\nexport function createRequirementGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n requirements: readonly TRequirement[],\r\n resolvers: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>,\r\n options?: {\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n },\r\n): RequirementGraph<TContext, TRequirement, TStep> {\r\n const graph: RequirementGraphNode<TContext, TRequirement, TStep>[] = [];\r\n const requirementSet = new Set(requirements);\r\n const resolverBackedRequirements = new Set(\r\n requirements.filter((requirement) => Boolean(resolvers[requirement])),\r\n );\r\n\r\n for (const requirement of requirements) {\r\n const resolver = resolvers[requirement];\r\n if (!resolver) {\r\n continue;\r\n }\r\n\r\n const dependsOn = options?.dependencies?.[requirement] ?? [];\r\n for (const dependency of dependsOn) {\r\n if (!requirementSet.has(dependency)) {\r\n throw new Error(\r\n `Invalid dependency \\\"${String(dependency)}\\\" referenced by requirement \\\"${String(requirement)}\\\".`,\r\n );\r\n }\r\n if (!resolverBackedRequirements.has(dependency)) {\r\n throw new Error(\r\n `Dependency \\\"${String(dependency)}\\\" referenced by requirement \\\"${String(requirement)}\\\" has no resolver.`,\r\n );\r\n }\r\n }\r\n\r\n graph.push({\r\n requirement,\r\n step: resolver.step,\r\n isMet: resolver.isMet,\r\n when: options?.conditions?.[requirement],\r\n priority: options?.priorities?.[requirement] ?? 0,\r\n dependsOn,\r\n });\r\n }\r\n\r\n const byRequirement = new Map(\r\n graph.map((node) => [node.requirement, node] as const),\r\n );\r\n\r\n const visited = new Set<TRequirement>();\r\n const visiting = new Set<TRequirement>();\r\n\r\n const dfs = (requirement: TRequirement, stack: TRequirement[]) => {\r\n if (visited.has(requirement)) {\r\n return;\r\n }\r\n\r\n if (visiting.has(requirement)) {\r\n const cycleStart = stack.indexOf(requirement);\r\n const cyclePath = [...stack.slice(cycleStart), requirement]\r\n .map((value) => String(value))\r\n .join(\" -> \");\r\n throw new Error(`Circular dependency detected in requirement graph: ${cyclePath}`);\r\n }\r\n\r\n visiting.add(requirement);\r\n const node = byRequirement.get(requirement);\r\n if (node?.dependsOn?.length) {\r\n for (const dep of node.dependsOn) {\r\n if (byRequirement.has(dep)) {\r\n dfs(dep, [...stack, requirement]);\r\n }\r\n }\r\n }\r\n\r\n visiting.delete(requirement);\r\n visited.add(requirement);\r\n };\r\n\r\n for (const node of graph) {\r\n dfs(node.requirement, []);\r\n }\r\n\r\n return graph;\r\n}\r\n\r\n/**\r\n * Build a requirement graph using the built-in default resolvers plus any app-specific overrides.\r\n */\r\nexport function createDefaultRequirementGraph<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n TRequirement extends string = DefaultAppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>(\r\n options?: {\r\n requirements?: readonly TRequirement[];\r\n resolvers?: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>;\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n },\r\n): RequirementGraph<TContext, TRequirement, TStep> {\r\n const requirements =\r\n (options?.requirements ?? (defaultRequirements as unknown as readonly TRequirement[]));\r\n\r\n const resolvers = {\r\n ...(defaultRequirementResolvers as unknown as Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>),\r\n ...(options?.resolvers ?? {}),\r\n };\r\n\r\n return createRequirementGraph(requirements, resolvers, {\r\n priorities: options?.priorities,\r\n conditions: options?.conditions,\r\n dependencies: options?.dependencies,\r\n });\r\n}\r\n\r\nfunction sortGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(graph: RequirementGraph<TContext, TRequirement, TStep>) {\r\n const entries = graph.map((node, index) => ({ node, index }));\r\n const byRequirement = new Map(entries.map((entry) => [entry.node.requirement, entry] as const));\r\n\r\n const indegree = new Map<TRequirement, number>();\r\n const adjacency = new Map<TRequirement, TRequirement[]>();\r\n\r\n for (const entry of entries) {\r\n indegree.set(entry.node.requirement, 0);\r\n adjacency.set(entry.node.requirement, []);\r\n }\r\n\r\n for (const entry of entries) {\r\n const current = entry.node.requirement;\r\n for (const dependency of entry.node.dependsOn ?? []) {\r\n const depEntry = byRequirement.get(dependency);\r\n if (!depEntry) {\r\n continue;\r\n }\r\n\r\n const outgoing = adjacency.get(depEntry.node.requirement);\r\n if (outgoing) {\r\n outgoing.push(current);\r\n }\r\n indegree.set(current, (indegree.get(current) ?? 0) + 1);\r\n }\r\n }\r\n\r\n const compare = (\r\n left: { node: RequirementGraphNode<TContext, TRequirement, TStep>; index: number },\r\n right: { node: RequirementGraphNode<TContext, TRequirement, TStep>; index: number },\r\n ) => {\r\n const byPriority = (right.node.priority ?? 0) - (left.node.priority ?? 0);\r\n if (byPriority !== 0) {\r\n return byPriority;\r\n }\r\n // Keep declaration order for equal-priority nodes to avoid surprising step jumps.\r\n return left.index - right.index;\r\n };\r\n\r\n const ready = entries\r\n .filter((entry) => (indegree.get(entry.node.requirement) ?? 0) === 0)\r\n .sort(compare);\r\n\r\n const ordered: RequirementGraphNode<TContext, TRequirement, TStep>[] = [];\r\n\r\n while (ready.length > 0) {\r\n const current = ready.shift();\r\n if (!current) {\r\n break;\r\n }\r\n\r\n ordered.push(current.node);\r\n\r\n for (const dependent of adjacency.get(current.node.requirement) ?? []) {\r\n const next = (indegree.get(dependent) ?? 0) - 1;\r\n indegree.set(dependent, next);\r\n if (next === 0) {\r\n const dependentEntry = byRequirement.get(dependent);\r\n if (dependentEntry) {\r\n ready.push(dependentEntry);\r\n ready.sort(compare);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (ordered.length !== graph.length) {\r\n throw new Error(\"Unable to topologically sort requirement graph. Check for dependency cycles.\");\r\n }\r\n\r\n return ordered;\r\n}\r\n\r\n/**\r\n * Evaluate the graph against the current context and return the next unmet step.\r\n *\r\n * Nodes are evaluated in dependency-aware order with deterministic tie-breaking.\r\n */\r\nexport async function evaluateNextStep<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n context: TContext,\r\n graph: RequirementGraph<TContext, TRequirement, TStep>,\r\n completeStep: TStep,\r\n): Promise<TStep> {\r\n for (const node of sortGraph(graph)) {\r\n if (node.when && !(await node.when(context))) {\r\n continue;\r\n }\r\n\r\n if (node.dependsOn && node.dependsOn.length > 0) {\r\n const prerequisiteNodes = graph.filter((candidate) =>\r\n node.dependsOn?.includes(candidate.requirement),\r\n );\r\n\r\n if (prerequisiteNodes.length > 0) {\r\n const prerequisitesMet = await Promise.all(\r\n prerequisiteNodes.map(async (candidate) => candidate.isMet(context)),\r\n );\r\n if (prerequisitesMet.includes(false)) {\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n if (!(await node.isMet(context))) {\r\n return node.step;\r\n }\r\n }\r\n\r\n return completeStep;\r\n}\r\n\r\n/**\r\n * Return every unmet requirement for the current context in graph evaluation order.\r\n */\r\nexport async function getMissingRequirements<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n context: TContext,\r\n graph: RequirementGraph<TContext, TRequirement, TStep>,\r\n): Promise<TRequirement[]> {\r\n const missing: TRequirement[] = [];\r\n\r\n for (const node of sortGraph(graph)) {\r\n if (node.when && !(await node.when(context))) {\r\n continue;\r\n }\r\n\r\n if (!(await node.isMet(context))) {\r\n missing.push(node.requirement);\r\n }\r\n }\r\n\r\n return missing;\r\n}\r\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -1385,10 +1385,11 @@ var defaultStyles = {
1385
1385
  gap: 12,
1386
1386
  width: "100%",
1387
1387
  maxWidth: 560,
1388
- border: "1px solid #e5e7eb",
1388
+ border: "1px solid #cbd5e1",
1389
1389
  borderRadius: 14,
1390
1390
  padding: 16,
1391
- background: "#ffffff",
1391
+ background: "#f8fafc",
1392
+ color: "#0f172a",
1392
1393
  fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, sans-serif"
1393
1394
  },
1394
1395
  headerRow: {
@@ -1401,7 +1402,7 @@ var defaultStyles = {
1401
1402
  fontSize: 12,
1402
1403
  textTransform: "uppercase",
1403
1404
  letterSpacing: 1.2,
1404
- color: "#6b7280",
1405
+ color: "#475569",
1405
1406
  marginBottom: 4
1406
1407
  },
1407
1408
  title: {
@@ -1410,12 +1411,13 @@ var defaultStyles = {
1410
1411
  lineHeight: "28px"
1411
1412
  },
1412
1413
  badge: {
1413
- border: "1px solid #d1d5db",
1414
+ border: "1px solid #cbd5e1",
1414
1415
  borderRadius: 999,
1415
1416
  padding: "4px 10px",
1416
1417
  fontSize: 12,
1417
1418
  fontWeight: 600,
1418
- color: "#374151"
1419
+ color: "#1e293b",
1420
+ background: "#ffffff"
1419
1421
  },
1420
1422
  success: {
1421
1423
  border: "1px solid #bbf7d0",
@@ -1443,7 +1445,7 @@ var defaultStyles = {
1443
1445
  },
1444
1446
  caption: {
1445
1447
  margin: 0,
1446
- color: "#4b5563",
1448
+ color: "#334155",
1447
1449
  fontSize: 14
1448
1450
  },
1449
1451
  formRow: {
@@ -1458,19 +1460,22 @@ var defaultStyles = {
1458
1460
  },
1459
1461
  input: {
1460
1462
  width: "100%",
1461
- border: "1px solid #d1d5db",
1463
+ border: "1px solid #94a3b8",
1462
1464
  borderRadius: 8,
1463
1465
  height: 40,
1464
1466
  padding: "0 12px",
1465
- fontSize: 14
1467
+ fontSize: 14,
1468
+ background: "#ffffff",
1469
+ color: "#0f172a"
1466
1470
  },
1467
1471
  button: {
1468
- border: "1px solid #d1d5db",
1472
+ border: "1px solid #94a3b8",
1469
1473
  borderRadius: 8,
1470
1474
  height: 40,
1471
1475
  padding: "0 14px",
1472
1476
  fontWeight: 600,
1473
1477
  background: "#ffffff",
1478
+ color: "#0f172a",
1474
1479
  whiteSpace: "nowrap",
1475
1480
  cursor: "pointer"
1476
1481
  },
@@ -1495,10 +1500,11 @@ var defaultStyles = {
1495
1500
  },
1496
1501
  oauthButton: {
1497
1502
  flex: 1,
1498
- border: "1px solid #d1d5db",
1503
+ border: "1px solid #94a3b8",
1499
1504
  borderRadius: 8,
1500
1505
  padding: "10px 12px",
1501
- background: "#f9fafb",
1506
+ background: "#ffffff",
1507
+ color: "#0f172a",
1502
1508
  cursor: "pointer"
1503
1509
  }
1504
1510
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/AdaptiveFlow.tsx","../src/engine.ts"],"sourcesContent":["\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport {\r\n createDefaultRequirementGraph,\r\n defaultRequirementResolvers,\r\n defaultRequirements,\r\n evaluateNextStep,\r\n getMissingRequirements,\r\n initialContext,\r\n type AdaptiveContext,\r\n type AdaptiveContextBase,\r\n type AdaptiveStep,\r\n type AppRequirement,\r\n type MaybePromise,\r\n type RequirementGraph,\r\n type RequirementResolver,\r\n} from \"./engine\";\r\n\r\n/** Supported OAuth provider identifiers accepted by the adapter and default UI. */\r\nexport type OAuthProvider = \"google\" | \"apple\" | (string & {});\r\n\r\n/** Configurable OAuth provider label/id pair used by the default footer buttons. */\r\nexport type AdaptiveFlowOAuthProvider = {\r\n id: OAuthProvider | (string & {});\r\n label: string;\r\n};\r\n\r\n/** Result returned by lookupByEmail to seed the flow with backend identity state. */\r\nexport type IdentityResolution = {\r\n accountExists: boolean;\r\n hasPassword?: boolean;\r\n isVerified?: boolean;\r\n agreedToTos?: boolean;\r\n profile?: Partial<AdaptiveContextBase[\"profile\"]>;\r\n};\r\n\r\n/** Backend adapter contract used by the flow to delegate all side effects. */\r\nexport type AdaptiveFlowAdapter<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n lookupByEmail?: (email: string) => Promise<IdentityResolution | null>;\r\n requestOtp?: (email: string) => Promise<void>;\r\n verifyOtp?: (email: string, code: string) => Promise<void>;\r\n signInWithPassword?: (email: string, password: string) => Promise<void>;\r\n createPassword?: (password: string) => Promise<void>;\r\n saveProfile?: (context: TContext) => Promise<void>;\r\n acceptTos?: (context: TContext) => Promise<void>;\r\n startOAuth?: (provider: OAuthProvider, context: TContext) => Promise<void>;\r\n completeOAuth?: (\r\n provider: OAuthProvider | null,\r\n context: TContext,\r\n ) => Promise<Partial<TContext> | void>;\r\n};\r\n\r\n/** Named style slots used by the built-in component shell and step renderers. */\r\nexport type AdaptiveFlowStyleSlot =\r\n | \"shell\"\r\n | \"headerRow\"\r\n | \"eyebrow\"\r\n | \"title\"\r\n | \"badge\"\r\n | \"success\"\r\n | \"error\"\r\n | \"info\"\r\n | \"caption\"\r\n | \"formRow\"\r\n | \"formColumn\"\r\n | \"input\"\r\n | \"button\"\r\n | \"checkboxRow\"\r\n | \"complete\"\r\n | \"footer\"\r\n | \"oauthButton\";\r\n\r\n/** Inline style overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowStyles = Partial<Record<AdaptiveFlowStyleSlot, React.CSSProperties>>;\r\n/** CSS class overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowClassNames = Partial<Record<AdaptiveFlowStyleSlot, string>>;\r\n\r\n/** Minimal storage interface used by persistence drivers. */\r\nexport type AdaptiveFlowStorageDriver = Pick<Storage, \"getItem\" | \"setItem\" | \"removeItem\">;\r\n\r\n/** Persistence settings for storing and restoring flow state across reloads. */\r\nexport type AdaptiveFlowPersistence<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n key: string;\r\n storage?: \"session\" | \"local\" | AdaptiveFlowStorageDriver;\r\n serialize?: (state: PersistedAdaptiveFlowState<TContext>) => string;\r\n deserialize?: (value: string) => PersistedAdaptiveFlowState<TContext>;\r\n clearOnComplete?: boolean;\r\n onError?: (error: Error, phase: \"read\" | \"write\" | \"clear\") => void;\r\n};\r\n\r\n/** Persisted flow payload written to session/local/custom storage. */\r\nexport type PersistedAdaptiveFlowState<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n context: TContext;\r\n oauthPendingProvider: OAuthProvider | null;\r\n};\r\n\r\n/** Context wrapper passed into validators so they can inspect the current flow state. */\r\nexport type AdaptiveFlowValidationContext<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n> = {\r\n context: TContext;\r\n};\r\n\r\n/** Validator failure payload that can target a specific field or the whole form. */\r\nexport type AdaptiveFlowValidationIssue = {\r\n message: string;\r\n field?: string;\r\n};\r\n\r\n/** Validator return type supported by the component and hook. */\r\nexport type AdaptiveFlowValidationResult =\r\n | string\r\n | AdaptiveFlowValidationIssue\r\n | void\r\n | Promise<string | AdaptiveFlowValidationIssue | void>;\r\n\r\n/** Schema adapter contract used for optional Zod-friendly validation. */\r\nexport type AdaptiveFlowSchema<TValue> = {\r\n safeParse?: (value: TValue) => {\r\n success: boolean;\r\n error?: {\r\n message?: string;\r\n issues?: Array<{\r\n message?: string;\r\n path?: Array<string | number>;\r\n }>;\r\n };\r\n };\r\n parse?: (value: TValue) => unknown;\r\n};\r\n\r\n/** Optional schema map for built-in step fields. */\r\nexport type AdaptiveFlowSchemas = {\r\n email?: AdaptiveFlowSchema<string>;\r\n otp?: AdaptiveFlowSchema<string>;\r\n password?: AdaptiveFlowSchema<string>;\r\n profile?: AdaptiveFlowSchema<AdaptiveContextBase[\"profile\"]>;\r\n tos?: AdaptiveFlowSchema<boolean>;\r\n};\r\n\r\n/** Backoff settings used to retry transient adapter calls and OAuth completion. */\r\nexport type AdaptiveFlowRetryPolicy = {\r\n maxAttempts?: number;\r\n initialDelayMs?: number;\r\n factor?: number;\r\n maxDelayMs?: number;\r\n jitter?: boolean;\r\n shouldRetry?: (error: Error, attempt: number) => boolean;\r\n delay?: (attempt: number) => number;\r\n};\r\n\r\n/** Field error bag keyed by field path or logical field name. */\r\nexport type AdaptiveFlowFieldErrors = Partial<Record<string, string>>;\r\n\r\n/** Validator map for the built-in flow fields. */\r\nexport type AdaptiveFlowValidators<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n email?: (input: string, payload: AdaptiveFlowValidationContext<TContext>) => AdaptiveFlowValidationResult;\r\n otp?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { email: string },\r\n ) => AdaptiveFlowValidationResult;\r\n password?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { hasPassword: boolean },\r\n ) => AdaptiveFlowValidationResult;\r\n profile?: (\r\n input: AdaptiveContextBase[\"profile\"],\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n tos?: (\r\n accepted: boolean,\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n};\r\n\r\n/** Transition record emitted whenever the evaluated step changes. */\r\nexport type AdaptiveStepTransition<TStep extends string = AdaptiveStep> = {\r\n from: TStep | null;\r\n to: TStep;\r\n at: number;\r\n attempt: number;\r\n};\r\n\r\n/** Arguments supplied to a stepRegistry renderer for a specific step. */\r\nexport type AdaptiveStepRendererArgs<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Registry that overrides the UI for selected steps. */\r\nexport type AdaptiveStepRegistry<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = Partial<\r\n Record<TStep, (args: AdaptiveStepRendererArgs<TContext, TRequirement, TStep>) => React.ReactNode>\r\n>;\r\n\r\n/** Arguments supplied to renderStep for full step-body customization. */\r\nexport type AdaptiveStepRenderArgs<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n defaultView: React.ReactNode;\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Props accepted by the AdaptiveFlow component. */\r\nexport type AdaptiveFlowProps<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n requirements?: readonly TRequirement[];\r\n requirementGraph?: RequirementGraph<TContext, TRequirement, TStep>;\r\n requirementGraphConfig?: {\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n };\r\n requirementResolvers?: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>;\r\n completeStep?: TStep;\r\n stepTitles?: Partial<Record<TStep, string>>;\r\n renderStep?: (args: AdaptiveStepRenderArgs<TContext, TRequirement, TStep>) => React.ReactNode;\r\n stepRegistry?: AdaptiveStepRegistry<TContext, TRequirement, TStep>;\r\n initialValue?: Partial<TContext>;\r\n onComplete?: (context: TContext) => void;\r\n onError?: (error: Error) => void;\r\n onStepTransition?: (transition: AdaptiveStepTransition<TStep>, context: TContext) => void;\r\n className?: string;\r\n classNames?: AdaptiveFlowClassNames;\r\n styles?: AdaptiveFlowStyles;\r\n unstyled?: boolean;\r\n persistence?: AdaptiveFlowPersistence<TContext>;\r\n validators?: AdaptiveFlowValidators<TContext>;\r\n schemas?: AdaptiveFlowSchemas;\r\n oauthProviders?: readonly AdaptiveFlowOAuthProvider[];\r\n retryPolicy?: AdaptiveFlowRetryPolicy;\r\n};\r\n\r\n/** Options accepted by the headless useAdaptiveFlow hook. */\r\nexport type UseAdaptiveFlowOptions<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = Omit<\r\n AdaptiveFlowProps<TContext, TRequirement, TStep>,\r\n \"stepTitles\" | \"renderStep\" | \"stepRegistry\" | \"className\" | \"classNames\" | \"styles\" | \"unstyled\"\r\n>;\r\n\r\n/** Result object returned by useAdaptiveFlow. */\r\nexport type UseAdaptiveFlowResult<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n context: TContext;\r\n step: TStep;\r\n hasEvaluated: boolean;\r\n completeStep: TStep;\r\n requirements: readonly TRequirement[];\r\n missingRequirements: TRequirement[];\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n handleEmail: (emailInput: string) => void;\r\n handleOtp: (code: string) => void;\r\n handlePassword: (password: string) => void;\r\n handleProfile: (profile: AdaptiveContextBase[\"profile\"]) => void;\r\n handleTos: () => void;\r\n handleOAuth: (provider: OAuthProvider) => void;\r\n};\r\n\r\ntype PlainObject = Record<string, unknown>;\r\n\r\n/** Default provider buttons rendered by the component footer when no provider list is supplied. */\r\nconst defaultOAuthProviders: readonly AdaptiveFlowOAuthProvider[] = [\r\n { id: \"google\", label: \"Continue with Google\" },\r\n { id: \"apple\", label: \"Continue with Apple\" },\r\n];\r\n\r\n/** Human-friendly labels used when a step title override is not supplied. */\r\nconst defaultStepTitle: Record<string, string> = {\r\n COLLECT_EMAIL: \"Enter your email\",\r\n VERIFY_OTP: \"Verify your email\",\r\n COLLECT_PASSWORD: \"Set up your password\",\r\n COLLECT_PROFILE: \"Complete your profile\",\r\n COLLECT_TOS: \"Accept terms\",\r\n COMPLETE: \"Done\",\r\n};\r\n\r\n/** Built-in step keys that have a default renderer in the component shell. */\r\nconst builtInDefaultSteps = new Set<string>([\r\n \"COLLECT_EMAIL\",\r\n \"VERIFY_OTP\",\r\n \"COLLECT_PASSWORD\",\r\n \"COLLECT_PROFILE\",\r\n \"COLLECT_TOS\",\r\n \"COMPLETE\",\r\n]);\r\n\r\nconst styleSlots: AdaptiveFlowStyleSlot[] = [\r\n \"shell\",\r\n \"headerRow\",\r\n \"eyebrow\",\r\n \"title\",\r\n \"badge\",\r\n \"success\",\r\n \"error\",\r\n \"info\",\r\n \"caption\",\r\n \"formRow\",\r\n \"formColumn\",\r\n \"input\",\r\n \"button\",\r\n \"checkboxRow\",\r\n \"complete\",\r\n \"footer\",\r\n \"oauthButton\",\r\n];\r\n\r\n/**\r\n * Deeply merge a patch into the current context.\r\n *\r\n * Plain nested objects are merged recursively, while arrays and non-plain values are replaced.\r\n */\r\nfunction mergeContext<TContext extends AdaptiveContextBase>(\r\n current: TContext,\r\n patch: Partial<TContext>,\r\n): TContext {\r\n const mergeValue = (baseValue: unknown, patchValue: unknown): unknown => {\r\n if (Array.isArray(baseValue) || Array.isArray(patchValue)) {\r\n return patchValue;\r\n }\r\n\r\n const baseIsObject = Boolean(baseValue) && typeof baseValue === \"object\";\r\n const patchIsObject = Boolean(patchValue) && typeof patchValue === \"object\";\r\n\r\n if (!baseIsObject || !patchIsObject) {\r\n return patchValue === undefined ? baseValue : patchValue;\r\n }\r\n\r\n const baseObject = baseValue as PlainObject;\r\n const patchObject = patchValue as PlainObject;\r\n const result: PlainObject = { ...baseObject };\r\n\r\n for (const key of Object.keys(patchObject)) {\r\n result[key] = mergeValue(baseObject[key], patchObject[key]);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n return mergeValue(current, patch) as TContext;\r\n}\r\n\r\n/** Merge the supplied initial value into the library's default context shape. */\r\nfunction withDefaults<TContext extends AdaptiveContextBase>(initialValue?: Partial<TContext>): TContext {\r\n if (!initialValue) {\r\n return initialContext as TContext;\r\n }\r\n\r\n return mergeContext(initialContext as TContext, initialValue);\r\n}\r\n\r\n/** Normalize any thrown value into an Error instance while preserving message and code when available. */\r\nfunction toError(error: unknown): Error {\r\n if (error instanceof Error) {\r\n return error;\r\n }\r\n\r\n if (typeof error === \"string\") {\r\n return new Error(error);\r\n }\r\n\r\n if (error && typeof error === \"object\") {\r\n const maybeError = error as { message?: unknown; code?: unknown };\r\n const message = typeof maybeError.message === \"string\" && maybeError.message.trim().length > 0\r\n ? maybeError.message\r\n : \"Unknown error while processing adaptive flow\";\r\n const normalized = new Error(message);\r\n if (typeof maybeError.code === \"string\" && maybeError.code.trim().length > 0) {\r\n normalized.name = maybeError.code;\r\n }\r\n (normalized as Error & { cause?: unknown }).cause = error;\r\n return normalized;\r\n }\r\n\r\n return new Error(`Unknown error while processing adaptive flow: ${String(error)}`);\r\n}\r\n\r\n/** Pause execution for the requested number of milliseconds. */\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n\r\n/** Clamp and normalize a retry delay into a safe non-negative millisecond value. */\r\nfunction normalizeDelay(delay: number | undefined, fallback: number): number {\r\n if (typeof delay !== \"number\" || Number.isNaN(delay) || delay < 0) {\r\n return fallback;\r\n }\r\n return delay;\r\n}\r\n\r\n/** Compute the delay for the current retry attempt using exponential backoff and optional jitter. */\r\n/** Compute the delay for a retry attempt using exponential backoff and optional jitter. */\r\nfunction computeRetryDelay(policy: AdaptiveFlowRetryPolicy | undefined, attempt: number): number {\r\n if (policy?.delay) {\r\n return normalizeDelay(policy.delay(attempt), 0);\r\n }\r\n\r\n const initialDelayMs = normalizeDelay(policy?.initialDelayMs, 250);\r\n const factor = typeof policy?.factor === \"number\" && policy.factor > 0 ? policy.factor : 2;\r\n const maxDelayMs = normalizeDelay(policy?.maxDelayMs, Number.POSITIVE_INFINITY);\r\n let delay = initialDelayMs * Math.pow(factor, Math.max(0, attempt - 1));\r\n\r\n if (policy?.jitter) {\r\n delay = delay * (0.5 + Math.random() * 0.5);\r\n }\r\n\r\n return Math.min(delay, maxDelayMs);\r\n}\r\n\r\n/** Execute an async operation with configurable retry/backoff behavior. */\r\nasync function withRetry<T>(\r\n operation: () => Promise<T>,\r\n retryPolicy: AdaptiveFlowRetryPolicy | undefined,\r\n): Promise<T> {\r\n if (!retryPolicy) {\r\n return operation();\r\n }\r\n\r\n const maxAttempts = Math.max(1, Math.trunc(retryPolicy.maxAttempts ?? 3));\r\n let lastError: unknown;\r\n\r\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\r\n try {\r\n return await operation();\r\n } catch (error) {\r\n lastError = error;\r\n const normalized = toError(error);\r\n const shouldRetry = retryPolicy.shouldRetry?.(normalized, attempt) ?? attempt < maxAttempts;\r\n if (!shouldRetry || attempt === maxAttempts) {\r\n throw normalized;\r\n }\r\n\r\n await sleep(computeRetryDelay(retryPolicy, attempt));\r\n }\r\n }\r\n\r\n throw toError(lastError);\r\n}\r\n\r\n/** Join class names while dropping falsy entries. */\r\nfunction cx(...names: Array<string | undefined | false | null>): string | undefined {\r\n const value = names.filter(Boolean).join(\" \").trim();\r\n return value.length > 0 ? value : undefined;\r\n}\r\n\r\n/** Resolve the configured storage driver or return null when running outside the browser. */\r\nfunction pickStorage(storage?: \"session\" | \"local\" | AdaptiveFlowStorageDriver): AdaptiveFlowStorageDriver | null {\r\n if (typeof window === \"undefined\") {\r\n return null;\r\n }\r\n\r\n if (!storage || storage === \"session\") {\r\n return window.sessionStorage;\r\n }\r\n\r\n if (storage === \"local\") {\r\n return window.localStorage;\r\n }\r\n\r\n return storage;\r\n}\r\n\r\n/** Read and deserialize persisted flow state from storage. */\r\nfunction readPersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n): PersistedAdaptiveFlowState<TContext> | null {\r\n if (!persistence) {\r\n return null;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return null;\r\n }\r\n\r\n const raw = storage.getItem(persistence.key);\r\n if (!raw) {\r\n return null;\r\n }\r\n\r\n const deserialize = persistence.deserialize ?? ((value: string) => JSON.parse(value));\r\n return deserialize(raw);\r\n}\r\n\r\n/** Serialize and persist the current flow state to storage. */\r\nfunction writePersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n state: PersistedAdaptiveFlowState<TContext>,\r\n): void {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return;\r\n }\r\n\r\n const serialize = persistence.serialize ?? ((value: PersistedAdaptiveFlowState<TContext>) => JSON.stringify(value));\r\n storage.setItem(persistence.key, serialize(state));\r\n}\r\n\r\n/** Remove persisted flow state from storage. */\r\nfunction clearPersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n): void {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return;\r\n }\r\n\r\n storage.removeItem(persistence.key);\r\n}\r\n\r\n/** Internal error type used to carry field-level validation failures. */\r\nclass FlowValidationError extends Error {\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n\r\n constructor(message: string, fieldErrors: AdaptiveFlowFieldErrors) {\r\n super(message);\r\n this.name = \"FlowValidationError\";\r\n this.fieldErrors = fieldErrors;\r\n }\r\n}\r\n\r\n/** Convert a validation issue into the internal validation error shape. */\r\nfunction toValidationError(\r\n issue: AdaptiveFlowValidationIssue,\r\n fallbackField?: string,\r\n): FlowValidationError {\r\n const field = issue.field ?? fallbackField;\r\n if (field) {\r\n return new FlowValidationError(issue.message, { [field]: issue.message });\r\n }\r\n return new FlowValidationError(issue.message, {});\r\n}\r\n\r\n/** Map schema validation issues into field error messages keyed by path. */\r\nfunction normalizeSchemaIssues(\r\n error: { message?: string; issues?: Array<{ message?: string; path?: Array<string | number> }> } | undefined,\r\n fallbackField?: string,\r\n): AdaptiveFlowFieldErrors {\r\n const fieldErrors: AdaptiveFlowFieldErrors = {};\r\n const issues = error?.issues ?? [];\r\n\r\n for (const issue of issues) {\r\n const path = issue.path?.length ? issue.path.map(String).join(\".\") : fallbackField;\r\n const message = issue.message?.trim() || error?.message || \"Validation failed.\";\r\n if (path && !fieldErrors[path]) {\r\n fieldErrors[path] = message;\r\n }\r\n }\r\n\r\n if (Object.keys(fieldErrors).length === 0 && fallbackField) {\r\n fieldErrors[fallbackField] = error?.message || \"Validation failed.\";\r\n }\r\n\r\n return fieldErrors;\r\n}\r\n\r\n/** Execute a validator result and raise a field-aware validation error when needed. */\r\nasync function assertValid(result: AdaptiveFlowValidationResult, fallbackField?: string): Promise<void> {\r\n const outcome = await result;\r\n if (!outcome) {\r\n return;\r\n }\r\n\r\n if (typeof outcome === \"string\") {\r\n const message = outcome.trim();\r\n if (message.length > 0) {\r\n throw new FlowValidationError(message, fallbackField ? { [fallbackField]: message } : {});\r\n }\r\n return;\r\n }\r\n\r\n if (outcome.message.trim().length > 0) {\r\n throw toValidationError(outcome, fallbackField);\r\n }\r\n}\r\n\r\n/** Execute an optional schema validator before running the custom validator chain. */\r\nasync function assertSchema<TValue>(\r\n schema: AdaptiveFlowSchema<TValue> | undefined,\r\n value: TValue,\r\n fallbackField?: string,\r\n): Promise<void> {\r\n if (!schema) {\r\n return;\r\n }\r\n\r\n if (schema.safeParse) {\r\n const result = schema.safeParse(value);\r\n if (!result.success) {\r\n const fieldErrors = normalizeSchemaIssues(result.error, fallbackField);\r\n throw new FlowValidationError(result.error?.message || \"Validation failed.\", fieldErrors);\r\n }\r\n return;\r\n }\r\n\r\n if (!schema.parse) {\r\n return;\r\n }\r\n\r\n try {\r\n schema.parse(value);\r\n } catch (error) {\r\n const normalized = error as {\r\n message?: string;\r\n issues?: Array<{ message?: string; path?: Array<string | number> }>;\r\n };\r\n const fieldErrors = normalizeSchemaIssues(\r\n {\r\n message: normalized?.message,\r\n issues: normalized?.issues,\r\n },\r\n fallbackField,\r\n );\r\n throw new FlowValidationError(normalized?.message || \"Validation failed.\", fieldErrors);\r\n }\r\n}\r\n\r\n/** Merge built-in style defaults with user overrides or return raw overrides in unstyled mode. */\r\nfunction resolveStyles(\r\n unstyled: boolean,\r\n styleOverrides?: AdaptiveFlowStyles,\r\n): Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined> {\r\n const resolved = {} as Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n\r\n for (const slot of styleSlots) {\r\n if (unstyled) {\r\n resolved[slot] = styleOverrides?.[slot];\r\n continue;\r\n }\r\n\r\n resolved[slot] = {\r\n ...defaultStyles[slot],\r\n ...(styleOverrides?.[slot] ?? {}),\r\n };\r\n }\r\n\r\n return resolved;\r\n}\r\n\r\n/** Headless flow hook that owns state, evaluation, persistence, retries, and adapter wiring. */\r\nexport function useAdaptiveFlow<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n}: UseAdaptiveFlowOptions<TContext, TRequirement, TStep>): UseAdaptiveFlowResult<\r\n TContext,\r\n TRequirement,\r\n TStep\r\n> {\r\n const normalizedRequirements = React.useMemo(\r\n () => (requirements ?? (defaultRequirements as unknown as readonly TRequirement[])),\r\n [requirements],\r\n );\r\n const normalizedCompleteStep = React.useMemo(\r\n () => (completeStep ?? (\"COMPLETE\" as TStep)),\r\n [completeStep],\r\n );\r\n const resolvers = React.useMemo(\r\n () =>\r\n ({\r\n ...(defaultRequirementResolvers as unknown as Partial<\r\n Record<TRequirement, RequirementResolver<TContext, TStep>>\r\n >),\r\n ...(requirementResolvers ?? {}),\r\n }) as Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>,\r\n [requirementResolvers],\r\n );\r\n const graph = React.useMemo(\r\n () =>\r\n requirementGraph ??\r\n createDefaultRequirementGraph({\r\n requirements: normalizedRequirements,\r\n resolvers,\r\n priorities: requirementGraphConfig?.priorities,\r\n conditions: requirementGraphConfig?.conditions,\r\n dependencies: requirementGraphConfig?.dependencies,\r\n }),\r\n [\r\n requirementGraph,\r\n normalizedRequirements,\r\n resolvers,\r\n requirementGraphConfig?.priorities,\r\n requirementGraphConfig?.conditions,\r\n requirementGraphConfig?.dependencies,\r\n ],\r\n );\r\n\r\n type RuntimeState = {\r\n step: TStep;\r\n hasEvaluated: boolean;\r\n missingRequirements: TRequirement[];\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n oauthPendingProvider: OAuthProvider | null;\r\n persistenceHydrated: boolean;\r\n };\r\n\r\n type RuntimeAction =\r\n | {\r\n type: \"evaluated\";\r\n missingRequirements: TRequirement[];\r\n step: TStep;\r\n transition: AdaptiveStepTransition<TStep>;\r\n }\r\n | { type: \"set_busy\"; busy: boolean }\r\n | { type: \"set_message\"; message: string | null }\r\n | { type: \"set_error\"; errorMessage: string | null }\r\n | { type: \"set_field_errors\"; fieldErrors: AdaptiveFlowFieldErrors }\r\n | { type: \"start_job\" }\r\n | { type: \"set_oauth_pending\"; provider: OAuthProvider | null }\r\n | { type: \"set_hydrated\"; hydrated: boolean };\r\n\r\n const runtimeReducer = (state: RuntimeState, action: RuntimeAction): RuntimeState => {\r\n switch (action.type) {\r\n case \"evaluated\":\r\n return {\r\n ...state,\r\n step: action.step,\r\n hasEvaluated: true,\r\n missingRequirements: action.missingRequirements,\r\n transitions: [...state.transitions, action.transition].slice(-100),\r\n };\r\n case \"set_busy\":\r\n return { ...state, busy: action.busy };\r\n case \"set_message\":\r\n return { ...state, message: action.message };\r\n case \"set_error\":\r\n return { ...state, errorMessage: action.errorMessage };\r\n case \"set_field_errors\":\r\n return { ...state, fieldErrors: action.fieldErrors };\r\n case \"start_job\":\r\n return { ...state, busy: true, errorMessage: null, fieldErrors: {} };\r\n case \"set_oauth_pending\":\r\n return { ...state, oauthPendingProvider: action.provider };\r\n case \"set_hydrated\":\r\n return { ...state, persistenceHydrated: action.hydrated };\r\n default:\r\n return state;\r\n }\r\n };\r\n\r\n const [context, setContext] = React.useState<TContext>(() => withDefaults(initialValue));\r\n const [runtime, dispatch] = React.useReducer(runtimeReducer, {\r\n step: normalizedCompleteStep,\r\n hasEvaluated: false,\r\n missingRequirements: [],\r\n transitions: [],\r\n busy: false,\r\n message: null,\r\n errorMessage: null,\r\n fieldErrors: {},\r\n oauthPendingProvider: null,\r\n persistenceHydrated: !persistence,\r\n } satisfies RuntimeState);\r\n\r\n const {\r\n step,\r\n hasEvaluated,\r\n missingRequirements,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n oauthPendingProvider,\r\n persistenceHydrated,\r\n } = runtime;\r\n const attemptByStepRef = React.useRef<Record<string, number>>({});\r\n const previousStepRef = React.useRef<TStep | null>(null);\r\n const evaluationRef = React.useRef(0);\r\n const completed = React.useRef(false);\r\n\r\n const reportPersistenceError = React.useCallback(\r\n (error: unknown, phase: \"read\" | \"write\" | \"clear\") => {\r\n const normalized = toError(error);\r\n persistence?.onError?.(normalized, phase);\r\n onError?.(normalized);\r\n },\r\n [onError, persistence],\r\n );\r\n\r\n React.useEffect(() => {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n try {\r\n const persisted = readPersistedState(persistence);\r\n if (persisted?.context) {\r\n setContext(mergeContext(withDefaults(initialValue), persisted.context));\r\n }\r\n if (persisted?.oauthPendingProvider) {\r\n dispatch({ type: \"set_oauth_pending\", provider: persisted.oauthPendingProvider });\r\n }\r\n } catch (error) {\r\n reportPersistenceError(error, \"read\");\r\n } finally {\r\n dispatch({ type: \"set_hydrated\", hydrated: true });\r\n }\r\n }, [initialValue, persistence, reportPersistenceError]);\r\n\r\n React.useEffect(() => {\r\n const currentEvaluation = ++evaluationRef.current;\r\n\r\n void (async () => {\r\n const [missing, next] = await Promise.all([\r\n getMissingRequirements(context, graph as RequirementGraph<TContext, TRequirement, TStep>),\r\n evaluateNextStep(context, graph as RequirementGraph<TContext, TRequirement, TStep>, normalizedCompleteStep),\r\n ]);\r\n\r\n if (currentEvaluation !== evaluationRef.current) {\r\n return;\r\n }\r\n\r\n const from = previousStepRef.current;\r\n const attemptKey = String(next);\r\n const nextAttempt = from === next ? (attemptByStepRef.current[attemptKey] ?? 0) + 1 : 1;\r\n attemptByStepRef.current[attemptKey] = nextAttempt;\r\n\r\n const transition: AdaptiveStepTransition<TStep> = {\r\n from,\r\n to: next,\r\n at: Date.now(),\r\n attempt: nextAttempt,\r\n };\r\n\r\n dispatch({\r\n type: \"evaluated\",\r\n missingRequirements: missing,\r\n step: next,\r\n transition,\r\n });\r\n previousStepRef.current = next;\r\n onStepTransition?.(transition, context);\r\n })().catch((error) => {\r\n if (currentEvaluation !== evaluationRef.current) {\r\n return;\r\n }\r\n\r\n const normalized = toError(error);\r\n dispatch({ type: \"set_field_errors\", fieldErrors: {} });\r\n dispatch({ type: \"set_error\", errorMessage: normalized.message });\r\n onError?.(normalized);\r\n });\r\n }, [context, graph, normalizedCompleteStep, onError, onStepTransition]);\r\n\r\n React.useEffect(() => {\r\n if (step === normalizedCompleteStep) {\r\n if (!completed.current) {\r\n completed.current = true;\r\n onComplete?.(context);\r\n\r\n const shouldClearPersistence = persistence?.clearOnComplete ?? true;\r\n if (shouldClearPersistence) {\r\n try {\r\n clearPersistedState(persistence);\r\n } catch (error) {\r\n reportPersistenceError(error, \"clear\");\r\n }\r\n }\r\n }\r\n } else {\r\n completed.current = false;\r\n }\r\n }, [context, normalizedCompleteStep, onComplete, persistence, reportPersistenceError, step]);\r\n\r\n React.useEffect(() => {\r\n if (!persistence || !persistenceHydrated) {\r\n return;\r\n }\r\n\r\n try {\r\n writePersistedState(persistence, { context, oauthPendingProvider });\r\n } catch (error) {\r\n reportPersistenceError(error, \"write\");\r\n }\r\n }, [context, oauthPendingProvider, persistence, persistenceHydrated, reportPersistenceError]);\r\n\r\n const run = React.useCallback(\r\n async (job: () => Promise<void>) => {\r\n dispatch({ type: \"start_job\" });\r\n try {\r\n await job();\r\n } catch (error) {\r\n if (error instanceof FlowValidationError) {\r\n dispatch({ type: \"set_field_errors\", fieldErrors: error.fieldErrors });\r\n if (Object.keys(error.fieldErrors).length === 0) {\r\n dispatch({ type: \"set_error\", errorMessage: error.message });\r\n onError?.(error);\r\n }\r\n } else {\r\n const normalized = toError(error);\r\n dispatch({ type: \"set_error\", errorMessage: normalized.message });\r\n onError?.(normalized);\r\n }\r\n } finally {\r\n dispatch({ type: \"set_busy\", busy: false });\r\n }\r\n },\r\n [onError],\r\n );\r\n\r\n const patchContext = React.useCallback((patch: Partial<TContext>) => {\r\n setContext((prev) => mergeContext(prev, patch));\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n const completeOAuth = adapter?.completeOAuth;\r\n if (!oauthPendingProvider || !completeOAuth) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n const patch = await withRetry(\r\n () => completeOAuth(oauthPendingProvider, context),\r\n retryPolicy,\r\n );\r\n if (patch) {\r\n patchContext(patch);\r\n }\r\n dispatch({ type: \"set_oauth_pending\", provider: null });\r\n dispatch({ type: \"set_message\", message: \"OAuth sign-in completed.\" });\r\n });\r\n }, [adapter, context, oauthPendingProvider, patchContext, retryPolicy, run]);\r\n\r\n const handleEmail = (emailInput: string) => {\r\n const email = emailInput.trim().toLowerCase();\r\n if (!email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.email, email, \"email\");\r\n if (validators?.email) {\r\n await assertValid(validators.email(email, { context }), \"email\");\r\n }\r\n\r\n const identity = adapter?.lookupByEmail\r\n ? await withRetry(() => adapter.lookupByEmail!(email), retryPolicy)\r\n : null;\r\n\r\n patchContext({\r\n email,\r\n hasPassword: Boolean(identity?.hasPassword),\r\n isVerified: Boolean(identity?.isVerified),\r\n agreedToTos: Boolean(identity?.agreedToTos),\r\n profile: {\r\n firstName: identity?.profile?.firstName ?? null,\r\n lastName: identity?.profile?.lastName ?? null,\r\n jobTitle: identity?.profile?.jobTitle ?? null,\r\n },\r\n } as Partial<TContext>);\r\n\r\n if (identity?.accountExists && identity.hasPassword) {\r\n dispatch({ type: \"set_message\", message: \"Welcome back. Enter your password to continue.\" });\r\n return;\r\n }\r\n\r\n if (adapter?.requestOtp) {\r\n await withRetry(() => adapter.requestOtp!(email), retryPolicy);\r\n dispatch({ type: \"set_message\", message: \"We sent a 6-digit code to your inbox.\" });\r\n } else {\r\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\r\n const isDev = env !== \"production\";\r\n if (!isDev) {\r\n throw new Error(\"OTP adapter is required in production. Provide adapter.requestOtp.\");\r\n }\r\n\r\n patchContext({ isVerified: true } as Partial<TContext>);\r\n dispatch({\r\n type: \"set_message\",\r\n message: \"No OTP adapter configured. Verification was skipped in development mode.\",\r\n });\r\n }\r\n });\r\n };\r\n\r\n const handleOtp = (code: string) => {\r\n if (!context.email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.otp, code, \"otp\");\r\n if (validators?.otp) {\r\n await assertValid(validators.otp(code, { context, email: context.email as string }), \"otp\");\r\n }\r\n\r\n if (adapter?.verifyOtp) {\r\n await withRetry(() => adapter.verifyOtp!(context.email as string, code), retryPolicy);\r\n }\r\n patchContext({ isVerified: true } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Email verified.\" });\r\n });\r\n };\r\n\r\n const handlePassword = (password: string) => {\r\n if (!context.email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.password, password, \"password\");\r\n if (validators?.password) {\r\n await assertValid(\r\n validators.password(password, { context, hasPassword: context.hasPassword }),\r\n \"password\",\r\n );\r\n }\r\n\r\n if (context.hasPassword) {\r\n if (adapter?.signInWithPassword) {\r\n await withRetry(\r\n () => adapter.signInWithPassword!(context.email as string, password),\r\n retryPolicy,\r\n );\r\n }\r\n } else {\r\n if (adapter?.createPassword) {\r\n await withRetry(() => adapter.createPassword!(password), retryPolicy);\r\n }\r\n patchContext({ hasPassword: true } as Partial<TContext>);\r\n }\r\n dispatch({ type: \"set_message\", message: \"Password step complete.\" });\r\n });\r\n };\r\n\r\n const handleProfile = (profile: AdaptiveContextBase[\"profile\"]) => {\r\n void run(async () => {\r\n await assertSchema(schemas?.profile, profile, \"profile\");\r\n if (validators?.profile) {\r\n await assertValid(validators.profile(profile, { context }), \"profile\");\r\n }\r\n\r\n const next = mergeContext(context, {\r\n profile: {\r\n firstName: profile.firstName || null,\r\n lastName: profile.lastName || null,\r\n jobTitle: profile.jobTitle || null,\r\n },\r\n } as Partial<TContext>);\r\n\r\n if (adapter?.saveProfile) {\r\n await withRetry(() => adapter.saveProfile!(next), retryPolicy);\r\n }\r\n\r\n patchContext({ profile: next.profile } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Profile saved.\" });\r\n });\r\n };\r\n\r\n const handleTos = () => {\r\n void run(async () => {\r\n await assertSchema(schemas?.tos, true, \"tos\");\r\n if (validators?.tos) {\r\n await assertValid(validators.tos(true, { context }), \"tos\");\r\n }\r\n\r\n const next = mergeContext(context, { agreedToTos: true } as Partial<TContext>);\r\n if (adapter?.acceptTos) {\r\n await withRetry(() => adapter.acceptTos!(next), retryPolicy);\r\n }\r\n patchContext({ agreedToTos: true } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Terms accepted.\" });\r\n });\r\n };\r\n\r\n const handleOAuth = (provider: OAuthProvider) => {\r\n const startOAuth = adapter?.startOAuth;\r\n if (!startOAuth) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n dispatch({ type: \"set_oauth_pending\", provider });\r\n dispatch({ type: \"set_message\", message: `Starting ${provider} sign-in...` });\r\n await withRetry(() => startOAuth(provider, context), retryPolicy);\r\n });\r\n };\r\n\r\n return {\r\n context,\r\n step,\r\n hasEvaluated,\r\n completeStep: normalizedCompleteStep,\r\n requirements: normalizedRequirements,\r\n missingRequirements,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n setContextPatch: patchContext,\r\n run,\r\n handleEmail,\r\n handleOtp,\r\n handlePassword,\r\n handleProfile,\r\n handleTos,\r\n handleOAuth,\r\n };\r\n}\r\n\r\n/** Default UI wrapper around useAdaptiveFlow that renders the built-in flow shell and step UI. */\r\nexport function AdaptiveFlow<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n stepTitles,\r\n renderStep,\r\n stepRegistry,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n className,\r\n classNames,\r\n styles,\r\n unstyled = false,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n}: AdaptiveFlowProps<TContext, TRequirement, TStep>) {\r\n const uiStyles = React.useMemo(() => resolveStyles(unstyled, styles), [unstyled, styles]);\r\n\r\n const {\r\n context,\r\n step,\r\n hasEvaluated,\r\n completeStep: normalizedCompleteStep,\r\n requirements: normalizedRequirements,\r\n missingRequirements: missing,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n setContextPatch: patchContext,\r\n run,\r\n handleEmail,\r\n handleOtp,\r\n handlePassword,\r\n handleProfile,\r\n handleTos,\r\n handleOAuth,\r\n } = useAdaptiveFlow<TContext, TRequirement, TStep>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n });\r\n\r\n const normalizedOAuthProviders = React.useMemo(\r\n () => (oauthProviders && oauthProviders.length > 0 ? oauthProviders : defaultOAuthProviders),\r\n [oauthProviders],\r\n );\r\n\r\n const completedCount = hasEvaluated\r\n ? normalizedRequirements.length - missing.length\r\n : 0;\r\n const needsJobTitle = normalizedRequirements.includes(\"has_job_title\" as TRequirement);\r\n const stepLabel = hasEvaluated\r\n ? (stepTitles?.[step] ?? defaultStepTitle[step] ?? step)\r\n : \"Loading flow\";\r\n\r\n const defaultView = (\r\n <>\r\n {!hasEvaluated ? (\r\n <div className={classNames?.info} style={uiStyles.info}>\r\n Evaluating required steps...\r\n </div>\r\n ) : null}\r\n {step === \"COLLECT_EMAIL\" ? (\r\n <EmailBlock\r\n onSubmit={handleEmail}\r\n disabled={busy}\r\n error={fieldErrors.email}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"VERIFY_OTP\" ? (\r\n <OtpBlock\r\n onSubmit={handleOtp}\r\n email={context.email ?? \"your email\"}\r\n disabled={busy}\r\n error={fieldErrors.otp}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_PASSWORD\" ? (\r\n <PasswordBlock\r\n onSubmit={handlePassword}\r\n disabled={busy}\r\n hasPassword={context.hasPassword}\r\n error={fieldErrors.password}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_PROFILE\" ? (\r\n <ProfileBlock\r\n defaultValue={context.profile}\r\n requireJobTitle={needsJobTitle}\r\n onSubmit={handleProfile}\r\n disabled={busy}\r\n errors={fieldErrors}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_TOS\" ? (\r\n <TosBlock\r\n onSubmit={handleTos}\r\n disabled={busy}\r\n error={fieldErrors.tos}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === normalizedCompleteStep ? (\r\n <CompleteBlock styles={uiStyles} classNames={classNames} />\r\n ) : null}\r\n {!builtInDefaultSteps.has(String(step)) && step !== normalizedCompleteStep ? (\r\n <div className={classNames?.info} style={uiStyles.info}>\r\n No default renderer for step \"{step}\". Provide renderStep to handle custom steps.\r\n </div>\r\n ) : null}\r\n </>\r\n );\r\n\r\n const customView = renderStep\r\n ? renderStep({\r\n step,\r\n context,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n missingRequirements: missing,\r\n requirements: normalizedRequirements,\r\n defaultView,\r\n setContextPatch: patchContext,\r\n run,\r\n adapter,\r\n transitions,\r\n })\r\n : null;\r\n const registryView = stepRegistry?.[step]\r\n ? stepRegistry[step]?.({\r\n step,\r\n context,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n missingRequirements: missing,\r\n requirements: normalizedRequirements,\r\n setContextPatch: patchContext,\r\n run,\r\n adapter,\r\n transitions,\r\n })\r\n : null;\r\n\r\n return (\r\n <div className={cx(className, classNames?.shell)} style={uiStyles.shell}>\r\n <div className={classNames?.headerRow} style={uiStyles.headerRow}>\r\n <div>\r\n <div className={classNames?.eyebrow} style={uiStyles.eyebrow}>\r\n Adaptive flow\r\n </div>\r\n <h2 className={classNames?.title} style={uiStyles.title}>\r\n {stepLabel}\r\n </h2>\r\n </div>\r\n <div className={classNames?.badge} style={uiStyles.badge}>\r\n {completedCount}/{normalizedRequirements.length}\r\n </div>\r\n </div>\r\n\r\n {message ? (\r\n <div className={classNames?.success} style={uiStyles.success}>\r\n {message}\r\n </div>\r\n ) : null}\r\n {errorMessage ? (\r\n <div className={classNames?.error} style={uiStyles.error}>\r\n {errorMessage}\r\n </div>\r\n ) : null}\r\n\r\n {customView ?? registryView ?? defaultView}\r\n\r\n <div className={classNames?.footer} style={uiStyles.footer}>\r\n {normalizedOAuthProviders.map((provider) => (\r\n <button\r\n key={provider.id}\r\n type=\"button\"\r\n className={classNames?.oauthButton}\r\n style={uiStyles.oauthButton}\r\n disabled={busy || !adapter?.startOAuth}\r\n onClick={() => {\r\n handleOAuth(provider.id);\r\n }}\r\n >\r\n {provider.label}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ntype BlockBaseProps = {\r\n disabled?: boolean;\r\n styles: Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n classNames?: AdaptiveFlowClassNames;\r\n};\r\n\r\n/** Default email collection form used by the built-in component. */\r\nfunction EmailBlock({\r\n onSubmit,\r\n disabled,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (email: string) => void; error?: string }) {\r\n const [email, setEmail] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-email-error\";\r\n return (\r\n <form\r\n className={classNames?.formRow}\r\n style={styles.formRow}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(email);\r\n }}\r\n >\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"email\"\r\n autoComplete=\"email\"\r\n placeholder=\"Enter your email\"\r\n value={email}\r\n onChange={(event) => setEmail(event.target.value)}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n />\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </form>\r\n );\r\n}\r\n\r\n/** Default OTP form used by the built-in component. */\r\nfunction OtpBlock({\r\n onSubmit,\r\n disabled,\r\n email,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (code: string) => void; email: string; error?: string }) {\r\n const [code, setCode] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-otp-error\";\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(code);\r\n }}\r\n >\r\n <p className={classNames?.caption} style={styles.caption}>\r\n Use the verification code sent to {email}.\r\n </p>\r\n <div className={classNames?.formRow} style={styles.formRow}>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n inputMode=\"numeric\"\r\n placeholder=\"Enter 6-digit code\"\r\n value={code}\r\n onChange={(event) => setCode(event.target.value.replace(/\\D/g, \"\").slice(0, 6))}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n maxLength={6}\r\n pattern=\"[0-9]{6}\"\r\n />\r\n <button\r\n className={classNames?.button}\r\n style={styles.button}\r\n disabled={disabled || code.length !== 6}\r\n type=\"submit\"\r\n >\r\n Verify\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </div>\r\n </form>\r\n );\r\n}\r\n\r\n/** Default password form used by the built-in component. */\r\nfunction PasswordBlock({\r\n onSubmit,\r\n disabled,\r\n hasPassword,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (password: string) => void; hasPassword: boolean; error?: string }) {\r\n const [password, setPassword] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-password-error\";\r\n return (\r\n <form\r\n className={classNames?.formRow}\r\n style={styles.formRow}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(password);\r\n }}\r\n >\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"password\"\r\n autoComplete={hasPassword ? \"current-password\" : \"new-password\"}\r\n placeholder={hasPassword ? \"Enter your password\" : \"Create a password\"}\r\n value={password}\r\n onChange={(event) => setPassword(event.target.value)}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n minLength={8}\r\n />\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </form>\r\n );\r\n}\r\n\r\n/** Default profile form used by the built-in component. */\r\nfunction ProfileBlock({\r\n onSubmit,\r\n disabled,\r\n defaultValue,\r\n requireJobTitle,\r\n errors,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & {\r\n onSubmit: (profile: AdaptiveContext[\"profile\"]) => void;\r\n defaultValue: AdaptiveContext[\"profile\"];\r\n requireJobTitle: boolean;\r\n errors?: AdaptiveFlowFieldErrors;\r\n}) {\r\n const [firstName, setFirstName] = React.useState(defaultValue.firstName ?? \"\");\r\n const [lastName, setLastName] = React.useState(defaultValue.lastName ?? \"\");\r\n const [jobTitle, setJobTitle] = React.useState(defaultValue.jobTitle ?? \"\");\r\n const firstNameError = errors?.firstName ?? errors?.[\"profile.firstName\"];\r\n const lastNameError = errors?.lastName ?? errors?.[\"profile.lastName\"];\r\n const jobTitleError = errors?.jobTitle ?? errors?.[\"profile.jobTitle\"];\r\n const profileError = errors?.profile;\r\n\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit({\r\n firstName: firstName || null,\r\n lastName: lastName || null,\r\n jobTitle: jobTitle || null,\r\n });\r\n }}\r\n >\r\n <div className={classNames?.formRow} style={styles.formRow}>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"given-name\"\r\n placeholder=\"First name\"\r\n value={firstName}\r\n onChange={(event) => setFirstName(event.target.value)}\r\n aria-invalid={Boolean(firstNameError)}\r\n required\r\n />\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"family-name\"\r\n placeholder=\"Last name\"\r\n value={lastName}\r\n onChange={(event) => setLastName(event.target.value)}\r\n aria-invalid={Boolean(lastNameError)}\r\n required\r\n />\r\n </div>\r\n {firstNameError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {firstNameError}\r\n </div>\r\n ) : null}\r\n {lastNameError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {lastNameError}\r\n </div>\r\n ) : null}\r\n {requireJobTitle ? (\r\n <>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"organization-title\"\r\n placeholder=\"Job title\"\r\n value={jobTitle}\r\n onChange={(event) => setJobTitle(event.target.value)}\r\n aria-invalid={Boolean(jobTitleError)}\r\n required\r\n />\r\n {jobTitleError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {jobTitleError}\r\n </div>\r\n ) : null}\r\n </>\r\n ) : null}\r\n {profileError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {profileError}\r\n </div>\r\n ) : null}\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n/** Default terms acceptance form used by the built-in component. */\r\nfunction TosBlock({\r\n onSubmit,\r\n disabled,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: () => void; error?: string }) {\r\n const [checked, setChecked] = React.useState(false);\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n if (checked) {\r\n onSubmit();\r\n }\r\n }}\r\n >\r\n <label className={classNames?.checkboxRow} style={styles.checkboxRow}>\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={(event) => setChecked(event.target.checked)}\r\n aria-invalid={Boolean(error)}\r\n />\r\n <span>I agree to the Terms of Service and Privacy Policy.</span>\r\n </label>\r\n {error ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n <button\r\n className={classNames?.button}\r\n style={styles.button}\r\n disabled={disabled || !checked}\r\n type=\"submit\"\r\n >\r\n Accept and Continue\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n/** Completion panel shown when the flow reaches the terminal step. */\r\nfunction CompleteBlock({\r\n styles,\r\n classNames,\r\n}: {\r\n styles: Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n classNames?: AdaptiveFlowClassNames;\r\n}) {\r\n return (\r\n <div className={classNames?.complete} style={styles.complete}>\r\n <strong>You are all set.</strong>\r\n <p className={classNames?.caption} style={styles.caption}>\r\n All requirements are complete.\r\n </p>\r\n </div>\r\n );\r\n}\r\n\r\nconst defaultStyles: Record<AdaptiveFlowStyleSlot, React.CSSProperties> = {\r\n shell: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 12,\r\n width: \"100%\",\r\n maxWidth: 560,\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 14,\r\n padding: 16,\r\n background: \"#ffffff\",\r\n fontFamily: \"system-ui, -apple-system, Segoe UI, Roboto, sans-serif\",\r\n },\r\n headerRow: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n gap: 12,\r\n },\r\n eyebrow: {\r\n fontSize: 12,\r\n textTransform: \"uppercase\",\r\n letterSpacing: 1.2,\r\n color: \"#6b7280\",\r\n marginBottom: 4,\r\n },\r\n title: {\r\n margin: 0,\r\n fontSize: 22,\r\n lineHeight: \"28px\",\r\n },\r\n badge: {\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 999,\r\n padding: \"4px 10px\",\r\n fontSize: 12,\r\n fontWeight: 600,\r\n color: \"#374151\",\r\n },\r\n success: {\r\n border: \"1px solid #bbf7d0\",\r\n background: \"#f0fdf4\",\r\n color: \"#166534\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n error: {\r\n border: \"1px solid #fecaca\",\r\n background: \"#fef2f2\",\r\n color: \"#991b1b\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n info: {\r\n border: \"1px solid #bfdbfe\",\r\n background: \"#eff6ff\",\r\n color: \"#1e3a8a\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n caption: {\r\n margin: 0,\r\n color: \"#4b5563\",\r\n fontSize: 14,\r\n },\r\n formRow: {\r\n display: \"flex\",\r\n gap: 8,\r\n alignItems: \"center\",\r\n },\r\n formColumn: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 10,\r\n },\r\n input: {\r\n width: \"100%\",\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 12px\",\r\n fontSize: 14,\r\n },\r\n button: {\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 14px\",\r\n fontWeight: 600,\r\n background: \"#ffffff\",\r\n whiteSpace: \"nowrap\",\r\n cursor: \"pointer\",\r\n },\r\n checkboxRow: {\r\n display: \"flex\",\r\n gap: 8,\r\n alignItems: \"flex-start\",\r\n fontSize: 14,\r\n color: \"#374151\",\r\n },\r\n complete: {\r\n border: \"1px solid #bbf7d0\",\r\n background: \"#f0fdf4\",\r\n color: \"#166534\",\r\n borderRadius: 12,\r\n padding: 12,\r\n },\r\n footer: {\r\n display: \"flex\",\r\n gap: 8,\r\n marginTop: 4,\r\n },\r\n oauthButton: {\r\n flex: 1,\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n padding: \"10px 12px\",\r\n background: \"#f9fafb\",\r\n cursor: \"pointer\",\r\n },\r\n};\r\n","/**\r\n * Built-in requirement keys that cover the default flow states supported by the package.\r\n */\r\nexport const DefaultAppRequirements = {\r\n HAS_EMAIL: \"has_email\",\r\n EMAIL_VERIFIED: \"email_verified\",\r\n HAS_PASSWORD: \"has_password\",\r\n HAS_FIRST_NAME: \"has_first_name\",\r\n HAS_LAST_NAME: \"has_last_name\",\r\n ACCEPTED_TOS: \"accepted_tos\",\r\n HAS_JOB_TITLE: \"has_job_title\",\r\n} as const;\r\n\r\n/**\r\n * Built-in step keys used by the default flow UI and default requirement resolvers.\r\n */\r\nexport const DefaultAdaptiveSteps = {\r\n COLLECT_EMAIL: \"COLLECT_EMAIL\",\r\n VERIFY_OTP: \"VERIFY_OTP\",\r\n COLLECT_PASSWORD: \"COLLECT_PASSWORD\",\r\n COLLECT_PROFILE: \"COLLECT_PROFILE\",\r\n COLLECT_TOS: \"COLLECT_TOS\",\r\n COMPLETE: \"COMPLETE\",\r\n} as const;\r\n\r\n/** Requirement key from the built-in default requirement set. */\r\nexport type DefaultAppRequirement = (typeof DefaultAppRequirements)[keyof typeof DefaultAppRequirements];\r\n/** Step key from the built-in default step set. */\r\nexport type DefaultAdaptiveStep = (typeof DefaultAdaptiveSteps)[keyof typeof DefaultAdaptiveSteps];\r\n\r\n/** Requirement key used by the engine, including custom app-specific requirements. */\r\nexport type AppRequirement = DefaultAppRequirement | (string & {});\r\n/** Step key used by the engine, including custom app-specific steps. */\r\nexport type AdaptiveStep = DefaultAdaptiveStep | (string & {});\r\n\r\n/** Base context shape managed by the default flow helpers and UI. */\r\nexport type AdaptiveContextBase = {\r\n email: string | null;\r\n isVerified: boolean;\r\n hasPassword: boolean;\r\n profile: {\r\n firstName: string | null;\r\n lastName: string | null;\r\n jobTitle: string | null;\r\n };\r\n agreedToTos: boolean;\r\n};\r\n\r\n/** Alias for the default context shape used by the built-in component and hook. */\r\nexport type AdaptiveContext = AdaptiveContextBase;\r\n\r\n/** Default set of requirements used when a flow does not provide its own list. */\r\nexport const defaultRequirements: DefaultAppRequirement[] = [\r\n DefaultAppRequirements.HAS_EMAIL,\r\n DefaultAppRequirements.EMAIL_VERIFIED,\r\n DefaultAppRequirements.HAS_PASSWORD,\r\n DefaultAppRequirements.HAS_FIRST_NAME,\r\n DefaultAppRequirements.HAS_LAST_NAME,\r\n DefaultAppRequirements.HAS_JOB_TITLE,\r\n DefaultAppRequirements.ACCEPTED_TOS,\r\n];\r\n\r\n/** Default initial context used by the component and hook when no initialValue is provided. */\r\nexport const initialContext: AdaptiveContextBase = {\r\n email: null,\r\n isVerified: false,\r\n hasPassword: false,\r\n profile: {\r\n firstName: null,\r\n lastName: null,\r\n jobTitle: null,\r\n },\r\n agreedToTos: false,\r\n};\r\n\r\n/** Utility type for APIs that may return either a synchronous or asynchronous value. */\r\nexport type MaybePromise<T> = T | Promise<T>;\r\n\r\n/** Resolver contract that maps one requirement to the step shown when it is unmet. */\r\nexport type RequirementResolver<\r\n TContext = AdaptiveContextBase,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n isMet: (context: TContext) => MaybePromise<boolean>;\r\n step: TStep;\r\n};\r\n\r\n/**\r\n * Single requirement node in the requirement graph.\r\n * The engine evaluates nodes by priority, dependency readiness, and custom conditions.\r\n */\r\nexport type RequirementGraphNode<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n requirement: TRequirement;\r\n step: TStep;\r\n isMet: (context: TContext) => MaybePromise<boolean>;\r\n when?: (context: TContext) => MaybePromise<boolean>;\r\n priority?: number;\r\n dependsOn?: readonly TRequirement[];\r\n};\r\n\r\n/** Ordered requirement graph consumed by the engine evaluation helpers. */\r\nexport type RequirementGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = readonly RequirementGraphNode<TContext, TRequirement, TStep>[];\r\n\r\n/** Default requirement-to-step resolvers used by the built-in flow UI. */\r\nexport const defaultRequirementResolvers: Record<\r\n DefaultAppRequirement,\r\n RequirementResolver<AdaptiveContextBase, AdaptiveStep>\r\n> = {\r\n has_email: {\r\n isMet: (context) => Boolean(context.email),\r\n step: DefaultAdaptiveSteps.COLLECT_EMAIL,\r\n },\r\n email_verified: {\r\n isMet: (context) => context.isVerified,\r\n step: DefaultAdaptiveSteps.VERIFY_OTP,\r\n },\r\n has_password: {\r\n isMet: (context) => context.hasPassword,\r\n step: DefaultAdaptiveSteps.COLLECT_PASSWORD,\r\n },\r\n has_first_name: {\r\n isMet: (context) => Boolean(context.profile.firstName),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n has_last_name: {\r\n isMet: (context) => Boolean(context.profile.lastName),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n accepted_tos: {\r\n isMet: (context) => context.agreedToTos,\r\n step: DefaultAdaptiveSteps.COLLECT_TOS,\r\n },\r\n has_job_title: {\r\n isMet: (context) => Boolean(context.profile.jobTitle),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n};\r\n\r\n/**\r\n * Build a requirement graph from a requirement list, resolver map, and optional graph metadata.\r\n *\r\n * The function validates that dependencies refer to known resolver-backed requirements and\r\n * rejects circular dependency chains at graph creation time.\r\n */\r\nexport function createRequirementGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n requirements: readonly TRequirement[],\r\n resolvers: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>,\r\n options?: {\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n },\r\n): RequirementGraph<TContext, TRequirement, TStep> {\r\n const graph: RequirementGraphNode<TContext, TRequirement, TStep>[] = [];\r\n const requirementSet = new Set(requirements);\r\n const resolverBackedRequirements = new Set(\r\n requirements.filter((requirement) => Boolean(resolvers[requirement])),\r\n );\r\n\r\n for (const requirement of requirements) {\r\n const resolver = resolvers[requirement];\r\n if (!resolver) {\r\n continue;\r\n }\r\n\r\n const dependsOn = options?.dependencies?.[requirement] ?? [];\r\n for (const dependency of dependsOn) {\r\n if (!requirementSet.has(dependency)) {\r\n throw new Error(\r\n `Invalid dependency \\\"${String(dependency)}\\\" referenced by requirement \\\"${String(requirement)}\\\".`,\r\n );\r\n }\r\n if (!resolverBackedRequirements.has(dependency)) {\r\n throw new Error(\r\n `Dependency \\\"${String(dependency)}\\\" referenced by requirement \\\"${String(requirement)}\\\" has no resolver.`,\r\n );\r\n }\r\n }\r\n\r\n graph.push({\r\n requirement,\r\n step: resolver.step,\r\n isMet: resolver.isMet,\r\n when: options?.conditions?.[requirement],\r\n priority: options?.priorities?.[requirement] ?? 0,\r\n dependsOn,\r\n });\r\n }\r\n\r\n const byRequirement = new Map(\r\n graph.map((node) => [node.requirement, node] as const),\r\n );\r\n\r\n const visited = new Set<TRequirement>();\r\n const visiting = new Set<TRequirement>();\r\n\r\n const dfs = (requirement: TRequirement, stack: TRequirement[]) => {\r\n if (visited.has(requirement)) {\r\n return;\r\n }\r\n\r\n if (visiting.has(requirement)) {\r\n const cycleStart = stack.indexOf(requirement);\r\n const cyclePath = [...stack.slice(cycleStart), requirement]\r\n .map((value) => String(value))\r\n .join(\" -> \");\r\n throw new Error(`Circular dependency detected in requirement graph: ${cyclePath}`);\r\n }\r\n\r\n visiting.add(requirement);\r\n const node = byRequirement.get(requirement);\r\n if (node?.dependsOn?.length) {\r\n for (const dep of node.dependsOn) {\r\n if (byRequirement.has(dep)) {\r\n dfs(dep, [...stack, requirement]);\r\n }\r\n }\r\n }\r\n\r\n visiting.delete(requirement);\r\n visited.add(requirement);\r\n };\r\n\r\n for (const node of graph) {\r\n dfs(node.requirement, []);\r\n }\r\n\r\n return graph;\r\n}\r\n\r\n/**\r\n * Build a requirement graph using the built-in default resolvers plus any app-specific overrides.\r\n */\r\nexport function createDefaultRequirementGraph<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n TRequirement extends string = DefaultAppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>(\r\n options?: {\r\n requirements?: readonly TRequirement[];\r\n resolvers?: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>;\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n },\r\n): RequirementGraph<TContext, TRequirement, TStep> {\r\n const requirements =\r\n (options?.requirements ?? (defaultRequirements as unknown as readonly TRequirement[]));\r\n\r\n const resolvers = {\r\n ...(defaultRequirementResolvers as unknown as Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>),\r\n ...(options?.resolvers ?? {}),\r\n };\r\n\r\n return createRequirementGraph(requirements, resolvers, {\r\n priorities: options?.priorities,\r\n conditions: options?.conditions,\r\n dependencies: options?.dependencies,\r\n });\r\n}\r\n\r\nfunction sortGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(graph: RequirementGraph<TContext, TRequirement, TStep>) {\r\n const entries = graph.map((node, index) => ({ node, index }));\r\n const byRequirement = new Map(entries.map((entry) => [entry.node.requirement, entry] as const));\r\n\r\n const indegree = new Map<TRequirement, number>();\r\n const adjacency = new Map<TRequirement, TRequirement[]>();\r\n\r\n for (const entry of entries) {\r\n indegree.set(entry.node.requirement, 0);\r\n adjacency.set(entry.node.requirement, []);\r\n }\r\n\r\n for (const entry of entries) {\r\n const current = entry.node.requirement;\r\n for (const dependency of entry.node.dependsOn ?? []) {\r\n const depEntry = byRequirement.get(dependency);\r\n if (!depEntry) {\r\n continue;\r\n }\r\n\r\n const outgoing = adjacency.get(depEntry.node.requirement);\r\n if (outgoing) {\r\n outgoing.push(current);\r\n }\r\n indegree.set(current, (indegree.get(current) ?? 0) + 1);\r\n }\r\n }\r\n\r\n const compare = (\r\n left: { node: RequirementGraphNode<TContext, TRequirement, TStep>; index: number },\r\n right: { node: RequirementGraphNode<TContext, TRequirement, TStep>; index: number },\r\n ) => {\r\n const byPriority = (right.node.priority ?? 0) - (left.node.priority ?? 0);\r\n if (byPriority !== 0) {\r\n return byPriority;\r\n }\r\n // Keep declaration order for equal-priority nodes to avoid surprising step jumps.\r\n return left.index - right.index;\r\n };\r\n\r\n const ready = entries\r\n .filter((entry) => (indegree.get(entry.node.requirement) ?? 0) === 0)\r\n .sort(compare);\r\n\r\n const ordered: RequirementGraphNode<TContext, TRequirement, TStep>[] = [];\r\n\r\n while (ready.length > 0) {\r\n const current = ready.shift();\r\n if (!current) {\r\n break;\r\n }\r\n\r\n ordered.push(current.node);\r\n\r\n for (const dependent of adjacency.get(current.node.requirement) ?? []) {\r\n const next = (indegree.get(dependent) ?? 0) - 1;\r\n indegree.set(dependent, next);\r\n if (next === 0) {\r\n const dependentEntry = byRequirement.get(dependent);\r\n if (dependentEntry) {\r\n ready.push(dependentEntry);\r\n ready.sort(compare);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (ordered.length !== graph.length) {\r\n throw new Error(\"Unable to topologically sort requirement graph. Check for dependency cycles.\");\r\n }\r\n\r\n return ordered;\r\n}\r\n\r\n/**\r\n * Evaluate the graph against the current context and return the next unmet step.\r\n *\r\n * Nodes are evaluated in dependency-aware order with deterministic tie-breaking.\r\n */\r\nexport async function evaluateNextStep<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n context: TContext,\r\n graph: RequirementGraph<TContext, TRequirement, TStep>,\r\n completeStep: TStep,\r\n): Promise<TStep> {\r\n for (const node of sortGraph(graph)) {\r\n if (node.when && !(await node.when(context))) {\r\n continue;\r\n }\r\n\r\n if (node.dependsOn && node.dependsOn.length > 0) {\r\n const prerequisiteNodes = graph.filter((candidate) =>\r\n node.dependsOn?.includes(candidate.requirement),\r\n );\r\n\r\n if (prerequisiteNodes.length > 0) {\r\n const prerequisitesMet = await Promise.all(\r\n prerequisiteNodes.map(async (candidate) => candidate.isMet(context)),\r\n );\r\n if (prerequisitesMet.includes(false)) {\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n if (!(await node.isMet(context))) {\r\n return node.step;\r\n }\r\n }\r\n\r\n return completeStep;\r\n}\r\n\r\n/**\r\n * Return every unmet requirement for the current context in graph evaluation order.\r\n */\r\nexport async function getMissingRequirements<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n context: TContext,\r\n graph: RequirementGraph<TContext, TRequirement, TStep>,\r\n): Promise<TRequirement[]> {\r\n const missing: TRequirement[] = [];\r\n\r\n for (const node of sortGraph(graph)) {\r\n if (node.when && !(await node.when(context))) {\r\n continue;\r\n }\r\n\r\n if (!(await node.isMet(context))) {\r\n missing.push(node.requirement);\r\n }\r\n }\r\n\r\n return missing;\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/AdaptiveFlow.tsx","../src/engine.ts"],"sourcesContent":["\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport {\r\n createDefaultRequirementGraph,\r\n defaultRequirementResolvers,\r\n defaultRequirements,\r\n evaluateNextStep,\r\n getMissingRequirements,\r\n initialContext,\r\n type AdaptiveContext,\r\n type AdaptiveContextBase,\r\n type AdaptiveStep,\r\n type AppRequirement,\r\n type MaybePromise,\r\n type RequirementGraph,\r\n type RequirementResolver,\r\n} from \"./engine\";\r\n\r\n/** Supported OAuth provider identifiers accepted by the adapter and default UI. */\r\nexport type OAuthProvider = \"google\" | \"apple\" | (string & {});\r\n\r\n/** Configurable OAuth provider label/id pair used by the default footer buttons. */\r\nexport type AdaptiveFlowOAuthProvider = {\r\n id: OAuthProvider | (string & {});\r\n label: string;\r\n};\r\n\r\n/** Result returned by lookupByEmail to seed the flow with backend identity state. */\r\nexport type IdentityResolution = {\r\n accountExists: boolean;\r\n hasPassword?: boolean;\r\n isVerified?: boolean;\r\n agreedToTos?: boolean;\r\n profile?: Partial<AdaptiveContextBase[\"profile\"]>;\r\n};\r\n\r\n/** Backend adapter contract used by the flow to delegate all side effects. */\r\nexport type AdaptiveFlowAdapter<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n lookupByEmail?: (email: string) => Promise<IdentityResolution | null>;\r\n requestOtp?: (email: string) => Promise<void>;\r\n verifyOtp?: (email: string, code: string) => Promise<void>;\r\n signInWithPassword?: (email: string, password: string) => Promise<void>;\r\n createPassword?: (password: string) => Promise<void>;\r\n saveProfile?: (context: TContext) => Promise<void>;\r\n acceptTos?: (context: TContext) => Promise<void>;\r\n startOAuth?: (provider: OAuthProvider, context: TContext) => Promise<void>;\r\n completeOAuth?: (\r\n provider: OAuthProvider | null,\r\n context: TContext,\r\n ) => Promise<Partial<TContext> | void>;\r\n};\r\n\r\n/** Named style slots used by the built-in component shell and step renderers. */\r\nexport type AdaptiveFlowStyleSlot =\r\n | \"shell\"\r\n | \"headerRow\"\r\n | \"eyebrow\"\r\n | \"title\"\r\n | \"badge\"\r\n | \"success\"\r\n | \"error\"\r\n | \"info\"\r\n | \"caption\"\r\n | \"formRow\"\r\n | \"formColumn\"\r\n | \"input\"\r\n | \"button\"\r\n | \"checkboxRow\"\r\n | \"complete\"\r\n | \"footer\"\r\n | \"oauthButton\";\r\n\r\n/** Inline style overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowStyles = Partial<Record<AdaptiveFlowStyleSlot, React.CSSProperties>>;\r\n/** CSS class overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowClassNames = Partial<Record<AdaptiveFlowStyleSlot, string>>;\r\n\r\n/** Minimal storage interface used by persistence drivers. */\r\nexport type AdaptiveFlowStorageDriver = Pick<Storage, \"getItem\" | \"setItem\" | \"removeItem\">;\r\n\r\n/** Persistence settings for storing and restoring flow state across reloads. */\r\nexport type AdaptiveFlowPersistence<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n key: string;\r\n storage?: \"session\" | \"local\" | AdaptiveFlowStorageDriver;\r\n serialize?: (state: PersistedAdaptiveFlowState<TContext>) => string;\r\n deserialize?: (value: string) => PersistedAdaptiveFlowState<TContext>;\r\n clearOnComplete?: boolean;\r\n onError?: (error: Error, phase: \"read\" | \"write\" | \"clear\") => void;\r\n};\r\n\r\n/** Persisted flow payload written to session/local/custom storage. */\r\nexport type PersistedAdaptiveFlowState<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n context: TContext;\r\n oauthPendingProvider: OAuthProvider | null;\r\n};\r\n\r\n/** Context wrapper passed into validators so they can inspect the current flow state. */\r\nexport type AdaptiveFlowValidationContext<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n> = {\r\n context: TContext;\r\n};\r\n\r\n/** Validator failure payload that can target a specific field or the whole form. */\r\nexport type AdaptiveFlowValidationIssue = {\r\n message: string;\r\n field?: string;\r\n};\r\n\r\n/** Validator return type supported by the component and hook. */\r\nexport type AdaptiveFlowValidationResult =\r\n | string\r\n | AdaptiveFlowValidationIssue\r\n | void\r\n | Promise<string | AdaptiveFlowValidationIssue | void>;\r\n\r\n/** Schema adapter contract used for optional Zod-friendly validation. */\r\nexport type AdaptiveFlowSchema<TValue> = {\r\n safeParse?: (value: TValue) => {\r\n success: boolean;\r\n error?: {\r\n message?: string;\r\n issues?: Array<{\r\n message?: string;\r\n path?: Array<string | number>;\r\n }>;\r\n };\r\n };\r\n parse?: (value: TValue) => unknown;\r\n};\r\n\r\n/** Optional schema map for built-in step fields. */\r\nexport type AdaptiveFlowSchemas = {\r\n email?: AdaptiveFlowSchema<string>;\r\n otp?: AdaptiveFlowSchema<string>;\r\n password?: AdaptiveFlowSchema<string>;\r\n profile?: AdaptiveFlowSchema<AdaptiveContextBase[\"profile\"]>;\r\n tos?: AdaptiveFlowSchema<boolean>;\r\n};\r\n\r\n/** Backoff settings used to retry transient adapter calls and OAuth completion. */\r\nexport type AdaptiveFlowRetryPolicy = {\r\n maxAttempts?: number;\r\n initialDelayMs?: number;\r\n factor?: number;\r\n maxDelayMs?: number;\r\n jitter?: boolean;\r\n shouldRetry?: (error: Error, attempt: number) => boolean;\r\n delay?: (attempt: number) => number;\r\n};\r\n\r\n/** Field error bag keyed by field path or logical field name. */\r\nexport type AdaptiveFlowFieldErrors = Partial<Record<string, string>>;\r\n\r\n/** Validator map for the built-in flow fields. */\r\nexport type AdaptiveFlowValidators<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n email?: (input: string, payload: AdaptiveFlowValidationContext<TContext>) => AdaptiveFlowValidationResult;\r\n otp?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { email: string },\r\n ) => AdaptiveFlowValidationResult;\r\n password?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { hasPassword: boolean },\r\n ) => AdaptiveFlowValidationResult;\r\n profile?: (\r\n input: AdaptiveContextBase[\"profile\"],\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n tos?: (\r\n accepted: boolean,\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n};\r\n\r\n/** Transition record emitted whenever the evaluated step changes. */\r\nexport type AdaptiveStepTransition<TStep extends string = AdaptiveStep> = {\r\n from: TStep | null;\r\n to: TStep;\r\n at: number;\r\n attempt: number;\r\n};\r\n\r\n/** Arguments supplied to a stepRegistry renderer for a specific step. */\r\nexport type AdaptiveStepRendererArgs<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Registry that overrides the UI for selected steps. */\r\nexport type AdaptiveStepRegistry<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = Partial<\r\n Record<TStep, (args: AdaptiveStepRendererArgs<TContext, TRequirement, TStep>) => React.ReactNode>\r\n>;\r\n\r\n/** Arguments supplied to renderStep for full step-body customization. */\r\nexport type AdaptiveStepRenderArgs<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n defaultView: React.ReactNode;\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Props accepted by the AdaptiveFlow component. */\r\nexport type AdaptiveFlowProps<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n requirements?: readonly TRequirement[];\r\n requirementGraph?: RequirementGraph<TContext, TRequirement, TStep>;\r\n requirementGraphConfig?: {\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n };\r\n requirementResolvers?: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>;\r\n completeStep?: TStep;\r\n stepTitles?: Partial<Record<TStep, string>>;\r\n renderStep?: (args: AdaptiveStepRenderArgs<TContext, TRequirement, TStep>) => React.ReactNode;\r\n stepRegistry?: AdaptiveStepRegistry<TContext, TRequirement, TStep>;\r\n initialValue?: Partial<TContext>;\r\n onComplete?: (context: TContext) => void;\r\n onError?: (error: Error) => void;\r\n onStepTransition?: (transition: AdaptiveStepTransition<TStep>, context: TContext) => void;\r\n className?: string;\r\n classNames?: AdaptiveFlowClassNames;\r\n styles?: AdaptiveFlowStyles;\r\n unstyled?: boolean;\r\n persistence?: AdaptiveFlowPersistence<TContext>;\r\n validators?: AdaptiveFlowValidators<TContext>;\r\n schemas?: AdaptiveFlowSchemas;\r\n oauthProviders?: readonly AdaptiveFlowOAuthProvider[];\r\n retryPolicy?: AdaptiveFlowRetryPolicy;\r\n};\r\n\r\n/** Options accepted by the headless useAdaptiveFlow hook. */\r\nexport type UseAdaptiveFlowOptions<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = Omit<\r\n AdaptiveFlowProps<TContext, TRequirement, TStep>,\r\n \"stepTitles\" | \"renderStep\" | \"stepRegistry\" | \"className\" | \"classNames\" | \"styles\" | \"unstyled\"\r\n>;\r\n\r\n/** Result object returned by useAdaptiveFlow. */\r\nexport type UseAdaptiveFlowResult<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n context: TContext;\r\n step: TStep;\r\n hasEvaluated: boolean;\r\n completeStep: TStep;\r\n requirements: readonly TRequirement[];\r\n missingRequirements: TRequirement[];\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n handleEmail: (emailInput: string) => void;\r\n handleOtp: (code: string) => void;\r\n handlePassword: (password: string) => void;\r\n handleProfile: (profile: AdaptiveContextBase[\"profile\"]) => void;\r\n handleTos: () => void;\r\n handleOAuth: (provider: OAuthProvider) => void;\r\n};\r\n\r\ntype PlainObject = Record<string, unknown>;\r\n\r\n/** Default provider buttons rendered by the component footer when no provider list is supplied. */\r\nconst defaultOAuthProviders: readonly AdaptiveFlowOAuthProvider[] = [\r\n { id: \"google\", label: \"Continue with Google\" },\r\n { id: \"apple\", label: \"Continue with Apple\" },\r\n];\r\n\r\n/** Human-friendly labels used when a step title override is not supplied. */\r\nconst defaultStepTitle: Record<string, string> = {\r\n COLLECT_EMAIL: \"Enter your email\",\r\n VERIFY_OTP: \"Verify your email\",\r\n COLLECT_PASSWORD: \"Set up your password\",\r\n COLLECT_PROFILE: \"Complete your profile\",\r\n COLLECT_TOS: \"Accept terms\",\r\n COMPLETE: \"Done\",\r\n};\r\n\r\n/** Built-in step keys that have a default renderer in the component shell. */\r\nconst builtInDefaultSteps = new Set<string>([\r\n \"COLLECT_EMAIL\",\r\n \"VERIFY_OTP\",\r\n \"COLLECT_PASSWORD\",\r\n \"COLLECT_PROFILE\",\r\n \"COLLECT_TOS\",\r\n \"COMPLETE\",\r\n]);\r\n\r\nconst styleSlots: AdaptiveFlowStyleSlot[] = [\r\n \"shell\",\r\n \"headerRow\",\r\n \"eyebrow\",\r\n \"title\",\r\n \"badge\",\r\n \"success\",\r\n \"error\",\r\n \"info\",\r\n \"caption\",\r\n \"formRow\",\r\n \"formColumn\",\r\n \"input\",\r\n \"button\",\r\n \"checkboxRow\",\r\n \"complete\",\r\n \"footer\",\r\n \"oauthButton\",\r\n];\r\n\r\n/**\r\n * Deeply merge a patch into the current context.\r\n *\r\n * Plain nested objects are merged recursively, while arrays and non-plain values are replaced.\r\n */\r\nfunction mergeContext<TContext extends AdaptiveContextBase>(\r\n current: TContext,\r\n patch: Partial<TContext>,\r\n): TContext {\r\n const mergeValue = (baseValue: unknown, patchValue: unknown): unknown => {\r\n if (Array.isArray(baseValue) || Array.isArray(patchValue)) {\r\n return patchValue;\r\n }\r\n\r\n const baseIsObject = Boolean(baseValue) && typeof baseValue === \"object\";\r\n const patchIsObject = Boolean(patchValue) && typeof patchValue === \"object\";\r\n\r\n if (!baseIsObject || !patchIsObject) {\r\n return patchValue === undefined ? baseValue : patchValue;\r\n }\r\n\r\n const baseObject = baseValue as PlainObject;\r\n const patchObject = patchValue as PlainObject;\r\n const result: PlainObject = { ...baseObject };\r\n\r\n for (const key of Object.keys(patchObject)) {\r\n result[key] = mergeValue(baseObject[key], patchObject[key]);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n return mergeValue(current, patch) as TContext;\r\n}\r\n\r\n/** Merge the supplied initial value into the library's default context shape. */\r\nfunction withDefaults<TContext extends AdaptiveContextBase>(initialValue?: Partial<TContext>): TContext {\r\n if (!initialValue) {\r\n return initialContext as TContext;\r\n }\r\n\r\n return mergeContext(initialContext as TContext, initialValue);\r\n}\r\n\r\n/** Normalize any thrown value into an Error instance while preserving message and code when available. */\r\nfunction toError(error: unknown): Error {\r\n if (error instanceof Error) {\r\n return error;\r\n }\r\n\r\n if (typeof error === \"string\") {\r\n return new Error(error);\r\n }\r\n\r\n if (error && typeof error === \"object\") {\r\n const maybeError = error as { message?: unknown; code?: unknown };\r\n const message = typeof maybeError.message === \"string\" && maybeError.message.trim().length > 0\r\n ? maybeError.message\r\n : \"Unknown error while processing adaptive flow\";\r\n const normalized = new Error(message);\r\n if (typeof maybeError.code === \"string\" && maybeError.code.trim().length > 0) {\r\n normalized.name = maybeError.code;\r\n }\r\n (normalized as Error & { cause?: unknown }).cause = error;\r\n return normalized;\r\n }\r\n\r\n return new Error(`Unknown error while processing adaptive flow: ${String(error)}`);\r\n}\r\n\r\n/** Pause execution for the requested number of milliseconds. */\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n\r\n/** Clamp and normalize a retry delay into a safe non-negative millisecond value. */\r\nfunction normalizeDelay(delay: number | undefined, fallback: number): number {\r\n if (typeof delay !== \"number\" || Number.isNaN(delay) || delay < 0) {\r\n return fallback;\r\n }\r\n return delay;\r\n}\r\n\r\n/** Compute the delay for the current retry attempt using exponential backoff and optional jitter. */\r\n/** Compute the delay for a retry attempt using exponential backoff and optional jitter. */\r\nfunction computeRetryDelay(policy: AdaptiveFlowRetryPolicy | undefined, attempt: number): number {\r\n if (policy?.delay) {\r\n return normalizeDelay(policy.delay(attempt), 0);\r\n }\r\n\r\n const initialDelayMs = normalizeDelay(policy?.initialDelayMs, 250);\r\n const factor = typeof policy?.factor === \"number\" && policy.factor > 0 ? policy.factor : 2;\r\n const maxDelayMs = normalizeDelay(policy?.maxDelayMs, Number.POSITIVE_INFINITY);\r\n let delay = initialDelayMs * Math.pow(factor, Math.max(0, attempt - 1));\r\n\r\n if (policy?.jitter) {\r\n delay = delay * (0.5 + Math.random() * 0.5);\r\n }\r\n\r\n return Math.min(delay, maxDelayMs);\r\n}\r\n\r\n/** Execute an async operation with configurable retry/backoff behavior. */\r\nasync function withRetry<T>(\r\n operation: () => Promise<T>,\r\n retryPolicy: AdaptiveFlowRetryPolicy | undefined,\r\n): Promise<T> {\r\n if (!retryPolicy) {\r\n return operation();\r\n }\r\n\r\n const maxAttempts = Math.max(1, Math.trunc(retryPolicy.maxAttempts ?? 3));\r\n let lastError: unknown;\r\n\r\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\r\n try {\r\n return await operation();\r\n } catch (error) {\r\n lastError = error;\r\n const normalized = toError(error);\r\n const shouldRetry = retryPolicy.shouldRetry?.(normalized, attempt) ?? attempt < maxAttempts;\r\n if (!shouldRetry || attempt === maxAttempts) {\r\n throw normalized;\r\n }\r\n\r\n await sleep(computeRetryDelay(retryPolicy, attempt));\r\n }\r\n }\r\n\r\n throw toError(lastError);\r\n}\r\n\r\n/** Join class names while dropping falsy entries. */\r\nfunction cx(...names: Array<string | undefined | false | null>): string | undefined {\r\n const value = names.filter(Boolean).join(\" \").trim();\r\n return value.length > 0 ? value : undefined;\r\n}\r\n\r\n/** Resolve the configured storage driver or return null when running outside the browser. */\r\nfunction pickStorage(storage?: \"session\" | \"local\" | AdaptiveFlowStorageDriver): AdaptiveFlowStorageDriver | null {\r\n if (typeof window === \"undefined\") {\r\n return null;\r\n }\r\n\r\n if (!storage || storage === \"session\") {\r\n return window.sessionStorage;\r\n }\r\n\r\n if (storage === \"local\") {\r\n return window.localStorage;\r\n }\r\n\r\n return storage;\r\n}\r\n\r\n/** Read and deserialize persisted flow state from storage. */\r\nfunction readPersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n): PersistedAdaptiveFlowState<TContext> | null {\r\n if (!persistence) {\r\n return null;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return null;\r\n }\r\n\r\n const raw = storage.getItem(persistence.key);\r\n if (!raw) {\r\n return null;\r\n }\r\n\r\n const deserialize = persistence.deserialize ?? ((value: string) => JSON.parse(value));\r\n return deserialize(raw);\r\n}\r\n\r\n/** Serialize and persist the current flow state to storage. */\r\nfunction writePersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n state: PersistedAdaptiveFlowState<TContext>,\r\n): void {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return;\r\n }\r\n\r\n const serialize = persistence.serialize ?? ((value: PersistedAdaptiveFlowState<TContext>) => JSON.stringify(value));\r\n storage.setItem(persistence.key, serialize(state));\r\n}\r\n\r\n/** Remove persisted flow state from storage. */\r\nfunction clearPersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n): void {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return;\r\n }\r\n\r\n storage.removeItem(persistence.key);\r\n}\r\n\r\n/** Internal error type used to carry field-level validation failures. */\r\nclass FlowValidationError extends Error {\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n\r\n constructor(message: string, fieldErrors: AdaptiveFlowFieldErrors) {\r\n super(message);\r\n this.name = \"FlowValidationError\";\r\n this.fieldErrors = fieldErrors;\r\n }\r\n}\r\n\r\n/** Convert a validation issue into the internal validation error shape. */\r\nfunction toValidationError(\r\n issue: AdaptiveFlowValidationIssue,\r\n fallbackField?: string,\r\n): FlowValidationError {\r\n const field = issue.field ?? fallbackField;\r\n if (field) {\r\n return new FlowValidationError(issue.message, { [field]: issue.message });\r\n }\r\n return new FlowValidationError(issue.message, {});\r\n}\r\n\r\n/** Map schema validation issues into field error messages keyed by path. */\r\nfunction normalizeSchemaIssues(\r\n error: { message?: string; issues?: Array<{ message?: string; path?: Array<string | number> }> } | undefined,\r\n fallbackField?: string,\r\n): AdaptiveFlowFieldErrors {\r\n const fieldErrors: AdaptiveFlowFieldErrors = {};\r\n const issues = error?.issues ?? [];\r\n\r\n for (const issue of issues) {\r\n const path = issue.path?.length ? issue.path.map(String).join(\".\") : fallbackField;\r\n const message = issue.message?.trim() || error?.message || \"Validation failed.\";\r\n if (path && !fieldErrors[path]) {\r\n fieldErrors[path] = message;\r\n }\r\n }\r\n\r\n if (Object.keys(fieldErrors).length === 0 && fallbackField) {\r\n fieldErrors[fallbackField] = error?.message || \"Validation failed.\";\r\n }\r\n\r\n return fieldErrors;\r\n}\r\n\r\n/** Execute a validator result and raise a field-aware validation error when needed. */\r\nasync function assertValid(result: AdaptiveFlowValidationResult, fallbackField?: string): Promise<void> {\r\n const outcome = await result;\r\n if (!outcome) {\r\n return;\r\n }\r\n\r\n if (typeof outcome === \"string\") {\r\n const message = outcome.trim();\r\n if (message.length > 0) {\r\n throw new FlowValidationError(message, fallbackField ? { [fallbackField]: message } : {});\r\n }\r\n return;\r\n }\r\n\r\n if (outcome.message.trim().length > 0) {\r\n throw toValidationError(outcome, fallbackField);\r\n }\r\n}\r\n\r\n/** Execute an optional schema validator before running the custom validator chain. */\r\nasync function assertSchema<TValue>(\r\n schema: AdaptiveFlowSchema<TValue> | undefined,\r\n value: TValue,\r\n fallbackField?: string,\r\n): Promise<void> {\r\n if (!schema) {\r\n return;\r\n }\r\n\r\n if (schema.safeParse) {\r\n const result = schema.safeParse(value);\r\n if (!result.success) {\r\n const fieldErrors = normalizeSchemaIssues(result.error, fallbackField);\r\n throw new FlowValidationError(result.error?.message || \"Validation failed.\", fieldErrors);\r\n }\r\n return;\r\n }\r\n\r\n if (!schema.parse) {\r\n return;\r\n }\r\n\r\n try {\r\n schema.parse(value);\r\n } catch (error) {\r\n const normalized = error as {\r\n message?: string;\r\n issues?: Array<{ message?: string; path?: Array<string | number> }>;\r\n };\r\n const fieldErrors = normalizeSchemaIssues(\r\n {\r\n message: normalized?.message,\r\n issues: normalized?.issues,\r\n },\r\n fallbackField,\r\n );\r\n throw new FlowValidationError(normalized?.message || \"Validation failed.\", fieldErrors);\r\n }\r\n}\r\n\r\n/** Merge built-in style defaults with user overrides or return raw overrides in unstyled mode. */\r\nfunction resolveStyles(\r\n unstyled: boolean,\r\n styleOverrides?: AdaptiveFlowStyles,\r\n): Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined> {\r\n const resolved = {} as Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n\r\n for (const slot of styleSlots) {\r\n if (unstyled) {\r\n resolved[slot] = styleOverrides?.[slot];\r\n continue;\r\n }\r\n\r\n resolved[slot] = {\r\n ...defaultStyles[slot],\r\n ...(styleOverrides?.[slot] ?? {}),\r\n };\r\n }\r\n\r\n return resolved;\r\n}\r\n\r\n/** Headless flow hook that owns state, evaluation, persistence, retries, and adapter wiring. */\r\nexport function useAdaptiveFlow<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n}: UseAdaptiveFlowOptions<TContext, TRequirement, TStep>): UseAdaptiveFlowResult<\r\n TContext,\r\n TRequirement,\r\n TStep\r\n> {\r\n const normalizedRequirements = React.useMemo(\r\n () => (requirements ?? (defaultRequirements as unknown as readonly TRequirement[])),\r\n [requirements],\r\n );\r\n const normalizedCompleteStep = React.useMemo(\r\n () => (completeStep ?? (\"COMPLETE\" as TStep)),\r\n [completeStep],\r\n );\r\n const resolvers = React.useMemo(\r\n () =>\r\n ({\r\n ...(defaultRequirementResolvers as unknown as Partial<\r\n Record<TRequirement, RequirementResolver<TContext, TStep>>\r\n >),\r\n ...(requirementResolvers ?? {}),\r\n }) as Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>,\r\n [requirementResolvers],\r\n );\r\n const graph = React.useMemo(\r\n () =>\r\n requirementGraph ??\r\n createDefaultRequirementGraph({\r\n requirements: normalizedRequirements,\r\n resolvers,\r\n priorities: requirementGraphConfig?.priorities,\r\n conditions: requirementGraphConfig?.conditions,\r\n dependencies: requirementGraphConfig?.dependencies,\r\n }),\r\n [\r\n requirementGraph,\r\n normalizedRequirements,\r\n resolvers,\r\n requirementGraphConfig?.priorities,\r\n requirementGraphConfig?.conditions,\r\n requirementGraphConfig?.dependencies,\r\n ],\r\n );\r\n\r\n type RuntimeState = {\r\n step: TStep;\r\n hasEvaluated: boolean;\r\n missingRequirements: TRequirement[];\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n oauthPendingProvider: OAuthProvider | null;\r\n persistenceHydrated: boolean;\r\n };\r\n\r\n type RuntimeAction =\r\n | {\r\n type: \"evaluated\";\r\n missingRequirements: TRequirement[];\r\n step: TStep;\r\n transition: AdaptiveStepTransition<TStep>;\r\n }\r\n | { type: \"set_busy\"; busy: boolean }\r\n | { type: \"set_message\"; message: string | null }\r\n | { type: \"set_error\"; errorMessage: string | null }\r\n | { type: \"set_field_errors\"; fieldErrors: AdaptiveFlowFieldErrors }\r\n | { type: \"start_job\" }\r\n | { type: \"set_oauth_pending\"; provider: OAuthProvider | null }\r\n | { type: \"set_hydrated\"; hydrated: boolean };\r\n\r\n const runtimeReducer = (state: RuntimeState, action: RuntimeAction): RuntimeState => {\r\n switch (action.type) {\r\n case \"evaluated\":\r\n return {\r\n ...state,\r\n step: action.step,\r\n hasEvaluated: true,\r\n missingRequirements: action.missingRequirements,\r\n transitions: [...state.transitions, action.transition].slice(-100),\r\n };\r\n case \"set_busy\":\r\n return { ...state, busy: action.busy };\r\n case \"set_message\":\r\n return { ...state, message: action.message };\r\n case \"set_error\":\r\n return { ...state, errorMessage: action.errorMessage };\r\n case \"set_field_errors\":\r\n return { ...state, fieldErrors: action.fieldErrors };\r\n case \"start_job\":\r\n return { ...state, busy: true, errorMessage: null, fieldErrors: {} };\r\n case \"set_oauth_pending\":\r\n return { ...state, oauthPendingProvider: action.provider };\r\n case \"set_hydrated\":\r\n return { ...state, persistenceHydrated: action.hydrated };\r\n default:\r\n return state;\r\n }\r\n };\r\n\r\n const [context, setContext] = React.useState<TContext>(() => withDefaults(initialValue));\r\n const [runtime, dispatch] = React.useReducer(runtimeReducer, {\r\n step: normalizedCompleteStep,\r\n hasEvaluated: false,\r\n missingRequirements: [],\r\n transitions: [],\r\n busy: false,\r\n message: null,\r\n errorMessage: null,\r\n fieldErrors: {},\r\n oauthPendingProvider: null,\r\n persistenceHydrated: !persistence,\r\n } satisfies RuntimeState);\r\n\r\n const {\r\n step,\r\n hasEvaluated,\r\n missingRequirements,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n oauthPendingProvider,\r\n persistenceHydrated,\r\n } = runtime;\r\n const attemptByStepRef = React.useRef<Record<string, number>>({});\r\n const previousStepRef = React.useRef<TStep | null>(null);\r\n const evaluationRef = React.useRef(0);\r\n const completed = React.useRef(false);\r\n\r\n const reportPersistenceError = React.useCallback(\r\n (error: unknown, phase: \"read\" | \"write\" | \"clear\") => {\r\n const normalized = toError(error);\r\n persistence?.onError?.(normalized, phase);\r\n onError?.(normalized);\r\n },\r\n [onError, persistence],\r\n );\r\n\r\n React.useEffect(() => {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n try {\r\n const persisted = readPersistedState(persistence);\r\n if (persisted?.context) {\r\n setContext(mergeContext(withDefaults(initialValue), persisted.context));\r\n }\r\n if (persisted?.oauthPendingProvider) {\r\n dispatch({ type: \"set_oauth_pending\", provider: persisted.oauthPendingProvider });\r\n }\r\n } catch (error) {\r\n reportPersistenceError(error, \"read\");\r\n } finally {\r\n dispatch({ type: \"set_hydrated\", hydrated: true });\r\n }\r\n }, [initialValue, persistence, reportPersistenceError]);\r\n\r\n React.useEffect(() => {\r\n const currentEvaluation = ++evaluationRef.current;\r\n\r\n void (async () => {\r\n const [missing, next] = await Promise.all([\r\n getMissingRequirements(context, graph as RequirementGraph<TContext, TRequirement, TStep>),\r\n evaluateNextStep(context, graph as RequirementGraph<TContext, TRequirement, TStep>, normalizedCompleteStep),\r\n ]);\r\n\r\n if (currentEvaluation !== evaluationRef.current) {\r\n return;\r\n }\r\n\r\n const from = previousStepRef.current;\r\n const attemptKey = String(next);\r\n const nextAttempt = from === next ? (attemptByStepRef.current[attemptKey] ?? 0) + 1 : 1;\r\n attemptByStepRef.current[attemptKey] = nextAttempt;\r\n\r\n const transition: AdaptiveStepTransition<TStep> = {\r\n from,\r\n to: next,\r\n at: Date.now(),\r\n attempt: nextAttempt,\r\n };\r\n\r\n dispatch({\r\n type: \"evaluated\",\r\n missingRequirements: missing,\r\n step: next,\r\n transition,\r\n });\r\n previousStepRef.current = next;\r\n onStepTransition?.(transition, context);\r\n })().catch((error) => {\r\n if (currentEvaluation !== evaluationRef.current) {\r\n return;\r\n }\r\n\r\n const normalized = toError(error);\r\n dispatch({ type: \"set_field_errors\", fieldErrors: {} });\r\n dispatch({ type: \"set_error\", errorMessage: normalized.message });\r\n onError?.(normalized);\r\n });\r\n }, [context, graph, normalizedCompleteStep, onError, onStepTransition]);\r\n\r\n React.useEffect(() => {\r\n if (step === normalizedCompleteStep) {\r\n if (!completed.current) {\r\n completed.current = true;\r\n onComplete?.(context);\r\n\r\n const shouldClearPersistence = persistence?.clearOnComplete ?? true;\r\n if (shouldClearPersistence) {\r\n try {\r\n clearPersistedState(persistence);\r\n } catch (error) {\r\n reportPersistenceError(error, \"clear\");\r\n }\r\n }\r\n }\r\n } else {\r\n completed.current = false;\r\n }\r\n }, [context, normalizedCompleteStep, onComplete, persistence, reportPersistenceError, step]);\r\n\r\n React.useEffect(() => {\r\n if (!persistence || !persistenceHydrated) {\r\n return;\r\n }\r\n\r\n try {\r\n writePersistedState(persistence, { context, oauthPendingProvider });\r\n } catch (error) {\r\n reportPersistenceError(error, \"write\");\r\n }\r\n }, [context, oauthPendingProvider, persistence, persistenceHydrated, reportPersistenceError]);\r\n\r\n const run = React.useCallback(\r\n async (job: () => Promise<void>) => {\r\n dispatch({ type: \"start_job\" });\r\n try {\r\n await job();\r\n } catch (error) {\r\n if (error instanceof FlowValidationError) {\r\n dispatch({ type: \"set_field_errors\", fieldErrors: error.fieldErrors });\r\n if (Object.keys(error.fieldErrors).length === 0) {\r\n dispatch({ type: \"set_error\", errorMessage: error.message });\r\n onError?.(error);\r\n }\r\n } else {\r\n const normalized = toError(error);\r\n dispatch({ type: \"set_error\", errorMessage: normalized.message });\r\n onError?.(normalized);\r\n }\r\n } finally {\r\n dispatch({ type: \"set_busy\", busy: false });\r\n }\r\n },\r\n [onError],\r\n );\r\n\r\n const patchContext = React.useCallback((patch: Partial<TContext>) => {\r\n setContext((prev) => mergeContext(prev, patch));\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n const completeOAuth = adapter?.completeOAuth;\r\n if (!oauthPendingProvider || !completeOAuth) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n const patch = await withRetry(\r\n () => completeOAuth(oauthPendingProvider, context),\r\n retryPolicy,\r\n );\r\n if (patch) {\r\n patchContext(patch);\r\n }\r\n dispatch({ type: \"set_oauth_pending\", provider: null });\r\n dispatch({ type: \"set_message\", message: \"OAuth sign-in completed.\" });\r\n });\r\n }, [adapter, context, oauthPendingProvider, patchContext, retryPolicy, run]);\r\n\r\n const handleEmail = (emailInput: string) => {\r\n const email = emailInput.trim().toLowerCase();\r\n if (!email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.email, email, \"email\");\r\n if (validators?.email) {\r\n await assertValid(validators.email(email, { context }), \"email\");\r\n }\r\n\r\n const identity = adapter?.lookupByEmail\r\n ? await withRetry(() => adapter.lookupByEmail!(email), retryPolicy)\r\n : null;\r\n\r\n patchContext({\r\n email,\r\n hasPassword: Boolean(identity?.hasPassword),\r\n isVerified: Boolean(identity?.isVerified),\r\n agreedToTos: Boolean(identity?.agreedToTos),\r\n profile: {\r\n firstName: identity?.profile?.firstName ?? null,\r\n lastName: identity?.profile?.lastName ?? null,\r\n jobTitle: identity?.profile?.jobTitle ?? null,\r\n },\r\n } as Partial<TContext>);\r\n\r\n if (identity?.accountExists && identity.hasPassword) {\r\n dispatch({ type: \"set_message\", message: \"Welcome back. Enter your password to continue.\" });\r\n return;\r\n }\r\n\r\n if (adapter?.requestOtp) {\r\n await withRetry(() => adapter.requestOtp!(email), retryPolicy);\r\n dispatch({ type: \"set_message\", message: \"We sent a 6-digit code to your inbox.\" });\r\n } else {\r\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\r\n const isDev = env !== \"production\";\r\n if (!isDev) {\r\n throw new Error(\"OTP adapter is required in production. Provide adapter.requestOtp.\");\r\n }\r\n\r\n patchContext({ isVerified: true } as Partial<TContext>);\r\n dispatch({\r\n type: \"set_message\",\r\n message: \"No OTP adapter configured. Verification was skipped in development mode.\",\r\n });\r\n }\r\n });\r\n };\r\n\r\n const handleOtp = (code: string) => {\r\n if (!context.email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.otp, code, \"otp\");\r\n if (validators?.otp) {\r\n await assertValid(validators.otp(code, { context, email: context.email as string }), \"otp\");\r\n }\r\n\r\n if (adapter?.verifyOtp) {\r\n await withRetry(() => adapter.verifyOtp!(context.email as string, code), retryPolicy);\r\n }\r\n patchContext({ isVerified: true } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Email verified.\" });\r\n });\r\n };\r\n\r\n const handlePassword = (password: string) => {\r\n if (!context.email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.password, password, \"password\");\r\n if (validators?.password) {\r\n await assertValid(\r\n validators.password(password, { context, hasPassword: context.hasPassword }),\r\n \"password\",\r\n );\r\n }\r\n\r\n if (context.hasPassword) {\r\n if (adapter?.signInWithPassword) {\r\n await withRetry(\r\n () => adapter.signInWithPassword!(context.email as string, password),\r\n retryPolicy,\r\n );\r\n }\r\n } else {\r\n if (adapter?.createPassword) {\r\n await withRetry(() => adapter.createPassword!(password), retryPolicy);\r\n }\r\n patchContext({ hasPassword: true } as Partial<TContext>);\r\n }\r\n dispatch({ type: \"set_message\", message: \"Password step complete.\" });\r\n });\r\n };\r\n\r\n const handleProfile = (profile: AdaptiveContextBase[\"profile\"]) => {\r\n void run(async () => {\r\n await assertSchema(schemas?.profile, profile, \"profile\");\r\n if (validators?.profile) {\r\n await assertValid(validators.profile(profile, { context }), \"profile\");\r\n }\r\n\r\n const next = mergeContext(context, {\r\n profile: {\r\n firstName: profile.firstName || null,\r\n lastName: profile.lastName || null,\r\n jobTitle: profile.jobTitle || null,\r\n },\r\n } as Partial<TContext>);\r\n\r\n if (adapter?.saveProfile) {\r\n await withRetry(() => adapter.saveProfile!(next), retryPolicy);\r\n }\r\n\r\n patchContext({ profile: next.profile } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Profile saved.\" });\r\n });\r\n };\r\n\r\n const handleTos = () => {\r\n void run(async () => {\r\n await assertSchema(schemas?.tos, true, \"tos\");\r\n if (validators?.tos) {\r\n await assertValid(validators.tos(true, { context }), \"tos\");\r\n }\r\n\r\n const next = mergeContext(context, { agreedToTos: true } as Partial<TContext>);\r\n if (adapter?.acceptTos) {\r\n await withRetry(() => adapter.acceptTos!(next), retryPolicy);\r\n }\r\n patchContext({ agreedToTos: true } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Terms accepted.\" });\r\n });\r\n };\r\n\r\n const handleOAuth = (provider: OAuthProvider) => {\r\n const startOAuth = adapter?.startOAuth;\r\n if (!startOAuth) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n dispatch({ type: \"set_oauth_pending\", provider });\r\n dispatch({ type: \"set_message\", message: `Starting ${provider} sign-in...` });\r\n await withRetry(() => startOAuth(provider, context), retryPolicy);\r\n });\r\n };\r\n\r\n return {\r\n context,\r\n step,\r\n hasEvaluated,\r\n completeStep: normalizedCompleteStep,\r\n requirements: normalizedRequirements,\r\n missingRequirements,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n setContextPatch: patchContext,\r\n run,\r\n handleEmail,\r\n handleOtp,\r\n handlePassword,\r\n handleProfile,\r\n handleTos,\r\n handleOAuth,\r\n };\r\n}\r\n\r\n/** Default UI wrapper around useAdaptiveFlow that renders the built-in flow shell and step UI. */\r\nexport function AdaptiveFlow<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n stepTitles,\r\n renderStep,\r\n stepRegistry,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n className,\r\n classNames,\r\n styles,\r\n unstyled = false,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n}: AdaptiveFlowProps<TContext, TRequirement, TStep>) {\r\n const uiStyles = React.useMemo(() => resolveStyles(unstyled, styles), [unstyled, styles]);\r\n\r\n const {\r\n context,\r\n step,\r\n hasEvaluated,\r\n completeStep: normalizedCompleteStep,\r\n requirements: normalizedRequirements,\r\n missingRequirements: missing,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n setContextPatch: patchContext,\r\n run,\r\n handleEmail,\r\n handleOtp,\r\n handlePassword,\r\n handleProfile,\r\n handleTos,\r\n handleOAuth,\r\n } = useAdaptiveFlow<TContext, TRequirement, TStep>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n });\r\n\r\n const normalizedOAuthProviders = React.useMemo(\r\n () => (oauthProviders && oauthProviders.length > 0 ? oauthProviders : defaultOAuthProviders),\r\n [oauthProviders],\r\n );\r\n\r\n const completedCount = hasEvaluated\r\n ? normalizedRequirements.length - missing.length\r\n : 0;\r\n const needsJobTitle = normalizedRequirements.includes(\"has_job_title\" as TRequirement);\r\n const stepLabel = hasEvaluated\r\n ? (stepTitles?.[step] ?? defaultStepTitle[step] ?? step)\r\n : \"Loading flow\";\r\n\r\n const defaultView = (\r\n <>\r\n {!hasEvaluated ? (\r\n <div className={classNames?.info} style={uiStyles.info}>\r\n Evaluating required steps...\r\n </div>\r\n ) : null}\r\n {step === \"COLLECT_EMAIL\" ? (\r\n <EmailBlock\r\n onSubmit={handleEmail}\r\n disabled={busy}\r\n error={fieldErrors.email}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"VERIFY_OTP\" ? (\r\n <OtpBlock\r\n onSubmit={handleOtp}\r\n email={context.email ?? \"your email\"}\r\n disabled={busy}\r\n error={fieldErrors.otp}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_PASSWORD\" ? (\r\n <PasswordBlock\r\n onSubmit={handlePassword}\r\n disabled={busy}\r\n hasPassword={context.hasPassword}\r\n error={fieldErrors.password}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_PROFILE\" ? (\r\n <ProfileBlock\r\n defaultValue={context.profile}\r\n requireJobTitle={needsJobTitle}\r\n onSubmit={handleProfile}\r\n disabled={busy}\r\n errors={fieldErrors}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_TOS\" ? (\r\n <TosBlock\r\n onSubmit={handleTos}\r\n disabled={busy}\r\n error={fieldErrors.tos}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === normalizedCompleteStep ? (\r\n <CompleteBlock styles={uiStyles} classNames={classNames} />\r\n ) : null}\r\n {!builtInDefaultSteps.has(String(step)) && step !== normalizedCompleteStep ? (\r\n <div className={classNames?.info} style={uiStyles.info}>\r\n No default renderer for step \"{step}\". Provide renderStep to handle custom steps.\r\n </div>\r\n ) : null}\r\n </>\r\n );\r\n\r\n const customView = renderStep\r\n ? renderStep({\r\n step,\r\n context,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n missingRequirements: missing,\r\n requirements: normalizedRequirements,\r\n defaultView,\r\n setContextPatch: patchContext,\r\n run,\r\n adapter,\r\n transitions,\r\n })\r\n : null;\r\n const registryView = stepRegistry?.[step]\r\n ? stepRegistry[step]?.({\r\n step,\r\n context,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n missingRequirements: missing,\r\n requirements: normalizedRequirements,\r\n setContextPatch: patchContext,\r\n run,\r\n adapter,\r\n transitions,\r\n })\r\n : null;\r\n\r\n return (\r\n <div className={cx(className, classNames?.shell)} style={uiStyles.shell}>\r\n <div className={classNames?.headerRow} style={uiStyles.headerRow}>\r\n <div>\r\n <div className={classNames?.eyebrow} style={uiStyles.eyebrow}>\r\n Adaptive flow\r\n </div>\r\n <h2 className={classNames?.title} style={uiStyles.title}>\r\n {stepLabel}\r\n </h2>\r\n </div>\r\n <div className={classNames?.badge} style={uiStyles.badge}>\r\n {completedCount}/{normalizedRequirements.length}\r\n </div>\r\n </div>\r\n\r\n {message ? (\r\n <div className={classNames?.success} style={uiStyles.success}>\r\n {message}\r\n </div>\r\n ) : null}\r\n {errorMessage ? (\r\n <div className={classNames?.error} style={uiStyles.error}>\r\n {errorMessage}\r\n </div>\r\n ) : null}\r\n\r\n {customView ?? registryView ?? defaultView}\r\n\r\n <div className={classNames?.footer} style={uiStyles.footer}>\r\n {normalizedOAuthProviders.map((provider) => (\r\n <button\r\n key={provider.id}\r\n type=\"button\"\r\n className={classNames?.oauthButton}\r\n style={uiStyles.oauthButton}\r\n disabled={busy || !adapter?.startOAuth}\r\n onClick={() => {\r\n handleOAuth(provider.id);\r\n }}\r\n >\r\n {provider.label}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ntype BlockBaseProps = {\r\n disabled?: boolean;\r\n styles: Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n classNames?: AdaptiveFlowClassNames;\r\n};\r\n\r\n/** Default email collection form used by the built-in component. */\r\nfunction EmailBlock({\r\n onSubmit,\r\n disabled,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (email: string) => void; error?: string }) {\r\n const [email, setEmail] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-email-error\";\r\n return (\r\n <form\r\n className={classNames?.formRow}\r\n style={styles.formRow}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(email);\r\n }}\r\n >\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"email\"\r\n autoComplete=\"email\"\r\n placeholder=\"Enter your email\"\r\n value={email}\r\n onChange={(event) => setEmail(event.target.value)}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n />\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </form>\r\n );\r\n}\r\n\r\n/** Default OTP form used by the built-in component. */\r\nfunction OtpBlock({\r\n onSubmit,\r\n disabled,\r\n email,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (code: string) => void; email: string; error?: string }) {\r\n const [code, setCode] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-otp-error\";\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(code);\r\n }}\r\n >\r\n <p className={classNames?.caption} style={styles.caption}>\r\n Use the verification code sent to {email}.\r\n </p>\r\n <div className={classNames?.formRow} style={styles.formRow}>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n inputMode=\"numeric\"\r\n placeholder=\"Enter 6-digit code\"\r\n value={code}\r\n onChange={(event) => setCode(event.target.value.replace(/\\D/g, \"\").slice(0, 6))}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n maxLength={6}\r\n pattern=\"[0-9]{6}\"\r\n />\r\n <button\r\n className={classNames?.button}\r\n style={styles.button}\r\n disabled={disabled || code.length !== 6}\r\n type=\"submit\"\r\n >\r\n Verify\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </div>\r\n </form>\r\n );\r\n}\r\n\r\n/** Default password form used by the built-in component. */\r\nfunction PasswordBlock({\r\n onSubmit,\r\n disabled,\r\n hasPassword,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (password: string) => void; hasPassword: boolean; error?: string }) {\r\n const [password, setPassword] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-password-error\";\r\n return (\r\n <form\r\n className={classNames?.formRow}\r\n style={styles.formRow}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(password);\r\n }}\r\n >\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"password\"\r\n autoComplete={hasPassword ? \"current-password\" : \"new-password\"}\r\n placeholder={hasPassword ? \"Enter your password\" : \"Create a password\"}\r\n value={password}\r\n onChange={(event) => setPassword(event.target.value)}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n minLength={8}\r\n />\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </form>\r\n );\r\n}\r\n\r\n/** Default profile form used by the built-in component. */\r\nfunction ProfileBlock({\r\n onSubmit,\r\n disabled,\r\n defaultValue,\r\n requireJobTitle,\r\n errors,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & {\r\n onSubmit: (profile: AdaptiveContext[\"profile\"]) => void;\r\n defaultValue: AdaptiveContext[\"profile\"];\r\n requireJobTitle: boolean;\r\n errors?: AdaptiveFlowFieldErrors;\r\n}) {\r\n const [firstName, setFirstName] = React.useState(defaultValue.firstName ?? \"\");\r\n const [lastName, setLastName] = React.useState(defaultValue.lastName ?? \"\");\r\n const [jobTitle, setJobTitle] = React.useState(defaultValue.jobTitle ?? \"\");\r\n const firstNameError = errors?.firstName ?? errors?.[\"profile.firstName\"];\r\n const lastNameError = errors?.lastName ?? errors?.[\"profile.lastName\"];\r\n const jobTitleError = errors?.jobTitle ?? errors?.[\"profile.jobTitle\"];\r\n const profileError = errors?.profile;\r\n\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit({\r\n firstName: firstName || null,\r\n lastName: lastName || null,\r\n jobTitle: jobTitle || null,\r\n });\r\n }}\r\n >\r\n <div className={classNames?.formRow} style={styles.formRow}>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"given-name\"\r\n placeholder=\"First name\"\r\n value={firstName}\r\n onChange={(event) => setFirstName(event.target.value)}\r\n aria-invalid={Boolean(firstNameError)}\r\n required\r\n />\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"family-name\"\r\n placeholder=\"Last name\"\r\n value={lastName}\r\n onChange={(event) => setLastName(event.target.value)}\r\n aria-invalid={Boolean(lastNameError)}\r\n required\r\n />\r\n </div>\r\n {firstNameError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {firstNameError}\r\n </div>\r\n ) : null}\r\n {lastNameError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {lastNameError}\r\n </div>\r\n ) : null}\r\n {requireJobTitle ? (\r\n <>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"organization-title\"\r\n placeholder=\"Job title\"\r\n value={jobTitle}\r\n onChange={(event) => setJobTitle(event.target.value)}\r\n aria-invalid={Boolean(jobTitleError)}\r\n required\r\n />\r\n {jobTitleError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {jobTitleError}\r\n </div>\r\n ) : null}\r\n </>\r\n ) : null}\r\n {profileError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {profileError}\r\n </div>\r\n ) : null}\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n/** Default terms acceptance form used by the built-in component. */\r\nfunction TosBlock({\r\n onSubmit,\r\n disabled,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: () => void; error?: string }) {\r\n const [checked, setChecked] = React.useState(false);\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n if (checked) {\r\n onSubmit();\r\n }\r\n }}\r\n >\r\n <label className={classNames?.checkboxRow} style={styles.checkboxRow}>\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={(event) => setChecked(event.target.checked)}\r\n aria-invalid={Boolean(error)}\r\n />\r\n <span>I agree to the Terms of Service and Privacy Policy.</span>\r\n </label>\r\n {error ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n <button\r\n className={classNames?.button}\r\n style={styles.button}\r\n disabled={disabled || !checked}\r\n type=\"submit\"\r\n >\r\n Accept and Continue\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n/** Completion panel shown when the flow reaches the terminal step. */\r\nfunction CompleteBlock({\r\n styles,\r\n classNames,\r\n}: {\r\n styles: Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n classNames?: AdaptiveFlowClassNames;\r\n}) {\r\n return (\r\n <div className={classNames?.complete} style={styles.complete}>\r\n <strong>You are all set.</strong>\r\n <p className={classNames?.caption} style={styles.caption}>\r\n All requirements are complete.\r\n </p>\r\n </div>\r\n );\r\n}\r\n\r\nconst defaultStyles: Record<AdaptiveFlowStyleSlot, React.CSSProperties> = {\r\n shell: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 12,\r\n width: \"100%\",\r\n maxWidth: 560,\r\n border: \"1px solid #cbd5e1\",\r\n borderRadius: 14,\r\n padding: 16,\r\n background: \"#f8fafc\",\r\n color: \"#0f172a\",\r\n fontFamily: \"system-ui, -apple-system, Segoe UI, Roboto, sans-serif\",\r\n },\r\n headerRow: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n gap: 12,\r\n },\r\n eyebrow: {\r\n fontSize: 12,\r\n textTransform: \"uppercase\",\r\n letterSpacing: 1.2,\r\n color: \"#475569\",\r\n marginBottom: 4,\r\n },\r\n title: {\r\n margin: 0,\r\n fontSize: 22,\r\n lineHeight: \"28px\",\r\n },\r\n badge: {\r\n border: \"1px solid #cbd5e1\",\r\n borderRadius: 999,\r\n padding: \"4px 10px\",\r\n fontSize: 12,\r\n fontWeight: 600,\r\n color: \"#1e293b\",\r\n background: \"#ffffff\",\r\n },\r\n success: {\r\n border: \"1px solid #bbf7d0\",\r\n background: \"#f0fdf4\",\r\n color: \"#166534\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n error: {\r\n border: \"1px solid #fecaca\",\r\n background: \"#fef2f2\",\r\n color: \"#991b1b\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n info: {\r\n border: \"1px solid #bfdbfe\",\r\n background: \"#eff6ff\",\r\n color: \"#1e3a8a\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n caption: {\r\n margin: 0,\r\n color: \"#334155\",\r\n fontSize: 14,\r\n },\r\n formRow: {\r\n display: \"flex\",\r\n gap: 8,\r\n alignItems: \"center\",\r\n },\r\n formColumn: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 10,\r\n },\r\n input: {\r\n width: \"100%\",\r\n border: \"1px solid #94a3b8\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 12px\",\r\n fontSize: 14,\r\n background: \"#ffffff\",\r\n color: \"#0f172a\",\r\n },\r\n button: {\r\n border: \"1px solid #94a3b8\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 14px\",\r\n fontWeight: 600,\r\n background: \"#ffffff\",\r\n color: \"#0f172a\",\r\n whiteSpace: \"nowrap\",\r\n cursor: \"pointer\",\r\n },\r\n checkboxRow: {\r\n display: \"flex\",\r\n gap: 8,\r\n alignItems: \"flex-start\",\r\n fontSize: 14,\r\n color: \"#374151\",\r\n },\r\n complete: {\r\n border: \"1px solid #bbf7d0\",\r\n background: \"#f0fdf4\",\r\n color: \"#166534\",\r\n borderRadius: 12,\r\n padding: 12,\r\n },\r\n footer: {\r\n display: \"flex\",\r\n gap: 8,\r\n marginTop: 4,\r\n },\r\n oauthButton: {\r\n flex: 1,\r\n border: \"1px solid #94a3b8\",\r\n borderRadius: 8,\r\n padding: \"10px 12px\",\r\n background: \"#ffffff\",\r\n color: \"#0f172a\",\r\n cursor: \"pointer\",\r\n },\r\n};\r\n","/**\r\n * Built-in requirement keys that cover the default flow states supported by the package.\r\n */\r\nexport const DefaultAppRequirements = {\r\n HAS_EMAIL: \"has_email\",\r\n EMAIL_VERIFIED: \"email_verified\",\r\n HAS_PASSWORD: \"has_password\",\r\n HAS_FIRST_NAME: \"has_first_name\",\r\n HAS_LAST_NAME: \"has_last_name\",\r\n ACCEPTED_TOS: \"accepted_tos\",\r\n HAS_JOB_TITLE: \"has_job_title\",\r\n} as const;\r\n\r\n/**\r\n * Built-in step keys used by the default flow UI and default requirement resolvers.\r\n */\r\nexport const DefaultAdaptiveSteps = {\r\n COLLECT_EMAIL: \"COLLECT_EMAIL\",\r\n VERIFY_OTP: \"VERIFY_OTP\",\r\n COLLECT_PASSWORD: \"COLLECT_PASSWORD\",\r\n COLLECT_PROFILE: \"COLLECT_PROFILE\",\r\n COLLECT_TOS: \"COLLECT_TOS\",\r\n COMPLETE: \"COMPLETE\",\r\n} as const;\r\n\r\n/** Requirement key from the built-in default requirement set. */\r\nexport type DefaultAppRequirement = (typeof DefaultAppRequirements)[keyof typeof DefaultAppRequirements];\r\n/** Step key from the built-in default step set. */\r\nexport type DefaultAdaptiveStep = (typeof DefaultAdaptiveSteps)[keyof typeof DefaultAdaptiveSteps];\r\n\r\n/** Requirement key used by the engine, including custom app-specific requirements. */\r\nexport type AppRequirement = DefaultAppRequirement | (string & {});\r\n/** Step key used by the engine, including custom app-specific steps. */\r\nexport type AdaptiveStep = DefaultAdaptiveStep | (string & {});\r\n\r\n/** Base context shape managed by the default flow helpers and UI. */\r\nexport type AdaptiveContextBase = {\r\n email: string | null;\r\n isVerified: boolean;\r\n hasPassword: boolean;\r\n profile: {\r\n firstName: string | null;\r\n lastName: string | null;\r\n jobTitle: string | null;\r\n };\r\n agreedToTos: boolean;\r\n};\r\n\r\n/** Alias for the default context shape used by the built-in component and hook. */\r\nexport type AdaptiveContext = AdaptiveContextBase;\r\n\r\n/** Default set of requirements used when a flow does not provide its own list. */\r\nexport const defaultRequirements: DefaultAppRequirement[] = [\r\n DefaultAppRequirements.HAS_EMAIL,\r\n DefaultAppRequirements.EMAIL_VERIFIED,\r\n DefaultAppRequirements.HAS_PASSWORD,\r\n DefaultAppRequirements.HAS_FIRST_NAME,\r\n DefaultAppRequirements.HAS_LAST_NAME,\r\n DefaultAppRequirements.HAS_JOB_TITLE,\r\n DefaultAppRequirements.ACCEPTED_TOS,\r\n];\r\n\r\n/** Default initial context used by the component and hook when no initialValue is provided. */\r\nexport const initialContext: AdaptiveContextBase = {\r\n email: null,\r\n isVerified: false,\r\n hasPassword: false,\r\n profile: {\r\n firstName: null,\r\n lastName: null,\r\n jobTitle: null,\r\n },\r\n agreedToTos: false,\r\n};\r\n\r\n/** Utility type for APIs that may return either a synchronous or asynchronous value. */\r\nexport type MaybePromise<T> = T | Promise<T>;\r\n\r\n/** Resolver contract that maps one requirement to the step shown when it is unmet. */\r\nexport type RequirementResolver<\r\n TContext = AdaptiveContextBase,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n isMet: (context: TContext) => MaybePromise<boolean>;\r\n step: TStep;\r\n};\r\n\r\n/**\r\n * Single requirement node in the requirement graph.\r\n * The engine evaluates nodes by priority, dependency readiness, and custom conditions.\r\n */\r\nexport type RequirementGraphNode<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n requirement: TRequirement;\r\n step: TStep;\r\n isMet: (context: TContext) => MaybePromise<boolean>;\r\n when?: (context: TContext) => MaybePromise<boolean>;\r\n priority?: number;\r\n dependsOn?: readonly TRequirement[];\r\n};\r\n\r\n/** Ordered requirement graph consumed by the engine evaluation helpers. */\r\nexport type RequirementGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = readonly RequirementGraphNode<TContext, TRequirement, TStep>[];\r\n\r\n/** Default requirement-to-step resolvers used by the built-in flow UI. */\r\nexport const defaultRequirementResolvers: Record<\r\n DefaultAppRequirement,\r\n RequirementResolver<AdaptiveContextBase, AdaptiveStep>\r\n> = {\r\n has_email: {\r\n isMet: (context) => Boolean(context.email),\r\n step: DefaultAdaptiveSteps.COLLECT_EMAIL,\r\n },\r\n email_verified: {\r\n isMet: (context) => context.isVerified,\r\n step: DefaultAdaptiveSteps.VERIFY_OTP,\r\n },\r\n has_password: {\r\n isMet: (context) => context.hasPassword,\r\n step: DefaultAdaptiveSteps.COLLECT_PASSWORD,\r\n },\r\n has_first_name: {\r\n isMet: (context) => Boolean(context.profile.firstName),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n has_last_name: {\r\n isMet: (context) => Boolean(context.profile.lastName),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n accepted_tos: {\r\n isMet: (context) => context.agreedToTos,\r\n step: DefaultAdaptiveSteps.COLLECT_TOS,\r\n },\r\n has_job_title: {\r\n isMet: (context) => Boolean(context.profile.jobTitle),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n};\r\n\r\n/**\r\n * Build a requirement graph from a requirement list, resolver map, and optional graph metadata.\r\n *\r\n * The function validates that dependencies refer to known resolver-backed requirements and\r\n * rejects circular dependency chains at graph creation time.\r\n */\r\nexport function createRequirementGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n requirements: readonly TRequirement[],\r\n resolvers: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>,\r\n options?: {\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n },\r\n): RequirementGraph<TContext, TRequirement, TStep> {\r\n const graph: RequirementGraphNode<TContext, TRequirement, TStep>[] = [];\r\n const requirementSet = new Set(requirements);\r\n const resolverBackedRequirements = new Set(\r\n requirements.filter((requirement) => Boolean(resolvers[requirement])),\r\n );\r\n\r\n for (const requirement of requirements) {\r\n const resolver = resolvers[requirement];\r\n if (!resolver) {\r\n continue;\r\n }\r\n\r\n const dependsOn = options?.dependencies?.[requirement] ?? [];\r\n for (const dependency of dependsOn) {\r\n if (!requirementSet.has(dependency)) {\r\n throw new Error(\r\n `Invalid dependency \\\"${String(dependency)}\\\" referenced by requirement \\\"${String(requirement)}\\\".`,\r\n );\r\n }\r\n if (!resolverBackedRequirements.has(dependency)) {\r\n throw new Error(\r\n `Dependency \\\"${String(dependency)}\\\" referenced by requirement \\\"${String(requirement)}\\\" has no resolver.`,\r\n );\r\n }\r\n }\r\n\r\n graph.push({\r\n requirement,\r\n step: resolver.step,\r\n isMet: resolver.isMet,\r\n when: options?.conditions?.[requirement],\r\n priority: options?.priorities?.[requirement] ?? 0,\r\n dependsOn,\r\n });\r\n }\r\n\r\n const byRequirement = new Map(\r\n graph.map((node) => [node.requirement, node] as const),\r\n );\r\n\r\n const visited = new Set<TRequirement>();\r\n const visiting = new Set<TRequirement>();\r\n\r\n const dfs = (requirement: TRequirement, stack: TRequirement[]) => {\r\n if (visited.has(requirement)) {\r\n return;\r\n }\r\n\r\n if (visiting.has(requirement)) {\r\n const cycleStart = stack.indexOf(requirement);\r\n const cyclePath = [...stack.slice(cycleStart), requirement]\r\n .map((value) => String(value))\r\n .join(\" -> \");\r\n throw new Error(`Circular dependency detected in requirement graph: ${cyclePath}`);\r\n }\r\n\r\n visiting.add(requirement);\r\n const node = byRequirement.get(requirement);\r\n if (node?.dependsOn?.length) {\r\n for (const dep of node.dependsOn) {\r\n if (byRequirement.has(dep)) {\r\n dfs(dep, [...stack, requirement]);\r\n }\r\n }\r\n }\r\n\r\n visiting.delete(requirement);\r\n visited.add(requirement);\r\n };\r\n\r\n for (const node of graph) {\r\n dfs(node.requirement, []);\r\n }\r\n\r\n return graph;\r\n}\r\n\r\n/**\r\n * Build a requirement graph using the built-in default resolvers plus any app-specific overrides.\r\n */\r\nexport function createDefaultRequirementGraph<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n TRequirement extends string = DefaultAppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>(\r\n options?: {\r\n requirements?: readonly TRequirement[];\r\n resolvers?: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>;\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n },\r\n): RequirementGraph<TContext, TRequirement, TStep> {\r\n const requirements =\r\n (options?.requirements ?? (defaultRequirements as unknown as readonly TRequirement[]));\r\n\r\n const resolvers = {\r\n ...(defaultRequirementResolvers as unknown as Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>),\r\n ...(options?.resolvers ?? {}),\r\n };\r\n\r\n return createRequirementGraph(requirements, resolvers, {\r\n priorities: options?.priorities,\r\n conditions: options?.conditions,\r\n dependencies: options?.dependencies,\r\n });\r\n}\r\n\r\nfunction sortGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(graph: RequirementGraph<TContext, TRequirement, TStep>) {\r\n const entries = graph.map((node, index) => ({ node, index }));\r\n const byRequirement = new Map(entries.map((entry) => [entry.node.requirement, entry] as const));\r\n\r\n const indegree = new Map<TRequirement, number>();\r\n const adjacency = new Map<TRequirement, TRequirement[]>();\r\n\r\n for (const entry of entries) {\r\n indegree.set(entry.node.requirement, 0);\r\n adjacency.set(entry.node.requirement, []);\r\n }\r\n\r\n for (const entry of entries) {\r\n const current = entry.node.requirement;\r\n for (const dependency of entry.node.dependsOn ?? []) {\r\n const depEntry = byRequirement.get(dependency);\r\n if (!depEntry) {\r\n continue;\r\n }\r\n\r\n const outgoing = adjacency.get(depEntry.node.requirement);\r\n if (outgoing) {\r\n outgoing.push(current);\r\n }\r\n indegree.set(current, (indegree.get(current) ?? 0) + 1);\r\n }\r\n }\r\n\r\n const compare = (\r\n left: { node: RequirementGraphNode<TContext, TRequirement, TStep>; index: number },\r\n right: { node: RequirementGraphNode<TContext, TRequirement, TStep>; index: number },\r\n ) => {\r\n const byPriority = (right.node.priority ?? 0) - (left.node.priority ?? 0);\r\n if (byPriority !== 0) {\r\n return byPriority;\r\n }\r\n // Keep declaration order for equal-priority nodes to avoid surprising step jumps.\r\n return left.index - right.index;\r\n };\r\n\r\n const ready = entries\r\n .filter((entry) => (indegree.get(entry.node.requirement) ?? 0) === 0)\r\n .sort(compare);\r\n\r\n const ordered: RequirementGraphNode<TContext, TRequirement, TStep>[] = [];\r\n\r\n while (ready.length > 0) {\r\n const current = ready.shift();\r\n if (!current) {\r\n break;\r\n }\r\n\r\n ordered.push(current.node);\r\n\r\n for (const dependent of adjacency.get(current.node.requirement) ?? []) {\r\n const next = (indegree.get(dependent) ?? 0) - 1;\r\n indegree.set(dependent, next);\r\n if (next === 0) {\r\n const dependentEntry = byRequirement.get(dependent);\r\n if (dependentEntry) {\r\n ready.push(dependentEntry);\r\n ready.sort(compare);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (ordered.length !== graph.length) {\r\n throw new Error(\"Unable to topologically sort requirement graph. Check for dependency cycles.\");\r\n }\r\n\r\n return ordered;\r\n}\r\n\r\n/**\r\n * Evaluate the graph against the current context and return the next unmet step.\r\n *\r\n * Nodes are evaluated in dependency-aware order with deterministic tie-breaking.\r\n */\r\nexport async function evaluateNextStep<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n context: TContext,\r\n graph: RequirementGraph<TContext, TRequirement, TStep>,\r\n completeStep: TStep,\r\n): Promise<TStep> {\r\n for (const node of sortGraph(graph)) {\r\n if (node.when && !(await node.when(context))) {\r\n continue;\r\n }\r\n\r\n if (node.dependsOn && node.dependsOn.length > 0) {\r\n const prerequisiteNodes = graph.filter((candidate) =>\r\n node.dependsOn?.includes(candidate.requirement),\r\n );\r\n\r\n if (prerequisiteNodes.length > 0) {\r\n const prerequisitesMet = await Promise.all(\r\n prerequisiteNodes.map(async (candidate) => candidate.isMet(context)),\r\n );\r\n if (prerequisitesMet.includes(false)) {\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n if (!(await node.isMet(context))) {\r\n return node.step;\r\n }\r\n }\r\n\r\n return completeStep;\r\n}\r\n\r\n/**\r\n * Return every unmet requirement for the current context in graph evaluation order.\r\n */\r\nexport async function getMissingRequirements<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n context: TContext,\r\n graph: RequirementGraph<TContext, TRequirement, TStep>,\r\n): Promise<TRequirement[]> {\r\n const missing: TRequirement[] = [];\r\n\r\n for (const node of sortGraph(graph)) {\r\n if (node.when && !(await node.when(context))) {\r\n continue;\r\n }\r\n\r\n if (!(await node.isMet(context))) {\r\n missing.push(node.requirement);\r\n }\r\n }\r\n\r\n return missing;\r\n}\r\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@secmia/openui-flow",
3
- "version": "4.2.7",
3
+ "version": "4.2.8",
4
4
  "description": "Backend-agnostic adaptive flow engine for React apps",
5
5
  "license": "MIT",
6
6
  "author": "",