{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "analytics",
  "title": "Analytics",
  "description": "trackEvent and experiment helpers.",
  "files": [
    {
      "path": "registry/default/lib/analytics.ts",
      "content": "/** Lightweight analytics + A/B testing - no external SDK required. */\n\nexport type AnalyticsEvent = {\n  name: string;\n  properties?: Record<string, string | number | boolean>;\n};\n\nexport type Experiment = {\n  id: string;\n  variants: string[];\n  weights?: number[];\n};\n\nconst STORAGE_PREFIX = \"ms_\";\nconst EXPERIMENT_PREFIX = `${STORAGE_PREFIX}exp_`;\n\nfunction isBrowser(): boolean {\n  return typeof window !== \"undefined\";\n}\n\n/** Assign and persist a variant for an experiment (sticky per user). */\nexport function getExperimentVariant(experiment: Experiment): string {\n  if (!isBrowser()) return experiment.variants[0] ?? \"\";\n\n  const key = `${EXPERIMENT_PREFIX}${experiment.id}`;\n  const stored = localStorage.getItem(key);\n  if (stored && experiment.variants.includes(stored)) return stored;\n\n  const weights = experiment.weights ?? experiment.variants.map(() => 1);\n  const total = weights.reduce((a, b) => a + b, 0);\n  let roll = Math.random() * total;\n  let variant = experiment.variants[0] ?? \"\";\n  for (let i = 0; i < experiment.variants.length; i++) {\n    roll -= weights[i] ?? 0;\n    if (roll <= 0) {\n      variant = experiment.variants[i] ?? variant;\n      break;\n    }\n  }\n\n  localStorage.setItem(key, variant);\n  trackEvent(\"experiment_assigned\", {\n    experiment_id: experiment.id,\n    variant,\n  });\n  return variant;\n}\n\n/** Track an event - forwards to Plausible/GA if configured, always logs in dev. */\nexport function trackEvent(\n  name: string,\n  properties?: Record<string, string | number | boolean>\n): void {\n  if (!isBrowser()) return;\n\n  const payload: AnalyticsEvent = { name, properties };\n\n  if (process.env.NODE_ENV === \"development\") {\n    console.debug(\"[analytics]\", payload);\n  }\n\n  // Plausible custom events\n  const plausible = (\n    window as Window & { plausible?: (e: string, o?: { props: Record<string, string | number | boolean> }) => void }\n  ).plausible;\n  if (plausible) {\n    plausible(name, properties ? { props: properties } : undefined);\n  }\n\n  // Google Analytics 4\n  const gtag = (\n    window as Window & { gtag?: (...args: unknown[]) => void }\n  ).gtag;\n  if (gtag) {\n    gtag(\"event\", name, properties);\n  }\n\n  // Local event buffer for debugging\n  try {\n    const key = `${STORAGE_PREFIX}events`;\n    const existing = JSON.parse(localStorage.getItem(key) ?? \"[]\") as AnalyticsEvent[];\n    existing.push({ ...payload, properties: { ...properties, ts: Date.now() } as Record<string, string | number | boolean> });\n    localStorage.setItem(key, JSON.stringify(existing.slice(-50)));\n  } catch {\n    // ignore quota errors\n  }\n}\n\nexport const CTA_EXPERIMENT: Experiment = {\n  id: \"homepage_cta\",\n  variants: [\"book_call\", \"try_planner\"],\n  weights: [50, 50],\n};\n\nexport const CONTACT_FORM_EXPERIMENT: Experiment = {\n  id: \"contact_form_layout\",\n  variants: [\"multi_step\", \"single_step\"],\n  weights: [70, 30],\n};\n",
      "type": "registry:lib",
      "target": "lib/analytics.ts"
    }
  ],
  "type": "registry:lib"
}