@wireai/activation 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/AGENTS.md +73 -0
  2. package/CHANGELOG.md +572 -0
  3. package/INTEGRATION_PROMPT.md +55 -0
  4. package/LICENSE +21 -0
  5. package/README.md +923 -0
  6. package/dist/CenteredModal-C3qQBHsA.d.mts +38 -0
  7. package/dist/CenteredModal-Cdgns6--.d.ts +38 -0
  8. package/dist/coachmarks/index.d.mts +352 -0
  9. package/dist/coachmarks/index.d.ts +352 -0
  10. package/dist/coachmarks/index.js +944 -0
  11. package/dist/coachmarks/index.js.map +1 -0
  12. package/dist/coachmarks/index.mjs +918 -0
  13. package/dist/coachmarks/index.mjs.map +1 -0
  14. package/dist/decision-CFvGY6nP.d.ts +228 -0
  15. package/dist/decision-Cl8OFYzu.d.mts +228 -0
  16. package/dist/index.d.mts +1390 -0
  17. package/dist/index.d.ts +1390 -0
  18. package/dist/index.js +3260 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/index.mjs +3186 -0
  21. package/dist/index.mjs.map +1 -0
  22. package/dist/questionnaire/index.d.mts +249 -0
  23. package/dist/questionnaire/index.d.ts +249 -0
  24. package/dist/questionnaire/index.js +922 -0
  25. package/dist/questionnaire/index.js.map +1 -0
  26. package/dist/questionnaire/index.mjs +906 -0
  27. package/dist/questionnaire/index.mjs.map +1 -0
  28. package/dist/reviews/index.d.mts +213 -0
  29. package/dist/reviews/index.d.ts +213 -0
  30. package/dist/reviews/index.js +1001 -0
  31. package/dist/reviews/index.js.map +1 -0
  32. package/dist/reviews/index.mjs +971 -0
  33. package/dist/reviews/index.mjs.map +1 -0
  34. package/dist/showcase/index.d.mts +119 -0
  35. package/dist/showcase/index.d.ts +119 -0
  36. package/dist/showcase/index.js +660 -0
  37. package/dist/showcase/index.js.map +1 -0
  38. package/dist/showcase/index.mjs +651 -0
  39. package/dist/showcase/index.mjs.map +1 -0
  40. package/dist/types-BKfpdZzX.d.mts +84 -0
  41. package/dist/types-BKfpdZzX.d.ts +84 -0
  42. package/dist/types-CMuOexw0.d.mts +116 -0
  43. package/dist/types-CMuOexw0.d.ts +116 -0
  44. package/dist/types-GL_hQ0TN.d.mts +46 -0
  45. package/dist/types-GL_hQ0TN.d.ts +46 -0
  46. package/llms.txt +36 -0
  47. package/metro/index.d.ts +32 -0
  48. package/metro/index.js +83 -0
  49. package/package.json +171 -0
  50. package/src/DemoOnboarding.tsx +133 -0
  51. package/src/OnboardingFlow.tsx +504 -0
  52. package/src/WireOnboarding.tsx +248 -0
  53. package/src/analytics/analyticsEvent.ts +69 -0
  54. package/src/analytics/reportClientEvent.ts +119 -0
  55. package/src/analytics/sendPreview.ts +73 -0
  56. package/src/attribution/attribution.ts +46 -0
  57. package/src/cards/ChipSelectCard.tsx +265 -0
  58. package/src/cards/InterstitialCard.tsx +299 -0
  59. package/src/cards/NumberStepperCard.tsx +121 -0
  60. package/src/cards/SelectionCard.tsx +270 -0
  61. package/src/cards/StatusCard.tsx +170 -0
  62. package/src/cards/TextInputCard.tsx +147 -0
  63. package/src/cards/index.ts +23 -0
  64. package/src/coachmarks/CoachmarkOverlayHost.tsx +44 -0
  65. package/src/coachmarks/CoachmarkProvider.tsx +108 -0
  66. package/src/coachmarks/GestureHint.tsx +331 -0
  67. package/src/coachmarks/SpotlightOverlay.tsx +254 -0
  68. package/src/coachmarks/coachmarkAnchorRegistry.ts +70 -0
  69. package/src/coachmarks/coachmarkOverlayStore.ts +63 -0
  70. package/src/coachmarks/index.ts +62 -0
  71. package/src/coachmarks/runtime.ts +103 -0
  72. package/src/coachmarks/selectTourSteps.ts +45 -0
  73. package/src/coachmarks/types.ts +58 -0
  74. package/src/coachmarks/useCoachmarkAnchor.ts +49 -0
  75. package/src/coachmarks/useCoachmarkTour.ts +200 -0
  76. package/src/components/AnimatedSparkle.tsx +101 -0
  77. package/src/components/Button.tsx +129 -0
  78. package/src/components/CardHandoff.tsx +212 -0
  79. package/src/components/CardLayout.tsx +103 -0
  80. package/src/components/CenteredModal.tsx +184 -0
  81. package/src/components/CompletionView.tsx +186 -0
  82. package/src/components/DoneBlock.tsx +37 -0
  83. package/src/components/ErrorBlock.tsx +42 -0
  84. package/src/components/Illustration.tsx +36 -0
  85. package/src/components/LoadingBlock.tsx +182 -0
  86. package/src/components/LoadingScreen.tsx +35 -0
  87. package/src/components/OnboardingScaffold.tsx +105 -0
  88. package/src/components/StepProgress.tsx +85 -0
  89. package/src/components/loaderChrome.ts +28 -0
  90. package/src/config/onboardingFlag.ts +39 -0
  91. package/src/config/wireConfigFromEnv.ts +52 -0
  92. package/src/device/deviceContext.ts +158 -0
  93. package/src/features/WireFeaturesProvider.tsx +81 -0
  94. package/src/features/cache.ts +92 -0
  95. package/src/features/defaults.ts +67 -0
  96. package/src/features/fetchWireFeatures.ts +86 -0
  97. package/src/features/index.ts +39 -0
  98. package/src/features/types.ts +61 -0
  99. package/src/features/useWireFeatures.ts +57 -0
  100. package/src/identity/userIdentity.ts +100 -0
  101. package/src/illustrations/defaultIllustrations.tsx +99 -0
  102. package/src/index.ts +159 -0
  103. package/src/motion/centeredModalMotion.ts +45 -0
  104. package/src/motion/motionSpec.ts +133 -0
  105. package/src/motion/useReducedMotion.ts +43 -0
  106. package/src/questionnaire/QuestionnaireGate.tsx +235 -0
  107. package/src/questionnaire/decision.ts +63 -0
  108. package/src/questionnaire/index.ts +54 -0
  109. package/src/questionnaire/runtime.ts +20 -0
  110. package/src/questionnaire/transport.ts +83 -0
  111. package/src/questionnaire/types.ts +182 -0
  112. package/src/questionnaire/useQuestionnaireGate.ts +159 -0
  113. package/src/reviews/ReviewGate.tsx +316 -0
  114. package/src/reviews/ReviewModal.tsx +13 -0
  115. package/src/reviews/decision.ts +120 -0
  116. package/src/reviews/equality.ts +54 -0
  117. package/src/reviews/expo-store-review.d.ts +16 -0
  118. package/src/reviews/feedbackForm.ts +41 -0
  119. package/src/reviews/index.ts +78 -0
  120. package/src/reviews/presentation.ts +29 -0
  121. package/src/reviews/runtime.ts +45 -0
  122. package/src/reviews/storeReview.ts +62 -0
  123. package/src/reviews/transport.ts +89 -0
  124. package/src/reviews/types.ts +172 -0
  125. package/src/reviews/useReviewGate.ts +137 -0
  126. package/src/session/persistedSession.ts +143 -0
  127. package/src/session-analytics/index.ts +18 -0
  128. package/src/session-analytics/reportSessionStart.ts +144 -0
  129. package/src/session-analytics/useSessionStart.ts +114 -0
  130. package/src/showcase/FeatureShowcase.tsx +233 -0
  131. package/src/showcase/index.ts +19 -0
  132. package/src/showcase/selectShowcaseSlides.ts +45 -0
  133. package/src/showcase/showcaseColors.ts +91 -0
  134. package/src/showcase/types.ts +74 -0
  135. package/src/theme/ThemeContext.tsx +38 -0
  136. package/src/theme/defaultTheme.ts +70 -0
  137. package/src/theme/themeFromBrand.ts +93 -0
  138. package/src/theme/types.ts +88 -0
  139. package/src/theme/typography.ts +46 -0
  140. package/src/types.ts +215 -0
  141. package/src/utils/deriveAnswers.ts +43 -0
  142. package/src/utils/readProgress.ts +33 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/theme/defaultTheme.ts","../src/theme/ThemeContext.tsx","../src/components/Illustration.tsx","../src/illustrations/defaultIllustrations.tsx","../src/theme/typography.ts","../src/motion/motionSpec.ts","../src/motion/useReducedMotion.ts","../src/components/AnimatedSparkle.tsx","../src/components/loaderChrome.ts","../src/components/LoadingBlock.tsx","../src/components/LoadingScreen.tsx","../src/components/StepProgress.tsx","../src/components/OnboardingScaffold.tsx","../src/components/Button.tsx","../src/components/ErrorBlock.tsx","../src/components/CardLayout.tsx","../src/components/CompletionView.tsx","../src/components/CardHandoff.tsx","../src/utils/deriveAnswers.ts","../src/utils/readProgress.ts","../src/analytics/reportClientEvent.ts","../src/analytics/sendPreview.ts","../src/OnboardingFlow.tsx","../src/cards/ChipSelectCard.tsx","../src/cards/TextInputCard.tsx","../src/cards/SelectionCard.tsx","../src/cards/StatusCard.tsx","../src/cards/NumberStepperCard.tsx","../src/cards/InterstitialCard.tsx","../src/cards/index.ts","../src/device/deviceContext.ts","../src/session/persistedSession.ts","../src/identity/userIdentity.ts","../src/WireOnboarding.tsx","../src/DemoOnboarding.tsx","../src/theme/themeFromBrand.ts","../src/components/DoneBlock.tsx","../src/motion/centeredModalMotion.ts","../src/components/CenteredModal.tsx","../src/features/defaults.ts","../src/features/cache.ts","../src/features/fetchWireFeatures.ts","../src/features/useWireFeatures.ts","../src/features/WireFeaturesProvider.tsx","../src/config/wireConfigFromEnv.ts","../src/config/onboardingFlag.ts","../src/analytics/analyticsEvent.ts","../src/attribution/attribution.ts","../src/session-analytics/reportSessionStart.ts","../src/session-analytics/useSessionStart.ts"],"names":["createContext","useMemo","useContext","jsx","View","Text","jsxs","StyleSheet","useState","useEffect","AccessibilityInfo","useRef","Animated","Easing","styles","React","SafeAreaView","TouchableOpacity","useCallback","Pressable","KeyboardAvoidingView","ScrollView","easeWire","Fragment","useWireAIThread","useWireAIAction","_a","_b","_c","_d","step","_e","_f","ComponentRenderer","z","schema","useWindowDimensions","TextInput","Image","Platform","Dimensions","I18nManager","WireAIProvider","Modal","forwardRef","useImperativeHandle","BackHandler","READ_TIMEOUT_MS","withTimeout","AppState"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * defaultOnboardingTheme — a neutral, light, brand-agnostic baseline. Consumers\n * pass a `Partial<OnboardingTheme>` that is deep-merged over this (see\n * `mergeTheme`), so they only override what differs from neutral.\n */\nimport type { OnboardingTheme } from \"./types\";\n\nexport const defaultOnboardingTheme: OnboardingTheme = {\n colors: {\n background: \"#FFFFFF\",\n surface: \"#F7F7F8\",\n text: \"#101114\",\n textMuted: \"#6B7280\",\n primary: \"#111111\",\n onPrimary: \"#FFFFFF\",\n primarySoft: \"rgba(17,17,17,0.06)\",\n border: \"#E4E4E7\",\n borderStrong: \"#C7C7CC\",\n disabled: \"#EBEBEB\",\n success: \"#16A34A\",\n warning: \"#D97706\",\n error: \"#DC2626\",\n info: \"#2563EB\",\n },\n fonts: {\n regular: undefined,\n medium: undefined,\n bold: undefined,\n baseSize: 16,\n scale: 1,\n },\n radius: {\n sm: 8,\n md: 12,\n lg: 16,\n full: 9999,\n },\n spacing: {\n xs: 4,\n sm: 8,\n md: 16,\n lg: 24,\n xl: 32,\n },\n // Circled (pill) CTA by default; an app can pass `button: { radius: 12 }` for\n // a rounded rectangle, or override height/paddingX to match its design system.\n button: {\n radius: 9999,\n height: 52,\n paddingX: 24,\n },\n};\n\n/**\n * Deep-merge a partial theme over the default. Two levels deep is enough — the\n * theme is intentionally shallow (colors/fonts/radius/spacing), so we merge each\n * known sub-object and leave scalars to overwrite.\n */\nexport const mergeTheme = (\n override?: Partial<OnboardingTheme>,\n): OnboardingTheme => {\n if (!override) return defaultOnboardingTheme;\n return {\n colors: { ...defaultOnboardingTheme.colors, ...override.colors },\n fonts: { ...defaultOnboardingTheme.fonts, ...override.fonts },\n radius: { ...defaultOnboardingTheme.radius, ...override.radius },\n spacing: { ...defaultOnboardingTheme.spacing, ...override.spacing },\n button: { ...defaultOnboardingTheme.button, ...override.button },\n };\n};\n","/**\n * ThemeContext — provides the resolved OnboardingTheme to every shell element and\n * themed card via `useOnboardingTheme()`. WHY a context rather than prop-drilling:\n * the cards are mounted by the SDK's ComponentRenderer (not by us), so we can't\n * pass them props directly — they must read the theme from context.\n */\nimport React, { createContext, useContext, useMemo } from \"react\";\nimport { mergeTheme } from \"./defaultTheme\";\nimport type { OnboardingTheme } from \"./types\";\n\nconst OnboardingThemeContext = createContext<OnboardingTheme | null>(null);\n\nexport type OnboardingThemeProviderProps = {\n /** Partial overrides merged over the neutral default theme. */\n theme?: Partial<OnboardingTheme>;\n children: React.ReactNode;\n};\n\nexport const OnboardingThemeProvider: React.FC<OnboardingThemeProviderProps> = ({\n theme,\n children,\n}) => {\n const resolved = useMemo(() => mergeTheme(theme), [theme]);\n return (\n <OnboardingThemeContext.Provider value={resolved}>\n {children}\n </OnboardingThemeContext.Provider>\n );\n};\n\n/**\n * Read the active theme. Falls back to the default theme when used outside a\n * provider so a stray card never crashes — it just renders neutral.\n */\nexport const useOnboardingTheme = (): OnboardingTheme => {\n const ctx = useContext(OnboardingThemeContext);\n return ctx ?? mergeTheme();\n};\n","/**\n * Illustration registry — lets the host app supply brand artwork (SVG / Lottie /\n * Image nodes) keyed by name, which the backend references from an InterstitialCard\n * by `illustration`. Keeping the registry in React context (rather than as a card\n * prop) is what keeps the kit dependency-free: the kit never imports react-native-svg\n * or Lottie — the app brings its own nodes and the kit just slots the matching one.\n *\n * <WireOnboarding illustrations={{ \"before-after\": <BeforeAfter/> }} ... />\n *\n * When the backend names an illustration the registry doesn't have, the\n * InterstitialCard falls back to its `imageUrl` (a plain RN <Image>).\n */\nimport React, { createContext, useContext } from \"react\";\n\nexport type IllustrationRegistry = Record<string, React.ReactNode>;\n\nconst IllustrationContext = createContext<IllustrationRegistry>({});\n\nexport type IllustrationProviderProps = {\n registry?: IllustrationRegistry;\n children: React.ReactNode;\n};\n\nexport const IllustrationProvider: React.FC<IllustrationProviderProps> = ({\n registry,\n children,\n}) => (\n <IllustrationContext.Provider value={registry ?? {}}>{children}</IllustrationContext.Provider>\n);\n\n/** Look up an app-supplied illustration node by name. Returns undefined if absent. */\nexport const useIllustration = (name?: string): React.ReactNode | undefined => {\n const registry = useContext(IllustrationContext);\n if (!name) return undefined;\n return registry[name];\n};\n","/**\n * defaultIllustrations — a tiny, dependency-free fallback registry so an app can\n * render `InterstitialCard` with ZERO illustration code. These are plain\n * <View>/<Text> glyphs (NO react-native-svg, NO Lottie, NO image assets) themed\n * from the active OnboardingTheme, covering the common backend-emitted names.\n *\n * Spread it under your own artwork — your named nodes win:\n *\n * illustrations={{ ...defaultIllustrations, ...myIllustrations }}\n *\n * Names match what the onboarding backend commonly emits via an InterstitialCard's\n * `illustration`: `momentum` (forward-motion arc) and `before-after` (two states).\n * Add more by spreading your own — these are only sensible defaults.\n */\nimport React from \"react\";\nimport { StyleSheet, Text, View } from \"react-native\";\nimport { useOnboardingTheme } from \"../theme/ThemeContext\";\n\n/** A soft tinted disc with a centered glyph — the shared frame for every default. */\nconst Glyph: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const t = useOnboardingTheme();\n return (\n <View\n style={[\n styles.disc,\n { backgroundColor: t.colors.primarySoft, borderRadius: t.radius.full },\n ]}\n >\n <Text style={[styles.glyphText, { color: t.colors.primary }]} allowFontScaling={false}>\n {children}\n </Text>\n </View>\n );\n};\n\n/** Forward-motion / momentum: an upward arrow. */\nconst MomentumGlyph: React.FC = () => <Glyph>{\"↗\"}</Glyph>;\n\n/** Before → after: two states with an arrow between. */\nconst BeforeAfterGlyph: React.FC = () => {\n const t = useOnboardingTheme();\n return (\n <View style={styles.row}>\n <View\n style={[\n styles.chip,\n { borderColor: t.colors.border, borderRadius: t.radius.md },\n ]}\n />\n <Text style={[styles.arrow, { color: t.colors.primary }]} allowFontScaling={false}>\n {\"→\"}\n </Text>\n <View\n style={[\n styles.chip,\n { backgroundColor: t.colors.primarySoft, borderColor: t.colors.primary, borderRadius: t.radius.md },\n ]}\n />\n </View>\n );\n};\n\n/**\n * The default registry. `WireOnboarding`'s `illustrations` prop is\n * `Record<string, ReactNode>`, so these are concrete element nodes.\n */\nexport const defaultIllustrations: Record<string, React.ReactNode> = {\n momentum: <MomentumGlyph />,\n \"before-after\": <BeforeAfterGlyph />,\n};\n\nconst styles = StyleSheet.create({\n disc: {\n width: 96,\n height: 96,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n glyphText: {\n fontSize: 44,\n fontWeight: \"700\",\n lineHeight: 52,\n },\n row: {\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 12,\n },\n chip: {\n width: 56,\n height: 56,\n borderWidth: 2,\n },\n arrow: {\n fontSize: 28,\n fontWeight: \"700\",\n },\n});\n","/**\n * typography — derive concrete RN text styles from the theme's font config, so\n * every label/title/caption in the kit scales from one `baseSize` + `scale` and\n * picks the right family. Cards call these instead of hardcoding fontSize/weight.\n */\nimport type { TextStyle } from \"react-native\";\nimport type { OnboardingFonts } from \"./types\";\n\nconst round = (n: number) => Math.round(n);\n\n/** Body text — the reference size. */\nexport const bodyStyle = (f: OnboardingFonts): TextStyle => ({\n fontFamily: f.regular,\n fontSize: round(f.baseSize * f.scale),\n lineHeight: round(f.baseSize * f.scale * 1.5),\n});\n\n/** Slightly smaller secondary/hint text. */\nexport const captionStyle = (f: OnboardingFonts): TextStyle => ({\n fontFamily: f.regular,\n fontSize: round(f.baseSize * 0.8125 * f.scale),\n lineHeight: round(f.baseSize * 0.8125 * f.scale * 1.5),\n});\n\n/** Emphasised label (e.g. a card question). */\nexport const labelStyle = (f: OnboardingFonts): TextStyle => ({\n fontFamily: f.medium ?? f.bold,\n fontSize: round(f.baseSize * f.scale),\n lineHeight: round(f.baseSize * f.scale * 1.4),\n fontWeight: f.medium ? undefined : (\"600\" as const),\n});\n\n/** Heading (status title, done block). */\nexport const headingStyle = (f: OnboardingFonts): TextStyle => ({\n fontFamily: f.bold,\n fontSize: round(f.baseSize * 1.25 * f.scale),\n lineHeight: round(f.baseSize * 1.25 * f.scale * 1.3),\n fontWeight: f.bold ? undefined : (\"700\" as const),\n});\n\n/** Button label. */\nexport const buttonLabelStyle = (f: OnboardingFonts): TextStyle => ({\n fontFamily: f.bold ?? f.medium,\n fontSize: round(f.baseSize * f.scale),\n fontWeight: f.bold ? undefined : (\"600\" as const),\n});\n","/**\n * motionSpec — the single source of truth for every animation value in the kit,\n * extracted 1:1 from the Wire Activation card-interactions design canvas\n * (see design-refs/EXTRACTED-SPEC.md for the row-by-row mapping).\n *\n * Pure constants + pure helpers only — NO react-native import — so the spec is\n * unit-testable under node:test and components can't drift from the design\n * without a red test.\n */\n\n/** The design system's \"ease-wire\" curve: cubic-bezier(0.16, 1, 0.3, 1). */\nexport const WIRE_BEZIER = [0.16, 1, 0.3, 1] as const;\n\n/** Design-system duration tokens (colors_and_type.css --duration-*). */\nexport const DURATION_FAST_MS = 150;\nexport const DURATION_BASE_MS = 300;\nexport const DURATION_SLOW_MS = 500;\n\n/** Reduce-motion fallback: a short fade to the final frame, never a frozen mid-state. */\nexport const REDUCED_FADE_MS = 120;\n\n// ── Press feedback (spec rows 1, 4, 20) ─────────────────────────────────────\nexport const ROW_PRESS_SCALE = 0.975;\nexport const CHIP_PRESS_SCALE = 0.94;\nexport const BUTTON_PRESS_SCALE = 0.975;\n/** Reduce-motion press feedback: opacity dip instead of scale. */\nexport const REDUCED_PRESS_OPACITY = 0.85;\nexport const PRESS_SPRING = { friction: 8, tension: 220 } as const;\nexport const BUTTON_PRESS_SPRING = { friction: 8, tension: 240 } as const;\n\n// ── Selection state changes (spec rows 2, 3, 5, 6) ──────────────────────────\nexport const SELECT_FILL_MS = 180;\nexport const CHIP_FILL_MS = 160;\nexport const CHECK_SPRING = { friction: 6, tension: 180 } as const;\nexport const CHECK_SCALE_FROM = 0.6;\n\n// ── Card-to-card handoff (spec rows 7-10) ───────────────────────────────────\nexport const CARD_ENTER_MS = 220;\nexport const CARD_EXIT_MS = 180;\n/** The exit starts this long BEFORE the enter (enter is delayed by this). */\nexport const CARD_EXIT_LEAD_MS = 80;\nexport const CARD_SLIDE_PX = 26;\nexport const CARD_ENTER_SCALE_FROM = 0.96;\n/** The interstitial keeps the shell's springier value-beat (AnimatedCard idiom). */\nexport const CARD_SPRING = { damping: 14, stiffness: 180, mass: 1 } as const;\n/** Loader-to-card handoff: the loader just fades out. */\nexport const LOADER_HANDOFF_FADE_MS = 120;\n\n// ── InterstitialCard reveal (spec rows 11-13) ───────────────────────────────\nexport const INTERSTITIAL_HEAD_MS = 500;\nexport const INTERSTITIAL_HEAD_STAGGER_MS = 100;\nexport const INTERSTITIAL_ITEM_MS = 300;\nexport const INTERSTITIAL_ITEM_STAGGER_MS = 90;\nexport const INTERSTITIAL_ITEM_BASE_DELAY_MS = 200;\nexport const INTERSTITIAL_CHECK_DELAY_MS = 200;\nexport const INTERSTITIAL_CHECK_SCALE_FROM = 0.4;\n\n/** Delay before work item `index` begins its reveal (row lands after the head). */\nexport const interstitialItemDelay = (index: number): number =>\n INTERSTITIAL_ITEM_BASE_DELAY_MS + index * INTERSTITIAL_ITEM_STAGGER_MS;\n\n/** Delay before work item `index`'s check pops (200ms after its row starts). */\nexport const interstitialCheckDelay = (index: number): number =>\n interstitialItemDelay(index) + INTERSTITIAL_CHECK_DELAY_MS;\n\n// ── Status / completion payoff (spec rows 14-16) ────────────────────────────\nexport const STATUS_POP_SPRING = { friction: 6, tension: 200 } as const;\nexport const STATUS_POP_SCALE_FROM = 0.4;\nexport const STATUS_BURST_MS = 500;\nexport const STATUS_BURST_SCALE_FROM = 0.4;\nexport const STATUS_BURST_SCALE_TO = 1.5;\nexport const STATUS_BURST_OPACITY_FROM = 0.5;\nexport const STATUS_COPY_MS = 300;\nexport const STATUS_COPY_STAGGER_MS = 80;\n/** Copy starts settling once the badge pop is visibly underway. */\nexport const STATUS_COPY_BASE_DELAY_MS = 200;\n\n/** Delay before payoff copy line `index` fades up. */\nexport const statusCopyDelay = (index: number): number =>\n STATUS_COPY_BASE_DELAY_MS + index * STATUS_COPY_STAGGER_MS;\n\n// ── Loading treatment (spec rows 17-19) ─────────────────────────────────────\nexport const LOADER_PULSE_MS = 1600;\nexport const LOADER_PULSE_MIN_OPACITY = 0.35;\nexport const LOADER_ORBIT_MS = 2400;\n/** Skeleton lines appear only when the fetch runs past this. */\nexport const SKELETON_DELAY_MS = 300;\nexport const SKELETON_PULSE_MS = 1500;\nexport const SKELETON_MIN_OPACITY = 0.45;\n\n// ── Progress bar (spec row 21) ──────────────────────────────────────────────\nexport const PROGRESS_MS = 400;\n\n// ── Dev/QA duration scale (slow-mo for judging motion) ──────────────────────\n// A module-level multiplier applied to every timing DURATION (and stagger\n// delay) at animation start. 1 = design speed; 2 = half-speed slow-mo. Springs\n// are physics-based (friction/tension) and do NOT scale. This is a dev/QA tool\n// (the playground's tweak panel drives it) — production code never calls the\n// setter, so the default 1 keeps shipped motion exactly on spec.\n\nlet durationScale = 1;\n\n/** Set the global duration multiplier (clamped to 0.1-10; invalid resets to 1). */\nexport const setMotionDurationScale = (scale: number): void => {\n durationScale = Number.isFinite(scale) && scale > 0 ? Math.min(10, Math.max(0.1, scale)) : 1;\n};\n\nexport const getMotionDurationScale = (): number => durationScale;\n\n/** Apply the current duration scale to a spec duration/delay (rounded ms). */\nexport const scaledMs = (ms: number): number => Math.round(ms * durationScale);\n\n// ── Reduce-motion helpers (pure, shared by every animated component) ────────\n\nexport type EntranceSpec = {\n /** Duration to animate with (falls back to the short fade under reduce motion). */\n duration: number;\n /** Whether transforms (translate/scale) may move; false = opacity-only fade. */\n useTransform: boolean;\n};\n\n/** Entrances: full motion normally; a 120ms opacity-only fade under reduce motion. */\nexport const entranceSpec = (reduced: boolean, durationMs: number): EntranceSpec =>\n reduced\n ? { duration: REDUCED_FADE_MS, useTransform: false }\n : { duration: durationMs, useTransform: true };\n\n/** State changes (select fills etc.): snap instantly under reduce motion. */\nexport const stateChangeDuration = (reduced: boolean, durationMs: number): number =>\n reduced ? 0 : durationMs;\n\n/** Looping/ambient animations run only when motion is allowed. */\nexport const loopEnabled = (reduced: boolean): boolean => !reduced;\n","/**\n * useReducedMotion — the kit's ONE reduce-motion gate. Reads the OS setting via\n * AccessibilityInfo and stays subscribed to `reduceMotionChanged`, so every\n * animated component lands on its final frame (or a ~120ms fade) the moment the\n * user flips the setting — no restart needed.\n *\n * This closes the gap documented in ai_rules/rules/performance.md §3: every\n * animation in the kit must consume this hook (usually through the pure helpers\n * in motionSpec.ts: `entranceSpec` / `stateChangeDuration` / `loopEnabled`).\n */\nimport { useEffect, useState } from \"react\";\nimport { AccessibilityInfo } from \"react-native\";\n\n// Last-known value, module-level: cards remount every turn (keyed on message id),\n// and a `useState(false)` default would flash one animated frame per turn for a\n// reduce-motion user before the async read resolves.\nlet lastKnown = false;\n\nexport const useReducedMotion = (): boolean => {\n const [reduced, setReduced] = useState(lastKnown);\n\n useEffect(() => {\n let mounted = true;\n AccessibilityInfo.isReduceMotionEnabled()\n .then((value) => {\n lastKnown = value;\n if (mounted) setReduced(value);\n })\n .catch(() => {\n // Unavailable (e.g. some test envs): keep the last-known value.\n });\n const sub = AccessibilityInfo.addEventListener(\"reduceMotionChanged\", (value) => {\n lastKnown = value;\n setReduced(value);\n });\n return () => {\n mounted = false;\n sub?.remove();\n };\n }, []);\n\n return reduced;\n};\n","/**\n * AnimatedSparkle — the themed \"AI is thinking\" glyph (✦), animated with RN's\n * built-in `Animated` (native driver) so the kit needs neither reanimated nor a\n * vector-icon dependency.\n *\n * Variants:\n * - \"spin\" (default, unchanged): continuous rotation — the original loader.\n * - \"pulse\": the Wire Activation loading treatment — the mark breathes\n * (opacity 0.35 ↔ 1, 1600ms loop) instead of rotating.\n *\n * Reduce motion: no loop at all — the glyph renders static at full opacity\n * (final frame), per design-refs/EXTRACTED-SPEC.md row 17.\n */\nimport React, { useEffect, useRef } from \"react\";\nimport { Animated, Easing, StyleSheet, Text } from \"react-native\";\nimport { useOnboardingTheme } from \"../theme/ThemeContext\";\nimport { LOADER_PULSE_MIN_OPACITY, LOADER_PULSE_MS, loopEnabled, scaledMs } from \"../motion/motionSpec\";\nimport { useReducedMotion } from \"../motion/useReducedMotion\";\n\nconst ROTATION_MS = 1800;\n\nexport type AnimatedSparkleProps = {\n /** Glyph size in px. */\n size?: number;\n /** Override color; defaults to the theme primary. */\n color?: string;\n /** \"spin\" rotates (default, the original), \"pulse\" breathes (the loader treatment). */\n variant?: \"spin\" | \"pulse\";\n};\n\nconst _AnimatedSparkle: React.FC<AnimatedSparkleProps> = ({ size = 30, color, variant = \"spin\" }) => {\n const t = useOnboardingTheme();\n const reduced = useReducedMotion();\n const progress = useRef(new Animated.Value(0)).current;\n\n useEffect(() => {\n if (!loopEnabled(reduced)) {\n // Static final frame: no rotation, full opacity.\n progress.setValue(0);\n return;\n }\n const loop =\n variant === \"pulse\"\n ? Animated.loop(\n Animated.sequence([\n Animated.timing(progress, {\n toValue: 1,\n duration: scaledMs(LOADER_PULSE_MS / 2),\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: true,\n }),\n Animated.timing(progress, {\n toValue: 0,\n duration: scaledMs(LOADER_PULSE_MS / 2),\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: true,\n }),\n ]),\n )\n : Animated.loop(\n Animated.timing(progress, {\n toValue: 1,\n duration: scaledMs(ROTATION_MS),\n easing: Easing.linear,\n useNativeDriver: true,\n }),\n );\n loop.start();\n return () => loop.stop();\n }, [progress, variant, reduced]);\n\n const rotate = progress.interpolate({ inputRange: [0, 1], outputRange: [\"0deg\", \"360deg\"] });\n const pulse = progress.interpolate({\n inputRange: [0, 1],\n outputRange: [1, LOADER_PULSE_MIN_OPACITY],\n });\n\n const animatedStyle = reduced\n ? undefined\n : variant === \"pulse\"\n ? { opacity: pulse }\n : { transform: [{ rotate }] };\n\n return (\n <Animated.View style={animatedStyle}>\n <Text\n accessibilityElementsHidden\n importantForAccessibility=\"no\"\n style={[styles.glyph, { fontSize: size, lineHeight: size * 1.1, color: color ?? t.colors.primary }]}\n >\n ✦\n </Text>\n </Animated.View>\n );\n};\n\nexport const AnimatedSparkle = React.memo(_AnimatedSparkle);\n\nconst styles = StyleSheet.create({\n glyph: { textAlign: \"center\" },\n});\n","/**\n * loaderChrome — the seam that lets a loader center in the FULL flow area instead of\n * the header-offset body it happens to render into.\n *\n * The between-turns loader lives inside the OnboardingScaffold body (so the card↔loader\n * handoff stays one coordinated CardHandoff — see OnboardingFlow). But the body sits\n * BELOW the header (the StepProgress bar), so a loader that only fills the body centers\n * a little low — the \"not centralized in the screen\" device finding. The scaffold knows\n * its own top chrome, so it publishes a vertical offset here; LoadingBlock reads it and\n * shifts its centered content up by that much, landing it at the true screen center\n * WITHOUT moving the body (the card underneath is untouched, so the handoff never jumps).\n *\n * Default 0: a LoadingBlock rendered OUTSIDE a scaffold (the standalone LoadingScreen used\n * for cold-start / restoring / error) has no header above it, so it already centers in the\n * full area and needs no shift.\n */\nimport { createContext, useContext } from \"react\";\n\nexport type LoaderChrome = {\n /** Vertical shift (px, usually negative = up) that re-centers a loader against the full flow area. */\n offsetY: number;\n};\n\nconst LoaderChromeContext = createContext<LoaderChrome>({ offsetY: 0 });\n\nexport const LoaderChromeProvider = LoaderChromeContext.Provider;\n\nexport const useLoaderChrome = (): LoaderChrome => useContext(LoaderChromeContext);\n","/**\n * LoadingBlock — the \"AI is thinking\" indicator, shown before the first card and\n * between every turn (each round-trip to the backend). The Wire Activation\n * loading treatment: no generic spinner — the brand mark breathes inside a\n * dashed ring while an accent dot orbits it, and skeleton lines appear (softly\n * pulsing) only when the fetch runs past 300ms so a fast turn never flashes\n * placeholder chrome (design-refs/EXTRACTED-SPEC.md rows 17-19).\n *\n * Reduce motion: static mark + copy, no orbit, no pulse.\n */\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { Animated, Easing, StyleSheet, Text, View } from \"react-native\";\nimport { useOnboardingTheme } from \"../theme/ThemeContext\";\nimport { bodyStyle, headingStyle } from \"../theme/typography\";\nimport { AnimatedSparkle } from \"./AnimatedSparkle\";\nimport {\n LOADER_ORBIT_MS,\n SKELETON_DELAY_MS,\n SKELETON_MIN_OPACITY,\n SKELETON_PULSE_MS,\n loopEnabled,\n scaledMs,\n} from \"../motion/motionSpec\";\nimport { useReducedMotion } from \"../motion/useReducedMotion\";\nimport { useLoaderChrome } from \"./loaderChrome\";\n\nconst STAGE_SIZE = 96;\nconst ORBIT_DOT = 9;\n\nexport type LoadingBlockProps = {\n /** Primary line, e.g. \"Thinking…\". */\n title?: string;\n /** Supporting line under the title. */\n hint?: string;\n};\n\n/** The orbiting accent dot: a full-stage rotating layer with the dot at 12 o'clock. */\nconst OrbitDot: React.FC<{ color: string; reduced: boolean }> = ({ color, reduced }) => {\n const spin = useRef(new Animated.Value(0)).current;\n useEffect(() => {\n if (!loopEnabled(reduced)) return;\n const loop = Animated.loop(\n Animated.timing(spin, {\n toValue: 1,\n duration: scaledMs(LOADER_ORBIT_MS),\n easing: Easing.linear,\n useNativeDriver: true,\n }),\n );\n loop.start();\n return () => loop.stop();\n }, [spin, reduced]);\n\n if (reduced) return null;\n const rotate = spin.interpolate({ inputRange: [0, 1], outputRange: [\"0deg\", \"360deg\"] });\n return (\n <Animated.View pointerEvents=\"none\" style={[StyleSheet.absoluteFill, { transform: [{ rotate }] }]}>\n <View style={[styles.orbitDot, { backgroundColor: color }]} />\n </Animated.View>\n );\n};\n\n/** A skeleton line that softly pulses (static under reduce motion). */\nconst SkeletonLine: React.FC<{ width: `${number}%`; delay: number; color: string; reduced: boolean }> = ({\n width,\n delay,\n color,\n reduced,\n}) => {\n const pulse = useRef(new Animated.Value(1)).current;\n useEffect(() => {\n if (!loopEnabled(reduced)) return;\n const loop = Animated.loop(\n Animated.sequence([\n Animated.delay(delay),\n Animated.timing(pulse, {\n toValue: SKELETON_MIN_OPACITY,\n duration: scaledMs(SKELETON_PULSE_MS / 2),\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: true,\n }),\n Animated.timing(pulse, {\n toValue: 1,\n duration: scaledMs(SKELETON_PULSE_MS / 2),\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: true,\n }),\n ]),\n );\n loop.start();\n return () => loop.stop();\n }, [pulse, delay, reduced]);\n\n return (\n <Animated.View\n style={[styles.skeletonLine, { width, backgroundColor: color, opacity: reduced ? 1 : pulse }]}\n />\n );\n};\n\nconst _LoadingBlock: React.FC<LoadingBlockProps> = ({\n title = \"Thinking…\",\n hint = \"Personalizing your experience\",\n}) => {\n const t = useOnboardingTheme();\n const reduced = useReducedMotion();\n // When the loader renders inside the scaffold body it sits below the header; the scaffold\n // publishes how far to shift UP so the loader centers in the full flow area, not the body.\n // Standalone (no provider) → 0. A static transform (visual only): it never reflows the body,\n // so the card underneath and the card↔loader handoff are unaffected.\n const { offsetY } = useLoaderChrome();\n\n // Skeleton lines are gated behind the 300ms window: a fast fetch never shows them.\n const [showSkeleton, setShowSkeleton] = useState(false);\n useEffect(() => {\n const timer = setTimeout(() => setShowSkeleton(true), SKELETON_DELAY_MS);\n return () => clearTimeout(timer);\n }, []);\n\n return (\n <View\n style={[\n styles.center,\n { gap: t.spacing.md, padding: t.spacing.lg },\n offsetY ? { transform: [{ translateY: offsetY }] } : null,\n ]}\n >\n <View style={styles.stage}>\n <View style={[styles.ring, { borderColor: t.colors.border, borderRadius: t.radius.full }]} />\n <OrbitDot color={t.colors.primary} reduced={reduced} />\n <AnimatedSparkle size={40} variant=\"pulse\" />\n </View>\n {title ? (\n <Text style={[headingStyle(t.fonts), { color: t.colors.text, textAlign: \"center\" }]}>\n {title}\n </Text>\n ) : null}\n {hint ? (\n <Text style={[bodyStyle(t.fonts), { color: t.colors.textMuted, textAlign: \"center\" }]}>\n {hint}\n </Text>\n ) : null}\n {showSkeleton ? (\n <View style={[styles.skeleton, { gap: t.spacing.sm, marginTop: t.spacing.sm }]}>\n <SkeletonLine width=\"80%\" delay={0} color={t.colors.surface} reduced={reduced} />\n <SkeletonLine width=\"60%\" delay={200} color={t.colors.surface} reduced={reduced} />\n </View>\n ) : null}\n </View>\n );\n};\n\nexport const LoadingBlock = React.memo(_LoadingBlock);\n\nconst styles = StyleSheet.create({\n center: { flex: 1, alignItems: \"center\", justifyContent: \"center\" },\n stage: {\n width: STAGE_SIZE,\n height: STAGE_SIZE,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n ring: {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderWidth: 1.5,\n borderStyle: \"dashed\",\n },\n orbitDot: {\n position: \"absolute\",\n top: -ORBIT_DOT / 2 + 1,\n left: STAGE_SIZE / 2 - ORBIT_DOT / 2,\n width: ORBIT_DOT,\n height: ORBIT_DOT,\n borderRadius: ORBIT_DOT / 2,\n },\n skeleton: { width: \"100%\", alignItems: \"center\" },\n skeletonLine: { height: 12, borderRadius: 6 },\n});\n","/**\n * LoadingScreen — the STANDALONE loader surface: a full-area safe frame that centers a\n * LoadingBlock dead in the middle of the screen. Used for the loader slots that render on\n * their own (no OnboardingScaffold around them): the cold-start \"getting started\" wait, the\n * resumed-session \"restoring\" wait, and the transient error/timeout retry beat.\n *\n * WHY a dedicated frame: those slots used to return a bare <LoadingBlock/>, whose flex:1 only\n * fills whatever the host happened to give it — with no safe area and, if the host didn't\n * bound it, no height at all (top-anchored). This wraps them in the same SafeAreaView the flow\n * uses, so the standalone loaders center exactly like the between-turns loader (which centers\n * in the full flow area via the scaffold's loaderChrome offset). One consistent centered look.\n */\nimport React from \"react\";\nimport { StyleSheet } from \"react-native\";\nimport { SafeAreaView } from \"react-native-safe-area-context\";\nimport { useOnboardingTheme } from \"../theme/ThemeContext\";\nimport { LoadingBlock, type LoadingBlockProps } from \"./LoadingBlock\";\n\nconst _LoadingScreen: React.FC<LoadingBlockProps> = ({ title, hint }) => {\n const t = useOnboardingTheme();\n return (\n <SafeAreaView\n edges={[\"top\", \"bottom\"]}\n style={[styles.flex, { backgroundColor: t.colors.background }]}\n >\n <LoadingBlock title={title} hint={hint} />\n </SafeAreaView>\n );\n};\n\nexport const LoadingScreen = React.memo(_LoadingScreen);\n\nconst styles = StyleSheet.create({\n flex: { flex: 1 },\n});\n","/**\n * StepProgress — a single themed progress bar that conveys forward motion. It never\n * shows a \"Step X of N\" number (the count would read as a promise the model may not\n * keep), but it can be *paced* two ways:\n *\n * - Default (no `approxScreens`): an asymptotic curve of the step index — always\n * advances, never reaches the end until the flow actually completes.\n * - With `approxScreens`: when the host knows roughly how many screens the flow\n * runs (e.g. the backend's screen budget), the fill tracks `step / approxScreens`\n * (capped below 100% until `complete`). More truthful pacing, still no number.\n */\nimport React, { useEffect, useRef } from \"react\";\nimport { Animated, Easing, StyleSheet, View } from \"react-native\";\nimport { useOnboardingTheme } from \"../theme/ThemeContext\";\nimport { PROGRESS_MS, WIRE_BEZIER, scaledMs, stateChangeDuration } from \"../motion/motionSpec\";\nimport { useReducedMotion } from \"../motion/useReducedMotion\";\n\nconst easeWire = Easing.bezier(...WIRE_BEZIER);\n\nexport type StepProgressProps = {\n /** 1-based index of the current step. Drives the fill. */\n step: number;\n /** When true, fill to 100% (flow finished). */\n complete?: boolean;\n /**\n * Approximate total number of screens, if known (e.g. the backend screen budget).\n * Paces the bar as `step / approxScreens` instead of the asymptotic curve. Never\n * shown as a number — it only shapes the fill. Omit for the asymptotic default.\n */\n approxScreens?: number;\n};\n\n// Asymptotic default: each step closes ~38% of the remaining gap, so the bar always\n// moves but never hits the end on its own: step1≈38%, step2≈62%, step3≈76%…\nconst DECAY = 0.62;\nconst MIN_FILL = 0.08;\n// When pacing by an approximate total, never look finished until `complete`.\nconst APPROX_CAP = 0.95;\n\nconst targetFor = (step: number, complete?: boolean, approxScreens?: number): number => {\n if (complete) return 1;\n const s = Number.isFinite(step) && step > 0 ? Math.floor(step) : 1;\n if (approxScreens && approxScreens > 0) {\n return Math.max(MIN_FILL, Math.min(APPROX_CAP, s / approxScreens));\n }\n return Math.max(MIN_FILL, 1 - DECAY ** s);\n};\n\nconst _StepProgress: React.FC<StepProgressProps> = ({ step, complete, approxScreens }) => {\n const t = useOnboardingTheme();\n const reduced = useReducedMotion();\n const fill = useRef(new Animated.Value(targetFor(step, complete, approxScreens))).current;\n\n // 400ms ease-wire per the design spec (design-refs/EXTRACTED-SPEC.md row 21).\n // A growing total re-targets the same value, so the fill eases forward and never\n // snaps back. Reduce motion: jump straight to the ratio.\n useEffect(() => {\n Animated.timing(fill, {\n toValue: targetFor(step, complete, approxScreens),\n duration: scaledMs(stateChangeDuration(reduced, PROGRESS_MS)),\n easing: easeWire,\n useNativeDriver: false, // animating width %\n }).start();\n }, [fill, step, complete, approxScreens, reduced]);\n\n const width = fill.interpolate({ inputRange: [0, 1], outputRange: [\"0%\", \"100%\"] });\n\n return (\n <View style={[styles.track, { backgroundColor: t.colors.border, borderRadius: t.radius.full }]}>\n <Animated.View\n style={[\n styles.fill,\n { width, backgroundColor: t.colors.primary, borderRadius: t.radius.full },\n ]}\n />\n </View>\n );\n};\n\nexport const StepProgress = React.memo(_StepProgress);\n\nconst styles = StyleSheet.create({\n track: { height: 6, width: \"100%\", overflow: \"hidden\" },\n fill: { height: 6 },\n});\n","/**\n * OnboardingScaffold — the themed shell that wraps every step:\n * [ safe area ]\n * header -> StepProgress (a numberless fill — never \"Step X of N\") + optional Skip\n * body -> the rendered card (children), full-screen (flex: 1)\n * footer -> optional Back link\n *\n * WHY a single scaffold: the body content changes every turn (it's an\n * SDK-rendered card), but the chrome — progress, skip, back, padding, safe area —\n * stays constant. Keeping it here means cards never re-implement the frame.\n *\n * The body no longer centers/scrolls the card: each card fills the body via the\n * shared CardLayout, which owns its own scroll + bottom-pinned CTA (Cal-AI style).\n * The safe area uses `react-native-safe-area-context` (top + bottom edges) — the\n * RN core SafeAreaView is deprecated and iOS-only, so the kit takes the standard\n * Expo/RN peer instead of shipping cropped layouts on Android + notched devices.\n */\nimport React from \"react\";\nimport { StyleSheet, Text, TouchableOpacity, View } from \"react-native\";\nimport { SafeAreaView } from \"react-native-safe-area-context\";\nimport { useOnboardingTheme } from \"../theme/ThemeContext\";\nimport { bodyStyle } from \"../theme/typography\";\nimport { StepProgress } from \"./StepProgress\";\nimport { LoaderChromeProvider } from \"./loaderChrome\";\n\n// The header's fixed StepProgress bar height (design bar = 6px; see StepProgress styles).\nconst PROGRESS_TRACK = 6;\n\nexport type OnboardingScaffoldProps = {\n /** 1-based index of the current step; drives the (countless) progress bar. */\n step: number;\n /** When true, the progress bar fills to 100% (flow finished). */\n complete?: boolean;\n /** Approximate total screens, if known — paces the bar (never shown). */\n approxScreens?: number;\n /** Optional Back action — hidden when omitted (e.g. on the first step). */\n onBack?: () => void;\n /** Optional Skip action — hidden when omitted. */\n onSkip?: () => void;\n skipLabel?: string;\n backLabel?: string;\n children: React.ReactNode;\n};\n\nconst _OnboardingScaffold: React.FC<OnboardingScaffoldProps> = ({\n step,\n complete,\n approxScreens,\n onBack,\n onSkip,\n skipLabel = \"Skip\",\n backLabel = \"Back\",\n children,\n}) => {\n const t = useOnboardingTheme();\n const hit = { top: 12, bottom: 12, left: 12, right: 12 };\n\n // Top chrome above the body content = header (progress bar + its paddingTop) + the body's\n // own paddingTop. A loader that fills the body centers half that distance too low; it reads\n // this offset (via LoaderChromeProvider) and shifts UP by half the chrome to land at the true\n // screen center. Cards ignore it, so their layout — and the card↔loader handoff — is untouched.\n const topChrome = t.spacing.md + PROGRESS_TRACK + t.spacing.md;\n const loaderOffsetY = -Math.round(topChrome / 2);\n\n return (\n <SafeAreaView\n edges={[\"top\", \"bottom\"]}\n style={[styles.flex, { backgroundColor: t.colors.background }]}\n >\n <View style={[styles.header, { paddingHorizontal: t.spacing.md, paddingTop: t.spacing.md }]}>\n <View style={styles.progressWrap}>\n <StepProgress step={step} complete={complete} approxScreens={approxScreens} />\n </View>\n {onSkip ? (\n <TouchableOpacity onPress={onSkip} hitSlop={hit} style={{ marginLeft: t.spacing.md }}>\n <Text style={[bodyStyle(t.fonts), { color: t.colors.textMuted }]}>{skipLabel}</Text>\n </TouchableOpacity>\n ) : null}\n </View>\n\n {/* Full-screen body: the card (via CardLayout) fills this and pins its own CTA. */}\n <View style={[styles.body, { paddingHorizontal: t.spacing.md, paddingTop: t.spacing.md }]}>\n <LoaderChromeProvider value={{ offsetY: loaderOffsetY }}>{children}</LoaderChromeProvider>\n </View>\n\n {onBack ? (\n <View style={[styles.footer, { paddingHorizontal: t.spacing.md, paddingBottom: t.spacing.sm }]}>\n <TouchableOpacity onPress={onBack} hitSlop={hit}>\n <Text style={[bodyStyle(t.fonts), { color: t.colors.textMuted }]}>{backLabel}</Text>\n </TouchableOpacity>\n </View>\n ) : null}\n </SafeAreaView>\n );\n};\n\nexport const OnboardingScaffold = React.memo(_OnboardingScaffold);\n\nconst styles = StyleSheet.create({\n flex: { flex: 1 },\n header: { flexDirection: \"row\", alignItems: \"center\" },\n progressWrap: { flex: 1 },\n body: { flex: 1 },\n footer: { flexDirection: \"row\", justifyContent: \"flex-start\" },\n});\n","/**\n * Button — the kit's themed primary/outline button, replacing the SDK's hardcoded\n * `Btn`. Every color/radius/font comes from the active theme.\n *\n * Motion (design-refs/EXTRACTED-SPEC.md row 20): \"a footer button that answers\n * the tap\" — scale 1→0.975 spring on press-in, back on release, native driver.\n * Reduce motion: an opacity dip to 0.85 while pressed, no scale. Disabled keeps\n * the `disabled` token fill with no press handler (unchanged).\n */\nimport React, { useCallback, useRef } from \"react\";\nimport { Animated, Pressable, StyleSheet, Text } from \"react-native\";\nimport { useOnboardingTheme } from \"../theme/ThemeContext\";\nimport { buttonLabelStyle } from \"../theme/typography\";\nimport {\n BUTTON_PRESS_SCALE,\n BUTTON_PRESS_SPRING,\n REDUCED_FADE_MS,\n REDUCED_PRESS_OPACITY,\n scaledMs,\n} from \"../motion/motionSpec\";\nimport { useReducedMotion } from \"../motion/useReducedMotion\";\n\ntype Variant = \"primary\" | \"outline\";\n\ntype ButtonProps = {\n title: string;\n onPress?: () => void;\n variant?: Variant;\n disabled?: boolean;\n /** Stretch to the container width — for form-style CTAs (e.g. the review form's\n * \"Send feedback\"). Default false keeps the content-width pill used by cards. */\n fullWidth?: boolean;\n};\n\nconst _Button: React.FC<ButtonProps> = ({\n title,\n onPress,\n variant = \"primary\",\n disabled = false,\n fullWidth = false,\n}) => {\n const t = useOnboardingTheme();\n const reduced = useReducedMotion();\n const isPrimary = variant === \"primary\";\n\n // 0 = at rest, 1 = pressed. Scale normally; opacity dip under reduce motion.\n const pressT = useRef(new Animated.Value(0)).current;\n const pressTo = useCallback(\n (to: number) => {\n if (reduced) {\n Animated.timing(pressT, {\n toValue: to,\n duration: scaledMs(REDUCED_FADE_MS),\n useNativeDriver: true,\n }).start();\n return;\n }\n Animated.spring(pressT, {\n toValue: to,\n friction: BUTTON_PRESS_SPRING.friction,\n tension: BUTTON_PRESS_SPRING.tension,\n useNativeDriver: true,\n }).start();\n },\n [pressT, reduced],\n );\n const handlePressIn = useCallback(() => pressTo(1), [pressTo]);\n const handlePressOut = useCallback(() => pressTo(0), [pressTo]);\n\n const scale = pressT.interpolate({\n inputRange: [0, 1],\n outputRange: [1, reduced ? 1 : BUTTON_PRESS_SCALE],\n });\n const opacity = pressT.interpolate({\n inputRange: [0, 1],\n outputRange: [1, reduced ? REDUCED_PRESS_OPACITY : 1],\n });\n\n return (\n <Pressable\n onPress={disabled ? undefined : onPress}\n onPressIn={disabled ? undefined : handlePressIn}\n onPressOut={disabled ? undefined : handlePressOut}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityState={{ disabled }}\n style={fullWidth ? styles.fill : undefined}\n >\n <Animated.View\n style={[\n styles.base,\n fullWidth && styles.fill,\n {\n borderRadius: t.button.radius,\n minHeight: t.button.height,\n paddingHorizontal: t.button.paddingX,\n opacity,\n transform: [{ scale }],\n },\n isPrimary\n ? { backgroundColor: disabled ? t.colors.disabled : t.colors.primary }\n : { borderWidth: 1.5, borderColor: disabled ? t.colors.border : t.colors.primary },\n ]}\n >\n <Text\n style={[\n buttonLabelStyle(t.fonts),\n {\n color: disabled\n ? t.colors.textMuted\n : isPrimary\n ? t.colors.onPrimary\n : t.colors.primary,\n },\n ]}\n >\n {title}\n </Text>\n </Animated.View>\n </Pressable>\n );\n};\n\nexport const Button = React.memo(_Button);\n\nconst styles = StyleSheet.create({\n base: { alignItems: \"center\", justifyContent: \"center\" },\n fill: { width: \"100%\" },\n});\n","/**\n * ErrorBlock — shown on backend error/timeout. Carries a retry action so the flow\n * never dead-ends. The host decides what retry does (re-send start, or fall back).\n */\nimport React from \"react\";\nimport { StyleSheet, Text, View } from \"react-native\";\nimport { useOnboardingTheme } from \"../theme/ThemeContext\";\nimport { bodyStyle, headingStyle } from \"../theme/typography\";\nimport { Button } from \"./Button\";\n\nexport type ErrorBlockProps = {\n title?: string;\n message?: string;\n retryLabel?: string;\n onRetry?: () => void;\n};\n\nconst _ErrorBlock: React.FC<ErrorBlockProps> = ({\n title = \"Something went wrong\",\n message = \"We couldn't load this step. You can try again.\",\n retryLabel = \"Try again\",\n onRetry,\n}) => {\n const t = useOnboardingTheme();\n return (\n <View style={[styles.center, { gap: t.spacing.md, padding: t.spacing.lg }]}>\n <Text style={[headingStyle(t.fonts), { color: t.colors.text, textAlign: \"center\" }]}>\n {title}\n </Text>\n <Text style={[bodyStyle(t.fonts), { color: t.colors.textMuted, textAlign: \"center\" }]}>\n {message}\n </Text>\n {onRetry ? <Button title={retryLabel} onPress={onRetry} variant=\"outline\" /> : null}\n </View>\n );\n};\n\nexport const ErrorBlock = React.memo(_ErrorBlock);\n\nconst styles = StyleSheet.create({\n center: { flex: 1, alignItems: \"center\", justifyContent: \"center\" },\n});\n","/**\n * CardLayout — the shared full-screen card body every card renders into. It owns\n * the Cal-AI style vertical rhythm so no card re-implements layout:\n *\n * [ title ] ← fixed at top (small gap → subtitle)\n * [ subtitle / hint ]\n * [ ─ scrollable content ─ ]← options / chips / input; a flex:1 ScrollView that\n * fills the gap, so it scrolls only when tall and\n * otherwise just pushes the footer down\n * [ footer / CTA ] ← the submit button, ANCHORED to the bottom\n *\n * The middle ScrollView (flex:1) IS the flexible spacer: when the content is short\n * it grows to fill, pinning the footer to the bottom of the screen; when the\n * content is many/tall options it scrolls while the CTA stays put. Everything\n * reads from the theme tokens — no hardcoded spacing or color.\n *\n * `align=\"center\"` vertically centers the content (used by the value/status beats:\n * InterstitialCard / StatusCard), keeping the same pinned-CTA footer.\n *\n * The whole column sits in a KeyboardAvoidingView (behavior=\"padding\") so the pinned\n * footer rides above the soft keyboard on text questions (TextInputCard). On hosts\n * whose window already resizes for the keyboard the computed overlap is ~0, so the\n * padding is a no-op — safe on both iOS and Android, edge-to-edge or not.\n */\nimport React from \"react\";\nimport { KeyboardAvoidingView, ScrollView, StyleSheet, Text, View } from \"react-native\";\nimport { useOnboardingTheme } from \"../theme/ThemeContext\";\nimport { bodyStyle, labelStyle } from \"../theme/typography\";\n\nexport type CardLayoutProps = {\n /** Fixed question/label shown at the top. Omit for a header-less centered beat. */\n title?: string;\n /** Optional supporting line under the title (small gap between them). */\n subtitle?: string;\n /** The options / chips / input area — the scrollable middle. */\n children: React.ReactNode;\n /** The pinned bottom CTA (usually a <Button/>). Omitted → no footer. */\n footer?: React.ReactNode;\n /** Vertical alignment of the middle content. \"top\" (questions) | \"center\" (beats). */\n align?: \"top\" | \"center\";\n /** Custom title node (e.g. StatusCard's icon+title row) rendered in place of `title`. */\n titleNode?: React.ReactNode;\n};\n\nconst _CardLayout: React.FC<CardLayoutProps> = ({\n title,\n subtitle,\n children,\n footer,\n align = \"top\",\n titleNode,\n}) => {\n const t = useOnboardingTheme();\n const hasHeader = !!title || !!subtitle || !!titleNode;\n\n return (\n <KeyboardAvoidingView style={styles.fill} behavior=\"padding\">\n {hasHeader ? (\n <View style={{ marginBottom: t.spacing.lg }}>\n {titleNode ??\n (title ? (\n <Text style={[labelStyle(t.fonts), { color: t.colors.text }]}>{title}</Text>\n ) : null)}\n {subtitle ? (\n <Text\n style={[\n bodyStyle(t.fonts),\n { color: t.colors.textMuted, marginTop: t.spacing.xs },\n ]}\n >\n {subtitle}\n </Text>\n ) : null}\n </View>\n ) : null}\n\n <ScrollView\n style={styles.fill}\n contentContainerStyle={[\n styles.scrollContent,\n align === \"center\" && styles.center,\n ]}\n keyboardShouldPersistTaps=\"handled\"\n keyboardDismissMode=\"on-drag\"\n showsVerticalScrollIndicator={false}\n >\n {children}\n </ScrollView>\n\n {footer ? <View style={{ paddingTop: t.spacing.lg }}>{footer}</View> : null}\n </KeyboardAvoidingView>\n );\n};\n\nexport const CardLayout = React.memo(_CardLayout);\n\nconst styles = StyleSheet.create({\n fill: { flex: 1 },\n // flexGrow lets a short content block grow to fill (pinning the footer) while a\n // tall one scrolls past the visible area.\n scrollContent: { flexGrow: 1 },\n center: { justifyContent: \"center\" },\n});\n","/**\n * CompletionView — the terminal \"you're all set\" screen, shown when the flow\n * reaches its final StatusCard. It surfaces the backend's recap (what the app\n * will do for the user, derived from their answers) and a single clear CTA.\n *\n * WHY a dedicated screen (not an instant hand-off): the backend spends the last\n * turn summarizing the user's tastes and what their experience will now look\n * like. The user should actually SEE that payoff and tap to continue — so\n * `onContinue` fires only on the button press, never automatically.\n *\n * Motion (design-refs/EXTRACTED-SPEC.md rows 14-16, the peak-end beat): the\n * badge pops in with a spring (scale 0.4→1, slight overshoot), ONE soft accent\n * burst radiates once behind it (scale 0.4→1.5, opacity 0.5→0, 500ms) —\n * celebratory without confetti — and the copy fades up 80ms apart. Everything\n * settles well under a second. Reduce motion: final frame, no burst.\n */\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Animated, Easing, StyleSheet, Text, View } from \"react-native\";\nimport { useOnboardingTheme } from \"../theme/ThemeContext\";\nimport { bodyStyle, headingStyle } from \"../theme/typography\";\nimport { Button } from \"./Button\";\nimport { CardLayout } from \"./CardLayout\";\nimport {\n STATUS_BURST_MS,\n STATUS_BURST_OPACITY_FROM,\n STATUS_BURST_SCALE_FROM,\n STATUS_BURST_SCALE_TO,\n STATUS_COPY_MS,\n STATUS_POP_SCALE_FROM,\n STATUS_POP_SPRING,\n WIRE_BEZIER,\n scaledMs,\n statusCopyDelay,\n} from \"../motion/motionSpec\";\nimport { useReducedMotion } from \"../motion/useReducedMotion\";\n\nconst easeWire = Easing.bezier(...WIRE_BEZIER);\nconst BADGE_SIZE = 64;\nconst BURST_SIZE = 104;\n\nexport type CompletionViewProps = {\n title: string;\n message?: string;\n ctaLabel?: string;\n onContinue: () => void;\n};\n\nconst _CompletionView: React.FC<CompletionViewProps> = ({\n title,\n message,\n ctaLabel = \"Let's go\",\n onContinue,\n}) => {\n const t = useOnboardingTheme();\n const reduced = useReducedMotion();\n const [submitted, setSubmitted] = useState(false);\n\n const pop = useRef(new Animated.Value(reduced ? 1 : 0)).current;\n const burst = useRef(new Animated.Value(reduced ? 1 : 0)).current;\n const titleT = useRef(new Animated.Value(reduced ? 1 : 0)).current;\n const messageT = useRef(new Animated.Value(reduced ? 1 : 0)).current;\n\n useEffect(() => {\n if (reduced) {\n // Final frame: badge + copy settled, burst already faded out.\n pop.setValue(1);\n burst.setValue(1);\n titleT.setValue(1);\n messageT.setValue(1);\n return;\n }\n const rise = (value: Animated.Value, delay: number) =>\n Animated.timing(value, {\n toValue: 1,\n duration: scaledMs(STATUS_COPY_MS),\n delay,\n easing: easeWire,\n useNativeDriver: true,\n });\n const anims = [\n Animated.spring(pop, {\n toValue: 1,\n friction: STATUS_POP_SPRING.friction,\n tension: STATUS_POP_SPRING.tension,\n useNativeDriver: true,\n }),\n // One-shot celebratory burst: fires once, never loops.\n Animated.timing(burst, {\n toValue: 1,\n duration: scaledMs(STATUS_BURST_MS),\n easing: Easing.out(Easing.ease),\n useNativeDriver: true,\n }),\n rise(titleT, scaledMs(statusCopyDelay(0))),\n rise(messageT, scaledMs(statusCopyDelay(1))),\n ];\n anims.forEach((a) => a.start());\n return () => anims.forEach((a) => a.stop());\n }, [reduced, pop, burst, titleT, messageT]);\n\n const handlePress = useCallback(() => {\n if (submitted) return;\n setSubmitted(true);\n onContinue();\n }, [submitted, onContinue]);\n\n const scale = pop.interpolate({ inputRange: [0, 1], outputRange: [STATUS_POP_SCALE_FROM, 1] });\n const burstScale = burst.interpolate({\n inputRange: [0, 1],\n outputRange: [STATUS_BURST_SCALE_FROM, STATUS_BURST_SCALE_TO],\n });\n const burstOpacity = burst.interpolate({\n inputRange: [0, 1],\n outputRange: [STATUS_BURST_OPACITY_FROM, 0],\n });\n const riseStyle = (value: Animated.Value) => ({\n opacity: value,\n transform: [{ translateY: value.interpolate({ inputRange: [0, 1], outputRange: [10, 0] }) }],\n });\n\n return (\n <CardLayout\n align=\"center\"\n footer={<Button title={ctaLabel} onPress={handlePress} variant=\"primary\" disabled={submitted} />}\n >\n <View style={[styles.center, { gap: t.spacing.md }]}>\n <View style={styles.badgeStage}>\n {/* Soft accent burst behind the badge: primarySoft keeps the tint calm. */}\n <Animated.View\n pointerEvents=\"none\"\n style={[\n styles.burst,\n {\n backgroundColor: t.colors.primarySoft,\n borderRadius: t.radius.full,\n opacity: burstOpacity,\n transform: [{ scale: burstScale }],\n },\n ]}\n />\n <Animated.View\n style={[\n styles.badge,\n {\n backgroundColor: t.colors.primarySoft,\n borderRadius: t.radius.full,\n transform: [{ scale }],\n opacity: pop,\n },\n ]}\n >\n <Text style={[styles.check, { color: t.colors.primary }]}>✓</Text>\n </Animated.View>\n </View>\n\n <Animated.View style={riseStyle(titleT)}>\n <Text style={[headingStyle(t.fonts), { color: t.colors.text, textAlign: \"center\" }]}>\n {title}\n </Text>\n </Animated.View>\n {message ? (\n <Animated.View style={riseStyle(messageT)}>\n <Text style={[bodyStyle(t.fonts), { color: t.colors.textMuted, textAlign: \"center\" }]}>\n {message}\n </Text>\n </Animated.View>\n ) : null}\n </View>\n </CardLayout>\n );\n};\n\nexport const CompletionView = React.memo(_CompletionView);\n\nconst styles = StyleSheet.create({\n center: { width: \"100%\", alignItems: \"center\", justifyContent: \"center\" },\n badgeStage: {\n width: BURST_SIZE,\n height: BURST_SIZE,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n burst: { position: \"absolute\", width: BURST_SIZE, height: BURST_SIZE },\n badge: { width: BADGE_SIZE, height: BADGE_SIZE, alignItems: \"center\", justifyContent: \"center\" },\n check: { fontSize: 34, fontWeight: \"800\" },\n});\n","/**\n * CardHandoff — the card-to-card transition from the Wire Activation design:\n * \"cards hand off, they don't cut\". When `transitionKey` changes, the outgoing\n * child leaves left (translateX 0→-26, fade, 180ms) in an absolute layer while\n * the incoming child arrives from the right (translateX +26→0, fade, 220ms)\n * delayed by the 80ms exit lead — one moving surface, ~300ms total.\n *\n * Variants (per child):\n * - \"slide\": questions — the directional stepper motion above.\n * - \"spring\": the InterstitialCard value beat — scale 0.96→1 spring pop\n * (the shell's springier variant, kept from AnimatedCard).\n * - \"fade\": loaders — enter/exit as a plain 120ms fade so the \"thinking\"\n * state hands off to the first card without a hard cut.\n *\n * Reduce motion: every handoff becomes a 120ms crossfade, no translate/scale.\n * All values run on the native driver (transform/opacity only); in-flight\n * animations are stopped when superseded and on unmount.\n *\n * This SUPERSEDES the enter-only AnimatedCard: same keyed-remount contract from\n * OnboardingFlow (the child renderer stays keyed on the message id), plus the\n * paired exit layer the design calls for.\n */\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { Animated, Easing, StyleSheet } from \"react-native\";\nimport {\n CARD_ENTER_MS,\n CARD_ENTER_SCALE_FROM,\n CARD_EXIT_LEAD_MS,\n CARD_EXIT_MS,\n CARD_SLIDE_PX,\n CARD_SPRING,\n LOADER_HANDOFF_FADE_MS,\n REDUCED_FADE_MS,\n WIRE_BEZIER,\n scaledMs,\n} from \"../motion/motionSpec\";\nimport { useReducedMotion } from \"../motion/useReducedMotion\";\n\nconst easeWire = Easing.bezier(...WIRE_BEZIER);\n\nexport type CardHandoffVariant = \"slide\" | \"spring\" | \"fade\";\n\nexport type CardHandoffProps = {\n /** Identity of the current child (e.g. the message id). A change runs the handoff. */\n transitionKey: string;\n /** How the CURRENT child enters (and, snapshotted, how it will later exit). */\n variant?: CardHandoffVariant;\n children: React.ReactNode;\n};\n\ntype Snapshot = { key: string; node: React.ReactNode; variant: CardHandoffVariant };\n\nconst _CardHandoff: React.FC<CardHandoffProps> = ({\n transitionKey,\n variant = \"slide\",\n children,\n}) => {\n const reduced = useReducedMotion();\n const [leaving, setLeaving] = useState<Snapshot | null>(null);\n\n const enterT = useRef(new Animated.Value(0)).current;\n const exitT = useRef(new Animated.Value(0)).current;\n // The previous render's child, snapshotted so it can play the exit layer.\n const prev = useRef<Snapshot>({ key: transitionKey, node: children, variant });\n // Variant of the child currently entering (drives the enter interpolations).\n const [enterVariant, setEnterVariant] = useState<CardHandoffVariant>(variant);\n const running = useRef<{ enter?: Animated.CompositeAnimation; exit?: Animated.CompositeAnimation }>({});\n const mounted = useRef(false);\n\n // One orchestration effect, run every render: refresh the snapshot while the key\n // is stable; on a key change, snapshot the old child into the exit layer and run\n // the paired exit+enter. (No deps array on purpose — `children` is a fresh node\n // every parent render and must keep the snapshot current.)\n useEffect(() => {\n const last = prev.current;\n prev.current = { key: transitionKey, node: children, variant };\n\n // First mount: enter only (the design's initial reveal), nothing exits.\n if (!mounted.current) {\n mounted.current = true;\n setEnterVariant(variant);\n running.current.enter = startEnter(enterT, variant, reduced, 0);\n return;\n }\n if (last.key === transitionKey) return;\n\n running.current.enter?.stop();\n running.current.exit?.stop();\n setLeaving(last);\n setEnterVariant(variant);\n enterT.setValue(0);\n exitT.setValue(0);\n\n const exitDuration = reduced\n ? REDUCED_FADE_MS\n : last.variant === \"fade\"\n ? LOADER_HANDOFF_FADE_MS\n : CARD_EXIT_MS;\n const exit = Animated.timing(exitT, {\n toValue: 1,\n duration: scaledMs(exitDuration),\n easing: easeWire,\n useNativeDriver: true,\n });\n running.current.exit = exit;\n exit.start();\n\n const enter = startEnter(enterT, variant, reduced, reduced ? 0 : CARD_EXIT_LEAD_MS, () =>\n setLeaving(null),\n );\n running.current.enter = enter;\n });\n\n // Stop anything in flight on unmount (leaked animations drain the JS thread).\n useEffect(\n () => () => {\n running.current.enter?.stop();\n running.current.exit?.stop();\n },\n [],\n );\n\n const enterStyle = {\n opacity: enterT,\n transform: transformFor(enterVariant, enterT, reduced, \"enter\"),\n };\n\n return (\n <>\n {leaving ? (\n <Animated.View\n pointerEvents=\"none\"\n style={[\n StyleSheet.absoluteFill,\n {\n opacity: exitT.interpolate({ inputRange: [0, 1], outputRange: [1, 0] }),\n transform: transformFor(leaving.variant, exitT, reduced, \"exit\"),\n },\n ]}\n >\n {leaving.node}\n </Animated.View>\n ) : null}\n <Animated.View style={[styles.fill, enterStyle]}>{children}</Animated.View>\n </>\n );\n};\n\n/** Kick off the enter animation for a variant (spring for the value beat, timing otherwise). */\nconst startEnter = (\n value: Animated.Value,\n variant: CardHandoffVariant,\n reduced: boolean,\n delay: number,\n onDone?: () => void,\n): Animated.CompositeAnimation => {\n value.setValue(0);\n const anim =\n !reduced && variant === \"spring\"\n ? Animated.spring(value, {\n toValue: 1,\n delay: scaledMs(delay),\n damping: CARD_SPRING.damping,\n stiffness: CARD_SPRING.stiffness,\n mass: CARD_SPRING.mass,\n useNativeDriver: true,\n })\n : Animated.timing(value, {\n toValue: 1,\n delay: scaledMs(delay),\n duration: scaledMs(\n reduced\n ? REDUCED_FADE_MS\n : variant === \"fade\"\n ? LOADER_HANDOFF_FADE_MS\n : CARD_ENTER_MS,\n ),\n easing: easeWire,\n useNativeDriver: true,\n });\n anim.start(({ finished }) => {\n if (finished) onDone?.();\n });\n return anim;\n};\n\n/** Transform track per variant/direction; reduce motion = opacity-only crossfade. */\nconst transformFor = (\n variant: CardHandoffVariant,\n t: Animated.Value,\n reduced: boolean,\n direction: \"enter\" | \"exit\",\n) => {\n if (reduced || variant === \"fade\") return [];\n if (variant === \"spring\" && direction === \"enter\") {\n return [{ scale: t.interpolate({ inputRange: [0, 1], outputRange: [CARD_ENTER_SCALE_FROM, 1] }) }];\n }\n return [\n {\n translateX: t.interpolate({\n inputRange: [0, 1],\n outputRange: direction === \"enter\" ? [CARD_SLIDE_PX, 0] : [0, -CARD_SLIDE_PX],\n }),\n },\n ];\n};\n\nexport const CardHandoff = React.memo(_CardHandoff);\n\nconst styles = StyleSheet.create({\n fill: { flex: 1 },\n});\n","/**\n * deriveAnswers — read the user's structured choices off the thread.\n *\n * The cards send answers back as natural-language strings (the SDK's\n * useWireAIAction wraps them, e.g. `I selected: [\"Food\",\"Travel\"]`,\n * `My answer is: \"Casablanca\"`). We pair each rendered question with the reply\n * that followed it and key the answer by the backend's progress `key` when\n * present (so `username`/`interests`/`city` come back under their real keys),\n * else by the question text. No second LLM call — the values ARE the data.\n */\nimport type { Message } from \"wireai-rn\";\n\nconst stripPrefix = (s: string): string =>\n s.replace(/^(I selected:|My answer is:|I tapped:)\\s*/i, \"\").trim();\n\nconst tryParse = (s: string): unknown => {\n try {\n return JSON.parse(s);\n } catch {\n return s;\n }\n};\n\nexport const deriveAnswers = (messages: Message[]): Record<string, unknown> => {\n const out: Record<string, unknown> = {};\n for (let i = 0; i < messages.length; i++) {\n const m = messages[i];\n const r = m?.response;\n if (!m || m.role !== \"assistant\" || !r || r.action !== \"render\") continue;\n\n const props = (r.props ?? {}) as Record<string, unknown>;\n const progress = props.progress as { key?: string } | undefined;\n const questionText =\n (props.title as string) ?? (props.label as string) ?? (props.question as string);\n const key = progress?.key || questionText;\n\n const reply = messages[i + 1];\n if (key && reply?.role === \"user\") {\n out[key] = tryParse(stripPrefix(reply.content));\n }\n }\n return out;\n};\n","/**\n * readProgress — pull the backend's progress metadata off a render response.\n *\n * The managed backend rides `{ step, total, key }` inside the Wire envelope's\n * `props.progress`. That's the only field that survives the SDK's strict client\n * validation (extra top-level keys get folded into props; the card's own schema\n * silently strips `progress` from its render props, but it stays readable on\n * `response.props`). All fields are optional so an older backend just falls back\n * to the local counter.\n */\nimport type { WireAIResponse } from \"wireai-rn\";\nimport type { OnboardingProgress } from \"../types\";\n\ntype PartialProgress = {\n step?: number;\n total?: number;\n key?: string;\n skippable?: boolean;\n};\n\nexport const readProgress = (response?: WireAIResponse): PartialProgress => {\n if (!response || response.action !== \"render\") return {};\n const props = (response.props ?? {}) as Record<string, unknown>;\n const raw = props.progress;\n if (!raw || typeof raw !== \"object\") return {};\n const p = raw as Partial<OnboardingProgress>;\n return {\n step: typeof p.step === \"number\" ? p.step : undefined,\n total: typeof p.total === \"number\" ? p.total : undefined,\n key: typeof p.key === \"string\" ? p.key : undefined,\n skippable: typeof p.skippable === \"boolean\" ? p.skippable : undefined,\n };\n};\n","/**\n * reportClientEvent — forward DEVICE-ONLY onboarding events to the Wire AI analytics\n * backend (`POST {serverUrl}/v1/events`), completing the funnel for events the server\n * can't observe on its own.\n *\n * The backend already records the server-observable funnel during the A2A flow\n * (`session_started`, `screen_shown`, `answer_submitted`, `completed`, `llm_fallback`,\n * and even `screen_skipped` — it derives that from the kit's skip sentinel). The one\n * event no server request can capture is `dropped`: the user closing the app / unmounting\n * the flow without finishing. That's what this reporter is for.\n *\n * Contract (server: routers/onboarding.py → analytics/events.py):\n * POST {serverUrl}/v1/events\n * Authorization: Bearer {apiKey}\n * { \"events\": [ { event_type, session_id, screen_index?, component?, question_key?,\n * latency_ms?, meta?, device?, user_context? } ] }\n * The server fills `app_id` + `environment` from the resolving key (never send app_id),\n * and silently skips malformed events — one bad payload never fails the batch.\n *\n * ⚠️ Correlation: `session_id` MUST equal the A2A `contextId` the server uses to key the\n * server-side events, or the funnel report (which groups by `session_id`) treats this as a\n * phantom session. See `makeSessionId` + WireOnboarding for how the kit seeds it.\n *\n * Fire-and-forget: this never throws into the UI and never awaits — analytics must never\n * be able to break onboarding.\n */\nimport type { DeviceContext } from \"../device/deviceContext\";\n\n/** Event types a CLIENT may report. The rest of the funnel is server-side; sending those\n * here would double-count. `screen_skipped` is included for completeness, but the kit does\n * NOT emit it — the backend already derives it from the skip sentinel (see OnboardingFlow).\n * `client_fallback` is emitted by the kit when the AI flow degrades to the static fallback,\n * so the dashboard's fallback-rate counts the whole-flow case (distinct from the server's\n * per-turn `llm_fallback`). The server back-fills a `session_started` for it if unseen.\n * This is the SINGLE fallback signal — hosts must NOT also report their own.\n * `identify` binds the host's opaque `user_id` to this `session_id` (late binding — the user\n * registered during/after onboarding). It carries no funnel weight; the server maps the\n * session to the user and back-fills a `session_started` if it never saw the session. */\nexport type ClientEventType = \"screen_skipped\" | \"dropped\" | \"client_fallback\" | \"identify\";\n\n/** One client-reported event. Mirrors the server's `OnboardingEvent` (client-settable fields). */\nexport type ClientEvent = {\n event_type: ClientEventType;\n /** Must match the server-side A2A contextId for this onboarding (see makeSessionId). */\n session_id: string;\n /** 0-based index of the screen the event refers to (matches server `screen_shown`). */\n screen_index?: number;\n component?: string;\n question_key?: string;\n latency_ms?: number;\n /** JSON-stringified extras; the server stores it verbatim. */\n meta?: string;\n /**\n * Privacy-label-neutral device snapshot (platform / form factor / locale / host appVersion).\n * Sent as an object; the server sanitizes + persists it and derives a coarse country. Old\n * servers ignore this unknown field — fully backward compatible. See device/deviceContext.ts.\n */\n device?: DeviceContext;\n /**\n * Host-injected, non-PII context (signup method, referral, plan, hashed user id). Old servers\n * ignore it. MUST NOT contain PII like raw emails — see the README `userContext` section.\n */\n user_context?: Record<string, string | number | boolean>;\n /**\n * The host's OPAQUE PSEUDONYMOUS user id (their internal id, NOT an email/name). Required on\n * `identify`, optional (rides along) on other events. Trimmed + capped at 128 chars host-side.\n * Lets the backend reconcile onboarding sessions to real users. Old servers ignore it.\n */\n user_id?: string;\n};\n\n/** Where to POST. Derived from `WireOnboardingConfig` (`serverUrl` + `apiKey`). */\nexport type ClientEventTarget = {\n /** Base server URL (same as `WireOnboardingConfig.serverUrl`); `/v1/events` is appended. */\n serverUrl: string;\n /** Tenant API key; sent as `Authorization: Bearer`. */\n apiKey: string;\n};\n\n/**\n * A unique-per-onboarding session id. Used both as the client event `session_id` AND as the\n * seed the kit forwards to the backend so the SERVER adopts it as the A2A `contextId` — making\n * client and server agree (see WireOnboarding + the SDK-correlation note in the kit docs).\n * No crypto dependency: timestamp + random is collision-safe for a single device's onboarding.\n */\nexport const makeSessionId = (): string =>\n `wire_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n\n/**\n * POST one or more client events, fire-and-forget. A missing/invalid target, a build error,\n * a missing `fetch`, or a network failure is swallowed — the call returns immediately and the\n * request (if any) runs in the background.\n */\nexport const reportClientEvents = (\n target: ClientEventTarget | undefined,\n events: ClientEvent[],\n): void => {\n if (!target?.serverUrl || events.length === 0) return;\n try {\n const url = `${target.serverUrl.replace(/\\/$/, \"\")}/v1/events`;\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (target.apiKey) headers.Authorization = `Bearer ${target.apiKey}`;\n void fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ events }),\n }).catch(() => {\n // Network/transport error — analytics is best-effort, swallow.\n });\n } catch {\n // URL construction, JSON serialization, or a missing fetch — swallow.\n }\n};\n\n/** Convenience single-event wrapper around {@link reportClientEvents}. */\nexport const reportClientEvent = (\n target: ClientEventTarget | undefined,\n event: ClientEvent,\n): void => reportClientEvents(target, [event]);\n","/**\n * sendPreview — fire-and-forget PREFETCH of the next A2A turn, so the backend can warm\n * its generation cache during a moment the user isn't waiting.\n *\n * Two callers, both firing the SAME text the real commit will send (the backend keys the\n * preview cache on the raw message string, so a mismatch just misses harmlessly):\n * 1. InterstitialCard — its answer is always \"continue\" (SDK-wrapped `My answer is: \"continue\"`),\n * warmed while the user reads the momentum screen.\n * 2. Choice cards (Selection/ChipSelect) — warmed on selection-change with the exact\n * `I selected: ${JSON.stringify(value)}` the Continue tap will send, so the perceptibly-slow\n * first LLM question returns from cache. See OnboardingFlow.previewOnSelect.\n *\n * Contract (mirrors the A2A `message/send` shape, but a distinct `method`):\n * POST {serverUrl}/a2a\n * Authorization: Bearer {apiKey}\n * { jsonrpc:\"2.0\", id:<rand>, method:\"message/preview\",\n * params:{ message:{ role:\"user\", parts:[{ text }] }, contextId:<sessionId>,\n * metadata:{ sessionId } } }\n *\n * Fire-and-forget, exactly like reportClientEvent: never awaits, never throws into the UI —\n * a prefetch that fails just means the real turn generates normally.\n */\n\n/** Where to POST the preview. Same tenant creds as the flow (`serverUrl` + `apiKey`). */\nexport type PreviewTarget = {\n /** Base server URL (same as `WireOnboardingConfig.serverUrl`); `/a2a` is appended. */\n serverUrl: string;\n /** Tenant API key; sent as `Authorization: Bearer`. */\n apiKey: string;\n};\n\n/** What to preview: the session to warm and the message the user is about to send. */\nexport type PreviewArgs = {\n /** A2A contextId for this onboarding (the kit session id). */\n sessionId: string;\n /** The message that will be committed next (for interstitials, always \"continue\"). */\n userMessage: string;\n};\n\n/**\n * Warm the next turn's cache, fire-and-forget. A missing/invalid target, a build error,\n * a missing `fetch`, or a network failure is swallowed — the call returns immediately and\n * the request (if any) runs in the background.\n */\nexport const sendPreview = (\n target: PreviewTarget | undefined,\n { sessionId, userMessage }: PreviewArgs,\n): void => {\n if (!target?.serverUrl) return;\n try {\n const url = `${target.serverUrl.replace(/\\/$/, \"\")}/a2a`;\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (target.apiKey) headers.Authorization = `Bearer ${target.apiKey}`;\n void fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: Math.floor(Math.random() * 1e9),\n method: \"message/preview\",\n params: {\n message: { role: \"user\", parts: [{ text: userMessage }] },\n contextId: sessionId,\n metadata: { sessionId },\n },\n }),\n }).catch(() => {\n // Network/transport error — prefetch is best-effort, swallow.\n });\n } catch {\n // URL construction, JSON serialization, or a missing fetch — swallow.\n }\n};\n","/**\n * OnboardingFlow — the inner engine. Mirrors the proven production-app usage of the SDK\n * (useWireAIThread + useWireAIAction + ComponentRenderer) and layers on the kit's\n * shell, progress, and per-step validators.\n *\n * Lifecycle per turn:\n * 1. Auto-send `startMessage` once → backend returns the first card.\n * 2. Show LoadingBlock until the first card arrives AND between every turn\n * (while `isLoading`); on error/timeout, auto-retry up to `maxRetries`, then\n * degrade to the host's static `fallbackFlow` (preferred), else `onError`, else\n * an inline ErrorBlock — so a generation failure never breaks onboarding.\n * 3. Render the latest card inside OnboardingScaffold. The progress bar follows\n * an asymptotic curve of the step index — it never reveals a total.\n * 4. Before any answer is sent, if the current screen's question key has a\n * validator, run it; on failure show the error inline and DON'T advance.\n * 5. On the terminal StatusCard, show CompletionView (the recap of what the app\n * will do for the user) and fire onComplete only when they tap its CTA.\n *\n * Lifecycle events (started / per-turn / error) are surfaced via `onEvent` so a\n * host can keep its analytics even though the kit owns the thread loop.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n ComponentRenderer,\n useWireAIAction,\n useWireAIThread,\n type Message,\n} from \"wireai-rn\";\nimport { OnboardingScaffold } from \"./components/OnboardingScaffold\";\nimport { LoadingBlock } from \"./components/LoadingBlock\";\nimport { LoadingScreen } from \"./components/LoadingScreen\";\nimport { ErrorBlock } from \"./components/ErrorBlock\";\nimport { CompletionView } from \"./components/CompletionView\";\nimport { CardHandoff } from \"./components/CardHandoff\";\nimport { deriveAnswers } from \"./utils/deriveAnswers\";\nimport { readProgress } from \"./utils/readProgress\";\nimport { reportClientEvent, type ClientEventTarget } from \"./analytics/reportClientEvent\";\nimport { sendPreview } from \"./analytics/sendPreview\";\nimport type { DeviceContext } from \"./device/deviceContext\";\nimport type { OnboardingCopy, OnboardingEvent, OnboardingResult, StepValidator } from \"./types\";\n\ntype OnboardingFlowProps = {\n validators?: Record<string, StepValidator>;\n onComplete: (result: OnboardingResult) => void;\n onSkip?: () => void;\n onError?: (err: unknown) => void;\n onEvent?: (event: OnboardingEvent) => void;\n copy?: Partial<OnboardingCopy>;\n approxScreens?: number;\n startMessage: string;\n startTimeoutMs: number;\n /** Static onboarding rendered when the AI flow fails and retries are exhausted. */\n fallbackFlow?: React.ReactNode;\n /** Consecutive failures to auto-retry before degrading. */\n maxRetries: number;\n /** Where to POST device-only client events (`dropped`). Omit to disable reporting. */\n reportTarget?: ClientEventTarget;\n /** Session id shared with the backend (A2A contextId), so `dropped` correlates. */\n sessionId: string;\n /**\n * Device snapshot + host-injected user context, attached to every client event so the\n * backend can segment the funnel by device. Old servers ignore the extra fields.\n */\n clientContext?: {\n device?: DeviceContext;\n userContext?: Record<string, string | number | boolean>;\n /** The host's opaque user id (see WireOnboarding `userId`), rides `dropped`/`client_fallback`. */\n userId?: string;\n };\n /**\n * True when `sessionId` was restored from persisted storage (app killed mid-flow).\n * The kickoff then sends the skip sentinel instead of `startMessage` — the server\n * would record the literal start text as the ANSWER to the pending question, while\n * the sentinel advances one card recording nothing — and fires `resumed` instead of\n * `started` so host funnels don't double-count the session.\n */\n resumed?: boolean;\n};\n\n// The kit's per-question Skip sends this sentinel; the backend skips ONE question\n// (advances one card, no answer recorded). Must match the backend's SKIP_ONE_SENTINEL.\nconst SKIP_ONE_SENTINEL = \"__wireai_skip__\";\n\n// Callbacks that carry the user's ANSWER (and so must pass validation first).\nconst ANSWER_CALLBACKS = [\"onSubmit\", \"onSelect\", \"onConfirm\", \"onPress\"] as const;\n\nexport const DEFAULT_COPY: OnboardingCopy = {\n startingTitle: \"Getting started…\",\n startingHint: \"Setting up your onboarding\",\n restoringTitle: \"Picking up where you left off…\",\n restoringHint: \"Restoring your session\",\n thinkingTitle: \"Personalizing…\",\n thinkingHint: \"Tailoring your next question\",\n checkingTitle: \"Checking…\",\n checkingHint: \"One moment\",\n completeTitle: \"You're all set\",\n completeCta: \"Let's go\",\n};\n\nexport const OnboardingFlow: React.FC<OnboardingFlowProps> = ({\n validators,\n onComplete,\n onError,\n onEvent,\n copy,\n approxScreens,\n startMessage,\n startTimeoutMs,\n fallbackFlow,\n maxRetries,\n reportTarget,\n sessionId,\n resumed = false,\n clientContext,\n}) => {\n const { messages, error, isLoading, sendMessage, reset } = useWireAIThread();\n const makeActions = useWireAIAction(sendMessage);\n\n const c = useMemo<OnboardingCopy>(() => ({ ...DEFAULT_COPY, ...copy }), [copy]);\n\n // Hold the latest event/error callbacks in refs so the lifecycle effects below\n // stay stable (and fire exactly once) regardless of the host re-passing closures.\n const onEventRef = useRef(onEvent);\n onEventRef.current = onEvent;\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n // Client-event reporting refs, captured so the unmount cleanup (which runs once, with a\n // stale closure) reads current values.\n const reportTargetRef = useRef(reportTarget);\n reportTargetRef.current = reportTarget;\n const sessionIdRef = useRef(sessionId);\n sessionIdRef.current = sessionId;\n // Device + user context, held in a ref so the mount-once unmount cleanup (the `dropped`\n // reporter, which runs with a stale closure) reads the current snapshot.\n const clientContextRef = useRef(clientContext);\n clientContextRef.current = clientContext;\n // Last 0-based screen index we showed the user (matches the server's `screen_shown`\n // index). Used as the `dropped` event's screen_index. -1 = nothing shown yet.\n const lastScreenIndexRef = useRef(-1);\n // Trailing-edge debounce timer for prefetch-on-select (see previewOnSelect below).\n const previewTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const started = useRef(false);\n const finished = useRef(false);\n const errored = useRef(false);\n const attempts = useRef(0);\n // Mirror of the `degraded` state for the unmount cleanup: a degrade to the static\n // fallback is NOT a drop, so `dropped` must not fire after it.\n const degradedRef = useRef(false);\n const [degraded, setDegraded] = useState(false);\n const [timedOut, setTimedOut] = useState(false);\n const [validationError, setValidationError] = useState<string | undefined>();\n const [validating, setValidating] = useState(false);\n\n const lastCard = useMemo<Message | undefined>(\n () => [...messages].reverse().find((m) => m.role === \"assistant\" && m.response?.action === \"render\"),\n [messages],\n );\n\n // Local fallback counter — how many distinct rendered cards we've seen.\n const renderedCount = useMemo(\n () => messages.filter((m) => m.role === \"assistant\" && m.response?.action === \"render\").length,\n [messages],\n );\n\n const progress = useMemo(() => readProgress(lastCard?.response), [lastCard]);\n\n // 1. Auto-start: the backend treats the first inbound message as \"begin\".\n // On a RESUMED session (persisted id restored after an app kill) the kickoff is\n // the skip sentinel instead: the server has this session mid-flow with a pending\n // question, and would record `startMessage`'s literal text as its ANSWER — the\n // sentinel advances one card recording nothing (a `screen_skipped`). On a session\n // the server no longer knows (restart/expiry), the sentinel degrades cleanly to a\n // normal kickoff under the same id. Retries re-send the same kickoff.\n useEffect(() => {\n if (started.current) return;\n started.current = true;\n sendMessage(resumed ? SKIP_ONE_SENTINEL : startMessage);\n // Surface the session id (the A2A contextId) on the start event so a host can capture it\n // and bind a user AFTER the flow via `identifyOnboarding({ contextId })` — completion clears\n // the persisted session, so the in-flight event is the reliable post-flow handle. sessionId\n // is stable for the whole session (minted before this subtree mounts), so this stays mount-once.\n onEventRef.current?.(\n resumed\n ? { type: \"resumed\", contextId: sessionId }\n : { type: \"started\", contextId: sessionId },\n );\n }, [sendMessage, startMessage, resumed, sessionId]);\n\n // 2. Startup watchdog.\n useEffect(() => {\n if (lastCard) return;\n const timer = setTimeout(() => setTimedOut(true), startTimeoutMs);\n return () => clearTimeout(timer);\n }, [lastCard, startTimeoutMs]);\n\n // A new card arrived → clear any prior inline validation error + emit a turn event.\n useEffect(() => {\n setValidationError(undefined);\n if (!lastCard?.id) return;\n const step = progress.step ?? renderedCount;\n // Remember the latest screen we showed (0-based) for a possible `dropped` event.\n lastScreenIndexRef.current = Math.max(0, step - 1);\n onEventRef.current?.({\n type: \"turn\",\n step,\n component: lastCard.response?.component,\n });\n // Prefetch: an InterstitialCard's answer is always \"continue\", so we can warm the next\n // turn's cache during the momentum window — by the time the user taps Continue the following\n // card is already generated. The preview MUST use the exact text the real Continue tap sends,\n // or the backend's message-keyed preview cache misses. The card's onSubmit(\"continue\") is\n // wrapped by the SDK as `My answer is: ${JSON.stringify(value)}`, so mirror that here.\n // Fire-and-forget; a failed/missed preview just means the real turn generates normally.\n if (lastCard.response?.component === \"InterstitialCard\") {\n sendPreview(reportTargetRef.current, {\n sessionId: sessionIdRef.current,\n userMessage: `My answer is: ${JSON.stringify(\"continue\")}`,\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [lastCard?.id]);\n\n // `dropped`: the user abandoned onboarding. No backend request fires on unmount, so the\n // server can't see this — the client must report it. Fire ONLY on a true unmount that\n // did NOT complete (`onComplete` never ran) and did NOT degrade to the static fallback\n // (a degrade is a reliability fallback, not a user drop). Refs keep this effect mount-once.\n useEffect(() => {\n return () => {\n if (finished.current || degradedRef.current) return;\n reportClientEvent(reportTargetRef.current, {\n event_type: \"dropped\",\n session_id: sessionIdRef.current,\n screen_index: lastScreenIndexRef.current >= 0 ? lastScreenIndexRef.current : undefined,\n device: clientContextRef.current?.device,\n user_context: clientContextRef.current?.userContext,\n user_id: clientContextRef.current?.userId,\n });\n };\n }, []);\n\n // Silently restart the thread from turn one (shared by auto-retry + manual retry).\n // Does NOT clear the attempt counter or the degraded flag — the caller decides that.\n const restartThread = useCallback(() => {\n setTimedOut(false);\n started.current = false;\n errored.current = false;\n reset();\n }, [reset]);\n\n // 3. Error/timeout → auto-retry a transient blip, then degrade to the static flow.\n // Each failure: log `error`; if we have retries left, restart the thread silently\n // (`retry`); once exhausted, mark `degraded` so the render falls through to the\n // host's `fallbackFlow`/`onError` (`fallback`). Counter is a ref → survives the\n // reset()-driven re-renders. This is the \"AI fails → static onboarding, never a\n // broken screen\" guarantee.\n useEffect(() => {\n if (errored.current) return;\n if (!error && !timedOut) return;\n errored.current = true;\n const reason: \"backend\" | \"timeout\" = error ? \"backend\" : \"timeout\";\n onEventRef.current?.({ type: \"error\", reason });\n attempts.current += 1;\n if (attempts.current <= maxRetries) {\n onEventRef.current?.({ type: \"retry\", reason, attempt: attempts.current });\n restartThread();\n } else {\n onEventRef.current?.({ type: \"fallback\", reason });\n // Report the degrade to the backend so the dashboard's fallback-rate reflects it.\n // Server-side `llm_fallback` fires per single degraded turn; this `client_fallback`\n // captures the whole-flow case (AI gave up, the user got static onboarding). The server\n // ingests it idempotently and back-fills a `session_started` if it never saw the session,\n // so even a device that dropped straight to its static manifest shows as a counted\n // fallback session. This is the ONE fallback signal — hosts must NOT also report it.\n reportClientEvent(reportTargetRef.current, {\n event_type: \"client_fallback\",\n session_id: sessionIdRef.current,\n screen_index: lastScreenIndexRef.current >= 0 ? lastScreenIndexRef.current : undefined,\n meta: JSON.stringify({ reason }),\n device: clientContextRef.current?.device,\n user_context: clientContextRef.current?.userContext,\n user_id: clientContextRef.current?.userId,\n });\n degradedRef.current = true;\n setDegraded(true);\n onErrorRef.current?.(error ?? new Error(\"Onboarding timed out\"));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [error, timedOut, maxRetries]);\n\n // 5. Completion: the terminal StatusCard is rendered as CompletionView; we fire\n // onComplete only when the user taps its CTA (guarded so it fires once).\n const handleFinish = useCallback(() => {\n if (finished.current) return;\n finished.current = true;\n onComplete({ answers: deriveAnswers(messages), raw: messages });\n }, [messages, onComplete]);\n\n // Manual retry (the no-fallback ErrorBlock button): clear the degrade + counter so\n // the user gets a fresh set of attempts.\n const handleRetry = useCallback(() => {\n attempts.current = 0;\n degradedRef.current = false;\n setDegraded(false);\n restartThread();\n }, [restartThread]);\n\n // Per-question Skip: tell the backend to skip THIS question only and advance to the\n // next card (no answer recorded) — distinct from finishing the flow. Rendered only\n // when the current card is `skippable` (see the scaffold below).\n //\n // NOTE: we deliberately do NOT report a client `screen_skipped` here. The backend already\n // emits `screen_skipped` (correctly correlated by its own contextId, with screen_index +\n // question_key) when it processes this SKIP_ONE_SENTINEL — see the server engine. A client\n // emission would double-count. The reporter supports `screen_skipped` for clients whose skip\n // never reaches the server, which is not the case for this kit.\n const skipQuestion = useCallback(() => {\n if (isLoading) return;\n sendMessage(SKIP_ONE_SENTINEL);\n }, [isLoading, sendMessage]);\n\n // Prefetch on SELECT — the fix for \"the first AI question is always the slowest\". Q1 is a\n // deterministic base card (instant); Q2 is the first LLM turn, and neither cache protects it\n // (flow-cache misses a novel answer combo, the provider prompt-cache is cold on the first\n // call). Choice cards hold their selection LOCALLY and only commit on Continue, so there's a\n // real gap we can use: as the user picks, fire a debounced `message/preview` keyed on the\n // EXACT text the Continue tap will send (`I selected: ${JSON.stringify(value)}`), so the\n // backend generates Q2 during the pick→Continue window. By the time they tap Continue it's\n // already cached → the slow question returns instantly. Fire-and-forget: if they change the\n // selection after the last preview, the real turn just generates normally (never worse than\n // today). Trailing-edge debounced so rapid multi-select toggles warm at most once.\n const previewOnSelect = useCallback((value: string | string[]) => {\n const target = reportTargetRef.current;\n if (!target?.serverUrl) return;\n if (Array.isArray(value) ? value.length === 0 : !value) return;\n if (previewTimer.current) clearTimeout(previewTimer.current);\n previewTimer.current = setTimeout(() => {\n sendPreview(target, {\n sessionId: sessionIdRef.current,\n userMessage: `I selected: ${JSON.stringify(value)}`,\n });\n }, 300);\n }, []);\n\n // Cancel any pending preview on unmount so a fired-but-unsent warm can't outlive the flow.\n useEffect(() => () => {\n if (previewTimer.current) clearTimeout(previewTimer.current);\n }, []);\n\n // 4. Wrap the SDK's action callbacks so an answer is validated before it's sent.\n const wrappedActions = useCallback(\n (messageId: string) => {\n const base = makeActions(messageId);\n const key = progress.key;\n const validator = key ? validators?.[key] : undefined;\n if (!validator) return base;\n\n const out: Record<string, (...args: unknown[]) => void> = { ...base };\n for (const name of ANSWER_CALLBACKS) {\n const original = base[name];\n if (!original) continue;\n out[name] = (...args: unknown[]) => {\n const value = args[0];\n // Only string answers are validatable (e.g. username). Pass others through.\n if (typeof value !== \"string\") return original(...args);\n setValidating(true);\n validator(value)\n .then((res) => {\n if (res.ok) {\n setValidationError(undefined);\n original(...args);\n } else {\n setValidationError(res.error ?? \"That value isn't available.\");\n }\n })\n .catch(() => {\n // A validator failure must never block the user — let them proceed.\n original(...args);\n })\n .finally(() => setValidating(false));\n };\n }\n return out;\n },\n [makeActions, progress.key, validators],\n );\n\n // ── Render ────────────────────────────────────────────────────────────────\n // Degraded (retries exhausted): render the host's static onboarding in place —\n // the \"AI failed → your static flow, never a broken screen\" guarantee. If no\n // static flow was supplied, hand off to onError (host navigates away), else the\n // inline retry screen as a last resort.\n if (degraded) {\n if (fallbackFlow !== undefined) return <>{fallbackFlow}</>;\n if (onError) {\n return <LoadingScreen title={c.startingTitle} hint={c.startingHint} />;\n }\n return (\n <ErrorBlock\n onRetry={handleRetry}\n message={\n timedOut\n ? \"This is taking longer than expected. Try again?\"\n : \"We couldn't reach the onboarding service. Try again?\"\n }\n />\n );\n }\n\n // Errored but not yet degraded → an auto-retry is in flight. Show a neutral loader\n // so a transient blip never flashes an error screen.\n if (error || timedOut) {\n return <LoadingScreen title={c.startingTitle} hint={c.startingHint} />;\n }\n\n const response = lastCard?.response;\n\n // No card yet → the first \"thinking\" screen.\n if (!lastCard || !response) {\n return <LoadingScreen title={c.startingTitle} hint={c.startingHint} />;\n }\n\n // Step index drives the progress bar. A total (never shown) only paces the fill:\n // prefer a backend-supplied total, else the host's approximate prop, else asymptotic.\n const step = progress.step ?? renderedCount;\n const total = progress.total ?? approxScreens;\n const isTerminal = response.action === \"render\" && response.component === \"StatusCard\";\n\n // Terminal recap: show what the app will now do for the user (backend-authored),\n // and finish only when they tap the CTA.\n if (isTerminal) {\n const props = (response.props ?? {}) as {\n title?: string;\n message?: string;\n ctaLabel?: string;\n };\n return (\n <OnboardingScaffold step={step} complete approxScreens={total}>\n <CompletionView\n title={props.title ?? c.completeTitle}\n message={props.message}\n ctaLabel={props.ctaLabel ?? c.completeCta}\n onContinue={handleFinish}\n />\n </OnboardingScaffold>\n );\n }\n\n const overrides: Record<string, unknown> = {\n ...wrappedActions(lastCard.id),\n // Inject the inline error onto whichever card supports it (TextInputCard).\n validationError,\n // Choice cards (Selection/ChipSelect) call this as the live selection changes, so the flow\n // can prefetch the next turn before Continue. Non-committing; ignored by cards that don't use it.\n onSelectionChange: previewOnSelect,\n };\n\n return (\n <OnboardingScaffold\n step={step}\n onSkip={progress.skippable ? skipQuestion : undefined}\n approxScreens={total}\n >\n {/* CardHandoff pairs the exit with the enter (the design's \"cards hand off,\n they don't cut\"): the answered card leaves left while the next arrives\n from the right; loader states enter/exit as a short fade. transitionKey\n identifies WHAT is on screen — loader states get a stable key per state,\n cards key on the message id. */}\n <CardHandoff\n transitionKey={validating ? \"loader:checking\" : isLoading ? \"loader:thinking\" : lastCard.id}\n variant={\n validating || isLoading\n ? \"fade\"\n : lastCard.response?.component === \"InterstitialCard\"\n ? \"spring\"\n : \"slide\"\n }\n >\n {validating ? (\n <LoadingBlock title={c.checkingTitle} hint={c.checkingHint} />\n ) : isLoading ? (\n // Between turns: the answer was sent and we're waiting on the next card.\n // Show the \"thinking\" loader instead of leaving the old card on screen.\n <LoadingBlock title={c.thinkingTitle} hint={c.thinkingHint} />\n ) : (\n // key={lastCard.id} is load-bearing: cards (SelectionCard/ChipSelectCard)\n // hold internal `selected`/`submitted` state, and React reuses a component\n // instance across turns when the rendered type is identical (e.g. two\n // SelectionCards in a row). Without a per-turn key the second card inherits\n // the first's `submitted=true` and silently rejects all taps. Keying on the\n // message id forces a fresh mount every turn. (CardHandoff's transitionKey\n // shares the id, but this renderer key stays the state-isolation guarantee.)\n <ComponentRenderer\n key={lastCard.id}\n messageId={lastCard.id}\n response={response}\n callbackOverrides={overrides as never}\n />\n )}\n </CardHandoff>\n </OnboardingScaffold>\n );\n};\n","/**\n * Themed ChipSelectCard — drop-in replacement for the OSS SDK's ChipSelectCard.\n * Identical `name`, `propsSchema`, `defaultProps`, and `onSelect` callback contract\n * so the SDK's ComponentRenderer drives it transparently. Only the look is themed.\n *\n * Motion (design-refs/EXTRACTED-SPEC.md rows 4-6): chips tick on press (scale\n * 0.94 spring), the selected accent fill crossfades in over 160ms (native-driver\n * opacity overlay) with the label flipping to `onPrimary` and a check popping in.\n * Deselect reverses. Reduce motion: color swap only, check shown instantly.\n */\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Animated, Easing, Pressable, StyleSheet, Text, View } from \"react-native\";\nimport { z } from \"zod\";\nimport type { InjectedProps, WireAIComponent } from \"wireai-rn\";\nimport { useOnboardingTheme } from \"../theme/ThemeContext\";\nimport { captionStyle } from \"../theme/typography\";\nimport { Button } from \"../components/Button\";\nimport { CardLayout } from \"../components/CardLayout\";\nimport {\n CHECK_SCALE_FROM,\n CHECK_SPRING,\n CHIP_FILL_MS,\n CHIP_PRESS_SCALE,\n PRESS_SPRING,\n WIRE_BEZIER,\n scaledMs,\n stateChangeDuration,\n} from \"../motion/motionSpec\";\nimport { useReducedMotion } from \"../motion/useReducedMotion\";\n\nconst easeWire = Easing.bezier(...WIRE_BEZIER);\n\n// Mirror of the SDK schema — must stay identical so the registry + validator agree.\nconst schema = z.object({\n title: z.string().describe(\"Question or section header, e.g. 'Which season?'\"),\n chips: z\n .array(z.string())\n .min(1)\n .describe(\"List of option labels shown as chips, e.g. ['Spring','Summer','Autumn','Winter']\"),\n multiSelect: z.boolean().optional().describe(\"Allow multiple chips selected at once, default true\"),\n submitLabel: z.string().optional().describe(\"Confirm button label, default: Continue\"),\n maxSelections: z.number().optional().describe(\"Maximum number of chips the user can select at once\"),\n});\n\ntype Props = z.infer<typeof schema> &\n InjectedProps & {\n onSelect?: (selected: string | string[]) => void;\n /** Fires as the live selection changes (before Continue), so the flow can prefetch the\n * next turn. Same value shape as onSelect. Optional — injected by OnboardingFlow. */\n onSelectionChange?: (selected: string | string[]) => void;\n };\n\ntype ChipItemProps = {\n chip: string;\n isSelected: boolean;\n multiSelect: boolean;\n onToggle: (chip: string) => void;\n};\n\nconst _ChipItem: React.FC<ChipItemProps> = ({ chip, isSelected, multiSelect, onToggle }) => {\n const t = useOnboardingTheme();\n const reduced = useReducedMotion();\n const handlePress = useCallback(() => onToggle(chip), [chip, onToggle]);\n\n // Press tick: scale 1→0.94, spring, native driver. Skipped under reduce motion.\n const pressScale = useRef(new Animated.Value(1)).current;\n const pressTo = useCallback(\n (to: number) => {\n if (reduced) return;\n Animated.spring(pressScale, {\n toValue: to,\n friction: PRESS_SPRING.friction,\n tension: PRESS_SPRING.tension,\n useNativeDriver: true,\n }).start();\n },\n [pressScale, reduced],\n );\n const handlePressIn = useCallback(() => pressTo(CHIP_PRESS_SCALE), [pressTo]);\n const handlePressOut = useCallback(() => pressTo(1), [pressTo]);\n\n // Selected fill: full accent pill, crossfaded in over 160ms on a native-driver\n // opacity overlay (EXTRACTED-SPEC.md D7). Reduce motion: instant swap.\n const fillT = useRef(new Animated.Value(isSelected ? 1 : 0)).current;\n useEffect(() => {\n const anim = Animated.timing(fillT, {\n toValue: isSelected ? 1 : 0,\n duration: scaledMs(stateChangeDuration(reduced, CHIP_FILL_MS)),\n easing: easeWire,\n useNativeDriver: true,\n });\n anim.start();\n return () => anim.stop();\n }, [isSelected, reduced, fillT]);\n\n // Check pop on select (the width-slide of the canvas is a layout animation the\n // native driver can't express — see EXTRACTED-SPEC.md D4).\n const checkT = useRef(new Animated.Value(isSelected ? 1 : 0)).current;\n useEffect(() => {\n if (!isSelected) {\n checkT.setValue(0);\n return;\n }\n if (reduced) {\n checkT.setValue(1);\n return;\n }\n checkT.setValue(0);\n const anim = Animated.spring(checkT, {\n toValue: 1,\n friction: CHECK_SPRING.friction,\n tension: CHECK_SPRING.tension,\n useNativeDriver: true,\n });\n anim.start();\n return () => anim.stop();\n }, [isSelected, reduced, checkT]);\n\n const checkScale = checkT.interpolate({ inputRange: [0, 1], outputRange: [CHECK_SCALE_FROM, 1] });\n\n return (\n <Pressable\n onPress={handlePress}\n onPressIn={handlePressIn}\n onPressOut={handlePressOut}\n accessibilityRole={multiSelect ? \"checkbox\" : \"radio\"}\n accessibilityState={multiSelect ? { checked: isSelected } : { selected: isSelected }}\n accessibilityLabel={chip}\n >\n <Animated.View\n style={[\n styles.chip,\n {\n borderRadius: t.radius.full,\n paddingHorizontal: t.spacing.md,\n paddingVertical: t.spacing.sm,\n borderColor: t.colors.border,\n backgroundColor: t.colors.background,\n transform: [{ scale: pressScale }],\n },\n ]}\n >\n <Animated.View\n pointerEvents=\"none\"\n style={[\n StyleSheet.absoluteFill,\n styles.fillOverlay,\n {\n borderRadius: t.radius.full,\n borderColor: t.colors.primary,\n backgroundColor: t.colors.primary,\n opacity: fillT,\n },\n ]}\n />\n {isSelected ? (\n <Animated.Text\n style={[\n styles.check,\n { color: t.colors.onPrimary, opacity: checkT, transform: [{ scale: checkScale }] },\n ]}\n >\n ✓\n </Animated.Text>\n ) : null}\n <Text\n style={[\n captionStyle(t.fonts),\n styles.chipLabel,\n { color: isSelected ? t.colors.onPrimary : t.colors.textMuted },\n ]}\n >\n {chip}\n </Text>\n </Animated.View>\n </Pressable>\n );\n};\nconst ChipItem = React.memo(_ChipItem);\n\nconst _ChipSelectCard: React.FC<Props> = ({\n title,\n chips,\n multiSelect = true,\n submitLabel = \"Continue\",\n maxSelections,\n onSelect,\n onSelectionChange,\n}) => {\n const t = useOnboardingTheme();\n const [selected, setSelected] = useState<string[]>([]);\n const [submitted, setSubmitted] = useState(false);\n\n // Report the settled selection upward (before Continue) so the flow can prefetch the next\n // turn. Debouncing lives in the flow; here we just emit on every change once something's picked.\n useEffect(() => {\n if (!submitted && selected.length) onSelectionChange?.(multiSelect ? selected : selected[0]!);\n }, [selected, submitted, multiSelect, onSelectionChange]);\n\n const toggle = useCallback(\n (chip: string) => {\n if (submitted) return;\n if (multiSelect) {\n setSelected((prev) => {\n if (prev.includes(chip)) return prev.filter((c) => c !== chip);\n if (maxSelections && prev.length >= maxSelections) return prev;\n return [...prev, chip];\n });\n } else {\n setSelected([chip]);\n }\n },\n [submitted, multiSelect, maxSelections],\n );\n\n const handleSubmit = useCallback(() => {\n if (!selected.length || !onSelect || submitted) return;\n setSubmitted(true);\n onSelect(multiSelect ? selected : selected[0]!);\n }, [selected, onSelect, submitted, multiSelect]);\n\n return (\n <CardLayout\n title={title}\n subtitle={maxSelections ? `Select up to ${maxSelections}` : undefined}\n footer={\n <Button\n title={submitLabel}\n onPress={handleSubmit}\n variant=\"primary\"\n disabled={selected.length === 0 || submitted}\n />\n }\n >\n <View style={[styles.chipsRow, { gap: t.spacing.sm + t.spacing.xs }]}>\n {chips.map((chip) => (\n <ChipItem\n key={chip}\n chip={chip}\n isSelected={selected.includes(chip)}\n multiSelect={multiSelect}\n onToggle={toggle}\n />\n ))}\n </View>\n </CardLayout>\n );\n};\n\nexport const ChipSelectCard: WireAIComponent = {\n name: \"ChipSelectCard\",\n description:\n \"Use for compact short labels: seasons, activities, travel styles, moods, categories. Ideal for 4–12 single-word or two-word options. Use SelectionCard instead when options need descriptions.\",\n component: React.memo(_ChipSelectCard) as WireAIComponent[\"component\"],\n propsSchema: schema,\n defaultProps: { multiSelect: true, submitLabel: \"Continue\" },\n};\n\nconst styles = StyleSheet.create({\n chipsRow: { flexDirection: \"row\", flexWrap: \"wrap\" },\n chip: { borderWidth: 1.5, flexDirection: \"row\", alignItems: \"center\", gap: 6, overflow: \"hidden\" },\n fillOverlay: { borderWidth: 1.5 },\n chipLabel: { fontWeight: \"600\" },\n check: { fontSize: 13, fontWeight: \"800\", lineHeight: 15 },\n});\n","/**\n * Themed TextInputCard — drop-in for the OSS SDK's TextInputCard. Same `name`,\n * `propsSchema`, `defaultProps`, and `onSubmit(value: string)` contract. The input\n * is themed and supports an optional inline error string (used by the kit's\n * per-step validators — e.g. \"username taken\"), set via the `validationError` prop\n * which the OnboardingFlow injects through callbackOverrides.\n *\n * Open-ended answers (goals, notes, \"what would make this better\") render a tall\n * multi-line box by default so the user has room to actually write. Short fields\n * (a name, a username) set `multiline: false` for the compact single-line height.\n */\nimport React, { useCallback, useState } from \"react\";\nimport { StyleSheet, Text, TextInput, View, useWindowDimensions } from \"react-native\";\nimport { z } from \"zod\";\nimport type { InjectedProps, WireAIComponent } from \"wireai-rn\";\nimport { useOnboardingTheme } from \"../theme/ThemeContext\";\nimport { bodyStyle, captionStyle } from \"../theme/typography\";\nimport { Button } from \"../components/Button\";\nimport { CardLayout } from \"../components/CardLayout\";\n\nconst schema = z.object({\n label: z.string().describe(\"Input field label / the question being asked\"),\n hint: z\n .string()\n .optional()\n .describe(\n \"One short line under the question giving context: what the answer is used for or why you ask. Add it whenever the question alone might be unclear.\"\n ),\n placeholder: z\n .string()\n .optional()\n .describe(\n 'A concrete example answer shown inside the box, phrased like a real user wrote it and starting with \"e.g. \". ALWAYS provide one for open-ended questions: it shows the expected answer shape and inspires the user.'\n ),\n submitLabel: z.string().optional().describe(\"Submit button label, default: Submit\"),\n multiline: z\n .boolean()\n .optional()\n .describe(\n \"Tall multi-line box for open-ended answers (goals, notes, feedback). Default true. Set false for a single-line field like a name or username.\"\n ),\n lines: z\n .number()\n .optional()\n .describe(\"Approx visible rows when multiline (default 6). Height is capped at 40% of the screen.\"),\n});\n\ntype Props = z.infer<typeof schema> &\n InjectedProps & {\n onSubmit?: (value: string) => void;\n /**\n * Inline error injected by OnboardingFlow when a validator rejects the value\n * (e.g. username already taken). Re-enables the input so the user can edit.\n */\n validationError?: string;\n };\n\nconst _TextInputCard: React.FC<Props> = ({\n label,\n hint,\n placeholder,\n submitLabel = \"Submit\",\n onSubmit,\n validationError,\n multiline = true,\n lines = 6,\n}) => {\n const t = useOnboardingTheme();\n const { height: screenHeight } = useWindowDimensions();\n const [value, setValue] = useState(\"\");\n const [submitted, setSubmitted] = useState(false);\n\n // A validator rejection arrives as `validationError`; reopen the field so the\n // user can fix their answer instead of being stuck on a submitted state.\n const locked = submitted && !validationError;\n\n // Multi-line free-text gets a generous box (~`lines` rows), capped at 40% of\n // screen height so it stays comfortable on small devices. Single-line fields\n // keep the compact 52pt height.\n const APPROX_ROW_HEIGHT = 26;\n const minHeight = multiline\n ? Math.min(Math.max(lines, 4) * APPROX_ROW_HEIGHT + t.spacing.md * 2, screenHeight * 0.4)\n : 52;\n\n const handleSubmit = useCallback(() => {\n if (value.trim() && onSubmit && !locked) {\n setSubmitted(true);\n onSubmit(value.trim());\n }\n }, [value, onSubmit, locked]);\n\n return (\n <CardLayout\n title={label}\n subtitle={hint}\n footer={\n <Button\n title={submitLabel}\n onPress={handleSubmit}\n variant=\"primary\"\n disabled={!value.trim() || locked}\n />\n }\n >\n <View style={{ gap: t.spacing.sm }}>\n <TextInput\n value={value}\n onChangeText={setValue}\n placeholder={placeholder ?? \"\"}\n placeholderTextColor={t.colors.textMuted}\n editable={!locked}\n multiline={multiline}\n numberOfLines={multiline ? lines : 1}\n textAlignVertical={multiline ? \"top\" : \"center\"}\n style={[\n bodyStyle(t.fonts),\n styles.input,\n {\n color: t.colors.text,\n backgroundColor: t.colors.surface,\n borderRadius: t.radius.md,\n borderColor: validationError ? t.colors.error : t.colors.border,\n padding: t.spacing.md,\n minHeight,\n },\n ]}\n />\n {validationError ? (\n <Text style={[captionStyle(t.fonts), { color: t.colors.error }]}>{validationError}</Text>\n ) : null}\n </View>\n </CardLayout>\n );\n};\n\nexport const TextInputCard: WireAIComponent = {\n name: \"TextInputCard\",\n description:\n \"Use when the user needs to type a free-text answer: an open-ended goal, notes, feedback, a name, a destination, a search query. Multi-line by default (great for open-ended goals); set multiline:false for a short single-line field like a name. Use NumberStepperCard for numeric ranges with known bounds.\",\n component: React.memo(_TextInputCard) as WireAIComponent[\"component\"],\n propsSchema: schema,\n defaultProps: { submitLabel: \"Submit\", multiline: true, lines: 6 },\n};\n\nconst styles = StyleSheet.create({\n input: { borderWidth: 1 },\n});\n","/**\n * Themed SelectionCard — drop-in for the OSS SDK's SelectionCard. Same `name`,\n * `propsSchema` (including the string|object option preprocess), `defaultProps`,\n * and `onSelect(string | string[])` contract. Radio/checkbox styling is themed.\n *\n * Motion (design-refs/EXTRACTED-SPEC.md rows 1-3): rows tick on press (scale\n * 0.975 spring), the selected fill/border eases in over 180ms ease-wire (a\n * native-driver opacity crossfade of a selected-style overlay), and the check\n * dot pops with a spring. All gated by useReducedMotion (snap, no spring).\n */\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Animated, Easing, Pressable, StyleSheet, Text, View } from \"react-native\";\nimport { z } from \"zod\";\nimport type { InjectedProps, WireAIComponent } from \"wireai-rn\";\nimport { useOnboardingTheme } from \"../theme/ThemeContext\";\nimport { labelStyle } from \"../theme/typography\";\nimport { Button } from \"../components/Button\";\nimport { CardLayout } from \"../components/CardLayout\";\nimport {\n CHECK_SCALE_FROM,\n CHECK_SPRING,\n PRESS_SPRING,\n ROW_PRESS_SCALE,\n SELECT_FILL_MS,\n WIRE_BEZIER,\n scaledMs,\n stateChangeDuration,\n} from \"../motion/motionSpec\";\nimport { useReducedMotion } from \"../motion/useReducedMotion\";\n\nconst easeWire = Easing.bezier(...WIRE_BEZIER);\n\nconst optionObjectSchema = z.object({\n value: z.string().describe(\"Option value\"),\n label: z.string().describe(\"Option display label\"),\n});\n\nconst schema = z.object({\n title: z.string().describe(\"Question or prompt for the user\"),\n options: z\n .preprocess(\n (arr) =>\n Array.isArray(arr)\n ? arr.map((item) => (typeof item === \"string\" ? { value: item, label: item } : item))\n : arr,\n z.array(optionObjectSchema).min(1),\n )\n .describe(\"List of choices\"),\n submitLabel: z.string().optional().describe(\"Submit button label, default: Continue\"),\n multiSelect: z.boolean().optional().describe(\"Allow multiple selections\"),\n});\n\ntype Props = z.infer<typeof schema> &\n InjectedProps & {\n onSelect?: (selected: string | string[]) => void;\n /** Fires as the live selection changes (before Continue), so the flow can prefetch the\n * next turn. Same value shape as onSelect. Optional — injected by OnboardingFlow. */\n onSelectionChange?: (selected: string | string[]) => void;\n };\n\ntype OptionRowProps = {\n opt: z.infer<typeof optionObjectSchema>;\n isSelected: boolean;\n multiSelect: boolean;\n onToggle: (value: string) => void;\n};\n\nconst _OptionRow: React.FC<OptionRowProps> = ({ opt, isSelected, multiSelect, onToggle }) => {\n const t = useOnboardingTheme();\n const reduced = useReducedMotion();\n const handlePress = useCallback(() => onToggle(opt.value), [opt.value, onToggle]);\n\n // Press tick: scale 1→0.975, spring, native driver. Skipped under reduce motion.\n const pressScale = useRef(new Animated.Value(1)).current;\n const pressTo = useCallback(\n (to: number) => {\n if (reduced) return;\n Animated.spring(pressScale, {\n toValue: to,\n friction: PRESS_SPRING.friction,\n tension: PRESS_SPRING.tension,\n useNativeDriver: true,\n }).start();\n },\n [pressScale, reduced],\n );\n const handlePressIn = useCallback(() => pressTo(ROW_PRESS_SCALE), [pressTo]);\n const handlePressOut = useCallback(() => pressTo(1), [pressTo]);\n\n // Selected fill: the selected border+bg live on an absolute overlay whose opacity\n // crossfades in 180ms ease-wire — same visual as a color interpolation, but it\n // stays on the native driver (see EXTRACTED-SPEC.md D7). Reduce motion: snap.\n const selectT = useRef(new Animated.Value(isSelected ? 1 : 0)).current;\n useEffect(() => {\n const anim = Animated.timing(selectT, {\n toValue: isSelected ? 1 : 0,\n duration: scaledMs(stateChangeDuration(reduced, SELECT_FILL_MS)),\n easing: easeWire,\n useNativeDriver: true,\n });\n anim.start();\n return () => anim.stop();\n }, [isSelected, reduced, selectT]);\n\n // Check pop: scale 0.6→1 + fade, springy. Reduce motion: shown at scale 1 instantly.\n const checkT = useRef(new Animated.Value(isSelected ? 1 : 0)).current;\n useEffect(() => {\n if (!isSelected) {\n checkT.setValue(0);\n return;\n }\n if (reduced) {\n checkT.setValue(1);\n return;\n }\n checkT.setValue(0);\n const anim = Animated.spring(checkT, {\n toValue: 1,\n friction: CHECK_SPRING.friction,\n tension: CHECK_SPRING.tension,\n useNativeDriver: true,\n });\n anim.start();\n return () => anim.stop();\n }, [isSelected, reduced, checkT]);\n\n const checkScale = checkT.interpolate({ inputRange: [0, 1], outputRange: [CHECK_SCALE_FROM, 1] });\n\n return (\n <Pressable\n onPress={handlePress}\n onPressIn={handlePressIn}\n onPressOut={handlePressOut}\n accessibilityRole={multiSelect ? \"checkbox\" : \"radio\"}\n accessibilityState={multiSelect ? { checked: isSelected } : { selected: isSelected }}\n accessibilityLabel={opt.label}\n >\n <Animated.View\n style={[\n styles.option,\n {\n padding: t.spacing.md,\n borderRadius: t.radius.md,\n gap: t.spacing.sm,\n borderColor: t.colors.border,\n backgroundColor: t.colors.background,\n transform: [{ scale: pressScale }],\n },\n ]}\n >\n <Animated.View\n pointerEvents=\"none\"\n style={[\n StyleSheet.absoluteFill,\n styles.selectedOverlay,\n {\n borderRadius: t.radius.md,\n borderColor: t.colors.primary,\n backgroundColor: t.colors.primarySoft,\n opacity: selectT,\n },\n ]}\n />\n <View\n style={[\n styles.indicator,\n { borderRadius: t.radius.full },\n isSelected\n ? { borderColor: t.colors.primary, backgroundColor: t.colors.primary }\n : { borderColor: t.colors.borderStrong, backgroundColor: \"transparent\" },\n ]}\n >\n {isSelected ? (\n <Animated.Text\n style={[\n styles.check,\n { color: t.colors.onPrimary, opacity: checkT, transform: [{ scale: checkScale }] },\n ]}\n >\n ✓\n </Animated.Text>\n ) : null}\n </View>\n {/* Accent discipline: the label keeps the text color in both states; the\n accent lives on the border, fill, and dot only. */}\n <Text style={[labelStyle(t.fonts), { color: t.colors.text }]}>{opt.label}</Text>\n </Animated.View>\n </Pressable>\n );\n};\nconst OptionRow = React.memo(_OptionRow);\n\nconst _SelectionCard: React.FC<Props> = ({\n title,\n options,\n submitLabel = \"Continue\",\n multiSelect = false,\n onSelect,\n onSelectionChange,\n}) => {\n const t = useOnboardingTheme();\n const [selected, setSelected] = useState<string[]>([]);\n const [submitted, setSubmitted] = useState(false);\n\n // Report the settled selection upward (before Continue) so the flow can prefetch the next\n // turn. Debouncing lives in the flow; here we just emit on every change once something's picked.\n useEffect(() => {\n if (!submitted && selected.length) onSelectionChange?.(multiSelect ? selected : selected[0]!);\n }, [selected, submitted, multiSelect, onSelectionChange]);\n\n const toggle = useCallback(\n (value: string) => {\n if (submitted) return;\n if (multiSelect) {\n setSelected((prev) => (prev.includes(value) ? prev.filter((v) => v !== value) : [...prev, value]));\n } else {\n setSelected([value]);\n }\n },\n [submitted, multiSelect],\n );\n\n const handleSubmit = useCallback(() => {\n if (!selected.length || !onSelect || submitted) return;\n setSubmitted(true);\n onSelect(multiSelect ? selected : selected[0]!);\n }, [selected, onSelect, submitted, multiSelect]);\n\n return (\n <CardLayout\n title={title}\n footer={\n <Button\n title={submitLabel}\n onPress={handleSubmit}\n variant=\"primary\"\n disabled={selected.length === 0 || submitted}\n />\n }\n >\n <View style={{ gap: t.spacing.sm + t.spacing.xs }}>\n {options.map((opt) => (\n <OptionRow\n key={opt.value}\n opt={opt}\n isSelected={selected.includes(opt.value)}\n multiSelect={multiSelect}\n onToggle={toggle}\n />\n ))}\n </View>\n </CardLayout>\n );\n};\n\nexport const SelectionCard: WireAIComponent = {\n name: \"SelectionCard\",\n description:\n \"Use for mutually exclusive (radio) or multi-select (checkbox) choices from 2–8 options. Use ChipSelectCard instead when options are short single words.\",\n component: React.memo(_SelectionCard) as WireAIComponent[\"component\"],\n propsSchema: schema,\n defaultProps: { submitLabel: \"Continue\", multiSelect: false },\n};\n\nconst styles = StyleSheet.create({\n option: { borderWidth: 1.5, flexDirection: \"row\", alignItems: \"center\", overflow: \"hidden\" },\n selectedOverlay: { borderWidth: 1.5 },\n indicator: { width: 24, height: 24, borderWidth: 2, alignItems: \"center\", justifyContent: \"center\" },\n check: { fontSize: 13, fontWeight: \"800\", lineHeight: 15 },\n});\n","/**\n * Themed StatusCard — drop-in for the OSS SDK's StatusCard. Same `name`,\n * `propsSchema`, and the onContinue/onPress/onSubmit callback fallback chain.\n * The terminal StatusCard is what OnboardingFlow treats as \"flow complete\".\n * Status colors read from the theme's semantic palette.\n *\n * Motion (design-refs/EXTRACTED-SPEC.md rows 14, 16): the status glyph pops in\n * with a spring (scale 0.4→1, overshoot) and the copy fades up 80ms behind it.\n * Reduce motion: final frame instantly. (The terminal payoff with the burst is\n * CompletionView; this card is the inline status treatment.)\n */\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Animated, Easing, StyleSheet, Text, View } from \"react-native\";\nimport { z } from \"zod\";\nimport type { InjectedProps, WireAIComponent } from \"wireai-rn\";\nimport { useOnboardingTheme } from \"../theme/ThemeContext\";\nimport { bodyStyle, headingStyle } from \"../theme/typography\";\nimport { Button } from \"../components/Button\";\nimport { CardLayout } from \"../components/CardLayout\";\nimport {\n STATUS_COPY_MS,\n STATUS_COPY_STAGGER_MS,\n STATUS_POP_SCALE_FROM,\n STATUS_POP_SPRING,\n WIRE_BEZIER,\n scaledMs,\n} from \"../motion/motionSpec\";\nimport { useReducedMotion } from \"../motion/useReducedMotion\";\n\nconst easeWire = Easing.bezier(...WIRE_BEZIER);\n\nconst schema = z.object({\n status: z.enum([\"success\", \"warning\", \"error\", \"info\"]).describe(\"Status type\"),\n title: z.string().describe(\"Status title\"),\n message: z.string().optional().describe(\"Supporting message\"),\n ctaLabel: z\n .string()\n .optional()\n .describe(\n \"Optional call-to-action button label. Always include this on success status to keep the conversation going.\",\n ),\n});\n\ntype Props = z.infer<typeof schema> &\n InjectedProps & {\n onContinue?: () => void;\n onPress?: (label: string) => void;\n onSubmit?: (value: string) => void;\n };\n\nconst STATUS_ICONS: Record<string, string> = {\n success: \"✓\",\n warning: \"⚠\",\n error: \"✗\",\n info: \"ℹ\",\n};\n\nconst _StatusCard: React.FC<Props> = ({ status, title, message, ctaLabel, onContinue, onPress, onSubmit }) => {\n const t = useOnboardingTheme();\n const reduced = useReducedMotion();\n const [submitted, setSubmitted] = useState(false);\n\n const colorFor: Record<string, string> = {\n success: t.colors.success,\n warning: t.colors.warning,\n error: t.colors.error,\n info: t.colors.info,\n };\n const color = colorFor[status] ?? t.colors.info;\n\n // Glyph pop + copy fade-up (final frame under reduce motion).\n const popT = useRef(new Animated.Value(reduced ? 1 : 0)).current;\n const copyT = useRef(new Animated.Value(reduced ? 1 : 0)).current;\n useEffect(() => {\n if (reduced) {\n popT.setValue(1);\n copyT.setValue(1);\n return;\n }\n const anims = [\n Animated.spring(popT, {\n toValue: 1,\n friction: STATUS_POP_SPRING.friction,\n tension: STATUS_POP_SPRING.tension,\n useNativeDriver: true,\n }),\n Animated.timing(copyT, {\n toValue: 1,\n duration: scaledMs(STATUS_COPY_MS),\n delay: scaledMs(STATUS_COPY_STAGGER_MS),\n easing: easeWire,\n useNativeDriver: true,\n }),\n ];\n anims.forEach((a) => a.start());\n return () => anims.forEach((a) => a.stop());\n }, [reduced, popT, copyT]);\n\n const popScale = popT.interpolate({ inputRange: [0, 1], outputRange: [STATUS_POP_SCALE_FROM, 1] });\n const copyRise = copyT.interpolate({ inputRange: [0, 1], outputRange: [10, 0] });\n\n const handleContinue = useCallback(() => {\n if (!submitted) {\n setSubmitted(true);\n if (onContinue) onContinue();\n else if (onPress && ctaLabel) onPress(ctaLabel);\n else if (onSubmit) onSubmit(\"continue\");\n }\n }, [submitted, onContinue, onPress, onSubmit, ctaLabel]);\n\n return (\n <CardLayout\n align=\"center\"\n footer={\n ctaLabel ? (\n <Button title={ctaLabel} onPress={handleContinue} variant=\"primary\" disabled={submitted} />\n ) : undefined\n }\n >\n <View style={[styles.center, { gap: t.spacing.sm }]}>\n <View style={[styles.titleRow, { gap: t.spacing.sm }]}>\n <Animated.Text\n style={[\n headingStyle(t.fonts),\n { color, opacity: popT, transform: [{ scale: popScale }] },\n ]}\n >\n {STATUS_ICONS[status] ?? \"·\"}\n </Animated.Text>\n <Animated.Text\n style={[\n headingStyle(t.fonts),\n { color, textAlign: \"center\", opacity: copyT, transform: [{ translateY: copyRise }] },\n ]}\n >\n {title}\n </Animated.Text>\n </View>\n {message ? (\n <Animated.Text\n style={[\n bodyStyle(t.fonts),\n {\n color: t.colors.textMuted,\n textAlign: \"center\",\n opacity: copyT,\n transform: [{ translateY: copyRise }],\n },\n ]}\n >\n {message}\n </Animated.Text>\n ) : null}\n </View>\n </CardLayout>\n );\n};\n\nexport const StatusCard: WireAIComponent = {\n name: \"StatusCard\",\n description:\n \"Use ONLY for real outcomes: booking confirmed, data saved, action completed. NEVER for 'you just viewed X' acknowledgments. Always include ctaLabel so the user can continue after seeing the status.\",\n component: React.memo(_StatusCard) as WireAIComponent[\"component\"],\n propsSchema: schema,\n};\n\nconst styles = StyleSheet.create({\n center: { width: \"100%\", alignItems: \"center\", justifyContent: \"center\" },\n titleRow: { flexDirection: \"row\", alignItems: \"center\", justifyContent: \"center\" },\n});\n","/**\n * Themed NumberStepperCard — drop-in for the OSS SDK's NumberStepperCard. Same\n * `name`, `propsSchema`, `defaultProps`, and `onSubmit(value: number)` contract.\n * Keeps the SDK's defensive numeric coercion so a malformed LLM payload can never\n * feed NaN/Infinity into layout math.\n */\nimport React, { useCallback, useState } from \"react\";\nimport { Pressable, StyleSheet, Text, View } from \"react-native\";\nimport { z } from \"zod\";\nimport type { InjectedProps, WireAIComponent } from \"wireai-rn\";\nimport { useOnboardingTheme } from \"../theme/ThemeContext\";\nimport { captionStyle, headingStyle } from \"../theme/typography\";\nimport { Button } from \"../components/Button\";\nimport { CardLayout } from \"../components/CardLayout\";\n\nconst schema = z.object({\n label: z.string().describe(\"What is being counted, e.g. 'Number of days' or 'Travellers'\"),\n min: z.number().optional().describe(\"Minimum value, default 1\"),\n max: z.number().optional().describe(\"Maximum value, default 30\"),\n defaultValue: z.number().optional().describe(\"Starting value\"),\n step: z.number().optional().describe(\"Increment per tap, default 1\"),\n unit: z.string().optional().describe(\"Unit label shown next to value, e.g. 'days' or 'people'\"),\n submitLabel: z.string().optional().describe(\"Confirm button label, default: Confirm\"),\n});\n\ntype Props = z.infer<typeof schema> &\n InjectedProps & {\n onSubmit?: (value: number) => void;\n };\n\nconst safeNum = (n: unknown, fallback: number): number =>\n typeof n === \"number\" && Number.isFinite(n) ? n : fallback;\n\nconst _NumberStepperCard: React.FC<Props> = ({\n label,\n min,\n max,\n defaultValue,\n step,\n unit,\n submitLabel = \"Confirm\",\n onSubmit,\n}) => {\n const t = useOnboardingTheme();\n\n const safeMin = safeNum(min, 1);\n const safeMaxRaw = safeNum(max, 30);\n const safeMax = safeMaxRaw < safeMin ? safeMin : safeMaxRaw;\n const safeStepRaw = safeNum(step, 1);\n const safeStep = safeStepRaw > 0 ? safeStepRaw : 1;\n const safeDefault = safeNum(defaultValue, safeMin);\n\n const [value, setValue] = useState(Math.min(Math.max(safeDefault, safeMin), safeMax));\n const [submitted, setSubmitted] = useState(false);\n\n const handleDecrement = useCallback(() => {\n if (!submitted) setValue((v) => Math.max(v - safeStep, safeMin));\n }, [submitted, safeStep, safeMin]);\n\n const handleIncrement = useCallback(() => {\n if (!submitted) setValue((v) => Math.min(v + safeStep, safeMax));\n }, [submitted, safeStep, safeMax]);\n\n const handleSubmit = useCallback(() => {\n if (!submitted) {\n setSubmitted(true);\n onSubmit?.(value);\n }\n }, [submitted, onSubmit, value]);\n\n const atMin = value <= safeMin;\n const atMax = value >= safeMax;\n\n const stepBtnStyle = (disabled: boolean) => [\n styles.stepBtn,\n { borderRadius: t.radius.full, backgroundColor: t.colors.background, borderColor: disabled ? t.colors.border : t.colors.primary },\n ];\n\n return (\n <CardLayout\n title={label}\n align=\"center\"\n footer={\n <Button title={submitLabel} onPress={handleSubmit} variant=\"primary\" disabled={submitted} />\n }\n >\n <View style={{ gap: t.spacing.md, alignItems: \"center\" }}>\n <View style={[styles.stepper, { gap: t.spacing.lg }]}>\n <Pressable onPress={atMin || submitted ? undefined : handleDecrement} disabled={atMin || submitted} style={stepBtnStyle(atMin)}>\n <Text style={[headingStyle(t.fonts), { color: atMin ? t.colors.textMuted : t.colors.primary }]}>{\"−\"}</Text>\n </Pressable>\n <View style={styles.valueBox}>\n <Text style={[headingStyle(t.fonts), { color: t.colors.primary }]}>{String(value)}</Text>\n {unit ? <Text style={[captionStyle(t.fonts), { color: t.colors.textMuted }]}>{unit}</Text> : null}\n </View>\n <Pressable onPress={atMax || submitted ? undefined : handleIncrement} disabled={atMax || submitted} style={stepBtnStyle(atMax)}>\n <Text style={[headingStyle(t.fonts), { color: atMax ? t.colors.textMuted : t.colors.primary }]}>{\"+\"}</Text>\n </Pressable>\n </View>\n <Text style={[captionStyle(t.fonts), { color: t.colors.textMuted, textAlign: \"center\" }]}>\n {`${safeMin} – ${safeMax}${unit ? ` ${unit}` : \"\"}`}\n </Text>\n </View>\n </CardLayout>\n );\n};\n\nexport const NumberStepperCard: WireAIComponent = {\n name: \"NumberStepperCard\",\n description:\n \"Use for any bounded numeric input: days, people, portions, budget tiers, ratings. Best for ranges 1–99. Set unit (e.g. 'days', 'people') for clarity.\",\n component: React.memo(_NumberStepperCard) as WireAIComponent[\"component\"],\n propsSchema: schema,\n defaultProps: { min: 1, max: 30, defaultValue: 1, step: 1, submitLabel: \"Confirm\" },\n};\n\nconst styles = StyleSheet.create({\n stepper: { flexDirection: \"row\", alignItems: \"center\", justifyContent: \"center\" },\n stepBtn: { width: 44, height: 44, borderWidth: 2, alignItems: \"center\", justifyContent: \"center\" },\n valueBox: { alignItems: \"center\", minWidth: 80 },\n});\n","/**\n * InterstitialCard — a mid-flow \"value\" screen (the Duolingo / Cal-AI beat): an\n * illustration + a short motivational line + a single Continue button. It is NOT a\n * question — it builds momentum and reinforces what the user is committing to,\n * which is one of the biggest retention levers in great onboarding.\n *\n * Artwork resolves in order so the screen is NEVER a blank box: the host's named\n * `illustration` (brand SVG/Lottie, keeping the kit dependency-free) → a\n * backend-supplied `imageUrl` via RN <Image> (which self-heals to art on load\n * error) → a named `illustrationFallback` (defaults to \"momentum\", always present\n * in the kit's default registry).\n *\n * A minimum display window keeps the momentum beat from flashing past when the next\n * card is already cached: Continue is disabled for MIN_DISPLAY_MS after mount.\n *\n * Motion (design-refs/EXTRACTED-SPEC.md rows 11-13): art and title fade-up in\n * sequence (500ms ease-wire, 100ms stagger); the optional `items` (short lines\n * referencing what the user already said) tick on one by one (90ms stagger),\n * each check popping 200ms after its row — \"work being done\", not a slideshow.\n * Reduce motion: everything rendered at its final frame at once.\n *\n * On Continue it sends \"continue\" back to the backend so the flow advances; the\n * submitted-state guard makes the tap idempotent.\n */\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Animated, Easing, Image, StyleSheet, Text, View } from \"react-native\";\nimport { z } from \"zod\";\nimport type { InjectedProps, WireAIComponent } from \"wireai-rn\";\nimport { useOnboardingTheme } from \"../theme/ThemeContext\";\nimport { bodyStyle, headingStyle } from \"../theme/typography\";\nimport { useIllustration } from \"../components/Illustration\";\nimport { Button } from \"../components/Button\";\nimport { CardLayout } from \"../components/CardLayout\";\nimport {\n CHECK_SPRING,\n INTERSTITIAL_CHECK_SCALE_FROM,\n INTERSTITIAL_HEAD_MS,\n INTERSTITIAL_HEAD_STAGGER_MS,\n INTERSTITIAL_ITEM_MS,\n WIRE_BEZIER,\n interstitialCheckDelay,\n scaledMs,\n interstitialItemDelay,\n} from \"../motion/motionSpec\";\nimport { useReducedMotion } from \"../motion/useReducedMotion\";\n\nconst easeWire = Easing.bezier(...WIRE_BEZIER);\nconst RISE_PX = 10;\n\nconst schema = z.object({\n title: z.string().describe(\"Short, warm headline for the value/momentum moment\"),\n body: z\n .string()\n .optional()\n .describe(\"One or two supporting lines that reflect the user's answers back and build momentum\"),\n items: z\n .array(z.string())\n .max(4)\n .optional()\n .describe(\n \"2-3 very short 'work being done' lines that each reference something the user already answered (e.g. 'Sized for a small team'). Shown as ticked items appearing in sequence. Prefer these over `body` when you have concrete answers to reflect back.\",\n ),\n illustration: z\n .string()\n .optional()\n .describe(\n \"Name of an app-provided illustration to show (the app's registry decides the artwork). Prefer this over imageUrl.\",\n ),\n imageUrl: z\n .string()\n .url()\n .refine((v) => v.startsWith(\"https://\"), \"imageUrl must be an https URL\")\n .optional()\n .describe(\n \"Fallback remote HTTPS image URL, used only when no named illustration is registered. A non-https or malformed value is rejected and degrades to the named-illustration fallback.\",\n ),\n illustrationFallback: z\n .string()\n .optional()\n .describe(\n \"Named illustration to show when neither `illustration` nor `imageUrl` resolves (or the image fails to load). Defaults to the kit's always-present 'momentum' art so the screen is never blank.\",\n ),\n ctaLabel: z.string().optional().describe(\"Continue button label, default: Continue\"),\n});\n\n// Minimum time the momentum screen stays interactive-locked, so it never flashes past\n// when the next card is already prefetched/cached.\nconst MIN_DISPLAY_MS = 500;\n\ntype Props = z.infer<typeof schema> &\n InjectedProps & {\n onSubmit?: (value: string) => void;\n onPress?: (label: string) => void;\n };\n\n/** One ticked \"work\" row: fades up on its stagger slot, then the check pops. */\nconst _WorkItem: React.FC<{ text: string; index: number; reduced: boolean }> = ({\n text,\n index,\n reduced,\n}) => {\n const t = useOnboardingTheme();\n const rowT = useRef(new Animated.Value(reduced ? 1 : 0)).current;\n const checkT = useRef(new Animated.Value(reduced ? 1 : 0)).current;\n\n useEffect(() => {\n if (reduced) {\n rowT.setValue(1);\n checkT.setValue(1);\n return;\n }\n const anims = [\n Animated.timing(rowT, {\n toValue: 1,\n duration: scaledMs(INTERSTITIAL_ITEM_MS),\n delay: scaledMs(interstitialItemDelay(index)),\n easing: easeWire,\n useNativeDriver: true,\n }),\n Animated.spring(checkT, {\n toValue: 1,\n delay: scaledMs(interstitialCheckDelay(index)),\n friction: CHECK_SPRING.friction,\n tension: CHECK_SPRING.tension,\n useNativeDriver: true,\n }),\n ];\n anims.forEach((a) => a.start());\n return () => anims.forEach((a) => a.stop());\n }, [reduced, index, rowT, checkT]);\n\n const rise = rowT.interpolate({ inputRange: [0, 1], outputRange: [RISE_PX, 0] });\n const checkScale = checkT.interpolate({\n inputRange: [0, 1],\n outputRange: [INTERSTITIAL_CHECK_SCALE_FROM, 1],\n });\n\n return (\n <Animated.View\n style={[styles.itemRow, { gap: t.spacing.sm + t.spacing.xs, opacity: rowT, transform: [{ translateY: rise }] }]}\n >\n <View\n style={[\n styles.itemBadge,\n { backgroundColor: t.colors.primarySoft, borderRadius: t.radius.full },\n ]}\n >\n <Animated.Text\n style={[\n styles.itemCheck,\n { color: t.colors.primary, opacity: checkT, transform: [{ scale: checkScale }] },\n ]}\n >\n ✓\n </Animated.Text>\n </View>\n <Text style={[bodyStyle(t.fonts), styles.itemText, { color: t.colors.text }]}>{text}</Text>\n </Animated.View>\n );\n};\nconst WorkItem = React.memo(_WorkItem);\n\nconst _InterstitialCard: React.FC<Props> = ({\n title,\n body,\n items,\n illustration,\n imageUrl,\n illustrationFallback,\n ctaLabel = \"Continue\",\n onSubmit,\n onPress,\n}) => {\n const t = useOnboardingTheme();\n const reduced = useReducedMotion();\n const node = useIllustration(illustration);\n const fallbackNode = useIllustration(illustrationFallback);\n const [submitted, setSubmitted] = useState(false);\n const [imgFailed, setImgFailed] = useState(false);\n // Keep the momentum beat on screen for at least MIN_DISPLAY_MS before Continue is tappable.\n const [canAdvance, setCanAdvance] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => setCanAdvance(true), MIN_DISPLAY_MS);\n return () => clearTimeout(timer);\n }, []);\n\n // Head reveal: art then title (then body) fade-up, 500ms ease-wire, 100ms stagger.\n // Reduce motion: final frame immediately (the shell handoff supplies the short fade).\n const artT = useRef(new Animated.Value(reduced ? 1 : 0)).current;\n const titleT = useRef(new Animated.Value(reduced ? 1 : 0)).current;\n const bodyT = useRef(new Animated.Value(reduced ? 1 : 0)).current;\n useEffect(() => {\n if (reduced) {\n artT.setValue(1);\n titleT.setValue(1);\n bodyT.setValue(1);\n return;\n }\n const rise = (value: Animated.Value, delay: number) =>\n Animated.timing(value, {\n toValue: 1,\n duration: scaledMs(INTERSTITIAL_HEAD_MS),\n delay,\n easing: easeWire,\n useNativeDriver: true,\n });\n const anims = [\n rise(artT, 0),\n rise(titleT, scaledMs(INTERSTITIAL_HEAD_STAGGER_MS)),\n rise(bodyT, scaledMs(INTERSTITIAL_HEAD_STAGGER_MS * 2)),\n ];\n anims.forEach((a) => a.start());\n return () => anims.forEach((a) => a.stop());\n }, [reduced, artT, titleT, bodyT]);\n\n const riseStyle = (value: Animated.Value) => ({\n opacity: value,\n transform: [{ translateY: value.interpolate({ inputRange: [0, 1], outputRange: [RISE_PX, 0] }) }],\n });\n\n const handleContinue = useCallback(() => {\n if (submitted || !canAdvance) return;\n setSubmitted(true);\n if (onSubmit) onSubmit(\"continue\");\n else if (onPress) onPress(ctaLabel);\n }, [submitted, canAdvance, onSubmit, onPress, ctaLabel]);\n\n // Resolution order — a broken/missing image must never leave a blank box:\n // named illustration → remote image (until it errors) → named fallback art.\n const showImage = !node && !!imageUrl && !imgFailed;\n const art = node ?? (showImage ? undefined : fallbackNode);\n\n return (\n <CardLayout\n align=\"center\"\n footer={\n <Button\n title={ctaLabel}\n onPress={handleContinue}\n variant=\"primary\"\n disabled={submitted || !canAdvance}\n />\n }\n >\n <View style={[styles.center, { gap: t.spacing.md }]}>\n <Animated.View style={[styles.fullWidth, riseStyle(artT)]}>\n {showImage ? (\n <Image\n source={{ uri: imageUrl }}\n style={styles.image}\n resizeMode=\"contain\"\n onError={() => setImgFailed(true)}\n />\n ) : art ? (\n <View style={styles.art}>{art}</View>\n ) : null}\n </Animated.View>\n\n <Animated.View style={riseStyle(titleT)}>\n <Text style={[headingStyle(t.fonts), { color: t.colors.text, textAlign: \"center\" }]}>{title}</Text>\n </Animated.View>\n\n {items?.length ? (\n <View style={[styles.items, { gap: t.spacing.md, marginTop: t.spacing.sm }]}>\n {items.map((item, i) => (\n <WorkItem key={item} text={item} index={i} reduced={reduced} />\n ))}\n </View>\n ) : body ? (\n <Animated.View style={riseStyle(bodyT)}>\n <Text style={[bodyStyle(t.fonts), { color: t.colors.textMuted, textAlign: \"center\" }]}>{body}</Text>\n </Animated.View>\n ) : null}\n </View>\n </CardLayout>\n );\n};\n\nexport const InterstitialCard: WireAIComponent = {\n name: \"InterstitialCard\",\n description:\n \"Use ONCE mid-flow (never first, never last) as a momentum/value screen between questions — an illustration + a warm line that reflects answers back, like Duolingo/Cal-AI. NOT a question; the user just taps Continue. Set `illustration` to an app-registered artwork name. Prefer `items` (2-3 short ticked lines, each reflecting a real answer) when you have the signal. Skip it if you don't have enough signal to make the line specific.\",\n component: React.memo(_InterstitialCard) as WireAIComponent[\"component\"],\n propsSchema: schema,\n defaultProps: { ctaLabel: \"Continue\", illustrationFallback: \"momentum\" },\n};\n\nconst styles = StyleSheet.create({\n center: { width: \"100%\", alignItems: \"center\", justifyContent: \"center\" },\n fullWidth: { width: \"100%\", alignItems: \"center\" },\n art: { alignItems: \"center\", justifyContent: \"center\" },\n image: { width: \"100%\", height: 200 },\n items: { width: \"100%\", alignSelf: \"stretch\" },\n itemRow: { flexDirection: \"row\", alignItems: \"center\" },\n itemBadge: { width: 24, height: 24, alignItems: \"center\", justifyContent: \"center\" },\n itemCheck: { fontSize: 13, fontWeight: \"800\", lineHeight: 15 },\n itemText: { flex: 1 },\n});\n","/**\n * onboardingComponents — the constrained set of themed cards the kit registers\n * with the SDK. The backend's `allowed_components` must be a subset of these\n * names so every card the agent asks for has a themed renderer.\n */\nimport type { WireAIComponent } from \"wireai-rn\";\nimport { ChipSelectCard } from \"./ChipSelectCard\";\nimport { TextInputCard } from \"./TextInputCard\";\nimport { SelectionCard } from \"./SelectionCard\";\nimport { StatusCard } from \"./StatusCard\";\nimport { NumberStepperCard } from \"./NumberStepperCard\";\nimport { InterstitialCard } from \"./InterstitialCard\";\n\nexport { ChipSelectCard, TextInputCard, SelectionCard, StatusCard, NumberStepperCard, InterstitialCard };\n\nexport const onboardingComponents: WireAIComponent[] = [\n ChipSelectCard,\n TextInputCard,\n SelectionCard,\n StatusCard,\n NumberStepperCard,\n InterstitialCard,\n];\n","/**\n * deviceContext — collect a small, privacy-label-neutral snapshot of the device so\n * onboarding analytics can segment the funnel (platform / form factor / locale) WITHOUT\n * adding a single dependency to the kit or changing a host app's App Privacy / Data Safety\n * declarations.\n *\n * HARD RULE (why this file has no imports beyond React Native built-ins):\n * The kit stays dependency-free. Everything here comes from `Platform`, `Dimensions`,\n * `I18nManager`, and the standard `Intl` global. There are NO advertising IDs, NO\n * `getUniqueId`/IDFA/GAID/fingerprinting APIs, and nothing that would require a new\n * privacy-label entry. A host can adopt this without touching its store declarations.\n *\n * DEFENSIVE BY DESIGN: `collectDeviceContext()` never throws. Every read is guarded and\n * a missing/unavailable field is simply omitted (Hermes may ship without full `Intl`,\n * `Platform.constants` differs per OS and RN version, etc.). Analytics must never be able\n * to break onboarding.\n */\nimport { Dimensions, I18nManager, Platform } from \"react-native\";\n\n/** Coarse device class. iOS uses the reported interface idiom; else a screen-size heuristic. */\nexport type DeviceFormFactor = \"phone\" | \"tablet\";\n\n/**\n * A privacy-label-neutral device snapshot. ALL fields except `platform` are optional and are\n * omitted when unavailable. Nothing here identifies a user or device uniquely.\n */\nexport type DeviceContext = {\n /** `Platform.OS` — \"ios\" | \"android\" | \"windows\" | \"macos\" | \"web\". Always present. */\n platform: typeof Platform.OS;\n /** OS version string (iOS `osVersion`/`Platform.Version`, Android `Release`). */\n osVersion?: string;\n /** Android device brand (e.g. \"samsung\"). Android only. */\n brand?: string;\n /** Android device model (e.g. \"SM-G991B\"). Android only. */\n model?: string;\n /** iOS interface idiom (\"phone\" | \"pad\" | …), when reported. iOS only. */\n interfaceIdiom?: string;\n /** Derived device class. */\n formFactor?: DeviceFormFactor;\n /** `Dimensions.get('screen')` width in dp. */\n screenWidth?: number;\n /** `Dimensions.get('screen')` height in dp. */\n screenHeight?: number;\n /** Screen pixel density (`scale`). */\n screenScale?: number;\n /** Right-to-left layout (`I18nManager.isRTL`). */\n isRTL?: boolean;\n /** Resolved locale (e.g. \"en-US\"), from `Intl` when available. */\n locale?: string;\n /** IANA time zone (e.g. \"Europe/Berlin\"), from `Intl` when available. */\n timeZone?: string;\n /**\n * Host app version (e.g. \"1.4.2). HOST-INJECTED — NOT collected here. `WireOnboarding`\n * merges `config.appVersion` into the snapshot; `collectDeviceContext()` never sets it.\n * Hosts typically pass it from `expo-constants` (the kit itself adds no dependency).\n */\n appVersion?: string;\n};\n\n/** iOS idiom wins; otherwise the shortest side in dp (>= 600 → tablet) picks the class. */\nconst deriveFormFactor = (\n iosIdiom: string | undefined,\n width: number | undefined,\n height: number | undefined,\n): DeviceFormFactor | undefined => {\n if (iosIdiom === \"pad\") return \"tablet\";\n if (iosIdiom === \"phone\") return \"phone\";\n if (typeof width === \"number\" && typeof height === \"number\") {\n return Math.min(width, height) >= 600 ? \"tablet\" : \"phone\";\n }\n return undefined;\n};\n\n/**\n * Collect the device snapshot. Pure, synchronous, and never throws — call it once per\n * onboarding session. Missing fields are omitted rather than sent as null/undefined so the\n * payload (and the server's stored dict) stays compact.\n */\nexport const collectDeviceContext = (): DeviceContext => {\n const ctx: DeviceContext = { platform: Platform.OS };\n\n // OS version (fallback; per-OS constants below may refine it).\n try {\n const version = Platform.Version;\n if (version !== undefined && version !== null && String(version)) {\n ctx.osVersion = String(version);\n }\n } catch {\n // ignore\n }\n\n // `Platform.constants` shape differs by OS and RN version — read every field defensively.\n let constants: Record<string, unknown> = {};\n try {\n constants = (Platform.constants ?? {}) as Record<string, unknown>;\n } catch {\n constants = {};\n }\n\n let iosIdiom: string | undefined;\n try {\n if (Platform.OS === \"android\") {\n const brand = constants.Brand;\n const model = constants.Model;\n const release = constants.Release;\n if (typeof brand === \"string\" && brand) ctx.brand = brand;\n if (typeof model === \"string\" && model) ctx.model = model;\n if (release !== undefined && release !== null && String(release)) {\n ctx.osVersion = String(release);\n }\n } else if (Platform.OS === \"ios\") {\n const osVersion = constants.osVersion;\n const idiom = constants.interfaceIdiom;\n if (osVersion !== undefined && osVersion !== null && String(osVersion)) {\n ctx.osVersion = String(osVersion);\n }\n if (typeof idiom === \"string\" && idiom) {\n ctx.interfaceIdiom = idiom;\n iosIdiom = idiom;\n }\n }\n } catch {\n // ignore per-OS constant reads\n }\n\n // Screen dimensions + derived form factor.\n try {\n const screen = Dimensions.get(\"screen\");\n if (screen) {\n if (typeof screen.width === \"number\") ctx.screenWidth = screen.width;\n if (typeof screen.height === \"number\") ctx.screenHeight = screen.height;\n if (typeof screen.scale === \"number\") ctx.screenScale = screen.scale;\n const formFactor = deriveFormFactor(iosIdiom, screen.width, screen.height);\n if (formFactor) ctx.formFactor = formFactor;\n }\n } catch {\n // ignore\n }\n\n // Layout direction.\n try {\n ctx.isRTL = I18nManager.isRTL;\n } catch {\n // ignore\n }\n\n // Locale + time zone via the standard Intl global. Hermes may ship without full Intl,\n // so referencing it can throw ReferenceError — the try/catch covers that too.\n try {\n const resolved = Intl.DateTimeFormat().resolvedOptions();\n if (resolved.locale) ctx.locale = resolved.locale;\n if (resolved.timeZone) ctx.timeZone = resolved.timeZone;\n } catch {\n // Intl unavailable — omit locale/timeZone.\n }\n\n return ctx;\n};\n","/**\n * Session-id persistence — the kit caching its OWN correlation seed across app kills.\n *\n * WHY: the session id is minted per mount and forwarded to the backend as the A2A\n * `contextId` (see WireOnboarding). Without persistence, an app KILL mid-onboarding\n * mints a NEW id on relaunch — the server counts a second `session_started` and the\n * orphaned first session reads as a phantom \"drop\", inflating the funnel's `started`\n * denominator. Persisting `{ id, ts }` and reusing a still-fresh id keeps a\n * kill-and-relaunch a SINGLE session in analytics.\n *\n * SCOPE: this persists the correlation seed ONLY — never answers. Answer persistence\n * stays a host concern via `onComplete` (the kit/host boundary is unchanged).\n *\n * The host injects the storage via the `storage` prop (an AsyncStorage-compatible\n * subset), keeping the kit dependency-free: an MMKV wrapper and AsyncStorage itself\n * both fit. Every operation is best-effort — a broken or hung storage must NEVER\n * break (or indefinitely gate) onboarding: reads race a short timeout, writes and\n * removes swallow all errors.\n */\nimport { makeSessionId } from \"../analytics/reportClientEvent\";\n\n/**\n * The storage the host injects. Deliberately the AsyncStorage-compatible subset so\n * `@react-native-async-storage/async-storage` can be passed as-is, and an MMKV (or\n * any other) wrapper is three one-line methods.\n */\nexport type WireOnboardingStorage = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\n/**\n * Matches the backend's session TTL (SESSION_TTL_SECONDS = 3600): an id older than\n * this can't be resumed server-side anyway, so the client mints fresh past it.\n */\nexport const DEFAULT_SESSION_TTL_MS = 3_600_000;\n\n/** Ceiling on the storage read — a hung adapter degrades to a fresh mint, never a stuck gate. */\nconst READ_TIMEOUT_MS = 1_500;\n\n/** Storage key for an app's cached session, e.g. `wireai:session:myelino`. */\nexport const sessionStorageKey = (appId: string): string => `wireai:session:${appId}`;\n\ntype PersistedSession = { id: string; ts: number };\n\n/** Resolved session for a mount: the id to use + whether it was restored from storage. */\nexport type LoadedSession = {\n id: string;\n /** True when a stored, still-fresh id was reused — the flow resumes instead of starting. */\n resumed: boolean;\n};\n\nconst withTimeout = <T>(p: Promise<T>, ms: number): Promise<T | undefined> => {\n let timer: ReturnType<typeof setTimeout>;\n const timeout = new Promise<undefined>((resolve) => {\n timer = setTimeout(() => resolve(undefined), ms);\n });\n // Clear the timer once the race settles, so a won read doesn't leave a ≤ms no-op\n // timer holding the closure alive.\n return Promise.race([p, timeout]).finally(() => clearTimeout(timer));\n};\n\nconst parsePersisted = (raw: string | null | undefined): PersistedSession | undefined => {\n if (!raw) return undefined;\n try {\n const parsed: unknown = JSON.parse(raw);\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n typeof (parsed as PersistedSession).id === \"string\" &&\n typeof (parsed as PersistedSession).ts === \"number\"\n ) {\n return parsed as PersistedSession;\n }\n } catch {\n // Corrupt entry → treat as absent; the caller mints fresh and overwrites it.\n }\n return undefined;\n};\n\n/**\n * Resolve the session id for this mount: reuse the stored one while it's fresh\n * (→ `resumed: true`), else mint via `makeSessionId`, persist it, and start clean.\n * Never throws; never hangs past the read timeout.\n */\nexport const loadPersistedSession = async (\n storage: WireOnboardingStorage,\n key: string,\n ttlMs: number = DEFAULT_SESSION_TTL_MS,\n): Promise<LoadedSession> => {\n let stored: PersistedSession | undefined;\n try {\n stored = parsePersisted(await withTimeout(storage.getItem(key), READ_TIMEOUT_MS));\n } catch {\n stored = undefined;\n }\n if (stored && Date.now() - stored.ts < ttlMs) {\n return { id: stored.id, resumed: true };\n }\n const id = makeSessionId();\n savePersistedSession(storage, key, id);\n return { id, resumed: false };\n};\n\n/**\n * Read the persisted session WITHOUT minting a fresh one (unlike `loadPersistedSession`).\n * Returns the stored `{ id, ts }` or `undefined` when absent/corrupt/timed-out. Used by the\n * post-onboarding `identifyOnboarding` helper to recover the contextId to bind a user to.\n * Never throws; never hangs past the read timeout.\n */\nexport const peekPersistedSession = async (\n storage: WireOnboardingStorage,\n key: string,\n): Promise<{ id: string; ts: number } | undefined> => {\n try {\n return parsePersisted(await withTimeout(storage.getItem(key), READ_TIMEOUT_MS));\n } catch {\n return undefined;\n }\n};\n\n/** Persist `{ id, ts }` under `key` — fire-and-forget, all errors swallowed. */\nexport const savePersistedSession = (\n storage: WireOnboardingStorage,\n key: string,\n id: string,\n): void => {\n try {\n void storage.setItem(key, JSON.stringify({ id, ts: Date.now() })).catch(() => {});\n } catch {\n // Best-effort: a failed write just means the next launch starts a fresh session.\n }\n};\n\n/** Remove the cached id (fired on completion) — fire-and-forget, all errors swallowed. */\nexport const clearPersistedSession = (storage: WireOnboardingStorage, key: string): void => {\n try {\n void storage.removeItem(key).catch(() => {});\n } catch {\n // Best-effort.\n }\n};\n","/**\n * User identity — bind an onboarding session to the HOST's own user id so the funnel can\n * be reconciled to real users later (console sessions ↔ your user table / GA4 users).\n *\n * The id is an OPAQUE PSEUDONYMOUS STRING the host owns — its internal user id, NOT an\n * email/name/phone. Same host-injection philosophy as `storage` and `userContext`: the kit\n * mints nothing and reads nothing; the host passes what it wants. Dependency-free.\n *\n * Three binding moments (see WireOnboarding + the README \"User identity\" section):\n * 1. MOUNT — pass `userId` and it rides the A2A session-start metadata; the server\n * binds it when it creates the session.\n * 2. MID-SESSION— the user registers DURING onboarding: change the `userId` prop and the\n * kit emits an `identify` client event that attaches the id to the live\n * session (late binding — the key scenario).\n * 3. POST-FLOW — the user registers AFTER onboarding: call `identifyOnboarding(...)` with\n * the same host storage (it recovers the persisted contextId, before completion\n * clears it) or, more reliably, the `contextId` you captured from the\n * `started`/`resumed` `onEvent` (both events carry a `contextId` field).\n *\n * ⚠️ NO PII. Pass an opaque id (or a hash), never a raw email/name/phone. The id is capped at\n * {@link USER_ID_MAX_LENGTH} chars (longer ids are truncated, not rejected).\n */\nimport { reportClientEvent } from \"../analytics/reportClientEvent\";\nimport {\n peekPersistedSession,\n sessionStorageKey,\n type WireOnboardingStorage,\n} from \"../session/persistedSession\";\n\n/** Max accepted user-id length. Longer strings are truncated (never rejected). Keep in sync\n * with the server's `USER_ID_MAX_LENGTH` (analytics/events.py). */\nexport const USER_ID_MAX_LENGTH = 128;\n\n/**\n * Normalize a host-supplied user id: trim, drop empty, and cap at {@link USER_ID_MAX_LENGTH}.\n * Returns `undefined` for a missing/blank/non-string value so callers can `if (id)`-gate.\n * PII is a host concern — this only bounds length, it does not (and cannot) detect an email.\n */\nexport const sanitizeUserId = (raw: unknown): string | undefined => {\n if (typeof raw !== \"string\") return undefined;\n const trimmed = raw.trim();\n if (!trimmed) return undefined;\n return trimmed.length > USER_ID_MAX_LENGTH ? trimmed.slice(0, USER_ID_MAX_LENGTH) : trimmed;\n};\n\n/** Options for {@link identifyOnboarding}. */\nexport type IdentifyOnboardingOptions = {\n /** Tenant transport, same shape as `WireOnboardingConfig` (only these two fields are used). */\n config: { serverUrl: string; apiKey: string };\n /** The host's opaque user id to bind. Trimmed + capped; NO PII. */\n userId: string;\n /**\n * The onboarding session id to bind to (the A2A contextId) — the `contextId` field carried on\n * the `started`/`resumed` `onEvent`. Pass this when you captured it there. Required after the\n * flow COMPLETED, since completion clears the persisted session. Wins over the storage lookup.\n */\n contextId?: string;\n /**\n * The SAME host storage you passed to `<WireOnboarding storage={…} />`. When `contextId` is\n * omitted, the helper reads the persisted contextId from it (works while the session is still\n * persisted — i.e. dropped or mid-flow, before completion clears it).\n */\n storage?: WireOnboardingStorage;\n /** App id, to derive the default storage key `wireai:session:<appId>` when reading from storage. */\n appId?: string;\n /** Storage key override — pass the same `persistKey` you gave `<WireOnboarding>`, if any. */\n persistKey?: string;\n};\n\n/**\n * Attach a host user id to an onboarding session AFTER the fact (post-registration), by sending\n * an `identify` client event to `/v1/events`. Resolves the contextId from an explicit\n * `contextId` or, failing that, from the persisted session in the host `storage`.\n *\n * Fire-and-forget under the hood (never throws, never blocks onboarding). Resolves to `true`\n * when an identify event was dispatched, `false` when it couldn't (no user id, no server url,\n * or no resolvable contextId).\n */\nexport const identifyOnboarding = async (\n opts: IdentifyOnboardingOptions,\n): Promise<boolean> => {\n const userId = sanitizeUserId(opts.userId);\n if (!userId || !opts.config?.serverUrl) return false;\n\n let contextId = opts.contextId?.trim() || undefined;\n if (!contextId && opts.storage) {\n const key = opts.persistKey ?? (opts.appId ? sessionStorageKey(opts.appId) : undefined);\n if (key) {\n const stored = await peekPersistedSession(opts.storage, key);\n contextId = stored?.id;\n }\n }\n if (!contextId) return false;\n\n reportClientEvent(\n { serverUrl: opts.config.serverUrl, apiKey: opts.config.apiKey },\n { event_type: \"identify\", session_id: contextId, user_id: userId },\n );\n return true;\n};\n","/**\n * WireOnboarding — the public host component. Drop it into a screen and it runs\n * the whole AI onboarding: builds the A2A transport from `config`, wires the SDK\n * provider with the themed cards, applies the theme, and renders the flow.\n *\n * <WireOnboarding\n * config={{ apiKey, serverUrl, appId }}\n * theme={myBrandTheme}\n * validators={{ username: checkUsernameAvailable }}\n * onComplete={persist}\n * onSkip={skip}\n * />\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { WireAIProvider, type LocalLLMConfig } from \"wireai-rn\";\nimport { OnboardingThemeProvider } from \"./theme/ThemeContext\";\nimport { IllustrationProvider } from \"./components/Illustration\";\nimport { defaultIllustrations } from \"./illustrations/defaultIllustrations\";\nimport { LoadingScreen } from \"./components/LoadingScreen\";\nimport { OnboardingFlow, DEFAULT_COPY } from \"./OnboardingFlow\";\nimport { onboardingComponents } from \"./cards\";\nimport { makeSessionId, reportClientEvent, type ClientEventTarget } from \"./analytics/reportClientEvent\";\nimport { collectDeviceContext, type DeviceContext } from \"./device/deviceContext\";\nimport { sanitizeUserId } from \"./identity/userIdentity\";\nimport {\n clearPersistedSession,\n loadPersistedSession,\n sessionStorageKey,\n DEFAULT_SESSION_TTL_MS,\n type LoadedSession,\n} from \"./session/persistedSession\";\nimport type { OnboardingResult, WireOnboardingProps } from \"./types\";\n\nexport const WireOnboarding: React.FC<WireOnboardingProps> = ({\n config,\n theme,\n components,\n illustrations,\n validators,\n onComplete,\n onSkip,\n onError,\n onEvent,\n copy,\n approxScreens,\n startMessage = \"start\",\n startTimeoutMs = 15_000,\n fallbackFlow,\n maxRetries = 1,\n storage,\n sessionTtlMs = DEFAULT_SESSION_TTL_MS,\n persistKey,\n userContext,\n userId,\n}) => {\n // The host's own opaque user id (trimmed + capped, NO PII) so onboarding sessions can be\n // reconciled to real users later. `sanitizeUserId` is a pure string transform → the memoized\n // result is a stable primitive, safe to feed the `llm` / `clientContext` memos directly (unlike\n // the raw object props). Bound at three moments: session-start metadata (mount), an `identify`\n // event on a mid-session change (late binding), and the `identifyOnboarding` helper post-flow.\n const boundUserId = useMemo(() => sanitizeUserId(userId), [userId]);\n\n // Privacy-label-neutral device snapshot, collected once per mount (no advertising IDs, no\n // fingerprinting — see device/deviceContext.ts). `config.appVersion` is host-injected and\n // merged in here (collectDeviceContext never sets it). Attached to BOTH the A2A session\n // metadata and every client event so the backend can segment the funnel by device.\n const device = useMemo<DeviceContext>(() => {\n const collected = collectDeviceContext();\n return config.appVersion ? { ...collected, appVersion: config.appVersion } : collected;\n }, [config.appVersion]);\n\n // Stable serialization of `userContext`. Hosts pass it INLINE (`userContext={{ … }}`, the\n // documented usage), so the raw object identity changes every render. Feeding that raw object\n // into the `llm` / `clientContext` memos below would make them unstable, and wireai-rn recreates\n // its A2A adapter whenever the llmConfig identity changes — the adapter ctor resets `contextId`\n // (node_modules/wireai-rn: `this.contextId = void 0`), so the server-learned session id is\n // dropped and correlation breaks. We key both memos on the JSON string (compared by value) and\n // reuse ONE normalized reference in the metadata + client-event paths.\n const userContextKey = userContext ? JSON.stringify(userContext) : \"\";\n const userContextStable = useMemo<Record<string, string | number | boolean> | undefined>(\n () => (userContextKey ? (JSON.parse(userContextKey) as Record<string, string | number | boolean>) : undefined),\n [userContextKey],\n );\n\n // The context payload shared by the A2A metadata + client-event paths. `userContext` +\n // `userId` are host-injected and forwarded verbatim (the server sanitizes them). Omitted keys\n // stay absent, so `dropped`/`client_fallback` events carry the user id when it's known.\n const clientContext = useMemo(\n () => ({ device, userContext: userContextStable, userId: boundUserId }),\n [device, userContextStable, boundUserId],\n );\n // One stable session id per onboarding SESSION (not per mount). It's used as the\n // client event `session_id` AND forwarded to the backend as `metadata.sessionId` so\n // the server can adopt it as the A2A `contextId` — making client-reported events\n // (`dropped`) correlate to the same session the server keys its own events by. See\n // the SDK-correlation note in analytics/reportClientEvent.ts.\n //\n // Without `storage`: minted synchronously per mount (the original behavior).\n // With `storage`: hydrated from the host-injected storage BEFORE the provider mounts\n // (loader-gate below), so an app KILL mid-onboarding resumes the SAME backend session\n // instead of minting a new one — which would count a phantom second `started` + a\n // false \"drop\" in the analytics funnel. See session/persistedSession.ts.\n const [session, setSession] = useState<LoadedSession | null>(() =>\n storage ? null : { id: makeSessionId(), resumed: false },\n );\n const storageKey = persistKey ?? sessionStorageKey(config.appId);\n\n useEffect(() => {\n if (!storage || session) return;\n // StrictMode/dev double-effect safe: the cancel flag drops the stale resolution.\n // Dev-only caveat: on a brand-new first mint, StrictMode's double-invoke can persist\n // then read the id back, surfacing a spurious `resumed: true`. Production is unaffected\n // (double-invoke is dev-only) and it self-heals on the next mount.\n let cancelled = false;\n void loadPersistedSession(storage, storageKey, sessionTtlMs).then((loaded) => {\n if (!cancelled) setSession(loaded);\n });\n return () => {\n cancelled = true;\n };\n }, [storage, storageKey, sessionTtlMs, session]);\n\n // Clear the cached id the moment the flow completes, so the next onboarding on this\n // device starts a fresh session. Dropped/degraded paths deliberately do NOT clear —\n // a dropped session must stay resumable within the TTL.\n const handleComplete = useCallback(\n (result: OnboardingResult) => {\n if (storage) clearPersistedSession(storage, storageKey);\n onComplete(result);\n },\n [storage, storageKey, onComplete],\n );\n\n const sessionId = session?.id ?? \"\";\n\n // Session-start snapshot of the bound user id. It seeds the A2A `metadata.userId` so the\n // adapter is built ONCE with whatever id was known at session start. A mid-session userId\n // change must NOT flow through this memo — recreating `llm` recreates the A2A adapter,\n // whose ctor resets `contextId` (see the userContext note above) and drops the server-\n // learned session id. Later changes ride EXCLUSIVELY on the `identify` effect below, which\n // mutates the live session in place. `useRef` captures the first-render value once.\n const startupUserIdRef = useRef<string | undefined>(boundUserId);\n\n // Build the A2A LocalLLMConfig from the friendlier kit config. The backend\n // resolves the app from the API key, so `model` (appId) is informational.\n const llm = useMemo<LocalLLMConfig>(() => {\n const baseUrl = config.serverUrl.replace(/\\/$/, \"\");\n return {\n provider: \"a2a\",\n baseUrl: `${baseUrl}/a2a`,\n model: config.appId,\n apiKey: config.apiKey,\n // Carry the kit session id alongside any host attribution so it reaches the A2A\n // request's `params.metadata` (the correlation seed; see note above), plus the\n // names of the components this device can actually render — so the backend only\n // emits cards the kit knows how to draw.\n metadata: {\n ...config.metadata,\n sessionId,\n supportedComponents: (components ?? onboardingComponents).map((c) => c.name),\n // Device snapshot + host-injected user context ride the session-start metadata so the\n // backend can segment the funnel. Old servers ignore these unknown keys (backward compat).\n device,\n ...(userContextStable ? { userContext: userContextStable } : {}),\n // The session-start user id (from the ref) rides the session-start metadata so the\n // server binds the session to a real user at creation. Reading the ref — not\n // `boundUserId` — keeps this memo off the userId dependency, so a mid-session change\n // does NOT recreate the adapter; it's bound by the `identify` effect below instead.\n ...(startupUserIdRef.current ? { userId: startupUserIdRef.current } : {}),\n },\n timeoutMs: 60_000,\n };\n }, [config.serverUrl, config.appId, config.apiKey, config.metadata, sessionId, components, device, userContextStable]);\n\n // Where client-reported events are POSTed (`/v1/events`). Same tenant creds as the flow.\n const reportTarget = useMemo<ClientEventTarget>(\n () => ({ serverUrl: config.serverUrl, apiKey: config.apiKey }),\n [config.serverUrl, config.apiKey],\n );\n\n // LATE BINDING (mid-session): the user often registers DURING onboarding. When `userId`\n // becomes known (or changes) after the session already started, emit an `identify` client\n // event that attaches the id to the LIVE session, so the backend can map this in-flight\n // session to the real user. On a FRESH mount the initial id already rode the session-start\n // metadata, so we seed the \"already bound\" ref with it and only react to later CHANGES. On a\n // RESUMED session the server-side record predates this mount and won't re-read start metadata,\n // so we leave the seed empty to force an identify when a userId is present. Fire-and-forget.\n const identifiedRef = useRef<string | undefined>(undefined);\n const identifySeededRef = useRef(false);\n useEffect(() => {\n if (!session || !sessionId) return;\n if (!identifySeededRef.current) {\n identifySeededRef.current = true;\n identifiedRef.current = session.resumed ? undefined : boundUserId;\n }\n if (!boundUserId || boundUserId === identifiedRef.current) return;\n identifiedRef.current = boundUserId;\n reportClientEvent(reportTarget, {\n event_type: \"identify\",\n session_id: sessionId,\n user_id: boundUserId,\n });\n }, [session, sessionId, boundUserId, reportTarget]);\n\n const cards = components ?? onboardingComponents;\n\n // Loader-gate (hydration approach A): hold the entire provider subtree until the\n // stored id resolves. `sessionId` is a dependency of the `llm` memo above, so mounting\n // the provider with a throwaway id and swapping later would re-init it mid-flight.\n // The read is timeout-capped in loadPersistedSession, so this gate is one storage\n // read (~a frame), never an indefinite hold.\n if (!session) {\n return (\n <OnboardingThemeProvider theme={theme}>\n <LoadingScreen\n title={copy?.restoringTitle ?? DEFAULT_COPY.restoringTitle}\n hint={copy?.restoringHint ?? DEFAULT_COPY.restoringHint}\n />\n </OnboardingThemeProvider>\n );\n }\n\n return (\n <OnboardingThemeProvider theme={theme}>\n <IllustrationProvider registry={{ ...defaultIllustrations, ...illustrations }}>\n <WireAIProvider llm={llm} components={cards}>\n <OnboardingFlow\n validators={validators}\n onComplete={handleComplete}\n onSkip={onSkip}\n onError={onError}\n onEvent={onEvent}\n copy={copy}\n approxScreens={approxScreens}\n startMessage={startMessage}\n startTimeoutMs={startTimeoutMs}\n fallbackFlow={fallbackFlow}\n maxRetries={maxRetries}\n reportTarget={reportTarget}\n sessionId={sessionId}\n resumed={session.resumed}\n clientContext={clientContext}\n />\n </WireAIProvider>\n </IllustrationProvider>\n </OnboardingThemeProvider>\n );\n};\n","/**\n * DemoOnboarding — a drop-in dev/QA trigger that runs the onboarding flow ON\n * DEMAND in a modal, then closes. No loop, no account, no navigation side-effects:\n * re-runnable infinitely with the same logged-in user. Place it anywhere a host\n * wants (e.g. a __DEV__ row in Settings). If `config` is null (the app hasn't\n * integrated Wire AI yet), it shows a hint instead of the flow.\n *\n * {__DEV__ && (\n * <DemoOnboarding config={wireConfigFromEnv({ appId: \"my-app\" })} theme={myTheme} />\n * )}\n *\n * It does NOT persist by default (a demo, not a real run) — pass `onComplete` if\n * you want to observe the captured answers.\n */\nimport { useCallback, useMemo, useState, type ReactNode } from \"react\";\nimport { Modal, Pressable, StyleSheet, Text, View } from \"react-native\";\n\nimport { WireOnboarding } from \"./WireOnboarding\";\nimport { mergeTheme } from \"./theme/defaultTheme\";\nimport type { OnboardingTheme } from \"./theme/types\";\nimport type { OnboardingResult, WireOnboardingConfig, WireOnboardingProps } from \"./types\";\n\nexport type DemoOnboardingProps = {\n /** The Wire AI config, or `null` when the app hasn't integrated Wire AI yet. */\n config: WireOnboardingConfig | null;\n theme?: WireOnboardingProps[\"theme\"];\n illustrations?: WireOnboardingProps[\"illustrations\"];\n validators?: WireOnboardingProps[\"validators\"];\n copy?: WireOnboardingProps[\"copy\"];\n /** Trigger button label. Default \"Demo onboarding\". */\n label?: string;\n /** Observe the demo result. By default the demo just closes (no persistence). */\n onComplete?: (result: OnboardingResult) => void;\n /** Render your own trigger instead of the default button: `(open) => <YourButton onPress={open} />`. */\n renderTrigger?: (open: () => void) => ReactNode;\n};\n\nexport function DemoOnboarding({\n config,\n theme,\n illustrations,\n validators,\n copy,\n label = \"Demo onboarding\",\n onComplete,\n renderTrigger,\n}: DemoOnboardingProps) {\n const [open, setOpen] = useState(false);\n const [runId, setRunId] = useState(0);\n const t = useMemo(() => mergeTheme(theme ?? {}), [theme]);\n const styles = useMemo(() => makeStyles(t), [t]);\n\n const openDemo = useCallback(() => {\n setRunId((n) => n + 1); // remount WireOnboarding → a fresh A2A session each open\n setOpen(true);\n }, []);\n const close = useCallback(() => setOpen(false), []);\n const finish = useCallback(\n (result: OnboardingResult) => {\n onComplete?.(result);\n setOpen(false);\n },\n [onComplete],\n );\n\n return (\n <>\n {renderTrigger ? (\n renderTrigger(openDemo)\n ) : (\n <Pressable onPress={openDemo} style={styles.trigger} accessibilityRole=\"button\">\n <Text style={styles.triggerText}>{label}</Text>\n </Pressable>\n )}\n\n <Modal\n visible={open}\n animationType=\"slide\"\n presentationStyle=\"fullScreen\"\n onRequestClose={close}\n >\n <View style={styles.modal}>\n {config ? (\n <WireOnboarding\n key={runId}\n config={config}\n theme={theme}\n illustrations={illustrations}\n validators={validators}\n copy={copy}\n onComplete={finish}\n onSkip={close}\n onError={close}\n />\n ) : (\n <View style={styles.notice}>\n <Text style={styles.noticeTitle}>Wire AI not configured</Text>\n <Text style={styles.noticeBody}>\n Set the Wire AI key + server URL (e.g. via wireConfigFromEnv) to demo the AI\n onboarding here.\n </Text>\n <Pressable onPress={close} style={styles.trigger} accessibilityRole=\"button\">\n <Text style={styles.triggerText}>Close</Text>\n </Pressable>\n </View>\n )}\n </View>\n </Modal>\n </>\n );\n}\n\nfunction makeStyles(t: OnboardingTheme) {\n return StyleSheet.create({\n trigger: {\n backgroundColor: t.colors.primary,\n borderRadius: t.button.radius,\n paddingVertical: 14,\n paddingHorizontal: 20,\n alignItems: \"center\",\n },\n triggerText: { color: t.colors.onPrimary, fontFamily: t.fonts.medium, fontSize: 16 },\n modal: { flex: 1, backgroundColor: t.colors.background },\n notice: { flex: 1, alignItems: \"center\", justifyContent: \"center\", padding: 24, gap: 12 },\n noticeTitle: { color: t.colors.text, fontFamily: t.fonts.bold, fontSize: 20 },\n noticeBody: {\n color: t.colors.textMuted,\n fontFamily: t.fonts.regular,\n fontSize: 15,\n textAlign: \"center\",\n },\n });\n}\n","/**\n * themeFromBrand — the fastest path to a branded flow. Give it a primary brand\n * color (and optionally a background + a font), and it derives a sensible full\n * `Partial<OnboardingTheme>` over the neutral `defaultOnboardingTheme` (via\n * `mergeTheme`): a tinted soft wash for selected states, a readable on-primary\n * label, and matching success/info accents left at the neutral default.\n *\n * theme={themeFromBrand({ primary: \"#15B0B0\" })}\n *\n * It stays intentionally small: it only touches the values that flow from a brand\n * color. Anything else (radius, spacing, button shape) keeps the default; pass\n * `extra` to override those without re-authoring the palette.\n */\nimport { defaultOnboardingTheme, mergeTheme } from \"./defaultTheme\";\nimport type { OnboardingTheme } from \"./types\";\n\nexport type ThemeFromBrandInput = {\n /** Brand / accent color — drives selected states, primary buttons, progress fill. */\n primary: string;\n /** App background behind the whole flow. Default: the neutral light background. */\n background?: string;\n /** Card / elevated surface background. Default: the neutral surface. */\n surface?: string;\n /** Primary body text color. Default: the neutral near-black. */\n text?: string;\n /** Text/icon color on top of `primary`. Default: white. */\n onPrimary?: string;\n /**\n * A single font family applied to regular/medium/bold (the kit derives weight\n * from size when a family isn't weight-split). Pass `fonts` in `extra` for\n * per-weight families.\n */\n font?: string;\n /** Any further theme overrides, deep-merged last (radius/spacing/button/fonts/colors). */\n extra?: Partial<OnboardingTheme>;\n};\n\n/** Parse a #RGB or #RRGGBB hex into [r,g,b]; returns null for anything else (e.g. rgba()). */\nconst hexToRgb = (hex: string): [number, number, number] | null => {\n const m = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(hex.trim());\n if (!m) return null;\n let h = m[1] as string;\n if (h.length === 3) h = h[0]! + h[0]! + h[1]! + h[1]! + h[2]! + h[2]!;\n const int = parseInt(h, 16);\n return [(int >> 16) & 255, (int >> 8) & 255, int & 255];\n};\n\n/** A low-alpha wash of the primary for selected backgrounds, falling back gracefully. */\nconst softFromPrimary = (primary: string): string => {\n const rgb = hexToRgb(primary);\n if (!rgb) return defaultOnboardingTheme.colors.primarySoft;\n const [r, g, b] = rgb;\n return `rgba(${r},${g},${b},0.10)`;\n};\n\nexport const themeFromBrand = (input: ThemeFromBrandInput): Partial<OnboardingTheme> => {\n const { primary, background, surface, text, onPrimary, font, extra } = input;\n\n const derived: Partial<OnboardingTheme> = {\n colors: {\n ...defaultOnboardingTheme.colors,\n primary,\n primarySoft: softFromPrimary(primary),\n onPrimary: onPrimary ?? defaultOnboardingTheme.colors.onPrimary,\n ...(background ? { background } : {}),\n ...(surface ? { surface } : {}),\n ...(text ? { text } : {}),\n },\n ...(font\n ? {\n fonts: {\n ...defaultOnboardingTheme.fonts,\n regular: font,\n medium: font,\n bold: font,\n },\n }\n : {}),\n };\n\n // mergeTheme resolves the derived palette over the neutral default into a full\n // theme. Then deep-merge `extra` per sub-object so callers can override\n // radius/spacing/button/fonts/colors without re-authoring the palette.\n const base = mergeTheme(derived);\n if (!extra) return base;\n return {\n colors: { ...base.colors, ...extra.colors },\n fonts: { ...base.fonts, ...extra.fonts },\n radius: { ...base.radius, ...extra.radius },\n spacing: { ...base.spacing, ...extra.spacing },\n button: { ...base.button, ...extra.button },\n };\n};\n","/**\n * DoneBlock — a brief themed \"all set\" state shown when the flow completes, while\n * the host persists results and navigates away. Purely cosmetic; the real\n * terminal signal is the SDK's StatusCard (handled in OnboardingFlow).\n */\nimport React from \"react\";\nimport { StyleSheet, Text, View } from \"react-native\";\nimport { useOnboardingTheme } from \"../theme/ThemeContext\";\nimport { bodyStyle, headingStyle } from \"../theme/typography\";\n\nexport type DoneBlockProps = {\n title?: string;\n message?: string;\n};\n\nconst _DoneBlock: React.FC<DoneBlockProps> = ({\n title = \"You're all set\",\n message = \"Personalizing your experience…\",\n}) => {\n const t = useOnboardingTheme();\n return (\n <View style={[styles.center, { gap: t.spacing.sm, padding: t.spacing.lg }]}>\n <Text style={[headingStyle(t.fonts), { color: t.colors.success, textAlign: \"center\" }]}>\n {title}\n </Text>\n <Text style={[bodyStyle(t.fonts), { color: t.colors.textMuted, textAlign: \"center\" }]}>\n {message}\n </Text>\n </View>\n );\n};\n\nexport const DoneBlock = React.memo(_DoneBlock);\n\nconst styles = StyleSheet.create({\n center: { flex: 1, alignItems: \"center\", justifyContent: \"center\" },\n});\n","/**\n * centeredModalMotion - the pure entrance spec for the content-agnostic CenteredModal shell.\n *\n * WHY split out: the shell UI (CenteredModal) is RN and cannot run under the kit's node:test\n * runner, but the entrance math is pure and worth pinning. Keep the animation spec here so both\n * the component and the tests read one source, and so any module (reviews, questionnaire) can\n * reuse the shell without depending on another feature module.\n *\n * The centered popup uses RN's built-in `Animated` (native driver), the same idiom as\n * CompletionView/CardHandoff, so the shell stays dependency-free (no reanimated).\n *\n * NOTE: `reviews/presentation.ts` re-exports these under their original names\n * (`REVIEW_MODAL_ANIM`, `entranceFrame`) for back-compat with the reviews public API.\n */\n\n/**\n * The entrance spec for the centered popup. Values chosen to match the boilerplate's\n * `animated-modal` feel (a springy zoom-in) with the kit's own native-driver idiom:\n * • backdrop fades 0 -> `backdropOpacity`\n * • card springs from `scaleFrom` -> 1 and fades 0 -> 1\n */\nexport const CENTERED_MODAL_ANIM = {\n /** Spring config for the card scale/opacity entrance (mirrors CompletionView's pop). */\n enterSpring: { friction: 7, tension: 80 },\n /** Exit timing in ms (fade + shrink back out before unmount). */\n exitMs: 160,\n /** Card scale at rest (progress 0); grows to 1 at progress 1. */\n scaleFrom: 0.9,\n /** Peak dim of the backdrop at progress 1. */\n backdropOpacity: 0.55,\n} as const;\n\n/** A single frame of the entrance, for a progress value in [0..1] (clamped). Pure, testable. */\nexport const centeredModalFrame = (\n progress: number,\n backdropMax: number = CENTERED_MODAL_ANIM.backdropOpacity,\n): { cardOpacity: number; cardScale: number; backdropOpacity: number } => {\n const p = progress < 0 ? 0 : progress > 1 ? 1 : progress;\n const { scaleFrom } = CENTERED_MODAL_ANIM;\n return {\n cardOpacity: p,\n cardScale: scaleFrom + (1 - scaleFrom) * p,\n backdropOpacity: backdropMax * p,\n };\n};\n","/**\n * CenteredModal - the content-agnostic centered-popup shell.\n *\n * Renders its children as an alert-style card in the MIDDLE of the screen, over a dimmed\n * backdrop, with a spring/fade entrance. It knows nothing about what it presents: the reviews\n * gate uses it (via the `ReviewModal` back-compat re-export) and the questionnaire module reuses\n * the same shell, neither depends on the other.\n *\n * Adapted from the mobile-launcher boilerplate's `animated-modal` (transparent RN Modal +\n * centered container + backdrop-tap dismiss + content stop-propagation + springy zoom-in), but\n * reimplemented on RN's built-in `Animated` (native driver) so the shell stays dependency-free:\n * the boilerplate uses react-native-reanimated, which the kit does not.\n *\n * Dismissal (backdrop tap / Android back / the imperative `close()` handle) animates the card\n * out, then fires `onDismiss`. It never auto-closes on resolve: the host keeps the card showing\n * whatever payoff it wants (a thank-you, a summary) until the user taps the backdrop to close,\n * exactly like CompletionView.\n */\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport { Animated, BackHandler, Easing, Modal, Pressable, StyleSheet } from \"react-native\";\nimport { SafeAreaView } from \"react-native-safe-area-context\";\n\nimport type { OnboardingTheme } from \"../theme/types\";\nimport { REDUCED_FADE_MS } from \"../motion/motionSpec\";\nimport { useReducedMotion } from \"../motion/useReducedMotion\";\nimport { CENTERED_MODAL_ANIM } from \"../motion/centeredModalMotion\";\n\n/** Imperative handle so an in-card \"Not now\"/\"Skip\" link can trigger the exit animation. */\nexport type CenteredModalHandle = { close: () => void };\n\nexport type CenteredModalProps = {\n /** The (already merged) active theme - card surface/radius/spacing come from here. */\n theme: OnboardingTheme;\n /** Whether a backdrop tap / back press dismisses. Default true (never a dead end). */\n dismissible?: boolean;\n /** Fired once, AFTER the exit animation, on any dismiss. Wire to the host's resolve. */\n onDismiss: () => void;\n children: React.ReactNode;\n};\n\nconst _CenteredModal = forwardRef<CenteredModalHandle, CenteredModalProps>(\n ({ theme, dismissible = true, onDismiss, children }, ref) => {\n const progress = useRef(new Animated.Value(0)).current;\n const [open, setOpen] = useState(true);\n const closingRef = useRef(false);\n const reduced = useReducedMotion();\n\n // Entrance: spring the card in (scale + fade); the backdrop fades up in lock-step.\n // Reduce motion: a short fade to the settled card, no spring/scale.\n useEffect(() => {\n const anim = reduced\n ? Animated.timing(progress, {\n toValue: 1,\n duration: REDUCED_FADE_MS,\n useNativeDriver: true,\n })\n : Animated.spring(progress, {\n toValue: 1,\n useNativeDriver: true,\n friction: CENTERED_MODAL_ANIM.enterSpring.friction,\n tension: CENTERED_MODAL_ANIM.enterSpring.tension,\n });\n anim.start();\n return () => anim.stop();\n }, [progress, reduced]);\n\n const close = useCallback(() => {\n if (closingRef.current) return;\n closingRef.current = true;\n Animated.timing(progress, {\n toValue: 0,\n duration: reduced ? REDUCED_FADE_MS : CENTERED_MODAL_ANIM.exitMs,\n easing: Easing.in(Easing.cubic),\n useNativeDriver: true,\n }).start(() => {\n setOpen(false);\n onDismiss();\n });\n }, [progress, onDismiss, reduced]);\n\n useImperativeHandle(ref, () => ({ close }), [close]);\n\n // Android hardware back -> dismiss (when allowed). Always consume so it never pops a route.\n useEffect(() => {\n const sub = BackHandler.addEventListener(\"hardwareBackPress\", () => {\n if (dismissible) close();\n return true;\n });\n return () => sub.remove();\n }, [dismissible, close]);\n\n const onBackdrop = useCallback(() => {\n if (dismissible) close();\n }, [dismissible, close]);\n\n const backdropOpacity = progress.interpolate({\n inputRange: [0, 1],\n outputRange: [0, CENTERED_MODAL_ANIM.backdropOpacity],\n });\n // Reduce motion: the card fades in already settled (no zoom).\n const cardScale = reduced\n ? 1\n : progress.interpolate({\n inputRange: [0, 1],\n outputRange: [CENTERED_MODAL_ANIM.scaleFrom, 1],\n });\n\n return (\n <Modal\n visible={open}\n transparent\n animationType=\"none\"\n statusBarTranslucent\n onRequestClose={dismissible ? close : undefined}\n >\n {/* Dimmed backdrop (fades with the entrance). */}\n <Animated.View\n style={[styles.backdrop, { opacity: backdropOpacity }]}\n pointerEvents=\"none\"\n />\n\n {/* Full-screen tap target: a tap outside the card dismisses. */}\n <Pressable\n style={styles.fill}\n onPress={onBackdrop}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Dismiss\"\n >\n <SafeAreaView style={styles.center} pointerEvents=\"box-none\">\n {/* Inner Pressable swallows taps so the card itself never dismisses. */}\n <Pressable onPress={() => {}} style={styles.cardWrap}>\n <Animated.View\n accessibilityViewIsModal\n accessibilityRole=\"alert\"\n style={[\n styles.card,\n {\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radius.lg,\n padding: theme.spacing.lg,\n gap: theme.spacing.md,\n opacity: progress,\n transform: [{ scale: cardScale }],\n },\n ]}\n >\n {children}\n </Animated.View>\n </Pressable>\n </SafeAreaView>\n </Pressable>\n </Modal>\n );\n },\n);\n\n_CenteredModal.displayName = \"CenteredModal\";\n\nexport const CenteredModal = React.memo(_CenteredModal);\n\nconst styles = StyleSheet.create({\n fill: { flex: 1 },\n backdrop: { position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, backgroundColor: \"#000\" },\n center: { flex: 1, alignItems: \"center\", justifyContent: \"center\", padding: 24 },\n cardWrap: { width: \"100%\", maxWidth: 420 },\n card: {\n width: \"100%\",\n // Soft elevation so the popup reads as lifted above the app in both themes.\n shadowColor: \"#000\",\n shadowOffset: { width: 0, height: 8 },\n shadowOpacity: 0.28,\n shadowRadius: 24,\n elevation: 12,\n },\n});\n\nexport default CenteredModal;\n","/**\n * The fail-open defaults + a tolerant parser for the server's flags payload.\n *\n * THE CONTRACT: fail-open, never fail-dark. An absent server object, a missing module key, a\n * malformed value, or an unreachable endpoint must resolve to the MOST PERMISSIVE state — every\n * module ON, onboarding `ai` — so a control-plane outage can only ever be more permissive than\n * the dashboard intends. It can never dark a tenant's activation. Matches the server's own\n * documented fail-open default (FEATURES.md: \"local defaults — every module on, onboarding ai\").\n */\nimport type { OnboardingMode, WireFeatures } from \"./types\";\n\n/**\n * ALL ON, onboarding `ai`. Frozen + module-level so its reference is stable across every call\n * (consumers that list resolved flags in an effect dep array never loop on a fresh identity).\n */\nexport const defaultWireFeatures: WireFeatures = Object.freeze({\n coachmarks: Object.freeze({ enabled: true }),\n showcase: Object.freeze({ enabled: true }),\n onboarding: Object.freeze({ mode: \"ai\" as OnboardingMode }),\n review: Object.freeze({ enabled: true }),\n questionnaire: Object.freeze({ enabled: true }),\n announcements: Object.freeze({ enabled: true }),\n}) as WireFeatures;\n\nconst VALID_MODES: readonly OnboardingMode[] = [\"ai\", \"static\", \"off\"];\n\n/** Read a `{ enabled: boolean }` module, defaulting to ON when absent/malformed (fail-open). */\nconst readEnabled = (raw: unknown): { enabled: boolean } => {\n if (raw && typeof raw === \"object\" && typeof (raw as { enabled?: unknown }).enabled === \"boolean\") {\n return { enabled: (raw as { enabled: boolean }).enabled };\n }\n return { enabled: true };\n};\n\n/**\n * Narrow the server's (untrusted) JSON to a complete `WireFeatures`. Every field is filled with\n * its fail-open default when the server omits it or sends the wrong type, so a partial or\n * malformed payload degrades PERMISSIVELY rather than throwing. A non-object input (null, array,\n * string) → the full defaults. Never throws.\n */\nexport const parseWireFeatures = (raw: unknown): WireFeatures => {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return defaultWireFeatures;\n const src = raw as Record<string, unknown>;\n const modeRaw = (src.onboarding as { mode?: unknown } | undefined)?.mode;\n const mode: OnboardingMode =\n typeof modeRaw === \"string\" && VALID_MODES.includes(modeRaw as OnboardingMode)\n ? (modeRaw as OnboardingMode)\n : \"ai\";\n return {\n coachmarks: readEnabled(src.coachmarks),\n showcase: readEnabled(src.showcase),\n onboarding: { mode },\n review: readEnabled(src.review),\n questionnaire: readEnabled(src.questionnaire),\n announcements: readEnabled(src.announcements),\n };\n};\n\n/** Value-equality of two resolved flags — lets the hook hold a stable reference across churn. */\nexport const featuresEqual = (a: WireFeatures, b: WireFeatures): boolean =>\n a === b ||\n (a.coachmarks.enabled === b.coachmarks.enabled &&\n a.showcase.enabled === b.showcase.enabled &&\n a.onboarding.mode === b.onboarding.mode &&\n a.review.enabled === b.review.enabled &&\n a.questionnaire.enabled === b.questionnaire.enabled &&\n a.announcements.enabled === b.announcements.enabled);\n","/**\n * The last-known-flags cache — persisted through the host's optional `storage`.\n *\n * WHY: the fetch is best-effort and fail-open. When the control plane is unreachable we serve the\n * LAST value we saw rather than snapping to defaults, so a tenant that intentionally disabled a\n * module during an incident keeps it disabled across an outage instead of flapping back on. That\n * is \"stale-while-error\": a fresh cache (< TTL) is trusted, and on a fetch error even a STALE\n * cache is served (any age beats a guess). Every operation is best-effort — a broken/hung storage\n * degrades to defaults, never a throw and never a stuck gate (mirrors persistedSession).\n */\nimport { parseWireFeatures } from \"./defaults\";\nimport type { WireFeatures } from \"./types\";\nimport type { WireOnboardingStorage } from \"../session/persistedSession\";\n\n/**\n * TTL for a cached flags entry, aligned to the server's `Cache-Control: private, max-age=300`.\n * A cache younger than this is \"fresh\"; older is \"stale\" (still served on a fetch error).\n */\nexport const DEFAULT_FEATURES_TTL_MS = 300_000;\n\n/** Ceiling on the storage read so a hung adapter degrades to defaults, never a stuck resolve. */\nconst READ_TIMEOUT_MS = 1_500;\n\n/** Storage key for a tenant's cached flags, e.g. `wireai:features:myelino`. */\nexport const featuresCacheKey = (appId?: string): string =>\n `wireai:features:${appId && appId.length > 0 ? appId : \"default\"}`;\n\n/** A cached flags entry: the resolved flags + the epoch-ms they were fetched. */\nexport interface CachedFeatures {\n features: WireFeatures;\n /** Age of the entry in ms at read time. */\n ageMs: number;\n}\n\nconst withTimeout = <T>(p: Promise<T>, ms: number): Promise<T | undefined> => {\n let timer: ReturnType<typeof setTimeout>;\n const timeout = new Promise<undefined>((resolve) => {\n timer = setTimeout(() => resolve(undefined), ms);\n });\n return Promise.race([p, timeout]).finally(() => clearTimeout(timer));\n};\n\n/** Whether a cache entry is still within the TTL (server max-age aligned). */\nexport const isFeaturesFresh = (ageMs: number, ttlMs: number = DEFAULT_FEATURES_TTL_MS): boolean =>\n ageMs >= 0 && ageMs < ttlMs;\n\n/**\n * Read the cached flags for `key`, or `undefined` when absent/corrupt/timed-out. Returns the\n * value AND its age so a caller can apply a TTL (fresh) or ignore it (stale-while-error). Never\n * throws; never hangs past the read timeout. The stored value is re-parsed through\n * `parseWireFeatures`, so a partially-corrupt entry still degrades fail-open.\n */\nexport const readCachedFeatures = async (\n storage: WireOnboardingStorage,\n key: string,\n): Promise<CachedFeatures | undefined> => {\n let raw: string | null | undefined;\n try {\n raw = await withTimeout(storage.getItem(key), READ_TIMEOUT_MS);\n } catch {\n return undefined;\n }\n if (!raw) return undefined;\n try {\n const parsed: unknown = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\" && typeof (parsed as { ts?: unknown }).ts === \"number\") {\n const ts = (parsed as { ts: number }).ts;\n return {\n features: parseWireFeatures((parsed as { features?: unknown }).features),\n ageMs: Date.now() - ts,\n };\n }\n } catch {\n // Corrupt entry → treat as absent; the caller falls back to defaults / a fresh fetch.\n }\n return undefined;\n};\n\n/** Persist `{ features, ts }` under `key` — fire-and-forget, all errors swallowed. */\nexport const writeCachedFeatures = (\n storage: WireOnboardingStorage,\n key: string,\n features: WireFeatures,\n): void => {\n try {\n void storage\n .setItem(key, JSON.stringify({ features, ts: Date.now() }))\n .catch(() => {});\n } catch {\n // Best-effort: a failed write just means the next launch has no cache to fall back to.\n }\n};\n","/**\n * fetchWireFeatures — read the per-module kill switches from `GET {serverUrl}/v1/features`.\n *\n * Contract (server: chohra-med/wireai-onboarding-server, routers/onboarding.py):\n * GET {serverUrl}/v1/features\n * Authorization: Bearer {apiKey}\n * 200 → { coachmarks:{enabled}, showcase:{enabled}, onboarding:{mode}, review:{enabled},\n * announcements:{enabled} } (Cache-Control: private, max-age=300)\n *\n * THE CONTRACT — fail-open, never fail-dark. Unreachable, timed-out, unauthorized (401),\n * server-error (5xx), or malformed JSON all resolve to the LAST CACHED value, else the\n * all-on defaults. No throw ever reaches the host: this is timeout-capped and swallows every\n * error, exactly like the session's best-effort reads. A control-plane outage can only ever be\n * MORE permissive than the dashboard intends — it can never dark a tenant's activation.\n */\nimport { readCachedFeatures, featuresCacheKey, writeCachedFeatures } from \"./cache\";\nimport { defaultWireFeatures, parseWireFeatures } from \"./defaults\";\nimport type { WireFeatures, WireFeaturesConfig } from \"./types\";\nimport type { WireOnboardingStorage } from \"../session/persistedSession\";\n\nconst DEFAULT_TIMEOUT_MS = 4_000;\n\n/** The fail-open fallback: last cached value (any age — stale-while-error), else defaults. */\nconst failOpen = async (\n storage: WireOnboardingStorage | undefined,\n key: string,\n): Promise<WireFeatures> => {\n if (!storage) return defaultWireFeatures;\n const cached = await readCachedFeatures(storage, key);\n return cached?.features ?? defaultWireFeatures;\n};\n\n/** GET with a hard timeout via AbortController (falls back to no-abort where unsupported). */\nconst fetchWithTimeout = async (\n url: string,\n apiKey: string,\n timeoutMs: number,\n): Promise<Response> => {\n const controller =\n typeof AbortController !== \"undefined\" ? new AbortController() : undefined;\n const timer = setTimeout(() => controller?.abort(), timeoutMs);\n try {\n return await fetch(url, {\n method: \"GET\",\n headers: { Accept: \"application/json\", Authorization: `Bearer ${apiKey}` },\n signal: controller?.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n};\n\n/**\n * Resolve the tenant's feature flags. Attempts the network once; on ANY failure returns the\n * cached value (any age), else the all-on defaults. On success, persists the fresh value to the\n * cache (fire-and-forget) and returns it. Never throws.\n *\n * const flags = await fetchWireFeatures({ serverUrl, apiKey, appId, storage });\n * if (!flags.coachmarks.enabled) { /* skip the tour * / }\n */\nexport const fetchWireFeatures = async (\n config?: WireFeaturesConfig,\n): Promise<WireFeatures> => {\n const key = featuresCacheKey(config?.appId);\n const storage = config?.storage;\n\n // Nothing to fetch (no creds) → cache, else defaults. Lets a host mount the provider before\n // its config is ready without ever darking.\n if (!config?.serverUrl || !config?.apiKey) return failOpen(storage, key);\n\n const url = `${config.serverUrl.replace(/\\/$/, \"\")}/v1/features`;\n const timeoutMs = config.timeoutMs && config.timeoutMs > 0 ? config.timeoutMs : DEFAULT_TIMEOUT_MS;\n\n try {\n const res = await fetchWithTimeout(url, config.apiKey, timeoutMs);\n // 401 (bad/rotated key), 5xx, any non-2xx → last-known, never dark.\n if (!res || !res.ok) return failOpen(storage, key);\n const json: unknown = await res.json(); // throws on malformed body → caught below\n const features = parseWireFeatures(json);\n if (storage) writeCachedFeatures(storage, key, features);\n return features;\n } catch {\n // Timeout/abort, network error, missing fetch, or malformed JSON — all fail open.\n return failOpen(storage, key);\n }\n};\n","/**\n * useWireFeatures — resolve the tenant's feature flags for a component tree, once per mount.\n *\n * Returns the all-on defaults immediately (fail-open), then swaps to the fetched value when the\n * network resolves. When no `serverUrl`+`apiKey` is supplied it never fetches and just returns\n * defaults, so a host that never adopts flags sees ZERO behavior change and ZERO network calls.\n *\n * frequent_rules #11 (unstable inline props): the config is idiomatically passed inline\n * (`config={{ serverUrl, apiKey }}`), a fresh identity every render. We stabilize the fetch key\n * by VALUE so the effect fires once per real credential change, and we only swap the returned\n * flags object when its VALUES change — so a host that lists the returned flags in an effect dep\n * array settles in a bounded number of commits instead of looping (enforced by the canary suite).\n */\nimport { useEffect, useRef, useState } from \"react\";\n\nimport { defaultWireFeatures, featuresEqual } from \"./defaults\";\nimport { fetchWireFeatures } from \"./fetchWireFeatures\";\nimport type { WireFeatures, WireFeaturesConfig } from \"./types\";\n\n/** Hold a stable reference for a value while its CONTENT is unchanged (see reviews/equality.ts). */\nconst useStableValue = <T,>(value: T, isEqual: (a: T, b: T) => boolean): T => {\n const ref = useRef(value);\n if (!isEqual(ref.current, value)) ref.current = value;\n return ref.current;\n};\n\n/** The credential slice that actually drives a refetch — stabilized by value. */\nconst sameFetchKey = (a: WireFeaturesConfig | undefined, b: WireFeaturesConfig | undefined): boolean =>\n a?.serverUrl === b?.serverUrl && a?.apiKey === b?.apiKey && a?.appId === b?.appId;\n\nexport const useWireFeatures = (config?: WireFeaturesConfig): WireFeatures => {\n const stableConfig = useStableValue(config, sameFetchKey);\n const [flags, setFlags] = useState<WireFeatures>(defaultWireFeatures);\n\n const canFetch = !!stableConfig?.serverUrl && !!stableConfig?.apiKey;\n\n useEffect(() => {\n if (!canFetch) {\n // No creds → stay on the all-on defaults (and reset if creds were removed).\n setFlags((prev) => (featuresEqual(prev, defaultWireFeatures) ? prev : defaultWireFeatures));\n return;\n }\n let alive = true;\n // fetchWireFeatures never throws — the .then always runs with a fail-open value.\n void fetchWireFeatures(stableConfig).then((next) => {\n if (!alive) return;\n // Only adopt a NEW reference on a real value change, so a host effect keyed on the\n // returned flags doesn't loop (frequent_rules #11).\n setFlags((prev) => (featuresEqual(prev, next) ? prev : next));\n });\n return () => {\n alive = false;\n };\n }, [canFetch, stableConfig]);\n\n return flags;\n};\n","/**\n * WireFeaturesProvider + useResolvedFeatures — the OPTIONAL one-fetch-serves-all-modules layer.\n *\n * Mount `WireFeaturesProvider` once near your app root with the tenant `config` and it fetches the\n * flags ONCE; every gated surface below it (coachmarks / showcase / reviews) reads the same\n * resolved value from context instead of each fetching its own. It is entirely optional: with no\n * provider, every surface falls back to its own lazy fetch (when given a config) or to the all-on\n * defaults, so modules work with zero setup and a host that never adopts flags is unchanged.\n *\n * NOTE on the built npm subpaths: React context is shared across the kit's subpath entries in the\n * SOURCE-consumption path (the monorepo apps) and in this test suite — one module instance, one\n * context. If you consume the built `wireai-onboarding/*` subpaths as separate bundles, pass the\n * resolved flags (or a `featuresConfig`) to each surface explicitly instead of relying on context.\n */\nimport React, { createContext, useContext, useMemo } from \"react\";\n\nimport { defaultWireFeatures } from \"./defaults\";\nimport { useWireFeatures } from \"./useWireFeatures\";\nimport type { WireFeatures, WireFeaturesConfig } from \"./types\";\n\n/** null = no provider mounted (the signal `useResolvedFeatures` uses to fall back). */\nconst WireFeaturesContext = createContext<WireFeatures | null>(null);\n\nexport interface WireFeaturesProviderProps {\n /** Tenant creds (+ optional storage) to fetch the flags once for the whole tree. */\n config?: WireFeaturesConfig;\n /**\n * Pre-resolved flags to provide directly instead of fetching (e.g. you already have them, or\n * you drive them from your own remote-config). Takes precedence over `config`.\n */\n flags?: WireFeatures;\n children: React.ReactNode;\n}\n\n/**\n * Fetch (or accept) the flags once and broadcast them to descendants. The provider VALUE is\n * memoized (performance rule #6) so a fresh object each render doesn't re-render every consumer.\n */\nexport const WireFeaturesProvider: React.FC<WireFeaturesProviderProps> = ({\n config,\n flags,\n children,\n}) => {\n // Always call the hook (rules of hooks); when `flags` is supplied we pass no config so it\n // never fetches and the explicit flags win below.\n const fetched = useWireFeatures(flags ? undefined : config);\n const value = flags ?? fetched;\n const stable = useMemo(() => value, [value]);\n return <WireFeaturesContext.Provider value={stable}>{children}</WireFeaturesContext.Provider>;\n};\n\nWireFeaturesProvider.displayName = \"WireFeaturesProvider\";\n\n/** Raw context read — `null` when no `WireFeaturesProvider` is mounted above. */\nexport const useWireFeaturesContext = (): WireFeatures | null =>\n useContext(WireFeaturesContext);\n\n/** Options for `useResolvedFeatures`: an explicit override and/or a lazy-fetch config. */\nexport interface ResolveFeaturesOptions {\n /** Explicit flags — win over everything (a surface's own `features` prop). */\n flags?: WireFeatures;\n /** Lazy-fetch config, used ONLY when there is no explicit `flags` and no provider above. */\n config?: WireFeaturesConfig;\n}\n\n/**\n * The resolution every gated surface uses. Precedence:\n * 1. explicit `options.flags` (a surface's own prop) →\n * 2. the nearest `WireFeaturesProvider` (context) →\n * 3. a lazy fetch from `options.config` (serverUrl + apiKey) →\n * 4. the all-on defaults.\n * Always fail-open, always a stable reference for a given value (so it's safe in effect deps).\n */\nexport const useResolvedFeatures = (options?: ResolveFeaturesOptions): WireFeatures => {\n const ctx = useWireFeaturesContext();\n // Only lazily fetch when nothing else provides the flags — otherwise pass no config so the\n // hook stays inert (defaults, no network). The hook is always called (rules of hooks).\n const shouldFetch = !options?.flags && ctx == null;\n const fetched = useWireFeatures(shouldFetch ? options?.config : undefined);\n return options?.flags ?? ctx ?? fetched ?? defaultWireFeatures;\n};\n","/**\n * wireConfigFromEnv — stop re-authoring env gating in every app. Reads the Wire AI\n * tenant key + server URL from the standard Expo public env vars and returns a\n * ready `WireOnboardingConfig`, or `null` when the key/URL are missing (so a host\n * can fall through to a static onboarding without writing the `if (!key)` itself).\n *\n * EXPO_PUBLIC_WIREAI_API_KEY=... (required)\n * EXPO_PUBLIC_WIREAI_SERVER_URL=... (required)\n *\n * const config = wireConfigFromEnv({ appId: \"morrow\" });\n * if (!config) return <StaticOnboarding />;\n * return <WireOnboarding config={config} ... />;\n *\n * `appId` defaults to `EXPO_PUBLIC_WIREAI_APP_ID` (or \"default\"); pass overrides to\n * set `appId`/`metadata` or to substitute the key/URL programmatically.\n */\nimport type { WireOnboardingConfig } from \"../types\";\n\nexport type WireConfigOverrides = Partial<WireOnboardingConfig>;\n\n/**\n * Minimal `process.env` declaration so the kit stays RN-pure (no `@types/node`).\n * In RN/Expo, `process.env.EXPO_PUBLIC_*` is provided/inlined by Metro at build\n * time; we only read string env vars here.\n *\n * IMPORTANT: read each var via STATIC member access (`process.env.EXPO_PUBLIC_FOO`).\n * Expo's `babel-preset-expo` `inline-env-vars` plugin ONLY inlines static\n * `process.env.EXPO_PUBLIC_*` member expressions. Aliasing (`const env = process.env`)\n * or computed access (`process.env[name]`) is left `undefined` in the Metro bundle, so\n * the value reads fine in Jest (Node) but is null on a real device. Do not refactor\n * these to an alias.\n */\ndeclare const process: { env: Record<string, string | undefined> };\n\nexport const wireConfigFromEnv = (\n overrides?: WireConfigOverrides,\n): WireOnboardingConfig | null => {\n const apiKey = overrides?.apiKey ?? process.env.EXPO_PUBLIC_WIREAI_API_KEY;\n const serverUrl = overrides?.serverUrl ?? process.env.EXPO_PUBLIC_WIREAI_SERVER_URL;\n const appId =\n overrides?.appId ?? process.env.EXPO_PUBLIC_WIREAI_APP_ID ?? \"default\";\n\n // Missing transport → null, so the host gates on one falsy check.\n if (!apiKey || !serverUrl) return null;\n\n return {\n apiKey,\n serverUrl,\n appId,\n ...(overrides?.metadata ? { metadata: overrides.metadata } : {}),\n };\n};\n","/**\n * isOnboardingEnabled — the ONE standard gate for AI onboarding, so every app stops\n * re-authoring `flag && hasConfig` (one app had `isAiOnboardingEnabled`, another had\n * `isWireBackendConfigured` — same idea, two shapes).\n *\n * The gate is **transport presence**: `wireConfigFromEnv()` is non-null (the key + URL are\n * set), and that is it. There is no separate on/off env flag — a missing key already means\n * \"off\", so a second `EXPO_PUBLIC_AI_ONBOARDING_ENABLED` flag was redundant (and, read via\n * computed access, it didn't even inline on device). An optional `remote` kill-switch lets an\n * app turn it off without a release; the kit stays dependency-free (the app owns the remote\n * read and hands us the boolean).\n *\n * Enabled ⇔ transport present AND `(remote ?? true)`.\n *\n * if (!isOnboardingEnabled()) return goToStaticOnboarding();\n * // or, with a remote kill-switch the app already read:\n * if (!isOnboardingEnabled({ remote: remoteKillSwitchOn })) return goToStaticOnboarding();\n */\nimport { wireConfigFromEnv } from \"./wireConfigFromEnv\";\nimport type { WireConfigOverrides } from \"./wireConfigFromEnv\";\n\nexport type OnboardingFlagOptions = {\n /**\n * Optional remote kill-switch the app already read (Firebase/LD/etc.). When `false`, it\n * disables onboarding even though transport is present. Omit (or `true`) to leave it on.\n */\n remote?: boolean;\n /**\n * Config overrides forwarded to `wireConfigFromEnv` for the transport-present check\n * (e.g. a programmatic `apiKey`/`serverUrl`). Usually omitted.\n */\n config?: WireConfigOverrides;\n};\n\nexport const isOnboardingEnabled = (opts?: OnboardingFlagOptions): boolean => {\n const transportPresent = wireConfigFromEnv(opts?.config) !== null;\n if (!transportPresent) return false;\n return opts?.remote ?? true;\n};\n","/**\n * Canonical analytics names for the onboarding funnel. The kit already emits a typed\n * `OnboardingEvent` (`started | turn | error | retry | fallback`) — but one app logged them as\n * `onboarding_*` and another as `AI_ONBOARDING_*`, so the same funnel reads differently per app.\n * This maps the kit event to ONE canonical `wire_onboarding_*` name + params, and the app logs\n * it through whatever transport it already has (Firebase, Amplitude, console). The app still\n * owns the logger; only the NAMES are standardized.\n *\n * <WireOnboarding\n * onEvent={(e) => { const a = toAnalyticsEvent(e); logEvent(a.name, a.params); }}\n * onComplete={(r) => { logEvent(WIRE_ONBOARDING_EVENTS.completed, { answers: Object.keys(r.answers).length }); persist(r); }}\n * />\n *\n * `completed` has no kit `OnboardingEvent` (the kit signals completion via `onComplete`, not\n * `onEvent`) — the app logs it explicitly on `onComplete` using the constant below, so the\n * funnel name stays canonical.\n */\nimport type { OnboardingEvent } from \"../types\";\n\nexport const WIRE_ONBOARDING_EVENTS = {\n started: \"wire_onboarding_started\",\n /** A persisted session was restored after an app kill (fires instead of `started`). */\n resumed: \"wire_onboarding_resumed\",\n turn: \"wire_onboarding_turn\",\n error: \"wire_onboarding_error\",\n retry: \"wire_onboarding_retry\",\n fallback: \"wire_onboarding_fallback\",\n /** Logged by the host on `onComplete` (no matching kit `OnboardingEvent`). */\n completed: \"wire_onboarding_completed\",\n} as const;\n\nexport type WireOnboardingEventName =\n (typeof WIRE_ONBOARDING_EVENTS)[keyof typeof WIRE_ONBOARDING_EVENTS];\n\nexport type AnalyticsEvent = {\n name: WireOnboardingEventName;\n params?: Record<string, unknown>;\n};\n\n/**\n * Map a kit `OnboardingEvent` to its canonical `{ name, params }`. Exhaustive over the union\n * (the `never` default makes a new event type a compile error here — intentional).\n */\nexport const toAnalyticsEvent = (event: OnboardingEvent): AnalyticsEvent => {\n switch (event.type) {\n case \"started\":\n return { name: WIRE_ONBOARDING_EVENTS.started };\n case \"resumed\":\n return { name: WIRE_ONBOARDING_EVENTS.resumed };\n case \"turn\":\n return {\n name: WIRE_ONBOARDING_EVENTS.turn,\n params: { step: event.step, component: event.component },\n };\n case \"error\":\n return { name: WIRE_ONBOARDING_EVENTS.error, params: { reason: event.reason } };\n case \"retry\":\n return {\n name: WIRE_ONBOARDING_EVENTS.retry,\n params: { reason: event.reason, attempt: event.attempt },\n };\n case \"fallback\":\n return { name: WIRE_ONBOARDING_EVENTS.fallback, params: { reason: event.reason } };\n default: {\n const _exhaustive: never = event;\n return _exhaustive;\n }\n }\n};\n","/**\n * attribution — forward install/ad attribution to the onboarding agent so it can tailor the\n * first question by acquisition source (e.g. a paid-campaign install vs an organic one). The\n * channel already exists: `WireOnboardingConfig.metadata` is merged into every A2A request by\n * `WireOnboarding`. No production app populated it before; this gives every app a standard shape.\n *\n * The app reads its raw attribution (AppsFlyer / Branch / deferred deep link — an app concern,\n * not the kit's) and passes the normalized result as `metadata`:\n *\n * const config = wireConfigFromEnv({\n * appId: \"morrow-self\",\n * metadata: attributionMetadata({ source: conv.mediaSource, campaign: conv.campaign, isOrganic: conv.isOrganic }),\n * });\n *\n * The backend sees `metadata.attribution = { source, campaign, ... }`.\n */\n\n/** Normalized acquisition attribution. All fields optional — pass what the SDK gives you. */\nexport type OnboardingAttribution = {\n /** Media source / network, e.g. \"appsflyer\", \"branch\", \"organic\". */\n source?: string;\n campaign?: string;\n adset?: string;\n ad?: string;\n /** Deferred deep-link slug / path that routed the install. */\n deepLink?: string;\n isFirstLaunch?: boolean;\n isOrganic?: boolean;\n /** Escape hatch for SDK-specific fields not covered above. */\n raw?: Record<string, unknown>;\n};\n\n/**\n * Wrap attribution into the `{ attribution: {...} }` metadata the agent reads. Drops `undefined`\n * fields so the request payload stays compact. Returns `{ attribution: {} }` for empty input\n * (still a valid, harmless metadata object).\n */\nexport const attributionMetadata = (\n a: OnboardingAttribution,\n): { attribution: Record<string, unknown> } => {\n const attribution: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(a)) {\n if (value !== undefined) attribution[key] = value;\n }\n return { attribution };\n};\n","/**\n * reportSessionStart — the ONE standard emitter for \"the user opened the app again\".\n *\n * Every app-open posts a single `app.session_started` event to the Wire analytics backend\n * (`POST {serverUrl}/v1/events`). That event does two jobs at once, with ZERO server changes:\n *\n * 1. SESSION MAPPING. It carries the host's opaque `userId` + a stable `deviceKey`, so the\n * backend can group a user's (or a pre-auth device's) opens over time — \"when did this\n * user last use the app, and how many times\". The device_key links the pre-auth opens to\n * the user once `userId` arrives (here or via `identifyOnboarding`).\n * 2. QUESTIONNAIRE / RETENTION FIRING. It flows into the SAME event stream the server's\n * decision engines read, so a questionnaire trigger `{event:\"app.session_started\", min_count:N}`\n * (matched within a session) or a questionnaire `min_sessions:N` (distinct device sessions)\n * fires on the user's Nth open with no new server endpoint.\n *\n * WIRE CONTRACT (server: analytics/events.py + routers/onboarding.py `POST /v1/events`):\n * The event is stored as `event_type='app_event'`, `question_key='app.session_started'` — the\n * generic app.* namespace the reviews wave shipped. The server's `_event_name(ev)` returns the\n * `question_key` for an `app_event`, which is what a trigger's `event` string matches. We do NOT\n * send `event_type:'app.session_started'` — that name is not in the server's EVENT_TYPES and\n * would be rejected. `device_key` rides in the non-PII `user_context` bucket, where the server's\n * `_event_device_key(ev)` reads it to group a device's sessions. `app_id` + `environment` are\n * filled server-side from the resolving key (never sent here).\n *\n * SESSION ID DISTINCTION (important): the `session_id` on this event is a PER-OPEN id (a fresh\n * `makeSessionId()` each app-open) — it is NOT the onboarding A2A `contextId`. Onboarding runs\n * ONCE (first launch) and owns its own context id; session-start fires on EVERY open, so it needs\n * its own per-open id. Grouping over time is done by `device_key`/`user_id`, not by session_id.\n *\n * Fire-and-forget: like every analytics path in the kit, this never throws into the UI, never\n * awaits, and swallows a missing target / bad URL / missing fetch / network error. Analytics must\n * never be able to break the app.\n */\nimport { makeSessionId, type ClientEventTarget } from \"../analytics/reportClientEvent\";\nimport type { DeviceContext } from \"../device/deviceContext\";\nimport { sanitizeUserId } from \"../identity/userIdentity\";\n\n/** The canonical event name for an app-open. A trigger keys off this exact string. */\nexport const SESSION_STARTED_EVENT = \"app.session_started\" as const;\n\n/** Options for {@link reportSessionStart}. Everything except `target` is optional so a pre-auth\n * open (no user yet) is a valid, device-only session. */\nexport interface ReportSessionStartOptions {\n /** Where to POST — the tenant transport (`serverUrl` + `apiKey`), same as `WireOnboardingConfig`. */\n target: ClientEventTarget | undefined;\n /**\n * The per-open session id. Defaults to a fresh `makeSessionId()`. Pass your own ONLY to\n * dedupe re-renders of the same open (the {@link useSessionStart} hook does exactly that).\n * This is NOT the onboarding contextId — see the file header.\n */\n sessionId?: string;\n /** The host's OPAQUE pseudonymous user id (their internal id, NOT an email/PII). Sanitized +\n * capped here; omitted on a pre-auth open (device-only session). */\n userId?: string;\n /** A stable, non-PII device id the host owns. Rides in `user_context.device_key` so the server\n * groups this device's sessions (the min_sessions signal). Host-supplied, same as reviews. */\n deviceKey?: string;\n /** The host's own local open-counter value for this open (1 on the first ever open). Drives the\n * `returning` flag and lets analytics read \"Nth session\" without server-side counting. */\n sessionCount?: number;\n /** Host app version (e.g. \"1.4.2\"), if cheaply available. Segments retention by release. */\n appVersion?: string;\n /** Platform string (e.g. \"ios\"), if cheaply available. */\n platform?: string;\n /** An optional richer device snapshot (from `collectDeviceContext()`); the hook fills this. */\n device?: DeviceContext;\n /** Small non-PII extras, stored as a JSON string in the event `meta`. */\n meta?: Record<string, unknown>;\n /** Set `false` to bypass the once-per-open guard (default on). See {@link resetSessionStartGuard}. */\n once?: boolean;\n}\n\n// ── Once-per-open guard ──────────────────────────────────────────────────────\n// A re-render (or a host that lists the emitter in an effect) must never double-fire the SAME\n// open. We remember the session ids already emitted; a repeat call with a seen id is a no-op.\n// Bounded so a long-lived app never grows this unboundedly — a fresh open always mints a fresh\n// id, so evicting old ids can never cause a real re-fire.\nconst _emitted = new Set<string>();\nconst _GUARD_MAX = 128;\n\n/** Test-only: forget every emitted session id so a unit test starts from a clean guard. */\nexport const resetSessionStartGuard = (): void => {\n _emitted.clear();\n};\n\n/**\n * Emit one `app.session_started` event for this app-open. Fire-and-forget; returns immediately.\n * Idempotent per `sessionId` (unless `once:false`) so a re-render can never double-fire.\n */\nexport const reportSessionStart = (opts: ReportSessionStartOptions): void => {\n const target = opts.target;\n if (!target?.serverUrl) return;\n\n const sessionId = opts.sessionId ?? makeSessionId();\n\n // Once-per-open guard: skip a repeat emit for a session id we already sent.\n if (opts.once !== false) {\n if (_emitted.has(sessionId)) return;\n if (_emitted.size >= _GUARD_MAX) {\n // Evict the oldest insertion (Set preserves insertion order).\n const oldest = _emitted.values().next().value;\n if (oldest !== undefined) _emitted.delete(oldest);\n }\n _emitted.add(sessionId);\n }\n\n try {\n const url = `${target.serverUrl.replace(/\\/$/, \"\")}/v1/events`;\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (target.apiKey) headers.Authorization = `Bearer ${target.apiKey}`;\n\n // Non-PII correlation bucket. device_key is read by the server to group a device's sessions;\n // session_count / returning / app_version / platform feed per-user retention analytics.\n const userContext: Record<string, string | number | boolean> = {};\n if (opts.deviceKey) userContext.device_key = opts.deviceKey;\n if (typeof opts.sessionCount === \"number\" && Number.isFinite(opts.sessionCount)) {\n userContext.session_count = opts.sessionCount;\n userContext.returning = opts.sessionCount > 1;\n }\n if (opts.appVersion) userContext.app_version = opts.appVersion;\n if (opts.platform) userContext.platform = opts.platform;\n\n const event: Record<string, unknown> = {\n event_type: \"app_event\",\n question_key: SESSION_STARTED_EVENT,\n session_id: sessionId,\n };\n const userId = sanitizeUserId(opts.userId);\n if (userId) event.user_id = userId;\n if (Object.keys(userContext).length > 0) event.user_context = userContext;\n if (opts.device) event.device = opts.device;\n if (opts.meta && Object.keys(opts.meta).length > 0) event.meta = JSON.stringify(opts.meta);\n\n void fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ events: [event] }),\n }).catch(() => {\n // Network/transport error — analytics is best-effort, swallow.\n });\n } catch {\n // URL construction, JSON serialization, or a missing fetch — swallow.\n }\n};\n","/**\n * useSessionStart — the optional convenience hook that fires {@link reportSessionStart} for you.\n *\n * Two firing moments, mirroring the Myelino/Morrow session-counter semantics:\n * • ON MOUNT — the app opened (cold start or the provider first rendered).\n * • ON FOREGROUND after a real background — when AppState returns to `active` having been\n * backgrounded for at least {@link BACKGROUND_SESSION_MS} (30 min), that's a NEW open, so a\n * fresh session fires. A quick app-switch (under the threshold) does NOT count as a new open.\n *\n * Each firing mints its OWN per-open `session_id` (held in a ref so a re-render never re-fires),\n * so grouping over time is by `deviceKey`/`userId`, never by session_id (see reportSessionStart).\n *\n * The hook is OPTIONAL. A host that already owns a session counter (Myelino/Morrow do) can skip\n * the hook and call `reportSessionStart(...)` directly from its own \"app opened\" path — BOTH\n * paths are first-class. This hook is the batteries-included option for a host that has none.\n *\n * Dependency policy: `AppState` + `Platform` are React Native built-ins (no new dep); the device\n * snapshot comes from the kit's own dependency-free `collectDeviceContext()`.\n */\nimport { useEffect, useRef } from \"react\";\nimport { AppState, Platform, type AppStateStatus } from \"react-native\";\n\nimport type { ClientEventTarget } from \"../analytics/reportClientEvent\";\nimport { collectDeviceContext } from \"../device/deviceContext\";\nimport { reportSessionStart } from \"./reportSessionStart\";\n\n/** A foreground after at least this long in the background counts as a NEW app-open (30 min). */\nexport const BACKGROUND_SESSION_MS = 30 * 60 * 1000;\n\n/** Tenant transport + optional host app version. Same creds as `WireOnboardingConfig`. */\nexport interface SessionStartConfig {\n /** Base server URL (same as `WireOnboardingConfig.serverUrl`); `/v1/events` is appended. */\n serverUrl?: string;\n /** Tenant API key; sent as `Authorization: Bearer`. */\n apiKey?: string;\n /** Host app version (e.g. \"1.4.2\"), forwarded for release segmentation. Optional. */\n appVersion?: string;\n}\n\n/** Per-open identity the host supplies. All optional: a pre-auth open is device-only. */\nexport interface UseSessionStartOptions {\n /** The host's opaque pseudonymous user id (NOT PII). Omitted before the user authenticates. */\n userId?: string;\n /** The host's local open-counter value for this open. Drives `returning` + \"Nth session\". */\n sessionCount?: number;\n /** A stable, non-PII device id the host owns. Groups this device's sessions server-side. */\n deviceKey?: string;\n /** Small non-PII extras forwarded on the event `meta`. */\n meta?: Record<string, unknown>;\n /** Set `false` to disable firing (e.g. behind a consent gate). Default enabled. */\n enabled?: boolean;\n}\n\n/**\n * Fire `app.session_started` on mount and on every real foreground-after-background. Returns\n * nothing — it is a side-effecting hook. Safe to call with inline options (values are read\n * through a ref, so changing `userId`/`sessionCount` never re-fires a session).\n */\nexport const useSessionStart = (\n config: SessionStartConfig | undefined,\n options: UseSessionStartOptions = {},\n): void => {\n // Latest options/config through a ref so the mount/resume fires read fresh values without\n // listing them as effect deps (which would re-fire a session on every prop change).\n const latest = useRef({ config, options });\n latest.current = { config, options };\n\n useEffect(() => {\n const fire = () => {\n const { config: cfg, options: opts } = latest.current;\n if (!cfg?.serverUrl) return;\n if (opts.enabled === false) return;\n const target: ClientEventTarget = { serverUrl: cfg.serverUrl, apiKey: cfg.apiKey ?? \"\" };\n const device = collectDeviceContext();\n if (cfg.appVersion && !device.appVersion) device.appVersion = cfg.appVersion;\n reportSessionStart({\n target,\n // A fresh per-open id each fire; the emitter's once-guard dedupes within the open.\n userId: opts.userId,\n deviceKey: opts.deviceKey,\n sessionCount: opts.sessionCount,\n appVersion: cfg.appVersion ?? device.appVersion,\n platform: Platform.OS,\n device,\n meta: opts.meta,\n });\n };\n\n // 1) Mount = an app-open.\n fire();\n\n // 2) Foreground after a real background = a new app-open.\n let backgroundedAt: number | null = null;\n const onChange = (state: AppStateStatus) => {\n if (state === \"background\" || state === \"inactive\") {\n // Record the first moment we left the foreground (don't overwrite inactive→background).\n if (backgroundedAt == null) backgroundedAt = Date.now();\n return;\n }\n if (state === \"active\") {\n const since = backgroundedAt;\n backgroundedAt = null;\n if (since != null && Date.now() - since >= BACKGROUND_SESSION_MS) fire();\n }\n };\n const sub = AppState.addEventListener(\"change\", onChange);\n return () => {\n // RN >= 0.65 returns a subscription with remove(); guard for older shims.\n if (sub && typeof (sub as { remove?: () => void }).remove === \"function\") sub.remove();\n };\n // Mount-only effect: firing reads fresh values via `latest`, so no reactive deps.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n};\n"]}