@uptrademedia/site-kit 1.0.14 → 1.0.16

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.
File without changes
@@ -1,4 +1,4 @@
1
- import { F as FormSubmission, M as ManagedFormConfig, a as FormField$2, b as ManagedFormProps, c as FormRenderProps } from '../types-lFLKKn0G.mjs';
1
+ import { F as FormSubmission, M as ManagedFormConfig, a as FormField$2, b as ManagedFormProps, c as FormRenderProps } from '../types-B77UG-p-.mjs';
2
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
3
3
  import React__default from 'react';
4
4
 
@@ -1,4 +1,4 @@
1
- import { F as FormSubmission, M as ManagedFormConfig, a as FormField$2, b as ManagedFormProps, c as FormRenderProps } from '../types-lFLKKn0G.js';
1
+ import { F as FormSubmission, M as ManagedFormConfig, a as FormField$2, b as ManagedFormProps, c as FormRenderProps } from '../types-B77UG-p-.js';
2
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
3
3
  import React__default from 'react';
4
4
 
@@ -471,7 +471,26 @@ function useForm(formIdOrSlug, options = {}) {
471
471
  reset
472
472
  };
473
473
  }
474
+ function normalizeOptions(options) {
475
+ if (!options) return [];
476
+ if (Array.isArray(options)) {
477
+ return options.map((opt) => {
478
+ if (typeof opt === "string") return { value: opt, label: opt };
479
+ if (typeof opt === "object" && opt !== null && "value" in opt && "label" in opt) return opt;
480
+ if (typeof opt === "object" && opt !== null && "label" in opt) return { value: opt.label, label: opt.label };
481
+ return { value: String(opt), label: String(opt) };
482
+ });
483
+ }
484
+ if (typeof options === "object" && options !== null) {
485
+ const obj = options;
486
+ if (Array.isArray(obj.choices)) return normalizeOptions(obj.choices);
487
+ if (Array.isArray(obj.items)) return normalizeOptions(obj.items);
488
+ if (Array.isArray(obj.options)) return normalizeOptions(obj.options);
489
+ }
490
+ return [];
491
+ }
474
492
  function FormField({ field: field2, value, error, onChange, classPrefix = "uptrade-form" }) {
493
+ const options = normalizeOptions(field2.options);
475
494
  const baseInputStyle = {
476
495
  width: "100%",
477
496
  padding: "var(--uptrade-input-padding, 10px 12px)",
@@ -498,8 +517,8 @@ function FormField({ field: field2, value, error, onChange, classPrefix = "uptra
498
517
  fontSize: 14,
499
518
  marginTop: 4
500
519
  };
501
- if (field2.field_type === "heading") {
502
- return /* @__PURE__ */ jsxRuntime.jsx("h3", { className: `${classPrefix}__heading`, style: { margin: "16px 0 8px" }, children: field2.label });
520
+ if (field2.field_type === "heading" || field2.field_type === "section_header") {
521
+ return /* @__PURE__ */ jsxRuntime.jsx("h3", { className: `${classPrefix}__heading`, style: { margin: "16px 0 8px", fontWeight: 600, fontSize: 18 }, children: field2.label });
503
522
  }
504
523
  if (field2.field_type === "paragraph") {
505
524
  return /* @__PURE__ */ jsxRuntime.jsx("p", { className: `${classPrefix}__paragraph`, style: { color: "var(--uptrade-help-color, #6b7280)", margin: "8px 0" }, children: field2.help_text || field2.label });
@@ -512,11 +531,11 @@ function FormField({ field: field2, value, error, onChange, classPrefix = "uptra
512
531
  field2.label,
513
532
  field2.is_required && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "var(--uptrade-error-color, #ef4444)" }, children: " *" })
514
533
  ] }),
515
- ["text", "email", "phone", "number"].includes(field2.field_type) && /* @__PURE__ */ jsxRuntime.jsx(
534
+ ["text", "email", "phone", "tel", "number"].includes(field2.field_type) && /* @__PURE__ */ jsxRuntime.jsx(
516
535
  "input",
517
536
  {
518
537
  className: `${classPrefix}__input`,
519
- type: field2.field_type === "phone" ? "tel" : field2.field_type,
538
+ type: field2.field_type === "phone" || field2.field_type === "tel" ? "tel" : field2.field_type,
520
539
  name: field2.slug,
521
540
  value: String(value || ""),
522
541
  placeholder: field2.placeholder,
@@ -549,7 +568,7 @@ function FormField({ field: field2, value, error, onChange, classPrefix = "uptra
549
568
  style: baseInputStyle,
550
569
  children: [
551
570
  /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", children: field2.placeholder || "Select an option" }),
552
- field2.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: option.value, children: option.label }, option.value))
571
+ options.map((option) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: option.value, children: option.label }, option.value))
553
572
  ]
554
573
  }
555
574
  ),
@@ -566,10 +585,10 @@ function FormField({ field: field2, value, error, onChange, classPrefix = "uptra
566
585
  onChange(selected);
567
586
  },
568
587
  style: { ...baseInputStyle, height: 120 },
569
- children: field2.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: option.value, children: option.label }, option.value))
588
+ children: options.map((option) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: option.value, children: option.label }, option.value))
570
589
  }
571
590
  ),
572
- field2.field_type === "radio" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${classPrefix}__radio-group`, style: { display: "flex", flexDirection: "column", gap: 8 }, children: field2.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsxs("label", { className: `${classPrefix}__radio-option`, style: { display: "flex", alignItems: "center", gap: 8 }, children: [
591
+ field2.field_type === "radio" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${classPrefix}__radio-group`, style: { display: "flex", flexDirection: "column", gap: 8 }, children: options.map((option) => /* @__PURE__ */ jsxRuntime.jsxs("label", { className: `${classPrefix}__radio-option`, style: { display: "flex", alignItems: "center", gap: 8 }, children: [
573
592
  /* @__PURE__ */ jsxRuntime.jsx(
574
593
  "input",
575
594
  {
@@ -582,7 +601,7 @@ function FormField({ field: field2, value, error, onChange, classPrefix = "uptra
582
601
  ),
583
602
  option.label
584
603
  ] }, option.value)) }),
585
- field2.field_type === "checkbox" && (!field2.options || field2.options.length === 0) && /* @__PURE__ */ jsxRuntime.jsxs("label", { className: `${classPrefix}__checkbox`, style: { display: "flex", alignItems: "center", gap: 8 }, children: [
604
+ field2.field_type === "checkbox" && options.length === 0 && /* @__PURE__ */ jsxRuntime.jsxs("label", { className: `${classPrefix}__checkbox`, style: { display: "flex", alignItems: "center", gap: 8 }, children: [
586
605
  /* @__PURE__ */ jsxRuntime.jsx(
587
606
  "input",
588
607
  {
@@ -594,7 +613,7 @@ function FormField({ field: field2, value, error, onChange, classPrefix = "uptra
594
613
  ),
595
614
  field2.help_text || field2.label
596
615
  ] }),
597
- field2.field_type === "checkbox" && field2.options && field2.options.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${classPrefix}__checkbox-group`, style: { display: "flex", flexDirection: "column", gap: 8 }, children: field2.options.map((option) => {
616
+ field2.field_type === "checkbox" && options.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${classPrefix}__checkbox-group`, style: { display: "flex", flexDirection: "column", gap: 8 }, children: options.map((option) => {
598
617
  const selectedValues = Array.isArray(value) ? value : [];
599
618
  const isChecked = selectedValues.includes(option.value);
600
619
  return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: `${classPrefix}__checkbox-option`, style: { display: "flex", alignItems: "center", gap: 8 }, children: [
@@ -754,6 +773,7 @@ function FormClient({
754
773
  }, [values]);
755
774
  const validateField = react.useCallback((field2) => {
756
775
  if (!isFieldVisible(field2)) return null;
776
+ if (["heading", "section_header", "paragraph", "hidden"].includes(field2.field_type)) return null;
757
777
  const value = values[field2.slug];
758
778
  const rules = field2.validation || {};
759
779
  if (field2.is_required && (!value || value === "")) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/forms/useFormTracking.ts","../../src/forms/useForm.ts","../../src/forms/FormField.tsx","../../src/forms/FormClient.tsx","../../src/forms/ManagedForm.tsx"],"names":["useRef","useEffect","useCallback","useState","field","useMemo","jsx","jsxs","getUTMParams","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @uptrade/site-kit/forms - Form Tracking Hook\n * \n * Tracks form analytics including step progress and abandonment\n */\n\n'use client'\n\nimport { useEffect, useRef, useCallback } from 'react'\n\ninterface UseFormTrackingOptions {\n formId: string\n totalSteps: number\n enabled?: boolean\n debug?: boolean\n}\n\ninterface FormTrackingReturn {\n trackStepChange: (step: number) => void\n trackComplete: () => void\n sessionId: string\n}\n\nexport function useFormTracking({\n formId,\n totalSteps,\n enabled = true,\n debug = false,\n}: UseFormTrackingOptions): FormTrackingReturn {\n const sessionIdRef = useRef<string>('')\n const startTimeRef = useRef<number>(0)\n const stepStartTimeRef = useRef<number>(0)\n const stepTimesRef = useRef<Record<number, number>>({})\n const currentStepRef = useRef<number>(1)\n const maxStepRef = useRef<number>(1)\n const analyticsIdRef = useRef<string | null>(null)\n \n // Initialize tracking\n useEffect(() => {\n if (!enabled) return\n if (!formId) {\n if (debug) console.warn('[Forms] Tracking skipped: formId is empty')\n return\n }\n \n // Generate session ID\n sessionIdRef.current = crypto.randomUUID()\n startTimeRef.current = Date.now()\n stepStartTimeRef.current = Date.now()\n \n // Record form start\n const startTracking = async () => {\n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (!apiUrl || !apiKey) {\n if (debug) console.error('[Forms] Missing API URL or API key')\n return\n }\n \n try {\n const response = await fetch(`${apiUrl}/api/public/forms/analytics/start`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({\n formId,\n sessionId: sessionIdRef.current,\n deviceType: getDeviceType(),\n }),\n })\n \n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n \n const data = await response.json()\n analyticsIdRef.current = data.id\n if (debug) console.log('[Forms] Started tracking:', data.id)\n } catch (error) {\n if (debug) console.error('[Forms] Error starting tracking:', error)\n }\n }\n \n startTracking()\n \n // Handle abandonment on page leave\n const handleBeforeUnload = () => {\n if (!analyticsIdRef.current) return\n \n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (!apiUrl || !apiKey) return\n \n const now = Date.now()\n const currentStepTime = Math.floor((now - stepStartTimeRef.current) / 1000)\n stepTimesRef.current[currentStepRef.current] = currentStepTime\n \n // Use sendBeacon for reliable delivery during page unload\n const payload = JSON.stringify({\n analyticsId: analyticsIdRef.current,\n step: currentStepRef.current,\n maxStep: maxStepRef.current,\n stepTimes: stepTimesRef.current,\n totalTimeSeconds: Math.floor((now - startTimeRef.current) / 1000),\n })\n \n const blob = new Blob([payload], { type: 'application/json' })\n // Note: sendBeacon doesn't support custom headers, API key included in URL\n const _headers = new Headers({\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n })\n \n // Try sendBeacon first (more reliable during unload)\n const sent = navigator.sendBeacon(\n `${apiUrl}/api/public/forms/analytics/abandon`,\n blob\n )\n \n if (debug) console.log('[Forms] Abandonment tracked:', sent ? 'success' : 'failed')\n }\n \n window.addEventListener('beforeunload', handleBeforeUnload)\n \n return () => {\n window.removeEventListener('beforeunload', handleBeforeUnload)\n }\n }, [formId, enabled, debug])\n \n // Track step changes\n const trackStepChange = useCallback(async (step: number) => {\n if (!enabled || !analyticsIdRef.current) return\n \n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (!apiUrl || !apiKey) {\n if (debug) console.error('[Forms] Missing API URL or API key')\n return\n }\n \n const now = Date.now()\n \n // Record time spent on previous step\n const prevStepTime = Math.floor((now - stepStartTimeRef.current) / 1000)\n stepTimesRef.current[currentStepRef.current] = prevStepTime\n \n // Update refs\n currentStepRef.current = step\n maxStepRef.current = Math.max(maxStepRef.current, step)\n stepStartTimeRef.current = now\n \n // Update database\n try {\n const response = await fetch(`${apiUrl}/api/public/forms/analytics/step`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({\n analyticsId: analyticsIdRef.current,\n step,\n maxStep: maxStepRef.current,\n stepTimes: stepTimesRef.current,\n }),\n })\n \n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n \n if (debug) console.log('[Forms] Step changed to:', step)\n } catch (error) {\n if (debug) console.error('[Forms] Error updating step:', error)\n }\n }, [enabled, debug])\n \n // Track completion\n const trackComplete = useCallback(async () => {\n if (!enabled || !analyticsIdRef.current) return\n \n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (!apiUrl || !apiKey) {\n if (debug) console.error('[Forms] Missing API URL or API key')\n return\n }\n \n const now = Date.now()\n \n // Record time for final step\n const finalStepTime = Math.floor((now - stepStartTimeRef.current) / 1000)\n stepTimesRef.current[currentStepRef.current] = finalStepTime\n \n try {\n // Complete form analytics tracking\n // Note: A database trigger will automatically log this as a conversion\n // in analytics_conversions when completed_at is set\n const response = await fetch(`${apiUrl}/api/public/forms/analytics/complete`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({\n analyticsId: analyticsIdRef.current,\n totalSteps,\n stepTimes: stepTimesRef.current,\n totalTimeSeconds: Math.floor((now - startTimeRef.current) / 1000),\n }),\n })\n \n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n \n if (debug) console.log('[Forms] Form completed (conversion auto-logged via trigger)')\n } catch (error) {\n if (debug) console.error('[Forms] Error completing tracking:', error)\n }\n }, [enabled, totalSteps, formId, debug])\n \n return {\n trackStepChange,\n trackComplete,\n sessionId: sessionIdRef.current,\n }\n}\n\n// Helper\nfunction getDeviceType(): 'desktop' | 'mobile' | 'tablet' {\n if (typeof window === 'undefined') return 'desktop'\n const ua = navigator.userAgent\n if (/tablet|ipad|playbook|silk/i.test(ua)) return 'tablet'\n if (/mobile|iphone|ipod|android|blackberry|opera mini|iemobile/i.test(ua)) return 'mobile'\n return 'desktop'\n}\n\n","/**\n * @uptrade/site-kit/forms - useForm Hook\n * \n * Headless hook for complete control over form rendering.\n * Fetches form config from API, handles validation, state, and submission.\n * \n * @example\n * ```tsx\n * const { form, fields, values, errors, setFieldValue, submit, isSubmitting } = useForm('contact-form')\n * \n * return (\n * <form onSubmit={(e) => { e.preventDefault(); submit() }}>\n * {fields.map(field => (\n * <MyCustomInput\n * key={field.slug}\n * label={field.label}\n * value={values[field.slug]}\n * error={errors[field.slug]}\n * onChange={(val) => setFieldValue(field.slug, val)}\n * />\n * ))}\n * <button type=\"submit\" disabled={isSubmitting}>Submit</button>\n * </form>\n * )\n * ```\n */\n\n'use client'\n\nimport { useState, useEffect, useCallback, useMemo } from 'react'\nimport { useFormTracking } from './useFormTracking'\nimport type { \n ManagedFormConfig, \n FormField, \n FormSubmission \n} from './types'\n\n// ============================================\n// Types\n// ============================================\n\nexport interface UseFormOptions {\n /** Project ID (defaults to SiteKitProvider config) */\n projectId?: string\n /** Callback when form submits successfully */\n onSuccess?: (submission: FormSubmission) => void\n /** Callback when submission fails */\n onError?: (error: Error) => void\n /** Initial values to prefill */\n initialValues?: Record<string, unknown>\n /** Auto-redirect after success (override form config) */\n redirectUrl?: string | false\n}\n\nexport interface UseFormReturn {\n /** Form configuration (null while loading) */\n form: ManagedFormConfig | null\n /** Loading state */\n isLoading: boolean\n /** Error fetching form */\n fetchError: Error | null\n \n /** All form fields */\n allFields: FormField[]\n /** Fields for current step (multi-step) or all fields (single step) */\n fields: FormField[]\n /** Visible fields only (respecting conditional logic) */\n visibleFields: FormField[]\n \n /** Current form values */\n values: Record<string, unknown>\n /** Current validation errors */\n errors: Record<string, string>\n \n /** Set a single field value */\n setFieldValue: (key: string, value: unknown) => void\n /** Set multiple field values at once */\n setValues: (values: Record<string, unknown>) => void\n /** Clear all errors */\n clearErrors: () => void\n \n /** Multi-step state */\n step: number\n totalSteps: number\n isMultiStep: boolean\n progress: number\n \n /** Multi-step navigation */\n nextStep: () => boolean\n prevStep: () => void\n goToStep: (step: number) => void\n canGoNext: boolean\n canGoPrev: boolean\n isLastStep: boolean\n \n /** Validate current step */\n validate: () => boolean\n /** Validate a single field */\n validateField: (field: FormField) => string | null\n /** Check if a field is visible (conditional logic) */\n isFieldVisible: (field: FormField) => boolean\n \n /** Submit the form */\n submit: () => Promise<void>\n /** Submission state */\n isSubmitting: boolean\n isComplete: boolean\n /** Reset form to initial state */\n reset: () => void\n}\n\n// ============================================\n// Helper: Get UTM params\n// ============================================\n\nfunction getUTMParams() {\n if (typeof window === 'undefined') return {}\n \n const params = new URLSearchParams(window.location.search)\n return {\n utm_source: params.get('utm_source'),\n utm_medium: params.get('utm_medium'),\n utm_campaign: params.get('utm_campaign'),\n utm_term: params.get('utm_term'),\n utm_content: params.get('utm_content'),\n }\n}\n\n// ============================================\n// Hook\n// ============================================\n\nexport function useForm(\n formIdOrSlug: string,\n options: UseFormOptions = {}\n): UseFormReturn {\n const { \n projectId: optionsProjectId,\n onSuccess, \n onError, \n initialValues = {},\n redirectUrl,\n } = options\n \n // Get projectId from window globals if not provided\n const projectId = optionsProjectId || \n (typeof window !== 'undefined' ? (window as any).__SITE_KIT_PROJECT_ID__ : undefined)\n \n // State\n const [form, setForm] = useState<ManagedFormConfig | null>(null)\n const [isLoading, setIsLoading] = useState(true)\n const [fetchError, setFetchError] = useState<Error | null>(null)\n const [values, setValuesState] = useState<Record<string, unknown>>(initialValues)\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [step, setStep] = useState(1)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [isComplete, setIsComplete] = useState(false)\n \n const totalSteps = form?.total_steps || 1\n const isMultiStep = (form?.is_multi_step) || false\n \n const { trackStepChange, trackComplete } = useFormTracking({\n formId: form?.id || '',\n totalSteps,\n })\n \n // Fetch form config\n useEffect(() => {\n if (!projectId) {\n setFetchError(new Error('projectId is required. Provide it via SiteKitProvider or useForm options.'))\n setIsLoading(false)\n return\n }\n \n async function fetchForm() {\n try {\n setIsLoading(true)\n \n const apiUrl = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.uptrademedia.com'\n : 'https://api.uptrademedia.com'\n const apiKey = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_KEY__\n : undefined\n \n if (!apiKey) {\n throw new Error('API key is required. Set NEXT_PUBLIC_UPTRADE_API_KEY in your .env')\n }\n \n const response = await fetch(`${apiUrl}/api/public/forms/config`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n formIdOrSlug: formIdOrSlug,\n }),\n })\n \n if (!response.ok) {\n throw new Error(`Failed to fetch form: ${response.statusText}`)\n }\n \n const data = await response.json()\n if (!data) throw new Error('Form not found')\n \n // Sort steps and fields\n if (data.steps) {\n data.steps.sort((a: any, b: any) => (a.step_number || 0) - (b.step_number || 0))\n }\n if (data.fields) {\n data.fields.sort((a: any, b: any) => (a.sort_order || 0) - (b.sort_order || 0))\n }\n \n // Compute multi-step properties\n const total_steps = data.steps?.length || 1\n const is_multi_step = total_steps > 1\n \n setForm({\n ...data,\n total_steps,\n is_multi_step,\n })\n \n // Set default values from field configs\n const defaults: Record<string, unknown> = {}\n for (const field of data.fields || []) {\n if (field.default_value !== undefined && field.default_value !== null) {\n defaults[field.slug] = field.default_value\n }\n }\n setValuesState({ ...defaults, ...initialValues })\n \n } catch (err) {\n setFetchError(err as Error)\n } finally {\n setIsLoading(false)\n }\n }\n \n fetchForm()\n }, [formIdOrSlug, projectId])\n \n // All fields\n const allFields = useMemo(() => form?.fields || [], [form])\n \n // Fields for current step\n const fields = useMemo(() => {\n if (!isMultiStep) return allFields\n \n const currentStepConfig = form?.steps?.find(s => s.step_number === step)\n if (!currentStepConfig) return allFields\n \n return allFields.filter(f => f.step_id === currentStepConfig.id)\n }, [form, step, allFields, isMultiStep])\n \n // Check if field is visible (conditional logic)\n const isFieldVisible = useCallback((field: FormField): boolean => {\n if (!field.conditional?.show_when) return true\n \n const { field: condField, operator, value } = field.conditional.show_when\n const fieldValue = values[condField]\n \n switch (operator) {\n case 'equals':\n return fieldValue === value\n case 'not_equals':\n return fieldValue !== value\n case 'contains':\n return String(fieldValue || '').includes(String(value))\n case 'not_contains':\n return !String(fieldValue || '').includes(String(value))\n case 'is_empty':\n return !fieldValue || fieldValue === ''\n case 'not_empty':\n return !!fieldValue && fieldValue !== ''\n case 'greater_than':\n return Number(fieldValue) > Number(value)\n case 'less_than':\n return Number(fieldValue) < Number(value)\n default:\n return true\n }\n }, [values])\n \n // Visible fields only\n const visibleFields = useMemo(() => {\n return fields.filter(isFieldVisible)\n }, [fields, isFieldVisible])\n \n // Validate a single field\n const validateField = useCallback((field: FormField): string | null => {\n if (!isFieldVisible(field)) return null\n \n const value = values[field.slug]\n const rules = field.validation || {}\n \n // Required check\n if (field.is_required && (!value || value === '')) {\n return rules.custom_error || `${field.label} is required`\n }\n \n if (!value) return null\n \n const strValue = String(value)\n \n // Length checks\n if (rules.min_length && strValue.length < rules.min_length) {\n return `${field.label} must be at least ${rules.min_length} characters`\n }\n if (rules.max_length && strValue.length > rules.max_length) {\n return `${field.label} must be no more than ${rules.max_length} characters`\n }\n \n // Numeric checks\n if (rules.min !== undefined && Number(value) < rules.min) {\n return `${field.label} must be at least ${rules.min}`\n }\n if (rules.max !== undefined && Number(value) > rules.max) {\n return `${field.label} must be no more than ${rules.max}`\n }\n \n // Pattern check\n if (rules.pattern && !new RegExp(rules.pattern).test(strValue)) {\n return rules.custom_error || `${field.label} is invalid`\n }\n \n // Email check\n if (field.field_type === 'email' && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(strValue)) {\n return 'Please enter a valid email address'\n }\n \n // Phone check\n if (field.field_type === 'phone' && !/^[\\d\\s\\-\\+\\(\\)]+$/.test(strValue)) {\n return 'Please enter a valid phone number'\n }\n \n return null\n }, [values, isFieldVisible])\n \n // Validate current step\n const validate = useCallback((): boolean => {\n const newErrors: Record<string, string> = {}\n \n for (const field of fields) {\n const error = validateField(field)\n if (error) {\n newErrors[field.slug] = error\n }\n }\n \n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }, [fields, validateField])\n \n // Set single field value\n const setFieldValue = useCallback((key: string, value: unknown) => {\n setValuesState(prev => ({ ...prev, [key]: value }))\n // Clear error when field changes\n setErrors(prev => {\n if (prev[key]) {\n const next = { ...prev }\n delete next[key]\n return next\n }\n return prev\n })\n }, [])\n \n // Set multiple values\n const setValues = useCallback((newValues: Record<string, unknown>) => {\n setValuesState(prev => ({ ...prev, ...newValues }))\n }, [])\n \n // Clear all errors\n const clearErrors = useCallback(() => {\n setErrors({})\n }, [])\n \n // Step navigation\n const canGoNext = step < totalSteps\n const canGoPrev = step > 1\n const isLastStep = step === totalSteps\n const progress = Math.round((step / totalSteps) * 100)\n \n const nextStep = useCallback((): boolean => {\n if (!validate()) return false\n \n if (step < totalSteps) {\n const newStep = step + 1\n setStep(newStep)\n trackStepChange(newStep)\n return true\n }\n return false\n }, [step, totalSteps, validate, trackStepChange])\n \n const prevStep = useCallback(() => {\n if (step > 1) {\n const newStep = step - 1\n setStep(newStep)\n trackStepChange(newStep)\n }\n }, [step, trackStepChange])\n \n const goToStep = useCallback((targetStep: number) => {\n if (targetStep >= 1 && targetStep <= totalSteps) {\n setStep(targetStep)\n trackStepChange(targetStep)\n }\n }, [totalSteps, trackStepChange])\n \n // Submit form\n const submit = useCallback(async () => {\n if (!form) return\n if (!validate()) return\n \n setIsSubmitting(true)\n \n try {\n const apiUrl = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.uptrademedia.com'\n : 'https://api.uptrademedia.com'\n const apiKey = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_KEY__\n : undefined\n \n if (!apiKey) {\n throw new Error('API key is required. Set NEXT_PUBLIC_UPTRADE_API_KEY in your .env')\n }\n \n const submission = {\n formId: form.id,\n data: values,\n metadata: {\n pageUrl: typeof window !== 'undefined' ? window.location.href : null,\n referrer: typeof document !== 'undefined' ? document.referrer || null : null,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : null,\n sessionId: typeof sessionStorage !== 'undefined' \n ? sessionStorage.getItem('_uptrade_sid') \n : null,\n ...getUTMParams(),\n },\n }\n \n const response = await fetch(`${apiUrl}/api/public/forms/submit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify(submission),\n })\n \n if (!response.ok) {\n throw new Error(`Form submission failed: ${response.statusText}`)\n }\n \n const data = await response.json()\n \n trackComplete()\n setIsComplete(true)\n onSuccess?.(data)\n \n // Redirect handling\n const finalRedirect = redirectUrl !== false \n ? (redirectUrl || form.redirect_url) \n : undefined\n \n if (finalRedirect) {\n window.location.href = finalRedirect\n }\n } catch (error) {\n console.error('[useForm] Submission error:', error)\n onError?.(error as Error)\n } finally {\n setIsSubmitting(false)\n }\n }, [form, values, validate, trackComplete, onSuccess, onError, redirectUrl])\n \n // Reset form\n const reset = useCallback(() => {\n setValuesState(initialValues)\n setErrors({})\n setStep(1)\n setIsComplete(false)\n }, [initialValues])\n \n return {\n form,\n isLoading,\n fetchError,\n \n allFields,\n fields,\n visibleFields,\n \n values,\n errors,\n setFieldValue,\n setValues,\n clearErrors,\n \n step,\n totalSteps,\n isMultiStep,\n progress,\n \n nextStep,\n prevStep,\n goToStep,\n canGoNext,\n canGoPrev,\n isLastStep,\n \n validate,\n validateField,\n isFieldVisible,\n \n submit,\n isSubmitting,\n isComplete,\n reset,\n }\n}\n","/**\n * @uptrade/site-kit/forms - Form Field Component\n * \n * Renders individual form fields based on type.\n * \n * Styling Options:\n * 1. Use CSS variables to customize the default styles\n * 2. Use the `className` prop on ManagedForm for scoped styles\n * 3. Use the custom render function for complete control\n * \n * CSS Variables (set these in your stylesheet):\n * --uptrade-input-bg: #ffffff\n * --uptrade-input-border: #d1d5db\n * --uptrade-input-border-focus: #3b82f6\n * --uptrade-input-border-error: #ef4444\n * --uptrade-input-radius: 6px\n * --uptrade-input-padding: 10px 12px\n * --uptrade-label-color: inherit\n * --uptrade-label-weight: 500\n * --uptrade-error-color: #ef4444\n * --uptrade-help-color: #6b7280\n * --uptrade-font-size: 16px\n */\n\n'use client'\n\nimport React from 'react'\nimport type { FormField as FormFieldType } from './types'\n\ninterface FormFieldProps {\n field: FormFieldType\n value: unknown\n error?: string\n onChange: (value: unknown) => void\n /** Optional class name prefix for custom styling */\n classPrefix?: string\n}\n\nexport function FormField({ field, value, error, onChange, classPrefix = 'uptrade-form' }: FormFieldProps) {\n // Use CSS variables with inline style fallbacks\n const baseInputStyle: React.CSSProperties = {\n width: '100%',\n padding: 'var(--uptrade-input-padding, 10px 12px)',\n fontSize: 'var(--uptrade-font-size, 16px)',\n border: error \n ? '1px solid var(--uptrade-input-border-error, #ef4444)' \n : '1px solid var(--uptrade-input-border, #d1d5db)',\n borderRadius: 'var(--uptrade-input-radius, 6px)',\n backgroundColor: 'var(--uptrade-input-bg, #ffffff)',\n outline: 'none',\n fontFamily: 'inherit',\n }\n \n const labelStyle: React.CSSProperties = {\n display: 'block',\n marginBottom: 6,\n fontWeight: 'var(--uptrade-label-weight, 500)' as any,\n color: 'var(--uptrade-label-color, inherit)',\n }\n \n const errorStyle: React.CSSProperties = {\n color: 'var(--uptrade-error-color, #ef4444)',\n fontSize: 14,\n marginTop: 4,\n }\n \n const helpStyle: React.CSSProperties = {\n color: 'var(--uptrade-help-color, #6b7280)',\n fontSize: 14,\n marginTop: 4,\n }\n \n // Heading (display only)\n if (field.field_type === 'heading') {\n return <h3 className={`${classPrefix}__heading`} style={{ margin: '16px 0 8px' }}>{field.label}</h3>\n }\n \n // Paragraph (display only)\n if (field.field_type === 'paragraph') {\n return <p className={`${classPrefix}__paragraph`} style={{ color: 'var(--uptrade-help-color, #6b7280)', margin: '8px 0' }}>{field.help_text || field.label}</p>\n }\n \n // Hidden field\n if (field.field_type === 'hidden') {\n return <input type=\"hidden\" name={field.slug} value={String(value || '')} />\n }\n \n return (\n <div className={`${classPrefix}__field ${classPrefix}__field--${field.field_type}`}>\n <label className={`${classPrefix}__label`} style={labelStyle}>\n {field.label}\n {field.is_required && <span style={{ color: 'var(--uptrade-error-color, #ef4444)' }}> *</span>}\n </label>\n \n {/* Text, Email, Phone, Number */}\n {['text', 'email', 'phone', 'number'].includes(field.field_type) && (\n <input\n className={`${classPrefix}__input`}\n type={field.field_type === 'phone' ? 'tel' : field.field_type}\n name={field.slug}\n value={String(value || '')}\n placeholder={field.placeholder}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n />\n )}\n \n {/* Textarea */}\n {field.field_type === 'textarea' && (\n <textarea\n className={`${classPrefix}__textarea`}\n name={field.slug}\n value={String(value || '')}\n placeholder={field.placeholder}\n required={field.is_required}\n rows={4}\n onChange={(e) => onChange(e.target.value)}\n style={{ ...baseInputStyle, resize: 'vertical' }}\n />\n )}\n \n {/* Select */}\n {field.field_type === 'select' && (\n <select\n className={`${classPrefix}__select`}\n name={field.slug}\n value={String(value || '')}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n >\n <option value=\"\">{field.placeholder || 'Select an option'}</option>\n {field.options?.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n )}\n \n {/* Multi-select */}\n {field.field_type === 'multi-select' && (\n <select\n className={`${classPrefix}__select ${classPrefix}__select--multi`}\n name={field.slug}\n value={Array.isArray(value) ? value : []}\n required={field.is_required}\n multiple\n onChange={(e) => {\n const selected = Array.from(e.target.selectedOptions, opt => opt.value)\n onChange(selected)\n }}\n style={{ ...baseInputStyle, height: 120 }}\n >\n {field.options?.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n )}\n \n {/* Radio */}\n {field.field_type === 'radio' && (\n <div className={`${classPrefix}__radio-group`} style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {field.options?.map((option) => (\n <label key={option.value} className={`${classPrefix}__radio-option`} style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"radio\"\n name={field.slug}\n value={option.value}\n checked={value === option.value}\n onChange={() => onChange(option.value)}\n />\n {option.label}\n </label>\n ))}\n </div>\n )}\n \n {/* Checkbox (single) */}\n {field.field_type === 'checkbox' && (!field.options || field.options.length === 0) && (\n <label className={`${classPrefix}__checkbox`} style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"checkbox\"\n name={field.slug}\n checked={!!value}\n onChange={(e) => onChange(e.target.checked)}\n />\n {field.help_text || field.label}\n </label>\n )}\n \n {/* Checkbox (multiple options) */}\n {field.field_type === 'checkbox' && field.options && field.options.length > 0 && (\n <div className={`${classPrefix}__checkbox-group`} style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {field.options.map((option) => {\n const selectedValues = Array.isArray(value) ? value : []\n const isChecked = selectedValues.includes(option.value)\n \n return (\n <label key={option.value} className={`${classPrefix}__checkbox-option`} style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"checkbox\"\n checked={isChecked}\n onChange={() => {\n if (isChecked) {\n onChange(selectedValues.filter(v => v !== option.value))\n } else {\n onChange([...selectedValues, option.value])\n }\n }}\n />\n {option.label}\n </label>\n )\n })}\n </div>\n )}\n \n {/* Date */}\n {field.field_type === 'date' && (\n <input\n className={`${classPrefix}__input ${classPrefix}__input--date`}\n type=\"date\"\n name={field.slug}\n value={String(value || '')}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n />\n )}\n \n {/* Time */}\n {field.field_type === 'time' && (\n <input\n className={`${classPrefix}__input ${classPrefix}__input--time`}\n type=\"time\"\n name={field.slug}\n value={String(value || '')}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n />\n )}\n \n {/* DateTime */}\n {field.field_type === 'datetime' && (\n <input\n className={`${classPrefix}__input ${classPrefix}__input--datetime`}\n type=\"datetime-local\"\n name={field.slug}\n value={String(value || '')}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n />\n )}\n \n {/* File */}\n {field.field_type === 'file' && (\n <input\n className={`${classPrefix}__input ${classPrefix}__input--file`}\n type=\"file\"\n name={field.slug}\n required={field.is_required}\n onChange={(e) => {\n const file = e.target.files?.[0]\n if (file) {\n // Could upload to Supabase Storage here\n onChange(file.name)\n }\n }}\n style={baseInputStyle}\n />\n )}\n \n {/* Rating */}\n {field.field_type === 'rating' && (\n <div className={`${classPrefix}__rating`} style={{ display: 'flex', gap: 4 }}>\n {[1, 2, 3, 4, 5].map((star) => (\n <button\n key={star}\n type=\"button\"\n onClick={() => onChange(star)}\n className={`${classPrefix}__rating-star`}\n style={{\n background: 'none',\n border: 'none',\n fontSize: 24,\n cursor: 'pointer',\n color: (value as number) >= star ? 'var(--uptrade-rating-active, #fbbf24)' : 'var(--uptrade-rating-inactive, #d1d5db)',\n }}\n >\n ★\n </button>\n ))}\n </div>\n )}\n \n {/* Slider */}\n {field.field_type === 'slider' && (\n <div className={`${classPrefix}__slider`}>\n <input\n type=\"range\"\n name={field.slug}\n value={Number(value || 50)}\n min={field.validation?.min || 0}\n max={field.validation?.max || 100}\n onChange={(e) => onChange(Number(e.target.value))}\n style={{ width: '100%' }}\n />\n <div className={`${classPrefix}__slider-value`} style={{ textAlign: 'center', marginTop: 4 }}>{String(value || 50)}</div>\n </div>\n )}\n \n {/* Error message */}\n {error && <p className={`${classPrefix}__error`} style={errorStyle}>{error}</p>}\n \n {/* Help text */}\n {field.help_text && !error && field.field_type !== 'checkbox' && (\n <p className={`${classPrefix}__help`} style={helpStyle}>{field.help_text}</p>\n )}\n </div>\n )\n}\n","/**\n * @uptrade/site-kit/forms - Form Client Component\n * \n * Handles form state, validation, and submission\n */\n\n'use client'\n\nimport React, { useState, useCallback, useMemo } from 'react'\nimport { useFormTracking } from './useFormTracking'\nimport { FormField } from './FormField'\nimport type { \n ManagedFormConfig, \n FormField as FormFieldType, \n FormRenderProps,\n FormSubmission,\n} from './types'\n\ninterface FormClientProps {\n config: ManagedFormConfig\n className?: string\n onSuccess?: (submission: FormSubmission) => void\n onError?: (error: Error) => void\n customRender?: (props: FormRenderProps) => React.ReactNode\n}\n\nexport function FormClient({\n config,\n className,\n onSuccess,\n onError,\n customRender,\n}: FormClientProps) {\n const [values, setValues] = useState<Record<string, unknown>>({})\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [step, setStep] = useState(1)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [isComplete, setIsComplete] = useState(false)\n \n const { trackStepChange, trackComplete } = useFormTracking({\n formId: config.id,\n totalSteps: config.total_steps,\n })\n \n // Get fields for current step\n const currentFields = useMemo(() => {\n if (!config.is_multi_step) {\n return config.fields || []\n }\n \n const currentStepConfig = config.steps?.find(s => s.step_number === step)\n if (!currentStepConfig) return config.fields || []\n \n return (config.fields || []).filter(f => f.step_id === currentStepConfig.id)\n }, [config, step])\n \n // Check if field is visible (conditional logic)\n const isFieldVisible = useCallback((field: FormFieldType): boolean => {\n if (!field.conditional?.show_when) return true\n \n const { field: condField, operator, value } = field.conditional.show_when\n const fieldValue = values[condField]\n \n switch (operator) {\n case 'equals':\n return fieldValue === value\n case 'not_equals':\n return fieldValue !== value\n case 'contains':\n return String(fieldValue).includes(String(value))\n case 'not_contains':\n return !String(fieldValue).includes(String(value))\n case 'is_empty':\n return !fieldValue || fieldValue === ''\n case 'not_empty':\n return !!fieldValue && fieldValue !== ''\n case 'greater_than':\n return Number(fieldValue) > Number(value)\n case 'less_than':\n return Number(fieldValue) < Number(value)\n default:\n return true\n }\n }, [values])\n \n // Validate field\n const validateField = useCallback((field: FormFieldType): string | null => {\n if (!isFieldVisible(field)) return null\n \n const value = values[field.slug]\n const rules = field.validation || {}\n \n // Required check\n if (field.is_required && (!value || value === '')) {\n return rules.custom_error || `${field.label} is required`\n }\n \n if (!value) return null\n \n const strValue = String(value)\n \n // Length checks\n if (rules.min_length && strValue.length < rules.min_length) {\n return `${field.label} must be at least ${rules.min_length} characters`\n }\n if (rules.max_length && strValue.length > rules.max_length) {\n return `${field.label} must be no more than ${rules.max_length} characters`\n }\n \n // Numeric checks\n if (rules.min !== undefined && Number(value) < rules.min) {\n return `${field.label} must be at least ${rules.min}`\n }\n if (rules.max !== undefined && Number(value) > rules.max) {\n return `${field.label} must be no more than ${rules.max}`\n }\n \n // Pattern check\n if (rules.pattern && !new RegExp(rules.pattern).test(strValue)) {\n return rules.custom_error || `${field.label} is invalid`\n }\n \n // Email check\n if (field.field_type === 'email' && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(strValue)) {\n return 'Please enter a valid email address'\n }\n \n // Phone check\n if (field.field_type === 'phone' && !/^[\\d\\s\\-\\+\\(\\)]+$/.test(strValue)) {\n return 'Please enter a valid phone number'\n }\n \n return null\n }, [values, isFieldVisible])\n \n // Validate current step\n const validateStep = useCallback((): boolean => {\n const newErrors: Record<string, string> = {}\n \n for (const field of currentFields) {\n const error = validateField(field)\n if (error) {\n newErrors[field.slug] = error\n }\n }\n \n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }, [currentFields, validateField])\n \n // Set field value\n const setFieldValue = useCallback((key: string, value: unknown) => {\n setValues(prev => ({ ...prev, [key]: value }))\n // Clear error when field changes\n if (errors[key]) {\n setErrors(prev => {\n const next = { ...prev }\n delete next[key]\n return next\n })\n }\n }, [errors])\n \n // Step navigation\n const nextStep = useCallback((): boolean => {\n if (!validateStep()) return false\n \n if (step < config.total_steps) {\n const newStep = step + 1\n setStep(newStep)\n trackStepChange(newStep)\n return true\n }\n return false\n }, [step, config.total_steps, validateStep, trackStepChange])\n \n const prevStep = useCallback(() => {\n if (step > 1) {\n const newStep = step - 1\n setStep(newStep)\n trackStepChange(newStep)\n }\n }, [step, trackStepChange])\n \n const goToStep = useCallback((targetStep: number) => {\n if (targetStep >= 1 && targetStep <= config.total_steps) {\n setStep(targetStep)\n trackStepChange(targetStep)\n }\n }, [config.total_steps, trackStepChange])\n \n // Submit form\n const submit = useCallback(async () => {\n if (!validateStep()) return\n \n setIsSubmitting(true)\n \n try {\n const apiUrl = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.uptrademedia.com'\n : 'https://api.uptrademedia.com'\n const apiKey = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_KEY__\n : undefined\n \n if (!apiKey) {\n throw new Error('API key is required. Set NEXT_PUBLIC_UPTRADE_API_KEY in your .env')\n }\n \n // Create submission with all required metadata\n const submission = {\n form_id: config.id,\n project_id: config.project_id,\n data: values,\n routing_type: config.form_type,\n status: 'new',\n page_url: typeof window !== 'undefined' ? window.location.href : null,\n referrer: typeof document !== 'undefined' ? document.referrer || null : null,\n user_agent: typeof navigator !== 'undefined' ? navigator.userAgent : null,\n session_id: typeof sessionStorage !== 'undefined' \n ? sessionStorage.getItem('_uptrade_sid') \n : null,\n ...getUTMParams(),\n }\n \n const response = await fetch(`${apiUrl}/api/public/forms/submit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify(submission),\n })\n \n if (!response.ok) {\n throw new Error(`Failed to submit form: ${response.statusText}`)\n }\n \n const data = await response.json()\n \n trackComplete()\n setIsComplete(true)\n onSuccess?.(data)\n \n // Redirect if configured\n if (config.redirect_url) {\n window.location.href = config.redirect_url\n }\n } catch (error) {\n console.error('[Forms] Submission error:', error)\n onError?.(error as Error)\n } finally {\n setIsSubmitting(false)\n }\n }, [config, values, validateStep, trackComplete, onSuccess, onError])\n \n // Progress percentage\n const progress = useMemo(() => {\n return Math.round((step / config.total_steps) * 100)\n }, [step, config.total_steps])\n \n // Render props for custom rendering\n const renderProps: FormRenderProps = {\n config,\n fields: currentFields,\n step,\n totalSteps: config.total_steps,\n values,\n errors,\n isSubmitting,\n progress,\n nextStep,\n prevStep,\n goToStep,\n submit,\n setFieldValue,\n isFieldVisible,\n }\n \n // Show success message\n if (isComplete) {\n return (\n <div className={className}>\n <p>{config.success_message}</p>\n </div>\n )\n }\n \n // Custom render\n if (customRender) {\n return <>{customRender(renderProps)}</>\n }\n \n // Default render\n return (\n <form\n className={`uptrade-form ${className || ''}`}\n onSubmit={(e) => {\n e.preventDefault()\n if (step < config.total_steps) {\n nextStep()\n } else {\n submit()\n }\n }}\n >\n {/* Step indicator for multi-step */}\n {config.is_multi_step && (\n <div className=\"uptrade-form__progress\" style={{ marginBottom: 20 }}>\n <div className=\"uptrade-form__progress-header\" style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 8 }}>\n <span className=\"uptrade-form__progress-step\">Step {step} of {config.total_steps}</span>\n <span className=\"uptrade-form__progress-percent\">{progress}%</span>\n </div>\n <div className=\"uptrade-form__progress-track\" style={{ \n height: 4, \n backgroundColor: 'var(--uptrade-progress-bg, #e5e7eb)', \n borderRadius: 2,\n overflow: 'hidden' \n }}>\n <div className=\"uptrade-form__progress-bar\" style={{ \n width: `${progress}%`, \n height: '100%', \n backgroundColor: 'var(--uptrade-progress-fill, #3b82f6)',\n transition: 'width 0.3s ease'\n }} />\n </div>\n </div>\n )}\n \n {/* Fields */}\n <div className=\"uptrade-form__fields\" style={{ display: 'flex', flexWrap: 'wrap', gap: 16 }}>\n {currentFields.map((field) => {\n if (!isFieldVisible(field)) return null\n \n const widthMap: Record<string, string> = {\n full: '100%',\n half: 'calc(50% - 8px)',\n third: 'calc(33.33% - 11px)',\n quarter: 'calc(25% - 12px)',\n }\n const widthStyle = widthMap[field.width] || '100%'\n \n return (\n <div key={field.id} className={`uptrade-form__field-wrapper uptrade-form__field-wrapper--${field.width}`} style={{ width: widthStyle }}>\n <FormField\n field={field}\n value={values[field.slug]}\n error={errors[field.slug]}\n onChange={(value) => setFieldValue(field.slug, value)}\n />\n </div>\n )\n })}\n </div>\n \n {/* Navigation buttons */}\n <div className=\"uptrade-form__actions\" style={{ \n display: 'flex', \n justifyContent: step > 1 ? 'space-between' : 'flex-end',\n marginTop: 24 \n }}>\n {step > 1 && (\n <button type=\"button\" className=\"uptrade-form__btn uptrade-form__btn--back\" onClick={prevStep}>\n Back\n </button>\n )}\n <button type=\"submit\" className=\"uptrade-form__btn uptrade-form__btn--submit\" disabled={isSubmitting}>\n {isSubmitting \n ? 'Submitting...' \n : step < config.total_steps \n ? 'Next' \n : config.submit_button_text\n }\n </button>\n </div>\n \n {/* Honeypot field */}\n {config.honeypot_enabled && (\n <input\n type=\"text\"\n name=\"website\"\n tabIndex={-1}\n autoComplete=\"off\"\n style={{ \n position: 'absolute', \n left: -9999, \n opacity: 0,\n pointerEvents: 'none' \n }}\n onChange={(e) => {\n if (e.target.value) {\n // Bot detected\n console.warn('[Forms] Honeypot triggered')\n }\n }}\n />\n )}\n </form>\n )\n}\n\n// Helper\nfunction getUTMParams(): Record<string, string> {\n if (typeof window === 'undefined') return {}\n \n const params = new URLSearchParams(window.location.search)\n const utmParams: Record<string, string> = {}\n \n for (const key of ['utm_source', 'utm_medium', 'utm_campaign']) {\n const value = params.get(key)\n if (value) utmParams[key] = value\n }\n \n return utmParams\n}\n","/**\n * @uptrade/site-kit/forms - Managed Form Component\n * \n * Fetches form config from Portal API and renders fields with validation\n */\n\n'use client'\n\nimport type { ManagedFormProps } from './types'\nimport { useForm } from './useForm'\nimport { FormClient } from './FormClient'\n\n// ============================================\n// Main Component (Client Component)\n// ============================================\n\nexport function ManagedForm({\n formId,\n projectId,\n className,\n onSuccess,\n onError,\n children,\n}: ManagedFormProps) {\n const {\n form,\n isLoading,\n fetchError,\n } = useForm(formId, {\n projectId,\n onSuccess,\n onError,\n })\n \n if (isLoading) {\n return (\n <div className={className}>\n <p style={{ color: '#6b7280' }}>Loading form...</p>\n </div>\n )\n }\n \n if (fetchError || !form) {\n return (\n <div className={className}>\n <p style={{ color: '#ef4444' }}>\n {fetchError?.message || 'Form not found or inactive.'}\n </p>\n </div>\n )\n }\n \n // Pass to client component for interactivity\n return (\n <FormClient\n config={form}\n className={className}\n onSuccess={onSuccess}\n onError={onError}\n customRender={children}\n />\n )\n}\n\n"]}
1
+ {"version":3,"sources":["../../src/forms/useFormTracking.ts","../../src/forms/useForm.ts","../../src/forms/FormField.tsx","../../src/forms/FormClient.tsx","../../src/forms/ManagedForm.tsx"],"names":["useRef","useEffect","useCallback","useState","field","useMemo","jsx","jsxs","getUTMParams","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @uptrade/site-kit/forms - Form Tracking Hook\n * \n * Tracks form analytics including step progress and abandonment\n */\n\n'use client'\n\nimport { useEffect, useRef, useCallback } from 'react'\n\ninterface UseFormTrackingOptions {\n formId: string\n totalSteps: number\n enabled?: boolean\n debug?: boolean\n}\n\ninterface FormTrackingReturn {\n trackStepChange: (step: number) => void\n trackComplete: () => void\n sessionId: string\n}\n\nexport function useFormTracking({\n formId,\n totalSteps,\n enabled = true,\n debug = false,\n}: UseFormTrackingOptions): FormTrackingReturn {\n const sessionIdRef = useRef<string>('')\n const startTimeRef = useRef<number>(0)\n const stepStartTimeRef = useRef<number>(0)\n const stepTimesRef = useRef<Record<number, number>>({})\n const currentStepRef = useRef<number>(1)\n const maxStepRef = useRef<number>(1)\n const analyticsIdRef = useRef<string | null>(null)\n \n // Initialize tracking\n useEffect(() => {\n if (!enabled) return\n if (!formId) {\n if (debug) console.warn('[Forms] Tracking skipped: formId is empty')\n return\n }\n \n // Generate session ID\n sessionIdRef.current = crypto.randomUUID()\n startTimeRef.current = Date.now()\n stepStartTimeRef.current = Date.now()\n \n // Record form start\n const startTracking = async () => {\n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (!apiUrl || !apiKey) {\n if (debug) console.error('[Forms] Missing API URL or API key')\n return\n }\n \n try {\n const response = await fetch(`${apiUrl}/api/public/forms/analytics/start`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({\n formId,\n sessionId: sessionIdRef.current,\n deviceType: getDeviceType(),\n }),\n })\n \n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n \n const data = await response.json()\n analyticsIdRef.current = data.id\n if (debug) console.log('[Forms] Started tracking:', data.id)\n } catch (error) {\n if (debug) console.error('[Forms] Error starting tracking:', error)\n }\n }\n \n startTracking()\n \n // Handle abandonment on page leave\n const handleBeforeUnload = () => {\n if (!analyticsIdRef.current) return\n \n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (!apiUrl || !apiKey) return\n \n const now = Date.now()\n const currentStepTime = Math.floor((now - stepStartTimeRef.current) / 1000)\n stepTimesRef.current[currentStepRef.current] = currentStepTime\n \n // Use sendBeacon for reliable delivery during page unload\n const payload = JSON.stringify({\n analyticsId: analyticsIdRef.current,\n step: currentStepRef.current,\n maxStep: maxStepRef.current,\n stepTimes: stepTimesRef.current,\n totalTimeSeconds: Math.floor((now - startTimeRef.current) / 1000),\n })\n \n const blob = new Blob([payload], { type: 'application/json' })\n // Note: sendBeacon doesn't support custom headers, API key included in URL\n const _headers = new Headers({\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n })\n \n // Try sendBeacon first (more reliable during unload)\n const sent = navigator.sendBeacon(\n `${apiUrl}/api/public/forms/analytics/abandon`,\n blob\n )\n \n if (debug) console.log('[Forms] Abandonment tracked:', sent ? 'success' : 'failed')\n }\n \n window.addEventListener('beforeunload', handleBeforeUnload)\n \n return () => {\n window.removeEventListener('beforeunload', handleBeforeUnload)\n }\n }, [formId, enabled, debug])\n \n // Track step changes\n const trackStepChange = useCallback(async (step: number) => {\n if (!enabled || !analyticsIdRef.current) return\n \n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (!apiUrl || !apiKey) {\n if (debug) console.error('[Forms] Missing API URL or API key')\n return\n }\n \n const now = Date.now()\n \n // Record time spent on previous step\n const prevStepTime = Math.floor((now - stepStartTimeRef.current) / 1000)\n stepTimesRef.current[currentStepRef.current] = prevStepTime\n \n // Update refs\n currentStepRef.current = step\n maxStepRef.current = Math.max(maxStepRef.current, step)\n stepStartTimeRef.current = now\n \n // Update database\n try {\n const response = await fetch(`${apiUrl}/api/public/forms/analytics/step`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({\n analyticsId: analyticsIdRef.current,\n step,\n maxStep: maxStepRef.current,\n stepTimes: stepTimesRef.current,\n }),\n })\n \n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n \n if (debug) console.log('[Forms] Step changed to:', step)\n } catch (error) {\n if (debug) console.error('[Forms] Error updating step:', error)\n }\n }, [enabled, debug])\n \n // Track completion\n const trackComplete = useCallback(async () => {\n if (!enabled || !analyticsIdRef.current) return\n \n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (!apiUrl || !apiKey) {\n if (debug) console.error('[Forms] Missing API URL or API key')\n return\n }\n \n const now = Date.now()\n \n // Record time for final step\n const finalStepTime = Math.floor((now - stepStartTimeRef.current) / 1000)\n stepTimesRef.current[currentStepRef.current] = finalStepTime\n \n try {\n // Complete form analytics tracking\n // Note: A database trigger will automatically log this as a conversion\n // in analytics_conversions when completed_at is set\n const response = await fetch(`${apiUrl}/api/public/forms/analytics/complete`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({\n analyticsId: analyticsIdRef.current,\n totalSteps,\n stepTimes: stepTimesRef.current,\n totalTimeSeconds: Math.floor((now - startTimeRef.current) / 1000),\n }),\n })\n \n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n \n if (debug) console.log('[Forms] Form completed (conversion auto-logged via trigger)')\n } catch (error) {\n if (debug) console.error('[Forms] Error completing tracking:', error)\n }\n }, [enabled, totalSteps, formId, debug])\n \n return {\n trackStepChange,\n trackComplete,\n sessionId: sessionIdRef.current,\n }\n}\n\n// Helper\nfunction getDeviceType(): 'desktop' | 'mobile' | 'tablet' {\n if (typeof window === 'undefined') return 'desktop'\n const ua = navigator.userAgent\n if (/tablet|ipad|playbook|silk/i.test(ua)) return 'tablet'\n if (/mobile|iphone|ipod|android|blackberry|opera mini|iemobile/i.test(ua)) return 'mobile'\n return 'desktop'\n}\n\n","/**\n * @uptrade/site-kit/forms - useForm Hook\n * \n * Headless hook for complete control over form rendering.\n * Fetches form config from API, handles validation, state, and submission.\n * \n * @example\n * ```tsx\n * const { form, fields, values, errors, setFieldValue, submit, isSubmitting } = useForm('contact-form')\n * \n * return (\n * <form onSubmit={(e) => { e.preventDefault(); submit() }}>\n * {fields.map(field => (\n * <MyCustomInput\n * key={field.slug}\n * label={field.label}\n * value={values[field.slug]}\n * error={errors[field.slug]}\n * onChange={(val) => setFieldValue(field.slug, val)}\n * />\n * ))}\n * <button type=\"submit\" disabled={isSubmitting}>Submit</button>\n * </form>\n * )\n * ```\n */\n\n'use client'\n\nimport { useState, useEffect, useCallback, useMemo } from 'react'\nimport { useFormTracking } from './useFormTracking'\nimport type { \n ManagedFormConfig, \n FormField, \n FormSubmission \n} from './types'\n\n// ============================================\n// Types\n// ============================================\n\nexport interface UseFormOptions {\n /** Project ID (defaults to SiteKitProvider config) */\n projectId?: string\n /** Callback when form submits successfully */\n onSuccess?: (submission: FormSubmission) => void\n /** Callback when submission fails */\n onError?: (error: Error) => void\n /** Initial values to prefill */\n initialValues?: Record<string, unknown>\n /** Auto-redirect after success (override form config) */\n redirectUrl?: string | false\n}\n\nexport interface UseFormReturn {\n /** Form configuration (null while loading) */\n form: ManagedFormConfig | null\n /** Loading state */\n isLoading: boolean\n /** Error fetching form */\n fetchError: Error | null\n \n /** All form fields */\n allFields: FormField[]\n /** Fields for current step (multi-step) or all fields (single step) */\n fields: FormField[]\n /** Visible fields only (respecting conditional logic) */\n visibleFields: FormField[]\n \n /** Current form values */\n values: Record<string, unknown>\n /** Current validation errors */\n errors: Record<string, string>\n \n /** Set a single field value */\n setFieldValue: (key: string, value: unknown) => void\n /** Set multiple field values at once */\n setValues: (values: Record<string, unknown>) => void\n /** Clear all errors */\n clearErrors: () => void\n \n /** Multi-step state */\n step: number\n totalSteps: number\n isMultiStep: boolean\n progress: number\n \n /** Multi-step navigation */\n nextStep: () => boolean\n prevStep: () => void\n goToStep: (step: number) => void\n canGoNext: boolean\n canGoPrev: boolean\n isLastStep: boolean\n \n /** Validate current step */\n validate: () => boolean\n /** Validate a single field */\n validateField: (field: FormField) => string | null\n /** Check if a field is visible (conditional logic) */\n isFieldVisible: (field: FormField) => boolean\n \n /** Submit the form */\n submit: () => Promise<void>\n /** Submission state */\n isSubmitting: boolean\n isComplete: boolean\n /** Reset form to initial state */\n reset: () => void\n}\n\n// ============================================\n// Helper: Get UTM params\n// ============================================\n\nfunction getUTMParams() {\n if (typeof window === 'undefined') return {}\n \n const params = new URLSearchParams(window.location.search)\n return {\n utm_source: params.get('utm_source'),\n utm_medium: params.get('utm_medium'),\n utm_campaign: params.get('utm_campaign'),\n utm_term: params.get('utm_term'),\n utm_content: params.get('utm_content'),\n }\n}\n\n// ============================================\n// Hook\n// ============================================\n\nexport function useForm(\n formIdOrSlug: string,\n options: UseFormOptions = {}\n): UseFormReturn {\n const { \n projectId: optionsProjectId,\n onSuccess, \n onError, \n initialValues = {},\n redirectUrl,\n } = options\n \n // Get projectId from window globals if not provided\n const projectId = optionsProjectId || \n (typeof window !== 'undefined' ? (window as any).__SITE_KIT_PROJECT_ID__ : undefined)\n \n // State\n const [form, setForm] = useState<ManagedFormConfig | null>(null)\n const [isLoading, setIsLoading] = useState(true)\n const [fetchError, setFetchError] = useState<Error | null>(null)\n const [values, setValuesState] = useState<Record<string, unknown>>(initialValues)\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [step, setStep] = useState(1)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [isComplete, setIsComplete] = useState(false)\n \n const totalSteps = form?.total_steps || 1\n const isMultiStep = (form?.is_multi_step) || false\n \n const { trackStepChange, trackComplete } = useFormTracking({\n formId: form?.id || '',\n totalSteps,\n })\n \n // Fetch form config\n useEffect(() => {\n if (!projectId) {\n setFetchError(new Error('projectId is required. Provide it via SiteKitProvider or useForm options.'))\n setIsLoading(false)\n return\n }\n \n async function fetchForm() {\n try {\n setIsLoading(true)\n \n const apiUrl = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.uptrademedia.com'\n : 'https://api.uptrademedia.com'\n const apiKey = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_KEY__\n : undefined\n \n if (!apiKey) {\n throw new Error('API key is required. Set NEXT_PUBLIC_UPTRADE_API_KEY in your .env')\n }\n \n const response = await fetch(`${apiUrl}/api/public/forms/config`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n formIdOrSlug: formIdOrSlug,\n }),\n })\n \n if (!response.ok) {\n throw new Error(`Failed to fetch form: ${response.statusText}`)\n }\n \n const data = await response.json()\n if (!data) throw new Error('Form not found')\n \n // Sort steps and fields\n if (data.steps) {\n data.steps.sort((a: any, b: any) => (a.step_number || 0) - (b.step_number || 0))\n }\n if (data.fields) {\n data.fields.sort((a: any, b: any) => (a.sort_order || 0) - (b.sort_order || 0))\n }\n \n // Compute multi-step properties\n const total_steps = data.steps?.length || 1\n const is_multi_step = total_steps > 1\n \n setForm({\n ...data,\n total_steps,\n is_multi_step,\n })\n \n // Set default values from field configs\n const defaults: Record<string, unknown> = {}\n for (const field of data.fields || []) {\n if (field.default_value !== undefined && field.default_value !== null) {\n defaults[field.slug] = field.default_value\n }\n }\n setValuesState({ ...defaults, ...initialValues })\n \n } catch (err) {\n setFetchError(err as Error)\n } finally {\n setIsLoading(false)\n }\n }\n \n fetchForm()\n }, [formIdOrSlug, projectId])\n \n // All fields\n const allFields = useMemo(() => form?.fields || [], [form])\n \n // Fields for current step\n const fields = useMemo(() => {\n if (!isMultiStep) return allFields\n \n const currentStepConfig = form?.steps?.find(s => s.step_number === step)\n if (!currentStepConfig) return allFields\n \n return allFields.filter(f => f.step_id === currentStepConfig.id)\n }, [form, step, allFields, isMultiStep])\n \n // Check if field is visible (conditional logic)\n const isFieldVisible = useCallback((field: FormField): boolean => {\n if (!field.conditional?.show_when) return true\n \n const { field: condField, operator, value } = field.conditional.show_when\n const fieldValue = values[condField]\n \n switch (operator) {\n case 'equals':\n return fieldValue === value\n case 'not_equals':\n return fieldValue !== value\n case 'contains':\n return String(fieldValue || '').includes(String(value))\n case 'not_contains':\n return !String(fieldValue || '').includes(String(value))\n case 'is_empty':\n return !fieldValue || fieldValue === ''\n case 'not_empty':\n return !!fieldValue && fieldValue !== ''\n case 'greater_than':\n return Number(fieldValue) > Number(value)\n case 'less_than':\n return Number(fieldValue) < Number(value)\n default:\n return true\n }\n }, [values])\n \n // Visible fields only\n const visibleFields = useMemo(() => {\n return fields.filter(isFieldVisible)\n }, [fields, isFieldVisible])\n \n // Validate a single field\n const validateField = useCallback((field: FormField): string | null => {\n if (!isFieldVisible(field)) return null\n \n const value = values[field.slug]\n const rules = field.validation || {}\n \n // Required check\n if (field.is_required && (!value || value === '')) {\n return rules.custom_error || `${field.label} is required`\n }\n \n if (!value) return null\n \n const strValue = String(value)\n \n // Length checks\n if (rules.min_length && strValue.length < rules.min_length) {\n return `${field.label} must be at least ${rules.min_length} characters`\n }\n if (rules.max_length && strValue.length > rules.max_length) {\n return `${field.label} must be no more than ${rules.max_length} characters`\n }\n \n // Numeric checks\n if (rules.min !== undefined && Number(value) < rules.min) {\n return `${field.label} must be at least ${rules.min}`\n }\n if (rules.max !== undefined && Number(value) > rules.max) {\n return `${field.label} must be no more than ${rules.max}`\n }\n \n // Pattern check\n if (rules.pattern && !new RegExp(rules.pattern).test(strValue)) {\n return rules.custom_error || `${field.label} is invalid`\n }\n \n // Email check\n if (field.field_type === 'email' && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(strValue)) {\n return 'Please enter a valid email address'\n }\n \n // Phone check\n if (field.field_type === 'phone' && !/^[\\d\\s\\-\\+\\(\\)]+$/.test(strValue)) {\n return 'Please enter a valid phone number'\n }\n \n return null\n }, [values, isFieldVisible])\n \n // Validate current step\n const validate = useCallback((): boolean => {\n const newErrors: Record<string, string> = {}\n \n for (const field of fields) {\n const error = validateField(field)\n if (error) {\n newErrors[field.slug] = error\n }\n }\n \n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }, [fields, validateField])\n \n // Set single field value\n const setFieldValue = useCallback((key: string, value: unknown) => {\n setValuesState(prev => ({ ...prev, [key]: value }))\n // Clear error when field changes\n setErrors(prev => {\n if (prev[key]) {\n const next = { ...prev }\n delete next[key]\n return next\n }\n return prev\n })\n }, [])\n \n // Set multiple values\n const setValues = useCallback((newValues: Record<string, unknown>) => {\n setValuesState(prev => ({ ...prev, ...newValues }))\n }, [])\n \n // Clear all errors\n const clearErrors = useCallback(() => {\n setErrors({})\n }, [])\n \n // Step navigation\n const canGoNext = step < totalSteps\n const canGoPrev = step > 1\n const isLastStep = step === totalSteps\n const progress = Math.round((step / totalSteps) * 100)\n \n const nextStep = useCallback((): boolean => {\n if (!validate()) return false\n \n if (step < totalSteps) {\n const newStep = step + 1\n setStep(newStep)\n trackStepChange(newStep)\n return true\n }\n return false\n }, [step, totalSteps, validate, trackStepChange])\n \n const prevStep = useCallback(() => {\n if (step > 1) {\n const newStep = step - 1\n setStep(newStep)\n trackStepChange(newStep)\n }\n }, [step, trackStepChange])\n \n const goToStep = useCallback((targetStep: number) => {\n if (targetStep >= 1 && targetStep <= totalSteps) {\n setStep(targetStep)\n trackStepChange(targetStep)\n }\n }, [totalSteps, trackStepChange])\n \n // Submit form\n const submit = useCallback(async () => {\n if (!form) return\n if (!validate()) return\n \n setIsSubmitting(true)\n \n try {\n const apiUrl = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.uptrademedia.com'\n : 'https://api.uptrademedia.com'\n const apiKey = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_KEY__\n : undefined\n \n if (!apiKey) {\n throw new Error('API key is required. Set NEXT_PUBLIC_UPTRADE_API_KEY in your .env')\n }\n \n const submission = {\n formId: form.id,\n data: values,\n metadata: {\n pageUrl: typeof window !== 'undefined' ? window.location.href : null,\n referrer: typeof document !== 'undefined' ? document.referrer || null : null,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : null,\n sessionId: typeof sessionStorage !== 'undefined' \n ? sessionStorage.getItem('_uptrade_sid') \n : null,\n ...getUTMParams(),\n },\n }\n \n const response = await fetch(`${apiUrl}/api/public/forms/submit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify(submission),\n })\n \n if (!response.ok) {\n throw new Error(`Form submission failed: ${response.statusText}`)\n }\n \n const data = await response.json()\n \n trackComplete()\n setIsComplete(true)\n onSuccess?.(data)\n \n // Redirect handling\n const finalRedirect = redirectUrl !== false \n ? (redirectUrl || form.redirect_url) \n : undefined\n \n if (finalRedirect) {\n window.location.href = finalRedirect\n }\n } catch (error) {\n console.error('[useForm] Submission error:', error)\n onError?.(error as Error)\n } finally {\n setIsSubmitting(false)\n }\n }, [form, values, validate, trackComplete, onSuccess, onError, redirectUrl])\n \n // Reset form\n const reset = useCallback(() => {\n setValuesState(initialValues)\n setErrors({})\n setStep(1)\n setIsComplete(false)\n }, [initialValues])\n \n return {\n form,\n isLoading,\n fetchError,\n \n allFields,\n fields,\n visibleFields,\n \n values,\n errors,\n setFieldValue,\n setValues,\n clearErrors,\n \n step,\n totalSteps,\n isMultiStep,\n progress,\n \n nextStep,\n prevStep,\n goToStep,\n canGoNext,\n canGoPrev,\n isLastStep,\n \n validate,\n validateField,\n isFieldVisible,\n \n submit,\n isSubmitting,\n isComplete,\n reset,\n }\n}\n","/**\n * @uptrade/site-kit/forms - Form Field Component\n * \n * Renders individual form fields based on type.\n * \n * Styling Options:\n * 1. Use CSS variables to customize the default styles\n * 2. Use the `className` prop on ManagedForm for scoped styles\n * 3. Use the custom render function for complete control\n * \n * CSS Variables (set these in your stylesheet):\n * --uptrade-input-bg: #ffffff\n * --uptrade-input-border: #d1d5db\n * --uptrade-input-border-focus: #3b82f6\n * --uptrade-input-border-error: #ef4444\n * --uptrade-input-radius: 6px\n * --uptrade-input-padding: 10px 12px\n * --uptrade-label-color: inherit\n * --uptrade-label-weight: 500\n * --uptrade-error-color: #ef4444\n * --uptrade-help-color: #6b7280\n * --uptrade-font-size: 16px\n */\n\n'use client'\n\nimport React from 'react'\nimport type { FormField as FormFieldType } from './types'\n\ninterface FormFieldProps {\n field: FormFieldType\n value: unknown\n error?: string\n onChange: (value: unknown) => void\n /** Optional class name prefix for custom styling */\n classPrefix?: string\n}\n\n/**\n * Normalize options from various DB formats into [{value, label}]\n * Handles:\n * - [{value, label}] → pass through\n * - {choices: [\"A\", \"B\"]} → [{value: \"A\", label: \"A\"}, ...]\n * - [\"A\", \"B\"] → [{value: \"A\", label: \"A\"}, ...]\n */\nfunction normalizeOptions(options: unknown): { value: string; label: string }[] {\n if (!options) return []\n if (Array.isArray(options)) {\n return options.map((opt) => {\n if (typeof opt === 'string') return { value: opt, label: opt }\n if (typeof opt === 'object' && opt !== null && 'value' in opt && 'label' in opt) return opt as { value: string; label: string }\n if (typeof opt === 'object' && opt !== null && 'label' in opt) return { value: (opt as any).label, label: (opt as any).label }\n return { value: String(opt), label: String(opt) }\n })\n }\n if (typeof options === 'object' && options !== null) {\n const obj = options as Record<string, unknown>\n if (Array.isArray(obj.choices)) return normalizeOptions(obj.choices)\n if (Array.isArray(obj.items)) return normalizeOptions(obj.items)\n if (Array.isArray(obj.options)) return normalizeOptions(obj.options)\n }\n return []\n}\n\nexport function FormField({ field, value, error, onChange, classPrefix = 'uptrade-form' }: FormFieldProps) {\n // Normalize options once\n const options = normalizeOptions(field.options)\n // Use CSS variables with inline style fallbacks\n const baseInputStyle: React.CSSProperties = {\n width: '100%',\n padding: 'var(--uptrade-input-padding, 10px 12px)',\n fontSize: 'var(--uptrade-font-size, 16px)',\n border: error \n ? '1px solid var(--uptrade-input-border-error, #ef4444)' \n : '1px solid var(--uptrade-input-border, #d1d5db)',\n borderRadius: 'var(--uptrade-input-radius, 6px)',\n backgroundColor: 'var(--uptrade-input-bg, #ffffff)',\n outline: 'none',\n fontFamily: 'inherit',\n }\n \n const labelStyle: React.CSSProperties = {\n display: 'block',\n marginBottom: 6,\n fontWeight: 'var(--uptrade-label-weight, 500)' as any,\n color: 'var(--uptrade-label-color, inherit)',\n }\n \n const errorStyle: React.CSSProperties = {\n color: 'var(--uptrade-error-color, #ef4444)',\n fontSize: 14,\n marginTop: 4,\n }\n \n const helpStyle: React.CSSProperties = {\n color: 'var(--uptrade-help-color, #6b7280)',\n fontSize: 14,\n marginTop: 4,\n }\n \n // Heading / Section Header (display only)\n if (field.field_type === 'heading' || field.field_type === 'section_header') {\n return <h3 className={`${classPrefix}__heading`} style={{ margin: '16px 0 8px', fontWeight: 600, fontSize: 18 }}>{field.label}</h3>\n }\n \n // Paragraph (display only)\n if (field.field_type === 'paragraph') {\n return <p className={`${classPrefix}__paragraph`} style={{ color: 'var(--uptrade-help-color, #6b7280)', margin: '8px 0' }}>{field.help_text || field.label}</p>\n }\n \n // Hidden field\n if (field.field_type === 'hidden') {\n return <input type=\"hidden\" name={field.slug} value={String(value || '')} />\n }\n \n return (\n <div className={`${classPrefix}__field ${classPrefix}__field--${field.field_type}`}>\n <label className={`${classPrefix}__label`} style={labelStyle}>\n {field.label}\n {field.is_required && <span style={{ color: 'var(--uptrade-error-color, #ef4444)' }}> *</span>}\n </label>\n \n {/* Text, Email, Phone/Tel, Number */}\n {['text', 'email', 'phone', 'tel', 'number'].includes(field.field_type) && (\n <input\n className={`${classPrefix}__input`}\n type={field.field_type === 'phone' || field.field_type === 'tel' ? 'tel' : field.field_type}\n name={field.slug}\n value={String(value || '')}\n placeholder={field.placeholder}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n />\n )}\n \n {/* Textarea */}\n {field.field_type === 'textarea' && (\n <textarea\n className={`${classPrefix}__textarea`}\n name={field.slug}\n value={String(value || '')}\n placeholder={field.placeholder}\n required={field.is_required}\n rows={4}\n onChange={(e) => onChange(e.target.value)}\n style={{ ...baseInputStyle, resize: 'vertical' }}\n />\n )}\n \n {/* Select */}\n {field.field_type === 'select' && (\n <select\n className={`${classPrefix}__select`}\n name={field.slug}\n value={String(value || '')}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n >\n <option value=\"\">{field.placeholder || 'Select an option'}</option>\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n )}\n \n {/* Multi-select */}\n {field.field_type === 'multi-select' && (\n <select\n className={`${classPrefix}__select ${classPrefix}__select--multi`}\n name={field.slug}\n value={Array.isArray(value) ? value : []}\n required={field.is_required}\n multiple\n onChange={(e) => {\n const selected = Array.from(e.target.selectedOptions, opt => opt.value)\n onChange(selected)\n }}\n style={{ ...baseInputStyle, height: 120 }}\n >\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n )}\n \n {/* Radio */}\n {field.field_type === 'radio' && (\n <div className={`${classPrefix}__radio-group`} style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {options.map((option) => (\n <label key={option.value} className={`${classPrefix}__radio-option`} style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"radio\"\n name={field.slug}\n value={option.value}\n checked={value === option.value}\n onChange={() => onChange(option.value)}\n />\n {option.label}\n </label>\n ))}\n </div>\n )}\n \n {/* Checkbox (single) */}\n {field.field_type === 'checkbox' && options.length === 0 && (\n <label className={`${classPrefix}__checkbox`} style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"checkbox\"\n name={field.slug}\n checked={!!value}\n onChange={(e) => onChange(e.target.checked)}\n />\n {field.help_text || field.label}\n </label>\n )}\n \n {/* Checkbox (multiple options) */}\n {field.field_type === 'checkbox' && options.length > 0 && (\n <div className={`${classPrefix}__checkbox-group`} style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {options.map((option) => {\n const selectedValues = Array.isArray(value) ? value : []\n const isChecked = selectedValues.includes(option.value)\n \n return (\n <label key={option.value} className={`${classPrefix}__checkbox-option`} style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"checkbox\"\n checked={isChecked}\n onChange={() => {\n if (isChecked) {\n onChange(selectedValues.filter(v => v !== option.value))\n } else {\n onChange([...selectedValues, option.value])\n }\n }}\n />\n {option.label}\n </label>\n )\n })}\n </div>\n )}\n \n {/* Date */}\n {field.field_type === 'date' && (\n <input\n className={`${classPrefix}__input ${classPrefix}__input--date`}\n type=\"date\"\n name={field.slug}\n value={String(value || '')}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n />\n )}\n \n {/* Time */}\n {field.field_type === 'time' && (\n <input\n className={`${classPrefix}__input ${classPrefix}__input--time`}\n type=\"time\"\n name={field.slug}\n value={String(value || '')}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n />\n )}\n \n {/* DateTime */}\n {field.field_type === 'datetime' && (\n <input\n className={`${classPrefix}__input ${classPrefix}__input--datetime`}\n type=\"datetime-local\"\n name={field.slug}\n value={String(value || '')}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n />\n )}\n \n {/* File */}\n {field.field_type === 'file' && (\n <input\n className={`${classPrefix}__input ${classPrefix}__input--file`}\n type=\"file\"\n name={field.slug}\n required={field.is_required}\n onChange={(e) => {\n const file = e.target.files?.[0]\n if (file) {\n // Could upload to Supabase Storage here\n onChange(file.name)\n }\n }}\n style={baseInputStyle}\n />\n )}\n \n {/* Rating */}\n {field.field_type === 'rating' && (\n <div className={`${classPrefix}__rating`} style={{ display: 'flex', gap: 4 }}>\n {[1, 2, 3, 4, 5].map((star) => (\n <button\n key={star}\n type=\"button\"\n onClick={() => onChange(star)}\n className={`${classPrefix}__rating-star`}\n style={{\n background: 'none',\n border: 'none',\n fontSize: 24,\n cursor: 'pointer',\n color: (value as number) >= star ? 'var(--uptrade-rating-active, #fbbf24)' : 'var(--uptrade-rating-inactive, #d1d5db)',\n }}\n >\n ★\n </button>\n ))}\n </div>\n )}\n \n {/* Slider */}\n {field.field_type === 'slider' && (\n <div className={`${classPrefix}__slider`}>\n <input\n type=\"range\"\n name={field.slug}\n value={Number(value || 50)}\n min={field.validation?.min || 0}\n max={field.validation?.max || 100}\n onChange={(e) => onChange(Number(e.target.value))}\n style={{ width: '100%' }}\n />\n <div className={`${classPrefix}__slider-value`} style={{ textAlign: 'center', marginTop: 4 }}>{String(value || 50)}</div>\n </div>\n )}\n \n {/* Error message */}\n {error && <p className={`${classPrefix}__error`} style={errorStyle}>{error}</p>}\n \n {/* Help text */}\n {field.help_text && !error && field.field_type !== 'checkbox' && (\n <p className={`${classPrefix}__help`} style={helpStyle}>{field.help_text}</p>\n )}\n </div>\n )\n}\n","/**\n * @uptrade/site-kit/forms - Form Client Component\n * \n * Handles form state, validation, and submission\n */\n\n'use client'\n\nimport React, { useState, useCallback, useMemo } from 'react'\nimport { useFormTracking } from './useFormTracking'\nimport { FormField } from './FormField'\nimport type { \n ManagedFormConfig, \n FormField as FormFieldType, \n FormRenderProps,\n FormSubmission,\n} from './types'\n\ninterface FormClientProps {\n config: ManagedFormConfig\n className?: string\n onSuccess?: (submission: FormSubmission) => void\n onError?: (error: Error) => void\n customRender?: (props: FormRenderProps) => React.ReactNode\n}\n\nexport function FormClient({\n config,\n className,\n onSuccess,\n onError,\n customRender,\n}: FormClientProps) {\n const [values, setValues] = useState<Record<string, unknown>>({})\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [step, setStep] = useState(1)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [isComplete, setIsComplete] = useState(false)\n \n const { trackStepChange, trackComplete } = useFormTracking({\n formId: config.id,\n totalSteps: config.total_steps,\n })\n \n // Get fields for current step\n const currentFields = useMemo(() => {\n if (!config.is_multi_step) {\n return config.fields || []\n }\n \n const currentStepConfig = config.steps?.find(s => s.step_number === step)\n if (!currentStepConfig) return config.fields || []\n \n return (config.fields || []).filter(f => f.step_id === currentStepConfig.id)\n }, [config, step])\n \n // Check if field is visible (conditional logic)\n const isFieldVisible = useCallback((field: FormFieldType): boolean => {\n if (!field.conditional?.show_when) return true\n \n const { field: condField, operator, value } = field.conditional.show_when\n const fieldValue = values[condField]\n \n switch (operator) {\n case 'equals':\n return fieldValue === value\n case 'not_equals':\n return fieldValue !== value\n case 'contains':\n return String(fieldValue).includes(String(value))\n case 'not_contains':\n return !String(fieldValue).includes(String(value))\n case 'is_empty':\n return !fieldValue || fieldValue === ''\n case 'not_empty':\n return !!fieldValue && fieldValue !== ''\n case 'greater_than':\n return Number(fieldValue) > Number(value)\n case 'less_than':\n return Number(fieldValue) < Number(value)\n default:\n return true\n }\n }, [values])\n \n // Validate field\n const validateField = useCallback((field: FormFieldType): string | null => {\n if (!isFieldVisible(field)) return null\n // Skip display-only field types\n if (['heading', 'section_header', 'paragraph', 'hidden'].includes(field.field_type)) return null\n \n const value = values[field.slug]\n const rules = field.validation || {}\n \n // Required check\n if (field.is_required && (!value || value === '')) {\n return rules.custom_error || `${field.label} is required`\n }\n \n if (!value) return null\n \n const strValue = String(value)\n \n // Length checks\n if (rules.min_length && strValue.length < rules.min_length) {\n return `${field.label} must be at least ${rules.min_length} characters`\n }\n if (rules.max_length && strValue.length > rules.max_length) {\n return `${field.label} must be no more than ${rules.max_length} characters`\n }\n \n // Numeric checks\n if (rules.min !== undefined && Number(value) < rules.min) {\n return `${field.label} must be at least ${rules.min}`\n }\n if (rules.max !== undefined && Number(value) > rules.max) {\n return `${field.label} must be no more than ${rules.max}`\n }\n \n // Pattern check\n if (rules.pattern && !new RegExp(rules.pattern).test(strValue)) {\n return rules.custom_error || `${field.label} is invalid`\n }\n \n // Email check\n if (field.field_type === 'email' && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(strValue)) {\n return 'Please enter a valid email address'\n }\n \n // Phone check\n if (field.field_type === 'phone' && !/^[\\d\\s\\-\\+\\(\\)]+$/.test(strValue)) {\n return 'Please enter a valid phone number'\n }\n \n return null\n }, [values, isFieldVisible])\n \n // Validate current step\n const validateStep = useCallback((): boolean => {\n const newErrors: Record<string, string> = {}\n \n for (const field of currentFields) {\n const error = validateField(field)\n if (error) {\n newErrors[field.slug] = error\n }\n }\n \n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }, [currentFields, validateField])\n \n // Set field value\n const setFieldValue = useCallback((key: string, value: unknown) => {\n setValues(prev => ({ ...prev, [key]: value }))\n // Clear error when field changes\n if (errors[key]) {\n setErrors(prev => {\n const next = { ...prev }\n delete next[key]\n return next\n })\n }\n }, [errors])\n \n // Step navigation\n const nextStep = useCallback((): boolean => {\n if (!validateStep()) return false\n \n if (step < config.total_steps) {\n const newStep = step + 1\n setStep(newStep)\n trackStepChange(newStep)\n return true\n }\n return false\n }, [step, config.total_steps, validateStep, trackStepChange])\n \n const prevStep = useCallback(() => {\n if (step > 1) {\n const newStep = step - 1\n setStep(newStep)\n trackStepChange(newStep)\n }\n }, [step, trackStepChange])\n \n const goToStep = useCallback((targetStep: number) => {\n if (targetStep >= 1 && targetStep <= config.total_steps) {\n setStep(targetStep)\n trackStepChange(targetStep)\n }\n }, [config.total_steps, trackStepChange])\n \n // Submit form\n const submit = useCallback(async () => {\n if (!validateStep()) return\n \n setIsSubmitting(true)\n \n try {\n const apiUrl = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.uptrademedia.com'\n : 'https://api.uptrademedia.com'\n const apiKey = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_KEY__\n : undefined\n \n if (!apiKey) {\n throw new Error('API key is required. Set NEXT_PUBLIC_UPTRADE_API_KEY in your .env')\n }\n \n // Create submission with all required metadata\n const submission = {\n form_id: config.id,\n project_id: config.project_id,\n data: values,\n routing_type: config.form_type,\n status: 'new',\n page_url: typeof window !== 'undefined' ? window.location.href : null,\n referrer: typeof document !== 'undefined' ? document.referrer || null : null,\n user_agent: typeof navigator !== 'undefined' ? navigator.userAgent : null,\n session_id: typeof sessionStorage !== 'undefined' \n ? sessionStorage.getItem('_uptrade_sid') \n : null,\n ...getUTMParams(),\n }\n \n const response = await fetch(`${apiUrl}/api/public/forms/submit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify(submission),\n })\n \n if (!response.ok) {\n throw new Error(`Failed to submit form: ${response.statusText}`)\n }\n \n const data = await response.json()\n \n trackComplete()\n setIsComplete(true)\n onSuccess?.(data)\n \n // Redirect if configured\n if (config.redirect_url) {\n window.location.href = config.redirect_url\n }\n } catch (error) {\n console.error('[Forms] Submission error:', error)\n onError?.(error as Error)\n } finally {\n setIsSubmitting(false)\n }\n }, [config, values, validateStep, trackComplete, onSuccess, onError])\n \n // Progress percentage\n const progress = useMemo(() => {\n return Math.round((step / config.total_steps) * 100)\n }, [step, config.total_steps])\n \n // Render props for custom rendering\n const renderProps: FormRenderProps = {\n config,\n fields: currentFields,\n step,\n totalSteps: config.total_steps,\n values,\n errors,\n isSubmitting,\n progress,\n nextStep,\n prevStep,\n goToStep,\n submit,\n setFieldValue,\n isFieldVisible,\n }\n \n // Show success message\n if (isComplete) {\n return (\n <div className={className}>\n <p>{config.success_message}</p>\n </div>\n )\n }\n \n // Custom render\n if (customRender) {\n return <>{customRender(renderProps)}</>\n }\n \n // Default render\n return (\n <form\n className={`uptrade-form ${className || ''}`}\n onSubmit={(e) => {\n e.preventDefault()\n if (step < config.total_steps) {\n nextStep()\n } else {\n submit()\n }\n }}\n >\n {/* Step indicator for multi-step */}\n {config.is_multi_step && (\n <div className=\"uptrade-form__progress\" style={{ marginBottom: 20 }}>\n <div className=\"uptrade-form__progress-header\" style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 8 }}>\n <span className=\"uptrade-form__progress-step\">Step {step} of {config.total_steps}</span>\n <span className=\"uptrade-form__progress-percent\">{progress}%</span>\n </div>\n <div className=\"uptrade-form__progress-track\" style={{ \n height: 4, \n backgroundColor: 'var(--uptrade-progress-bg, #e5e7eb)', \n borderRadius: 2,\n overflow: 'hidden' \n }}>\n <div className=\"uptrade-form__progress-bar\" style={{ \n width: `${progress}%`, \n height: '100%', \n backgroundColor: 'var(--uptrade-progress-fill, #3b82f6)',\n transition: 'width 0.3s ease'\n }} />\n </div>\n </div>\n )}\n \n {/* Fields */}\n <div className=\"uptrade-form__fields\" style={{ display: 'flex', flexWrap: 'wrap', gap: 16 }}>\n {currentFields.map((field) => {\n if (!isFieldVisible(field)) return null\n \n const widthMap: Record<string, string> = {\n full: '100%',\n half: 'calc(50% - 8px)',\n third: 'calc(33.33% - 11px)',\n quarter: 'calc(25% - 12px)',\n }\n const widthStyle = widthMap[field.width] || '100%'\n \n return (\n <div key={field.id} className={`uptrade-form__field-wrapper uptrade-form__field-wrapper--${field.width}`} style={{ width: widthStyle }}>\n <FormField\n field={field}\n value={values[field.slug]}\n error={errors[field.slug]}\n onChange={(value) => setFieldValue(field.slug, value)}\n />\n </div>\n )\n })}\n </div>\n \n {/* Navigation buttons */}\n <div className=\"uptrade-form__actions\" style={{ \n display: 'flex', \n justifyContent: step > 1 ? 'space-between' : 'flex-end',\n marginTop: 24 \n }}>\n {step > 1 && (\n <button type=\"button\" className=\"uptrade-form__btn uptrade-form__btn--back\" onClick={prevStep}>\n Back\n </button>\n )}\n <button type=\"submit\" className=\"uptrade-form__btn uptrade-form__btn--submit\" disabled={isSubmitting}>\n {isSubmitting \n ? 'Submitting...' \n : step < config.total_steps \n ? 'Next' \n : config.submit_button_text\n }\n </button>\n </div>\n \n {/* Honeypot field */}\n {config.honeypot_enabled && (\n <input\n type=\"text\"\n name=\"website\"\n tabIndex={-1}\n autoComplete=\"off\"\n style={{ \n position: 'absolute', \n left: -9999, \n opacity: 0,\n pointerEvents: 'none' \n }}\n onChange={(e) => {\n if (e.target.value) {\n // Bot detected\n console.warn('[Forms] Honeypot triggered')\n }\n }}\n />\n )}\n </form>\n )\n}\n\n// Helper\nfunction getUTMParams(): Record<string, string> {\n if (typeof window === 'undefined') return {}\n \n const params = new URLSearchParams(window.location.search)\n const utmParams: Record<string, string> = {}\n \n for (const key of ['utm_source', 'utm_medium', 'utm_campaign']) {\n const value = params.get(key)\n if (value) utmParams[key] = value\n }\n \n return utmParams\n}\n","/**\n * @uptrade/site-kit/forms - Managed Form Component\n * \n * Fetches form config from Portal API and renders fields with validation\n */\n\n'use client'\n\nimport type { ManagedFormProps } from './types'\nimport { useForm } from './useForm'\nimport { FormClient } from './FormClient'\n\n// ============================================\n// Main Component (Client Component)\n// ============================================\n\nexport function ManagedForm({\n formId,\n projectId,\n className,\n onSuccess,\n onError,\n children,\n}: ManagedFormProps) {\n const {\n form,\n isLoading,\n fetchError,\n } = useForm(formId, {\n projectId,\n onSuccess,\n onError,\n })\n \n if (isLoading) {\n return (\n <div className={className}>\n <p style={{ color: '#6b7280' }}>Loading form...</p>\n </div>\n )\n }\n \n if (fetchError || !form) {\n return (\n <div className={className}>\n <p style={{ color: '#ef4444' }}>\n {fetchError?.message || 'Form not found or inactive.'}\n </p>\n </div>\n )\n }\n \n // Pass to client component for interactivity\n return (\n <FormClient\n config={form}\n className={className}\n onSuccess={onSuccess}\n onError={onError}\n customRender={children}\n />\n )\n}\n\n"]}