@coursebuilder/analytics 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/api/index.d.ts +158 -0
- package/dist/api/index.js +317 -0
- package/dist/api/index.js.map +1 -0
- package/dist/catalog.d.ts +14 -0
- package/dist/catalog.js +209 -0
- package/dist/catalog.js.map +1 -0
- package/dist/components/index.d.ts +172 -0
- package/dist/components/index.js +1258 -0
- package/dist/components/index.js.map +1 -0
- package/dist/engine.d.ts +20 -0
- package/dist/engine.js +350 -0
- package/dist/engine.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +353 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/database.d.ts +79 -0
- package/dist/providers/database.js +533 -0
- package/dist/providers/database.js.map +1 -0
- package/dist/providers/derived.d.ts +45 -0
- package/dist/providers/derived.js +32 -0
- package/dist/providers/derived.js.map +1 -0
- package/dist/providers/ga4.d.ts +43 -0
- package/dist/providers/ga4.js +220 -0
- package/dist/providers/ga4.js.map +1 -0
- package/dist/providers/index.d.ts +8 -0
- package/dist/providers/index.js +1239 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/mux.d.ts +103 -0
- package/dist/providers/mux.js +241 -0
- package/dist/providers/mux.js.map +1 -0
- package/dist/providers/survey.d.ts +102 -0
- package/dist/providers/survey.js +233 -0
- package/dist/providers/survey.js.map +1 -0
- package/dist/types.d.ts +303 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/package.json +101 -0
- package/src/api/catalog-handler.ts +321 -0
- package/src/api/index.ts +4 -0
- package/src/api/token-handler.ts +71 -0
- package/src/catalog.ts +223 -0
- package/src/components/country-chart.tsx +114 -0
- package/src/components/index.ts +5 -0
- package/src/components/omnibus-dashboard.tsx +1460 -0
- package/src/components/revenue-chart.tsx +251 -0
- package/src/components/use-chart-colors.ts +75 -0
- package/src/engine.ts +201 -0
- package/src/index.ts +7 -0
- package/src/providers/database.ts +795 -0
- package/src/providers/derived.ts +79 -0
- package/src/providers/ga4.ts +173 -0
- package/src/providers/index.ts +44 -0
- package/src/providers/mux.ts +438 -0
- package/src/providers/survey.ts +487 -0
- package/src/types.ts +333 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/omnibus-dashboard.tsx","../../src/components/country-chart.tsx","../../src/components/use-chart-colors.ts","../../src/components/revenue-chart.tsx"],"sourcesContent":["'use client'\n\nimport React, { useState, useTransition } from 'react'\nimport {\n\tCheckIcon,\n\tChevronDownIcon,\n\tClipboardIcon,\n\tClipboardListIcon,\n\tClockIcon,\n\tDollarSignIcon,\n\tExternalLinkIcon,\n\tFilmIcon,\n\tGlobeIcon,\n\tLinkIcon,\n\tLoader2Icon,\n\tMousePointerClickIcon,\n\tPlayIcon,\n\tShoppingCartIcon,\n\tTrendingUpIcon,\n} from 'lucide-react'\nimport { parseAsStringLiteral, useQueryState } from 'nuqs'\n\nimport {\n\tCard,\n\tCardContent,\n\tCardDescription,\n\tCardHeader,\n\tCardTitle,\n} from '@coursebuilder/ui'\n\nimport type { AnalyticsRange } from '../types'\nimport { CountryChart } from './country-chart'\nimport { RevenueChart } from './revenue-chart'\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/**\n * Data structure for the Mux video dashboard, inlined here so the shared\n * component does not depend on the app-level mux-data module.\n */\nexport interface VideoDashboardData {\n\toverview: {\n\t\ttotalViews: number\n\t\tuniqueViewers: number\n\t\ttotalWatchTimeMs: number\n\t\ttotalPlayingTimeMs: number\n\t\tviewerExperienceScore: number\n\t\tglobalExperienceScore: number | null\n\t}\n\twatchTimeSeries: {\n\t\tdate: string\n\t\twatchTimeMs: number\n\t}[]\n\ttopVideos: {\n\t\ttitle: string\n\t\tviews: number\n\t\twatchTimeMs: number\n\t\tplayingTimeMs: number\n\t}[]\n\tcountries: {\n\t\tcountry: string\n\t\tviews: number\n\t\twatchTimeMs: number\n\t}[]\n}\n\nexport interface DashboardData {\n\tsummary: {\n\t\ttotalRevenue: number\n\t\tpurchaseCount: number\n\t\tavgOrderValue: number\n\t}\n\tdaily: { date: string; revenue: number; count: number }[]\n\tpreviousDaily: { date: string; revenue: number; count: number }[]\n\tbyProduct: {\n\t\tproductId: string\n\t\tproductName: string\n\t\trevenue: number\n\t\tcount: number\n\t}[]\n\tbyCountry: { country: string; revenue: number; count: number }[]\n\trecentPurchases: {\n\t\tid: string\n\t\tcreatedAt: Date\n\t\ttotalAmount: number\n\t\tproductName: string\n\t\tproductId: string\n\t\tcountry: string | null\n\t\tcouponId: string | null\n\t\tuserName: string | null\n\t\tuserEmail: string | null\n\t\tisTeam: boolean\n\t\tseats: number | null\n\t}[]\n\tattribution: { type: string; count: number }[]\n\tshortlinks: {\n\t\tshortlinkId: string\n\t\tslug: string\n\t\turl: string\n\t\tclicks: number\n\t\tsignups: number\n\t\tpurchases: number\n\t}[]\n\ttraffic: {\n\t\tsessions: number\n\t\ttotalUsers: number\n\t\tnewUsers: number\n\t\tpageviews: number\n\t} | null\n\tattributionCoverage: {\n\t\ttotalRevenue: number\n\t\tattributedRevenue: number\n\t\tunattributedRevenue: number\n\t\tattributionRate: number\n\t\ttotalPurchases: number\n\t} | null\n\tmux: VideoDashboardData | null\n\tmuxThumbnails: Record<string, string>\n\tsurveySegments:\n\t\t| {\n\t\t\t\tquestionId: string\n\t\t\t\tquestion: string\n\t\t\t\ttype: string | null\n\t\t\t\tresponses: number\n\t\t\t\tanswerDistribution: { answer: string; count: number }[]\n\t\t }[]\n\t\t| null\n\tsurveyCorrelation: {\n\t\ttotalRespondents: number\n\t\trespondentsWhoPurchased: number\n\t\toverallConversionRate: number\n\t\ttotalRevenueFromRespondents: number\n\t\tprePurchaseRespondents: number\n\t\tpostPurchaseRespondents: number\n\t\tneverPurchasedRespondents: number\n\t\tbaselineConversionRate: number\n\t\tbyQuestion: {\n\t\t\tquestionId: string\n\t\t\tquestionTitle: string | null\n\t\t\tanswer: string\n\t\t\trespondents: number\n\t\t\tpurchasers: number\n\t\t\tconversionRate: number\n\t\t\trevenue: number\n\t\t\tprePurchaseCount: number\n\t\t\tpostPurchaseCount: number\n\t\t}[]\n\t} | null\n}\n\n// ─── Formatters ──────────────────────────────────────────────────────────────\n\nfunction fmt$(v: number): string {\n\treturn new Intl.NumberFormat('en-US', {\n\t\tstyle: 'currency',\n\t\tcurrency: 'USD',\n\t\tminimumFractionDigits: 0,\n\t\tmaximumFractionDigits: 0,\n\t}).format(v)\n}\n\nfunction fmtK(v: number): string {\n\tif (v >= 1_000_000) return `${(v / 1_000_000).toFixed(1)}M`\n\tif (v >= 1_000) return `${(v / 1_000).toFixed(1)}K`\n\treturn v.toLocaleString()\n}\n\nfunction fmtWatchMs(ms: number): string {\n\tconst hours = ms / 1000 / 60 / 60\n\tif (hours >= 1000) return `${(hours / 1000).toFixed(1)}k hrs`\n\tif (hours >= 1) return `${hours.toFixed(0)} hrs`\n\treturn `${(ms / 1000 / 60).toFixed(0)} min`\n}\n\nfunction fmtAgo(date: Date): string {\n\tconst ms = Date.now() - new Date(date).getTime()\n\tconst h = Math.floor(ms / 3_600_000)\n\tif (h < 1) return 'just now'\n\tif (h < 24) return `${h}h ago`\n\tconst d = Math.floor(h / 24)\n\treturn d === 1 ? 'yesterday' : `${d}d ago`\n}\n\nfunction countryFlag(code: string | null): string {\n\tif (!code || code.length !== 2) return '🌍'\n\tconst offset = 0x1f1e6\n\tconst a = code.toUpperCase().charCodeAt(0) - 65 + offset\n\tconst b = code.toUpperCase().charCodeAt(1) - 65 + offset\n\treturn String.fromCodePoint(a, b)\n}\n\n// ─── Stat Card ───────────────────────────────────────────────────────────────\n\nfunction Stat({\n\tlabel,\n\tvalue,\n\tsub,\n\ticon: Icon,\n\taccent,\n}: {\n\tlabel: string\n\tvalue: string\n\tsub?: string\n\ticon: React.ComponentType<{ className?: string }>\n\taccent?: boolean\n\tindex?: number\n}) {\n\treturn (\n\t\t<div\n\t\t\tclassName={`rounded-xl border p-4 transition-[transform,box-shadow] duration-[160ms] ease-[cubic-bezier(0.23,1,0.32,1)] active:scale-[0.97] motion-safe:hover:-translate-y-0.5 motion-safe:hover:shadow-md [@media(hover:hover)]:cursor-default ${accent ? 'border-emerald-500/20 bg-emerald-500/[0.03]' : 'border-border/50 bg-card/50'}`}\n\t\t>\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<span className=\"text-muted-foreground text-[11px] font-medium uppercase tracking-wider\">\n\t\t\t\t\t{label}\n\t\t\t\t</span>\n\t\t\t\t<Icon className=\"text-muted-foreground/40 group-hover:text-muted-foreground/70 h-3.5 w-3.5 transition-colors duration-200\" />\n\t\t\t</div>\n\t\t\t<div className=\"mt-1.5\">\n\t\t\t\t<span className=\"text-foreground text-xl font-bold tabular-nums tracking-tight\">\n\t\t\t\t\t{value}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t{sub && (\n\t\t\t\t<p className=\"text-muted-foreground mt-0.5 text-[11px] leading-relaxed\">\n\t\t\t\t\t{sub}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// ─── Agent API Card ───────────────────────────────────────────────────────────\n\nfunction AgentApiCard({ appName = 'aihero' }: { appName?: string }) {\n\tconst [state, setState] = useState<'idle' | 'generating' | 'copied'>('idle')\n\tconst baseUrl =\n\t\ttypeof window !== 'undefined'\n\t\t\t? window.location.origin\n\t\t\t: 'https://www.aihero.dev'\n\tconst endpoint = `${baseUrl}/api/analytics`\n\n\tconst handleCopy = async () => {\n\t\tsetState('generating')\n\t\ttry {\n\t\t\t// Fetch token and catalog in parallel so prompt matches available surfaces\n\t\t\tconst [tokenRes, catalogRes] = await Promise.all([\n\t\t\t\tfetch('/api/analytics/token', { method: 'POST' }),\n\t\t\t\tfetch('/api/analytics')\n\t\t\t\t\t.then((r) => r.json())\n\t\t\t\t\t.catch(() => null),\n\t\t\t])\n\t\t\tif (!tokenRes.ok) throw new Error('Failed to generate token')\n\t\t\tconst { token, ttlLabel, expiresAt } = await tokenRes.json()\n\n\t\t\t// Build surface examples from live catalog\n\t\t\tconst surfaces: {\n\t\t\t\tname: string\n\t\t\t\tdescription: string\n\t\t\t\tcategory: string\n\t\t\t}[] = catalogRes?.surfaces ?? []\n\t\t\tconst categories = new Map<string, number>()\n\t\t\tfor (const s of surfaces) {\n\t\t\t\tcategories.set(s.category, (categories.get(s.category) ?? 0) + 1)\n\t\t\t}\n\t\t\tconst categoryLine = [...categories.entries()]\n\t\t\t\t.map(([cat, count]) => `${cat} (${count})`)\n\t\t\t\t.join(', ')\n\n\t\t\t// Pick one representative surface per category for the examples\n\t\t\tconst picks: { name: string; description: string }[] = [\n\t\t\t\t{ name: '', description: 'surface catalog' },\n\t\t\t]\n\t\t\tconst seen = new Set<string>()\n\t\t\tconst preferred = [\n\t\t\t\t'summary',\n\t\t\t\t'attribution/coverage',\n\t\t\t\t'traffic',\n\t\t\t\t'youtube/videos',\n\t\t\t\t'surveys',\n\t\t\t\t'correlation/traffic-revenue',\n\t\t\t\t'correlation/youtube-revenue',\n\t\t\t\t'attribution/email-campaigns',\n\t\t\t]\n\t\t\tfor (const name of preferred) {\n\t\t\t\tconst s = surfaces.find((x: any) => x.name === name)\n\t\t\t\tif (s && !seen.has(s.category)) {\n\t\t\t\t\tseen.add(s.category)\n\t\t\t\t\tpicks.push({ name: s.name, description: s.description })\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Fill any remaining categories\n\t\t\tfor (const s of surfaces) {\n\t\t\t\tif (!seen.has(s.category)) {\n\t\t\t\t\tseen.add(s.category)\n\t\t\t\t\tpicks.push({ name: s.name, description: s.description })\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst exampleLines = picks\n\t\t\t\t.map((p) =>\n\t\t\t\t\tp.name\n\t\t\t\t\t\t? `GET ${endpoint}?surface=${p.name}&range=30d → ${p.description}`\n\t\t\t\t\t\t: `GET ${endpoint} → ${p.description}`,\n\t\t\t\t)\n\t\t\t\t.join('\\n')\n\n\t\t\tconst hasYouTube = surfaces.some((s: any) => s.category === 'youtube')\n\t\t\tconst ytNote = hasYouTube\n\t\t\t\t? `\\nImportant:\n- YouTube surfaces are useful for correlation and content analysis, not live dashboard ops\n- YouTube Analytics data lags by about 48 hours, so call out the delay when interpreting fresh periods\\n`\n\t\t\t\t: ''\n\n\t\t\tconst prompt = `# ${appName} Analytics API\nBase: ${endpoint}\nAuth: Bearer ${token}\nToken expires: ${new Date(expiresAt).toLocaleString()} (${ttlLabel})\n\n${exampleLines}\n${ytNote}\nExample:\ncurl -H \"Authorization: Bearer ${token}\" \"${endpoint}?surface=summary&range=30d\"\n\nCategories: ${categoryLine}\nEvery response has contextual next_actions. Errors have codes + fix hints.`\n\n\t\t\tawait navigator.clipboard.writeText(prompt)\n\t\t\tsetState('copied')\n\t\t\tsetTimeout(() => setState('idle'), 3000)\n\t\t} catch {\n\t\t\tsetState('idle')\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className=\"border-border/30 flex flex-wrap items-center justify-between gap-2 rounded-lg border px-3 py-2 sm:px-4 sm:py-2.5\">\n\t\t\t<div className=\"flex min-w-0 items-center gap-2 text-xs\">\n\t\t\t\t<span className=\"text-muted-foreground/60 shrink-0\">⚡</span>\n\t\t\t\t<a\n\t\t\t\t\thref=\"/api/analytics\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground shrink-0 font-medium underline-offset-2 transition-colors hover:underline\"\n\t\t\t\t>\n\t\t\t\t\t/api/analytics\n\t\t\t\t</a>\n\t\t\t\t<span className=\"text-muted-foreground/40 hidden sm:inline\">·</span>\n\t\t\t\t<span className=\"text-muted-foreground/60 hidden sm:inline\">\n\t\t\t\t\tHATEOAS catalog\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<button\n\t\t\t\tonClick={handleCopy}\n\t\t\t\tdisabled={state === 'generating'}\n\t\t\t\tclassName={`flex shrink-0 items-center gap-1.5 rounded-md px-3 py-1.5 text-[11px] font-semibold transition-[transform,background-color,color,box-shadow] duration-[160ms] ease-[cubic-bezier(0.23,1,0.32,1)] active:scale-[0.97] disabled:pointer-events-none ${\n\t\t\t\t\tstate === 'copied'\n\t\t\t\t\t\t? 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400'\n\t\t\t\t\t\t: state === 'generating'\n\t\t\t\t\t\t\t? 'bg-muted text-muted-foreground'\n\t\t\t\t\t\t\t: 'bg-primary/10 text-primary hover:bg-primary/20 shadow-sm'\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\t{state === 'generating' ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Loader2Icon className=\"h-3 w-3 animate-spin\" />\n\t\t\t\t\t\tGenerating token…\n\t\t\t\t\t</>\n\t\t\t\t) : state === 'copied' ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<CheckIcon className=\"h-3 w-3\" />\n\t\t\t\t\t\tCopied with token\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ClipboardIcon className=\"h-3 w-3\" />\n\t\t\t\t\t\tCopy agent prompt\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t</div>\n\t)\n}\n\n// ─── Video Performance Cards ──────────────────────────────────────────────────\n\ninterface VideoItem {\n\ttitle: string\n\tthumbnailUrl: string | null\n\twatchTime: string\n\tviews: number\n\thref: string | null\n\tbadge?: string\n}\n\nfunction TopVideosCard({\n\tlabel,\n\tsubtitle,\n\ticon: Icon,\n\ticonColor,\n\tvideos,\n}: {\n\tlabel: string\n\tsubtitle: string\n\ticon: React.ComponentType<{ className?: string }>\n\ticonColor: string\n\tvideos: VideoItem[]\n}) {\n\tif (videos.length === 0) return null\n\n\treturn (\n\t\t<Card className=\"flex-1\">\n\t\t\t<CardHeader className=\"pb-3\">\n\t\t\t\t<div className=\"flex items-center gap-2.5\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={`flex h-7 w-7 items-center justify-center rounded-lg ${iconColor}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<CardTitle className=\"text-sm font-semibold\">{label}</CardTitle>\n\t\t\t\t\t\t<CardDescription className=\"text-[11px]\">\n\t\t\t\t\t\t\t{subtitle}\n\t\t\t\t\t\t</CardDescription>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</CardHeader>\n\t\t\t<CardContent className=\"space-y-0 pt-0\">\n\t\t\t\t{videos.map((v, i) => {\n\t\t\t\t\tconst Row = v.href ? 'a' : 'div'\n\t\t\t\t\tconst linkProps = v.href\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\thref: v.href,\n\t\t\t\t\t\t\t\ttarget: '_blank' as const,\n\t\t\t\t\t\t\t\trel: 'noopener noreferrer',\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Row\n\t\t\t\t\t\t\tkey={v.title}\n\t\t\t\t\t\t\t{...linkProps}\n\t\t\t\t\t\t\tclassName=\"hover:bg-muted/40 group -mx-2 flex items-center gap-3 rounded-lg px-2 py-2.5 transition-[background-color] duration-[150ms] ease-[cubic-bezier(0.23,1,0.32,1)]\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground/50 w-4 text-right text-xs font-medium tabular-nums\">\n\t\t\t\t\t\t\t\t{i + 1}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{v.thumbnailUrl ? (\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tsrc={v.thumbnailUrl}\n\t\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\t\twidth={72}\n\t\t\t\t\t\t\t\t\theight={40}\n\t\t\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t\t\t\tclassName=\"hidden h-10 w-[72px] shrink-0 rounded object-cover sm:block\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<div className=\"bg-muted hidden h-10 w-[72px] shrink-0 items-center justify-center rounded sm:flex\">\n\t\t\t\t\t\t\t\t\t<PlayIcon\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground/40 h-4 w-4\"\n\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t<p className=\"text-foreground/90 group-hover:text-foreground line-clamp-2 text-[13px] font-medium leading-snug transition-colors\">\n\t\t\t\t\t\t\t\t\t{v.title}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<div className=\"text-muted-foreground mt-1 flex flex-wrap items-center gap-x-3 gap-y-0.5 text-[11px]\">\n\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t<ClockIcon className=\"h-3 w-3\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t\t{v.watchTime}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span>{fmtK(v.views)} views</span>\n\t\t\t\t\t\t\t\t\t{v.badge && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-emerald-600 dark:text-emerald-400\">\n\t\t\t\t\t\t\t\t\t\t\t{v.badge}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{v.href && (\n\t\t\t\t\t\t\t\t<ExternalLinkIcon\n\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground/0 group-hover:text-muted-foreground/60 h-3.5 w-3.5 shrink-0 transition-colors\"\n\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Row>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</CardContent>\n\t\t</Card>\n\t)\n}\n\n// ─── Shortlinks Card ──────────────────────────────────────────────────────────\n\nfunction ShortlinksCard({\n\tshortlinks,\n\ttotalClicks,\n}: {\n\tshortlinks: DashboardData['shortlinks']\n\ttotalClicks: number\n}) {\n\tconst [expanded, setExpanded] = useState(false)\n\tif (shortlinks.length === 0) return null\n\n\tconst visible = expanded ? shortlinks : shortlinks.slice(0, 10)\n\tconst hasMore = shortlinks.length > 10\n\tconst totalSignups = shortlinks.reduce((s, l) => s + l.signups, 0)\n\tconst totalPurchases = shortlinks.reduce((s, l) => s + l.purchases, 0)\n\n\treturn (\n\t\t<Card>\n\t\t\t<CardHeader>\n\t\t\t\t<div className=\"flex items-center gap-2.5\">\n\t\t\t\t\t<LinkIcon className=\"text-muted-foreground h-4 w-4\" />\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<CardTitle className=\"text-sm font-semibold\">\n\t\t\t\t\t\t\tTop Shortlinks\n\t\t\t\t\t\t</CardTitle>\n\t\t\t\t\t\t<CardDescription className=\"text-[11px]\">\n\t\t\t\t\t\t\t{fmtK(totalClicks)} clicks · {totalSignups.toLocaleString()}{' '}\n\t\t\t\t\t\t\tsignups · {totalPurchases.toLocaleString()} purchases\n\t\t\t\t\t\t</CardDescription>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</CardHeader>\n\t\t\t<CardContent>\n\t\t\t\t<div className=\"overflow-x-auto\">\n\t\t\t\t\t<table className=\"w-full\">\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr className=\"text-muted-foreground border-border/50 border-b text-left text-[11px] uppercase tracking-wider\">\n\t\t\t\t\t\t\t\t<th className=\"pb-2.5 pr-4 font-medium\">Link</th>\n\t\t\t\t\t\t\t\t<th className=\"pb-2.5 pr-4 font-medium\">Destination</th>\n\t\t\t\t\t\t\t\t<th className=\"pb-2.5 text-right font-medium\">Clicks</th>\n\t\t\t\t\t\t\t\t<th className=\"hidden pb-2.5 text-right font-medium sm:table-cell\">\n\t\t\t\t\t\t\t\t\tSignups\n\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t<th className=\"hidden pb-2.5 text-right font-medium sm:table-cell\">\n\t\t\t\t\t\t\t\t\tPurchases\n\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody className=\"divide-border/30 divide-y\">\n\t\t\t\t\t\t\t{visible.map((link) => (\n\t\t\t\t\t\t\t\t<tr key={link.shortlinkId} className=\"group\">\n\t\t\t\t\t\t\t\t\t<td className=\"py-2.5 pr-4 text-sm font-medium\">\n\t\t\t\t\t\t\t\t\t\t/s/{link.slug}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"text-muted-foreground max-w-xs truncate py-2.5 pr-4 text-sm\">\n\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\thref={link.url}\n\t\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"hover:text-foreground inline-flex items-center gap-1 transition-colors\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{link.url\n\t\t\t\t\t\t\t\t\t\t\t\t.replace(/^https?:\\/\\/(www\\.)?/, '')\n\t\t\t\t\t\t\t\t\t\t\t\t.substring(0, 50)}\n\t\t\t\t\t\t\t\t\t\t\t<ExternalLinkIcon\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-3 w-3 opacity-0 transition-opacity group-hover:opacity-100\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"text-foreground py-2.5 text-right text-sm font-semibold tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t{link.clicks.toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"hidden py-2.5 text-right text-sm tabular-nums sm:table-cell\">\n\t\t\t\t\t\t\t\t\t\t{link.signups > 0 ? link.signups.toLocaleString() : '–'}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\t\t\tclassName={`hidden py-2.5 text-right text-sm font-semibold tabular-nums sm:table-cell ${link.purchases > 0 ? 'text-emerald-600 dark:text-emerald-400' : 'text-muted-foreground'}`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{link.purchases > 0 ? link.purchases.toLocaleString() : '–'}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t\t{hasMore && (\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={() => setExpanded(!expanded)}\n\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground mt-3 flex w-full items-center justify-center gap-1 text-xs transition-[color,transform] duration-[160ms] ease-[cubic-bezier(0.23,1,0.32,1)] active:scale-[0.97]\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ChevronDownIcon\n\t\t\t\t\t\t\tclassName={`h-3 w-3 transition-transform duration-[200ms] ease-[cubic-bezier(0.23,1,0.32,1)] ${expanded ? 'rotate-180' : ''}`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{expanded ? 'Show less' : `Show ${shortlinks.length - 10} more`}\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</CardContent>\n\t\t</Card>\n\t)\n}\n\n// ─── Range Selector ───────────────────────────────────────────────────────────\n\nconst RANGES: { value: AnalyticsRange; label: string }[] = [\n\t{ value: '24h', label: '24h' },\n\t{ value: '7d', label: '7d' },\n\t{ value: '30d', label: '30d' },\n\t{ value: '90d', label: '90d' },\n\t{ value: 'all', label: 'All' },\n]\n\nconst rangeParser = parseAsStringLiteral([\n\t'24h',\n\t'7d',\n\t'30d',\n\t'90d',\n\t'all',\n] as const).withDefault('30d')\n\n// ─── Dashboard ────────────────────────────────────────────────────────────────\n\nexport function OmnibusDashboard({\n\tdata,\n\tinitialRange,\n\tappName,\n\tsurveyDrilldownHref,\n}: {\n\tdata: DashboardData\n\tinitialRange: AnalyticsRange\n\tappName?: string\n\t/** Link to the analytics survey list page (e.g. /admin/analytics/surveys).\n\t * When set, the Survey Segments header becomes a clickable link. */\n\tsurveyDrilldownHref?: string\n}) {\n\tconst [range, setRange] = useQueryState('range', rangeParser)\n\tconst [isPending, startTransition] = useTransition()\n\n\tconst rangeLabel =\n\t\trange === '24h'\n\t\t\t? '24 hours'\n\t\t\t: range === '7d'\n\t\t\t\t? '7 days'\n\t\t\t\t: range === '90d'\n\t\t\t\t\t? '90 days'\n\t\t\t\t\t: range === 'all'\n\t\t\t\t\t\t? 'all time'\n\t\t\t\t\t\t: '30 days'\n\n\tconst signupCount =\n\t\tdata.attribution.find((a) => a.type === 'signup')?.count ?? 0\n\tconst purchaseAttrCount =\n\t\tdata.attribution.find((a) => a.type === 'purchase')?.count ?? 0\n\tconst totalClicks = data.shortlinks.reduce((s, l) => s + l.clicks, 0)\n\n\t// ── Presence flags ──────────────────────────────────────────────────────\n\tconst hasRevenue =\n\t\tdata.summary.totalRevenue > 0 || data.summary.purchaseCount > 0\n\tconst hasRevenueChart = data.daily.some((d) => d.revenue > 0)\n\tconst hasByProduct = data.byProduct.length > 0\n\tconst hasByCountry = data.byCountry.length > 0\n\tconst hasRecentPurchases = data.recentPurchases.length > 0\n\tconst hasAttribution = data.attribution.length > 0\n\tconst hasAttributionCoverage = data.attributionCoverage != null\n\tconst hasMux = data.mux != null\n\tconst hasTraffic = data.traffic != null\n\tconst hasSurveys =\n\t\tdata.surveySegments != null && data.surveySegments.length > 0\n\tconst hasSurveyCorrelation = data.surveyCorrelation != null\n\tconst hasShortlinks = data.shortlinks.length > 0\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-5 lg:gap-7\">\n\t\t\t{/* ── Header ──────────────────────────────────────────────────── */}\n\t\t\t<div className=\"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between\">\n\t\t\t\t<div className=\"min-w-0\">\n\t\t\t\t\t<h1 className=\"text-pretty text-xl font-bold tracking-tight sm:text-2xl\">\n\t\t\t\t\t\tAnalytics\n\t\t\t\t\t</h1>\n\t\t\t\t\t<p className=\"text-muted-foreground truncate text-[13px]\">\n\t\t\t\t\t\tRevenue · Attribution · Video · Traffic · Surveys — {rangeLabel}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex shrink-0 items-center gap-2\">\n\t\t\t\t\t{isPending && (\n\t\t\t\t\t\t<span className=\"text-muted-foreground animate-pulse text-xs\">\n\t\t\t\t\t\t\tLoading…\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"border-border/40 bg-muted/20 inline-flex items-center gap-0.5 overflow-x-auto rounded-lg border p-0.5\">\n\t\t\t\t\t\t{RANGES.map(({ value, label }) => (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={value}\n\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\tstartTransition(() => {\n\t\t\t\t\t\t\t\t\t\tsetRange(value)\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t\t\t\tclassName={`shrink-0 rounded-md px-2.5 py-1 text-[11px] font-medium transition-[background-color,color,transform] duration-[150ms] ease-[cubic-bezier(0.23,1,0.32,1)] active:scale-[0.95] ${\n\t\t\t\t\t\t\t\t\trange === value\n\t\t\t\t\t\t\t\t\t\t? 'bg-foreground text-background shadow-sm'\n\t\t\t\t\t\t\t\t\t\t: 'text-muted-foreground hover:text-foreground'\n\t\t\t\t\t\t\t\t} ${isPending ? 'cursor-wait opacity-60' : ''}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tclassName={`flex flex-col gap-5 transition-opacity duration-200 lg:gap-7 ${isPending ? 'pointer-events-none opacity-50' : ''}`}\n\t\t\t>\n\t\t\t\t{/* ── Agent API ────────────────────────────────────────────── */}\n\t\t\t\t<AgentApiCard appName={appName} />\n\n\t\t\t\t{/* ── Stat Grid ────────────────────────────────────────────── */}\n\t\t\t\t<div className=\"grid grid-cols-2 gap-2.5 lg:grid-cols-3 xl:grid-cols-5\">\n\t\t\t\t\t{hasRevenue && (\n\t\t\t\t\t\t<Stat\n\t\t\t\t\t\t\tlabel=\"Revenue\"\n\t\t\t\t\t\t\tvalue={fmt$(data.summary.totalRevenue)}\n\t\t\t\t\t\t\tsub={`${data.summary.purchaseCount} purchases · ${fmt$(data.summary.avgOrderValue)} avg`}\n\t\t\t\t\t\t\ticon={DollarSignIcon}\n\t\t\t\t\t\t\taccent\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{hasMux && (\n\t\t\t\t\t\t<Stat\n\t\t\t\t\t\t\tlabel=\"Site Watch Time\"\n\t\t\t\t\t\t\tvalue={fmtWatchMs(data.mux!.overview.totalPlayingTimeMs)}\n\t\t\t\t\t\t\tsub={`${fmtK(data.mux!.overview.totalViews)} views · ${fmtK(data.mux!.overview.uniqueViewers)} viewers`}\n\t\t\t\t\t\t\ticon={FilmIcon}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{hasTraffic && (\n\t\t\t\t\t\t<Stat\n\t\t\t\t\t\t\tlabel=\"Sessions\"\n\t\t\t\t\t\t\tvalue={fmtK(data.traffic!.sessions)}\n\t\t\t\t\t\t\tsub={`${fmtK(data.traffic!.totalUsers)} users · ${fmtK(data.traffic!.pageviews)} pages`}\n\t\t\t\t\t\t\ticon={GlobeIcon}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{purchaseAttrCount > 0 && (\n\t\t\t\t\t\t<Stat\n\t\t\t\t\t\t\tlabel=\"Conversions\"\n\t\t\t\t\t\t\tvalue={`${purchaseAttrCount.toLocaleString()}`}\n\t\t\t\t\t\t\tsub={`${signupCount} signups · ${totalClicks > 0 ? ((purchaseAttrCount / signupCount) * 100).toFixed(1) : 0}% signup→purchase`}\n\t\t\t\t\t\t\ticon={TrendingUpIcon}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{hasShortlinks && (\n\t\t\t\t\t\t<Stat\n\t\t\t\t\t\t\tlabel=\"Link Clicks\"\n\t\t\t\t\t\t\tvalue={fmtK(totalClicks)}\n\t\t\t\t\t\t\tsub={`${data.shortlinks.length} active · ${signupCount} signups`}\n\t\t\t\t\t\t\ticon={MousePointerClickIcon}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{hasSurveys && (\n\t\t\t\t\t\t<Stat\n\t\t\t\t\t\t\tlabel=\"Surveys\"\n\t\t\t\t\t\t\tvalue={`${data.surveySegments!.length}`}\n\t\t\t\t\t\t\tsub={`${data.surveySegments!.reduce((s, q) => s + q.responses, 0).toLocaleString()} responses`}\n\t\t\t\t\t\t\ticon={ClipboardListIcon}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* ── Video Performance ────────────────────────────────────── */}\n\t\t\t\t{hasMux && data.mux!.topVideos.length > 0 && (\n\t\t\t\t\t<TopVideosCard\n\t\t\t\t\t\tlabel=\"Site Videos\"\n\t\t\t\t\t\tsubtitle={`${fmtWatchMs(data.mux!.overview.totalPlayingTimeMs)} watch time · ${fmtK(data.mux!.overview.uniqueViewers)} viewers`}\n\t\t\t\t\t\ticon={FilmIcon}\n\t\t\t\t\t\ticonColor=\"bg-violet-500/10 text-violet-500\"\n\t\t\t\t\t\tvideos={data.mux!.topVideos.slice(0, 5).map((v) => ({\n\t\t\t\t\t\t\ttitle: v.title,\n\t\t\t\t\t\t\tthumbnailUrl: data.muxThumbnails[v.title] ?? null,\n\t\t\t\t\t\t\twatchTime: fmtWatchMs(v.playingTimeMs),\n\t\t\t\t\t\t\tviews: v.views,\n\t\t\t\t\t\t\thref: null,\n\t\t\t\t\t\t}))}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{/* ── Attribution Summary ──────────────────────────────────── */}\n\t\t\t\t{purchaseAttrCount > 0 && (\n\t\t\t\t\t<Card>\n\t\t\t\t\t\t<CardHeader className=\"pb-3\">\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2.5\">\n\t\t\t\t\t\t\t\t<LinkIcon className=\"text-muted-foreground h-4 w-4\" />\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<CardTitle className=\"text-sm font-semibold\">\n\t\t\t\t\t\t\t\t\t\tAttribution Trail\n\t\t\t\t\t\t\t\t\t</CardTitle>\n\t\t\t\t\t\t\t\t\t<CardDescription className=\"text-[11px]\">\n\t\t\t\t\t\t\t\t\t\tShortlink conversions · first-touch UTMs accumulating\n\t\t\t\t\t\t\t\t\t</CardDescription>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</CardHeader>\n\t\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t\t<div className=\"grid gap-3 sm:grid-cols-3\">\n\t\t\t\t\t\t\t\t<div className=\"bg-muted/20 rounded-lg p-3.5\">\n\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground block text-[11px] font-medium uppercase tracking-wider\">\n\t\t\t\t\t\t\t\t\t\tClick → Signup\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span className=\"text-foreground mt-1 block text-xl font-bold tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t{signupCount.toLocaleString()}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"bg-muted/20 rounded-lg p-3.5\">\n\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground block text-[11px] font-medium uppercase tracking-wider\">\n\t\t\t\t\t\t\t\t\t\tClick → Purchase\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span className=\"text-foreground mt-1 block text-xl font-bold tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t{purchaseAttrCount.toLocaleString()}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"bg-muted/20 rounded-lg p-3.5\">\n\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground block text-[11px] font-medium uppercase tracking-wider\">\n\t\t\t\t\t\t\t\t\t\tConversion Rate\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span className=\"text-foreground mt-1 block text-xl font-bold tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t{signupCount > 0\n\t\t\t\t\t\t\t\t\t\t\t? `${((purchaseAttrCount / signupCount) * 100).toFixed(1)}%`\n\t\t\t\t\t\t\t\t\t\t\t: '—'}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t</Card>\n\t\t\t\t)}\n\n\t\t\t\t{/* ── Attribution Coverage ─────────────────────────────────── */}\n\t\t\t\t{hasAttributionCoverage &&\n\t\t\t\t\tdata.attributionCoverage!.totalPurchases > 0 && (\n\t\t\t\t\t\t<Card>\n\t\t\t\t\t\t\t<CardHeader className=\"pb-3\">\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2.5\">\n\t\t\t\t\t\t\t\t\t<TrendingUpIcon className=\"text-muted-foreground h-4 w-4\" />\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<CardTitle className=\"text-sm font-semibold\">\n\t\t\t\t\t\t\t\t\t\t\tAttribution Coverage\n\t\t\t\t\t\t\t\t\t\t</CardTitle>\n\t\t\t\t\t\t\t\t\t\t<CardDescription className=\"text-[11px]\">\n\t\t\t\t\t\t\t\t\t\t\tAttributed vs dark revenue\n\t\t\t\t\t\t\t\t\t\t</CardDescription>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</CardHeader>\n\t\t\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t\t\t<div className=\"grid gap-3 sm:grid-cols-3\">\n\t\t\t\t\t\t\t\t\t<div className=\"bg-muted/20 rounded-lg p-3.5\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground block text-[11px] font-medium uppercase tracking-wider\">\n\t\t\t\t\t\t\t\t\t\t\tAttributed\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-foreground mt-1 block text-xl font-bold tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t{fmt$(data.attributionCoverage!.attributedRevenue)}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground text-[11px]\">\n\t\t\t\t\t\t\t\t\t\t\t{(\n\t\t\t\t\t\t\t\t\t\t\t\tdata.attributionCoverage!.attributionRate * 100\n\t\t\t\t\t\t\t\t\t\t\t).toFixed(1)}\n\t\t\t\t\t\t\t\t\t\t\t% of total\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"bg-muted/20 rounded-lg p-3.5\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground block text-[11px] font-medium uppercase tracking-wider\">\n\t\t\t\t\t\t\t\t\t\t\tDark / Unknown\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-foreground mt-1 block text-xl font-bold tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t{fmt$(data.attributionCoverage!.unattributedRevenue)}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"bg-muted/20 rounded-lg p-3.5\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground block text-[11px] font-medium uppercase tracking-wider\">\n\t\t\t\t\t\t\t\t\t\t\tTotal Purchases\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-foreground mt-1 block text-xl font-bold tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t{data.attributionCoverage!.totalPurchases.toLocaleString()}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t\t</Card>\n\t\t\t\t\t)}\n\n\t\t\t\t{/* ── Survey Segments ──────────────────────────────────────── */}\n\t\t\t\t{hasSurveys && (\n\t\t\t\t\t<Card>\n\t\t\t\t\t\t<CardHeader className=\"pb-3\">\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2.5\">\n\t\t\t\t\t\t\t\t\t<div className=\"flex h-7 w-7 items-center justify-center rounded-lg bg-indigo-500/10 text-indigo-500\">\n\t\t\t\t\t\t\t\t\t\t<ClipboardListIcon className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<CardTitle className=\"text-sm font-semibold\">\n\t\t\t\t\t\t\t\t\t\t\tSurvey Segments\n\t\t\t\t\t\t\t\t\t\t</CardTitle>\n\t\t\t\t\t\t\t\t\t\t<CardDescription className=\"text-[11px]\">\n\t\t\t\t\t\t\t\t\t\t\tHow users self-categorize across survey questions\n\t\t\t\t\t\t\t\t\t\t</CardDescription>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{surveyDrilldownHref && (\n\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\thref={surveyDrilldownHref}\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground text-[11px] font-medium transition-colors\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tView all surveys →\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</CardHeader>\n\t\t\t\t\t\t<CardContent className=\"space-y-6\">\n\t\t\t\t\t\t\t{data.surveySegments!.slice(0, 8).map((q) => {\n\t\t\t\t\t\t\t\tconst totalForQuestion = q.answerDistribution.reduce(\n\t\t\t\t\t\t\t\t\t(s, a) => s + a.count,\n\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<div key={q.questionId}>\n\t\t\t\t\t\t\t\t\t\t<div className=\"mb-2.5 flex items-start justify-between gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-foreground text-[13px] font-medium leading-snug\">\n\t\t\t\t\t\t\t\t\t\t\t\t{q.question}\n\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground shrink-0 text-[11px] tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t{totalForQuestion.toLocaleString()} responses\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-1.5\">\n\t\t\t\t\t\t\t\t\t\t\t{q.answerDistribution.slice(0, 6).map((a) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst pct =\n\t\t\t\t\t\t\t\t\t\t\t\t\ttotalForQuestion > 0\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? (a.count / totalForQuestion) * 100\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 0\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={a.answer}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"group flex items-center gap-2.5\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground w-[120px] shrink-0 truncate text-right text-[12px]\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle={a.answer}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{a.answer}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"bg-muted/50 relative h-5 flex-1 overflow-hidden rounded\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"absolute inset-y-0 left-0 rounded bg-indigo-500/20 transition-all duration-300\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: `${Math.max(pct, 1)}%` }}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"relative flex h-full items-center px-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-foreground/70 text-[11px] font-medium tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{pct.toFixed(0)}%\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground w-10 shrink-0 text-right text-[11px] tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{a.count.toLocaleString()}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t{q.answerDistribution.length > 6 && (\n\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground/60 pl-[132px] text-[11px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t+{q.answerDistribution.length - 6} more answers\n\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t</Card>\n\t\t\t\t)}\n\n\t\t\t\t{/* ── Survey → Purchase Correlation ────────────────────────── */}\n\t\t\t\t{hasSurveyCorrelation && (\n\t\t\t\t\t<Card>\n\t\t\t\t\t\t<CardHeader className=\"pb-3\">\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2.5\">\n\t\t\t\t\t\t\t\t<div className=\"flex h-7 w-7 items-center justify-center rounded-lg bg-emerald-500/10 text-emerald-500\">\n\t\t\t\t\t\t\t\t\t<TrendingUpIcon className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<CardTitle className=\"text-sm font-semibold\">\n\t\t\t\t\t\t\t\t\t\tSurvey → Purchase Correlation\n\t\t\t\t\t\t\t\t\t</CardTitle>\n\t\t\t\t\t\t\t\t\t<CardDescription className=\"text-[11px]\">\n\t\t\t\t\t\t\t\t\t\tWhich survey answers predict purchases? We match survey\n\t\t\t\t\t\t\t\t\t\trespondents against the purchases table to find conversion\n\t\t\t\t\t\t\t\t\t\trates per answer.\n\t\t\t\t\t\t\t\t\t</CardDescription>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</CardHeader>\n\t\t\t\t\t\t<CardContent className=\"space-y-5\">\n\t\t\t\t\t\t\t{/* How it works */}\n\t\t\t\t\t\t\t<p className=\"text-muted-foreground text-[12px] leading-relaxed\">\n\t\t\t\t\t\t\t\tWe look at every user who answered a survey and check if they\n\t\t\t\t\t\t\t\tever made a purchase.\n\t\t\t\t\t\t\t\t<strong className=\"text-foreground\"> Conversion</strong> =\n\t\t\t\t\t\t\t\trespondents who purchased / total respondents.\n\t\t\t\t\t\t\t\t<strong className=\"text-foreground\"> Baseline</strong> =\n\t\t\t\t\t\t\t\tpurchase rate of users who <em>never</em> took a survey, so you\n\t\t\t\t\t\t\t\tcan see if survey-takers convert at a higher or lower rate.\n\t\t\t\t\t\t\t\t<strong className=\"text-foreground\"> Revenue</strong> = total\n\t\t\t\t\t\t\t\tlifetime spend of respondents who purchased.\n\t\t\t\t\t\t\t</p>\n\n\t\t\t\t\t\t\t{/* Headline stats */}\n\t\t\t\t\t\t\t{(() => {\n\t\t\t\t\t\t\t\tconst sc = data.surveyCorrelation!\n\t\t\t\t\t\t\t\tconst totalRespondents = sc.totalRespondents ?? 0\n\t\t\t\t\t\t\t\tconst purchased = sc.respondentsWhoPurchased ?? 0\n\t\t\t\t\t\t\t\tconst convRate = sc.overallConversionRate ?? 0\n\t\t\t\t\t\t\t\tconst revenue = sc.totalRevenueFromRespondents ?? 0\n\t\t\t\t\t\t\t\tconst baseline = sc.baselineConversionRate ?? 0\n\t\t\t\t\t\t\t\tconst pre = sc.prePurchaseRespondents ?? 0\n\t\t\t\t\t\t\t\tconst post = sc.postPurchaseRespondents ?? 0\n\t\t\t\t\t\t\t\tconst never = sc.neverPurchasedRespondents ?? 0\n\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<div className=\"grid grid-cols-2 gap-2 sm:grid-cols-5\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"bg-muted/20 rounded-lg p-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground block text-[11px] font-medium uppercase tracking-wider\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tRespondents\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-foreground mt-1 block text-lg font-bold tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{totalRespondents.toLocaleString()}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground/70 text-[10px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tunique users who answered\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"bg-muted/20 rounded-lg p-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground block text-[11px] font-medium uppercase tracking-wider\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tPurchased\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-foreground mt-1 block text-lg font-bold tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{purchased.toLocaleString()}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground/70 text-[10px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tof those also bought\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"bg-muted/20 rounded-lg p-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground block text-[11px] font-medium uppercase tracking-wider\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tConversion\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-foreground mt-1 block text-lg font-bold tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{(convRate * 100).toFixed(1)}%\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground/70 text-[10px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\trespondent → purchaser\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"bg-muted/20 rounded-lg p-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground block text-[11px] font-medium uppercase tracking-wider\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tRevenue\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-foreground mt-1 block text-lg font-bold tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{fmt$(revenue)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground/70 text-[10px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tlifetime spend of purchasers\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"bg-muted/20 rounded-lg p-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground block text-[11px] font-medium uppercase tracking-wider\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tBaseline\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-foreground mt-1 block text-lg font-bold tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{(baseline * 100).toFixed(1)}%\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground/70 text-[10px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tusers who never took a survey\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t{/* Pre/Post breakdown */}\n\t\t\t\t\t\t\t\t\t\t<div className=\"border-border/30 rounded-lg border px-4 py-3\">\n\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground mb-2 text-[11px]\">\n\t\t\t\t\t\t\t\t\t\t\t\tOf the {purchased.toLocaleString()} purchasers, when did\n\t\t\t\t\t\t\t\t\t\t\t\tthey first respond relative to their first purchase?\n\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-wrap items-center gap-x-6 gap-y-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"inline-block h-2 w-2 rounded-full bg-emerald-500\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[12px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tResponded first, then bought:{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-foreground font-semibold tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{pre.toLocaleString()}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"inline-block h-2 w-2 rounded-full bg-blue-500\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[12px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tBought first, then responded:{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-foreground font-semibold tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{post.toLocaleString()}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"inline-block h-2 w-2 rounded-full bg-gray-400\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[12px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tResponded but never bought:{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-foreground font-semibold tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{never.toLocaleString()}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})()}\n\n\t\t\t\t\t\t\t{/* Per-answer conversion grouped by question */}\n\t\t\t\t\t\t\t{(() => {\n\t\t\t\t\t\t\t\tconst allRows = data.surveyCorrelation!.byQuestion ?? []\n\t\t\t\t\t\t\t\tif (allRows.length === 0) return null\n\n\t\t\t\t\t\t\t\tconst seen: Record<string, boolean> = {}\n\t\t\t\t\t\t\t\tconst questionIds: string[] = []\n\t\t\t\t\t\t\t\tconst answerCounts: Record<string, number> = {}\n\t\t\t\t\t\t\t\tfor (const r of allRows) {\n\t\t\t\t\t\t\t\t\tif (!seen[r.questionId]) {\n\t\t\t\t\t\t\t\t\t\tseen[r.questionId] = true\n\t\t\t\t\t\t\t\t\t\tquestionIds.push(r.questionId)\n\t\t\t\t\t\t\t\t\t\tanswerCounts[r.questionId] = 0\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tanswerCounts[r.questionId]!++\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst filteredQIds = questionIds.filter(\n\t\t\t\t\t\t\t\t\t(qId) => (answerCounts[qId] ?? 0) <= 10,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tif (filteredQIds.length === 0) return null\n\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<div className=\"space-y-6\">\n\t\t\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground text-[11px]\">\n\t\t\t\t\t\t\t\t\t\t\tPer answer: of everyone who chose this option, what % went\n\t\t\t\t\t\t\t\t\t\t\ton to purchase?\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t{filteredQIds.map((qId) => {\n\t\t\t\t\t\t\t\t\t\t\tconst answers = allRows\n\t\t\t\t\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t\t\t\t\t(r) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tr.questionId === qId && r.answer !== '[free text]',\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t.sort(\n\t\t\t\t\t\t\t\t\t\t\t\t\t(a, b) => (b.respondents ?? 0) - (a.respondents ?? 0),\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\tif (answers.length === 0) return null\n\t\t\t\t\t\t\t\t\t\t\tconst title = answers[0]?.questionTitle ?? qId\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<div key={qId}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-foreground mb-2 text-[13px] font-semibold leading-snug\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-1.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{answers.map((row) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst pct = (row.conversionRate ?? 0) * 100\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst purchased = row.purchasers ?? 0\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst responded = row.respondents ?? 0\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={row.answer}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"group flex items-center gap-2.5\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground w-[120px] shrink-0 truncate text-right text-[12px]\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle={row.answer}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{row.answer}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"bg-muted/50 relative h-5 flex-1 overflow-hidden rounded\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"absolute inset-y-0 left-0 rounded bg-emerald-500/20 transition-all duration-300\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: `${Math.max(pct, 1)}%` }}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"relative flex h-full items-center px-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-foreground/70 text-[11px] font-medium tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{pct.toFixed(1)}%\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground w-12 shrink-0 text-right text-[11px] tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{purchased}/{responded}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})()}\n\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t</Card>\n\t\t\t\t)}\n\n\t\t\t\t{/* ── Revenue Chart ─────────────────────────────────────────── */}\n\t\t\t\t{hasRevenueChart && (\n\t\t\t\t\t<Card className=\"overflow-hidden\">\n\t\t\t\t\t\t<CardHeader className=\"pb-3\">\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2.5\">\n\t\t\t\t\t\t\t\t<TrendingUpIcon className=\"text-muted-foreground h-4 w-4\" />\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<CardTitle className=\"text-sm font-semibold\">\n\t\t\t\t\t\t\t\t\t\tDaily Revenue\n\t\t\t\t\t\t\t\t\t</CardTitle>\n\t\t\t\t\t\t\t\t\t<CardDescription className=\"text-[11px]\">\n\t\t\t\t\t\t\t\t\t\t{rangeLabel}\n\t\t\t\t\t\t\t\t\t</CardDescription>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</CardHeader>\n\t\t\t\t\t\t<CardContent className=\"pb-3\">\n\t\t\t\t\t\t\t<RevenueChart\n\t\t\t\t\t\t\t\tdata={data.daily}\n\t\t\t\t\t\t\t\tpreviousData={data.previousDaily}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t</Card>\n\t\t\t\t)}\n\n\t\t\t\t{/* ── Products + Countries ──────────────────────────────────── */}\n\t\t\t\t{(hasByProduct || hasByCountry) && (\n\t\t\t\t\t<div className=\"grid gap-3 md:grid-cols-2\">\n\t\t\t\t\t\t{/* By Product */}\n\t\t\t\t\t\t{hasByProduct && (\n\t\t\t\t\t\t\t<Card>\n\t\t\t\t\t\t\t\t<CardHeader className=\"pb-3\">\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2.5\">\n\t\t\t\t\t\t\t\t\t\t<ShoppingCartIcon className=\"text-muted-foreground h-4 w-4\" />\n\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t<CardTitle className=\"text-sm font-semibold\">\n\t\t\t\t\t\t\t\t\t\t\t\tBy Product\n\t\t\t\t\t\t\t\t\t\t\t</CardTitle>\n\t\t\t\t\t\t\t\t\t\t\t<CardDescription className=\"text-[11px]\">\n\t\t\t\t\t\t\t\t\t\t\t\tRevenue breakdown\n\t\t\t\t\t\t\t\t\t\t\t</CardDescription>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</CardHeader>\n\t\t\t\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col gap-3\">\n\t\t\t\t\t\t\t\t\t\t{data.byProduct.map((p) => {\n\t\t\t\t\t\t\t\t\t\t\tconst pct =\n\t\t\t\t\t\t\t\t\t\t\t\tdata.summary.totalRevenue > 0\n\t\t\t\t\t\t\t\t\t\t\t\t\t? (p.revenue / data.summary.totalRevenue) * 100\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 0\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<div key={p.productId} className=\"space-y-1.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"truncate text-sm font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{p.productName}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-foreground shrink-0 text-sm font-semibold tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{fmt$(p.revenue)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"bg-muted/50 relative h-1.5 flex-1 overflow-hidden rounded-full\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"absolute inset-y-0 left-0 rounded-full bg-emerald-500/60\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: `${Math.min(pct, 100)}%` }}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground text-[11px] tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{p.count}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t\t\t</Card>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* By Country */}\n\t\t\t\t\t\t{hasByCountry && (\n\t\t\t\t\t\t\t<Card className=\"overflow-hidden\">\n\t\t\t\t\t\t\t\t<CardHeader className=\"pb-3\">\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2.5\">\n\t\t\t\t\t\t\t\t\t\t<GlobeIcon className=\"text-muted-foreground h-4 w-4\" />\n\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t<CardTitle className=\"text-sm font-semibold\">\n\t\t\t\t\t\t\t\t\t\t\t\tBy Country\n\t\t\t\t\t\t\t\t\t\t\t</CardTitle>\n\t\t\t\t\t\t\t\t\t\t\t<CardDescription className=\"text-[11px]\">\n\t\t\t\t\t\t\t\t\t\t\t\tTop 10 by revenue\n\t\t\t\t\t\t\t\t\t\t\t</CardDescription>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</CardHeader>\n\t\t\t\t\t\t\t\t<CardContent className=\"pb-3\">\n\t\t\t\t\t\t\t\t\t<CountryChart data={data.byCountry} />\n\t\t\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t\t\t</Card>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* ── Full Site Video Table ─────────────────────────────────── */}\n\t\t\t\t{hasMux && data.mux!.topVideos.length > 5 && (\n\t\t\t\t\t<Card>\n\t\t\t\t\t\t<CardHeader className=\"pb-3\">\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2.5\">\n\t\t\t\t\t\t\t\t<FilmIcon className=\"text-muted-foreground h-4 w-4\" />\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<CardTitle className=\"text-sm font-semibold\">\n\t\t\t\t\t\t\t\t\t\tAll Site Videos\n\t\t\t\t\t\t\t\t\t</CardTitle>\n\t\t\t\t\t\t\t\t\t<CardDescription className=\"text-[11px]\">\n\t\t\t\t\t\t\t\t\t\tBy watch time (Mux)\n\t\t\t\t\t\t\t\t\t</CardDescription>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</CardHeader>\n\t\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t\t<div className=\"overflow-x-auto\">\n\t\t\t\t\t\t\t\t<table className=\"w-full\">\n\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t<tr className=\"text-muted-foreground border-border/50 border-b text-left text-[11px] uppercase tracking-wider\">\n\t\t\t\t\t\t\t\t\t\t\t<th className=\"pb-2.5 pr-4 font-medium\">#</th>\n\t\t\t\t\t\t\t\t\t\t\t<th className=\"pb-2.5 pr-4 font-medium\">Title</th>\n\t\t\t\t\t\t\t\t\t\t\t<th className=\"pb-2.5 pr-4 text-right font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t\tWatch Time\n\t\t\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t\t\t\t<th className=\"pb-2.5 text-right font-medium\">Views</th>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t<tbody className=\"divide-border/30 divide-y\">\n\t\t\t\t\t\t\t\t\t\t{data.mux!.topVideos.slice(0, 10).map((v, i) => (\n\t\t\t\t\t\t\t\t\t\t\t<tr key={v.title} className=\"group\">\n\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"text-muted-foreground py-2.5 pr-4 text-sm tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{i + 1}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"max-w-[300px] truncate py-2.5 pr-4 text-sm font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{v.title}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"text-foreground py-2.5 pr-4 text-right text-sm font-semibold tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{fmtWatchMs(v.playingTimeMs)}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"text-muted-foreground py-2.5 text-right text-sm tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{fmtK(v.views)}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t</Card>\n\t\t\t\t)}\n\n\t\t\t\t{/* ── Shortlinks ────────────────────────────────────────────── */}\n\t\t\t\t{hasShortlinks && (\n\t\t\t\t\t<ShortlinksCard\n\t\t\t\t\t\tshortlinks={data.shortlinks}\n\t\t\t\t\t\ttotalClicks={totalClicks}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{/* ── Recent Purchases ──────────────────────────────────────── */}\n\t\t\t\t{hasRecentPurchases && (\n\t\t\t\t\t<Card>\n\t\t\t\t\t\t<CardHeader className=\"pb-3\">\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2.5\">\n\t\t\t\t\t\t\t\t\t<div className=\"bg-muted flex h-6 w-6 items-center justify-center rounded-md\">\n\t\t\t\t\t\t\t\t\t\t<ShoppingCartIcon className=\"text-muted-foreground h-3.5 w-3.5\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<CardTitle className=\"text-sm font-semibold\">\n\t\t\t\t\t\t\t\t\t\t\tTeam Purchases\n\t\t\t\t\t\t\t\t\t\t</CardTitle>\n\t\t\t\t\t\t\t\t\t\t<CardDescription className=\"text-[11px]\">\n\t\t\t\t\t\t\t\t\t\t\tMulti-seat deals · sorted by amount\n\t\t\t\t\t\t\t\t\t\t</CardDescription>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<span className=\"rounded-full bg-red-500/10 px-2 py-0.5 text-[10px] font-medium uppercase tracking-wider text-red-600 dark:text-red-400\">\n\t\t\t\t\t\t\t\t\tOH YEAH\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</CardHeader>\n\t\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t\t<div className=\"overflow-x-auto\">\n\t\t\t\t\t\t\t\t<table className=\"w-full\">\n\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t<tr className=\"text-muted-foreground border-border/50 border-b text-left text-[11px] uppercase tracking-wider\">\n\t\t\t\t\t\t\t\t\t\t\t<th className=\"pb-2.5 pr-4 text-right font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t\tAmount\n\t\t\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t\t\t\t<th className=\"pb-2.5 pr-4 text-right font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t\tSeats\n\t\t\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t\t\t\t<th className=\"pb-2.5 pr-4 font-medium\">Product</th>\n\t\t\t\t\t\t\t\t\t\t\t<th className=\"hidden pb-2.5 pr-4 font-medium sm:table-cell\">\n\t\t\t\t\t\t\t\t\t\t\t\tBuyer\n\t\t\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t\t\t\t<th className=\"hidden pb-2.5 pr-4 font-medium sm:table-cell\">\n\t\t\t\t\t\t\t\t\t\t\t\tCountry\n\t\t\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t\t\t\t<th className=\"pb-2.5 pr-4 font-medium\">When</th>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t<tbody className=\"divide-border/30 divide-y\">\n\t\t\t\t\t\t\t\t\t\t{data.recentPurchases.map((p) => (\n\t\t\t\t\t\t\t\t\t\t\t<tr key={p.id}>\n\t\t\t\t\t\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={`py-2.5 pr-4 text-right text-sm font-semibold tabular-nums ${\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tp.totalAmount > 0\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'text-emerald-600 dark:text-emerald-400'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'text-muted-foreground'\n\t\t\t\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{p.totalAmount > 0 ? fmt$(p.totalAmount) : 'Free'}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"py-2.5 pr-4 text-right text-sm tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{p.seats ?? '—'}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"max-w-[200px] truncate py-2.5 pr-4 text-sm font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{p.productName}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"text-muted-foreground hidden max-w-[150px] truncate py-2.5 pr-4 text-sm sm:table-cell\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{p.userName ?? p.userEmail ?? '—'}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"text-muted-foreground hidden py-2.5 pr-4 text-sm sm:table-cell\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{p.country\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? `${countryFlag(p.country)} ${p.country}`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: '—'}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"text-muted-foreground whitespace-nowrap py-2.5 pr-4 text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{fmtAgo(p.createdAt)}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t</Card>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","'use client'\n\nimport React from 'react'\nimport {\n\tBar,\n\tBarChart,\n\tCartesianGrid,\n\tResponsiveContainer,\n\tTooltip,\n\tXAxis,\n\tYAxis,\n} from 'recharts'\n\nimport { useChartColors } from './use-chart-colors'\n\ninterface CountryChartProps {\n\tdata: { country: string; revenue: number; count: number }[]\n}\n\nfunction countryFlag(code: string | null): string {\n\tif (!code || code.length !== 2) return '🌍'\n\tconst offset = 0x1f1e6\n\tconst a = code.toUpperCase().charCodeAt(0) - 65 + offset\n\tconst b = code.toUpperCase().charCodeAt(1) - 65 + offset\n\treturn String.fromCodePoint(a, b)\n}\n\nfunction formatCurrency(value: number): string {\n\tif (value >= 1000) return `$${(value / 1000).toFixed(1)}k`\n\treturn `$${value.toFixed(0)}`\n}\n\nfunction CustomTooltip({\n\tactive,\n\tpayload,\n}: {\n\tactive?: boolean\n\tpayload?: {\n\t\tvalue: number\n\t\tpayload: { country: string; count: number; revenue: number }\n\t}[]\n\tlabel?: string\n}) {\n\tif (!active || !payload?.length) return null\n\tconst d = payload[0]?.payload\n\tif (!d) return null\n\treturn (\n\t\t<div className=\"border-border/50 bg-card rounded-lg border px-3 py-2 shadow-xl\">\n\t\t\t<p className=\"text-foreground text-sm font-medium\">\n\t\t\t\t{countryFlag(d.country)} {d.country}\n\t\t\t</p>\n\t\t\t<p className=\"text-foreground text-lg font-bold tabular-nums\">\n\t\t\t\t$\n\t\t\t\t{d.revenue.toLocaleString(undefined, {\n\t\t\t\t\tminimumFractionDigits: 0,\n\t\t\t\t\tmaximumFractionDigits: 0,\n\t\t\t\t})}\n\t\t\t</p>\n\t\t\t<p className=\"text-muted-foreground text-xs\">{d.count} purchases</p>\n\t\t</div>\n\t)\n}\n\nexport function CountryChart({ data }: CountryChartProps) {\n\tconst colors = useChartColors()\n\tconst chartData = data.slice(0, 10).map((d) => ({\n\t\t...d,\n\t\tlabel: `${countryFlag(d.country)} ${d.country}`,\n\t}))\n\n\treturn (\n\t\t<div className=\"h-[280px] w-full\">\n\t\t\t<ResponsiveContainer width=\"100%\" height=\"100%\">\n\t\t\t\t<BarChart\n\t\t\t\t\tdata={chartData}\n\t\t\t\t\tlayout=\"vertical\"\n\t\t\t\t\tmargin={{ top: 4, right: 8, left: 4, bottom: 4 }}\n\t\t\t\t>\n\t\t\t\t\t<CartesianGrid\n\t\t\t\t\t\tstrokeDasharray=\"3 3\"\n\t\t\t\t\t\tstroke={colors.gridLine}\n\t\t\t\t\t\thorizontal={false}\n\t\t\t\t\t/>\n\t\t\t\t\t<XAxis\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\ttick={{ fill: colors.mutedForeground, fontSize: 11 }}\n\t\t\t\t\t\taxisLine={{ stroke: colors.gridLine }}\n\t\t\t\t\t\ttickLine={false}\n\t\t\t\t\t\ttickFormatter={formatCurrency}\n\t\t\t\t\t/>\n\t\t\t\t\t<YAxis\n\t\t\t\t\t\ttype=\"category\"\n\t\t\t\t\t\tdataKey=\"label\"\n\t\t\t\t\t\ttick={{ fill: colors.mutedForeground, fontSize: 12 }}\n\t\t\t\t\t\taxisLine={false}\n\t\t\t\t\t\ttickLine={false}\n\t\t\t\t\t\twidth={60}\n\t\t\t\t\t/>\n\t\t\t\t\t<Tooltip\n\t\t\t\t\t\tcontent={<CustomTooltip />}\n\t\t\t\t\t\tcursor={{ fill: colors.hoverBg }}\n\t\t\t\t\t/>\n\t\t\t\t\t<Bar\n\t\t\t\t\t\tdataKey=\"revenue\"\n\t\t\t\t\t\tradius={[0, 4, 4, 0]}\n\t\t\t\t\t\tmaxBarSize={24}\n\t\t\t\t\t\tfill=\"#22c55e\"\n\t\t\t\t\t\tfillOpacity={0.7}\n\t\t\t\t\t/>\n\t\t\t\t</BarChart>\n\t\t\t</ResponsiveContainer>\n\t\t</div>\n\t)\n}\n","'use client'\n\nimport { useEffect, useState } from 'react'\n\nexport interface ChartColors {\n\tprimary: string\n\tprimaryMuted: string\n\tforeground: string\n\tmutedForeground: string\n\tgridLine: string\n\tcardBg: string\n\thoverBg: string\n}\n\nconst FALLBACK: ChartColors = {\n\tprimary: '#d4a053',\n\tprimaryMuted: 'rgba(212, 160, 83, 0.2)',\n\tforeground: '#e5e5e5',\n\tmutedForeground: '#999',\n\tgridLine: '#333',\n\tcardBg: '#1a1a1a',\n\thoverBg: '#222',\n}\n\nfunction getCSSVar(name: string): string {\n\treturn getComputedStyle(document.documentElement)\n\t\t.getPropertyValue(name)\n\t\t.trim()\n}\n\nfunction oklchToUsable(raw: string): string {\n\tif (!raw) return ''\n\t// raw is like \"oklch(0.85 0.12 79.28)\" — browsers handle it fine\n\treturn raw.startsWith('oklch') ? raw : raw\n}\n\nexport function useChartColors(): ChartColors {\n\tconst [colors, setColors] = useState<ChartColors>(FALLBACK)\n\n\tuseEffect(() => {\n\t\tfunction update() {\n\t\t\tconst primary = getCSSVar('--primary')\n\t\t\tconst muted = getCSSVar('--muted')\n\t\t\tconst mutedFg = getCSSVar('--muted-foreground')\n\t\t\tconst fg = getCSSVar('--foreground')\n\t\t\tconst border = getCSSVar('--border')\n\t\t\tconst card = getCSSVar('--card')\n\n\t\t\tif (!primary) return\n\n\t\t\tsetColors({\n\t\t\t\tprimary: oklchToUsable(primary),\n\t\t\t\tprimaryMuted: oklchToUsable(primary).replace(')', ' / 0.2)'),\n\t\t\t\tforeground: oklchToUsable(fg),\n\t\t\t\tmutedForeground: oklchToUsable(mutedFg),\n\t\t\t\tgridLine: oklchToUsable(border),\n\t\t\t\tcardBg: oklchToUsable(card),\n\t\t\t\thoverBg: oklchToUsable(muted),\n\t\t\t})\n\t\t}\n\n\t\tupdate()\n\n\t\t// Re-read when theme changes (class mutation on <html>)\n\t\tconst observer = new MutationObserver(update)\n\t\tobserver.observe(document.documentElement, {\n\t\t\tattributes: true,\n\t\t\tattributeFilter: ['class'],\n\t\t})\n\n\t\treturn () => observer.disconnect()\n\t}, [])\n\n\treturn colors\n}\n","'use client'\n\nimport React, { useMemo } from 'react'\nimport {\n\tArea,\n\tAreaChart,\n\tCartesianGrid,\n\tResponsiveContainer,\n\tTooltip,\n\tXAxis,\n\tYAxis,\n} from 'recharts'\n\nimport { useChartColors } from './use-chart-colors'\n\ninterface DayData {\n\tdate: string\n\trevenue: number\n\tcount: number\n}\n\ninterface RevenueChartProps {\n\tdata: DayData[]\n\tpreviousData?: DayData[]\n}\n\nfunction formatDate(dateStr: string) {\n\tconst d = new Date(dateStr + 'T00:00:00')\n\treturn d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })\n}\n\nfunction formatCurrency(value: number): string {\n\tif (value >= 1000) return `$${(value / 1000).toFixed(1)}k`\n\treturn `$${value.toFixed(0)}`\n}\n\nfunction CustomTooltip({\n\tactive,\n\tpayload,\n\tlabel,\n}: {\n\tactive?: boolean\n\tpayload?: { dataKey: string; value: number; payload: MergedDay }[]\n\tlabel?: string\n}) {\n\tif (!active || !payload?.length || !label) return null\n\n\tconst merged = payload[0]?.payload\n\tif (!merged) return null\n\n\tconst current = merged.revenue ?? 0\n\tconst previous = merged.prevRevenue ?? 0\n\tconst hasPrev = previous > 0\n\n\tlet delta = ''\n\tlet deltaColor = ''\n\tif (hasPrev && current > 0) {\n\t\tconst pct = ((current - previous) / previous) * 100\n\t\tdelta = pct >= 0 ? `+${pct.toFixed(0)}%` : `${pct.toFixed(0)}%`\n\t\tdeltaColor = pct >= 0 ? 'text-emerald-500' : 'text-red-400'\n\t}\n\n\treturn (\n\t\t<div className=\"border-border/50 bg-card rounded-lg border px-3 py-2 shadow-xl\">\n\t\t\t<p className=\"text-muted-foreground text-xs\">{formatDate(label)}</p>\n\t\t\t<div className=\"mt-1 flex items-baseline gap-2\">\n\t\t\t\t<p className=\"text-foreground text-lg font-bold tabular-nums\">\n\t\t\t\t\t$\n\t\t\t\t\t{current.toLocaleString(undefined, {\n\t\t\t\t\t\tminimumFractionDigits: 0,\n\t\t\t\t\t\tmaximumFractionDigits: 0,\n\t\t\t\t\t})}\n\t\t\t\t</p>\n\t\t\t\t{delta && (\n\t\t\t\t\t<span className={`text-xs font-semibold ${deltaColor}`}>{delta}</span>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<p className=\"text-muted-foreground text-xs\">\n\t\t\t\t{merged.count ?? 0} purchases\n\t\t\t</p>\n\t\t\t{hasPrev && (\n\t\t\t\t<p className=\"text-muted-foreground border-border/30 mt-1 border-t pt-1 text-[11px]\">\n\t\t\t\t\tprev: $\n\t\t\t\t\t{previous.toLocaleString(undefined, {\n\t\t\t\t\t\tminimumFractionDigits: 0,\n\t\t\t\t\t\tmaximumFractionDigits: 0,\n\t\t\t\t\t})}{' '}\n\t\t\t\t\t· {merged.prevCount ?? 0} purchases\n\t\t\t\t</p>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\ninterface MergedDay {\n\tdate: string\n\trevenue: number\n\tcount: number\n\tprevRevenue: number | null\n\tprevCount: number | null\n}\n\nexport function RevenueChart({ data, previousData = [] }: RevenueChartProps) {\n\tconst colors = useChartColors()\n\n\tconst merged = useMemo<MergedDay[]>(() => {\n\t\tif (previousData.length === 0) {\n\t\t\treturn data.map((d) => ({\n\t\t\t\t...d,\n\t\t\t\tprevRevenue: null,\n\t\t\t\tprevCount: null,\n\t\t\t}))\n\t\t}\n\n\t\t// Align previous period by day offset (day 0 = start of each period)\n\t\treturn data.map((d, i) => {\n\t\t\tconst prev = previousData[i]\n\t\t\treturn {\n\t\t\t\t...d,\n\t\t\t\tprevRevenue: prev?.revenue ?? null,\n\t\t\t\tprevCount: prev?.count ?? null,\n\t\t\t}\n\t\t})\n\t}, [data, previousData])\n\n\tconst maxRevenue = useMemo(\n\t\t() =>\n\t\t\tMath.max(\n\t\t\t\t...merged.map((d) => d.revenue),\n\t\t\t\t...merged.map((d) => d.prevRevenue ?? 0),\n\t\t\t\t0,\n\t\t\t),\n\t\t[merged],\n\t)\n\n\t// Use log scale when the max is >10x the median — prevents spikes from crushing everything\n\tconst nonZeroVals = useMemo(\n\t\t() =>\n\t\t\tmerged\n\t\t\t\t.map((d) => d.revenue)\n\t\t\t\t.filter((v) => v > 0)\n\t\t\t\t.sort((a, b) => a - b),\n\t\t[merged],\n\t)\n\tconst useLog = useMemo(() => {\n\t\tif (nonZeroVals.length < 3) return false\n\t\tconst median = nonZeroVals[Math.floor(nonZeroVals.length / 2)]!\n\t\treturn maxRevenue > median * 10\n\t}, [nonZeroVals, maxRevenue])\n\tconst logFloor =\n\t\tnonZeroVals.length > 0 ? Math.floor(nonZeroVals[0]! * 0.7) : 100\n\n\tconst hasPrev = previousData.length > 0\n\n\treturn (\n\t\t<div className=\"h-[280px] w-full\">\n\t\t\t<ResponsiveContainer width=\"100%\" height=\"100%\">\n\t\t\t\t<AreaChart\n\t\t\t\t\tdata={merged}\n\t\t\t\t\tmargin={{ top: 8, right: 8, left: -12, bottom: 0 }}\n\t\t\t\t>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<linearGradient id=\"revenueGradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor=\"#22c55e\" stopOpacity={0.3} />\n\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor=\"#22c55e\" stopOpacity={0} />\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t</defs>\n\t\t\t\t\t<CartesianGrid\n\t\t\t\t\t\tstrokeDasharray=\"3 3\"\n\t\t\t\t\t\tstroke={colors.gridLine}\n\t\t\t\t\t\tvertical={false}\n\t\t\t\t\t/>\n\t\t\t\t\t<XAxis\n\t\t\t\t\t\tdataKey=\"date\"\n\t\t\t\t\t\ttickFormatter={formatDate}\n\t\t\t\t\t\ttick={{ fill: colors.mutedForeground, fontSize: 11 }}\n\t\t\t\t\t\taxisLine={{ stroke: colors.gridLine }}\n\t\t\t\t\t\ttickLine={false}\n\t\t\t\t\t\tinterval=\"preserveStartEnd\"\n\t\t\t\t\t\tminTickGap={40}\n\t\t\t\t\t/>\n\t\t\t\t\t<YAxis\n\t\t\t\t\t\ttick={{ fill: colors.mutedForeground, fontSize: 11 }}\n\t\t\t\t\t\taxisLine={false}\n\t\t\t\t\t\ttickLine={false}\n\t\t\t\t\t\tscale={useLog ? 'log' : 'auto'}\n\t\t\t\t\t\tdomain={\n\t\t\t\t\t\t\tuseLog ? [logFloor, 'auto'] : [0, Math.ceil(maxRevenue * 1.1)]\n\t\t\t\t\t\t}\n\t\t\t\t\t\tallowDataOverflow={useLog}\n\t\t\t\t\t\ttickFormatter={formatCurrency}\n\t\t\t\t\t/>\n\t\t\t\t\t<Tooltip\n\t\t\t\t\t\tcontent={<CustomTooltip />}\n\t\t\t\t\t\tcursor={{\n\t\t\t\t\t\t\tstroke: '#22c55e',\n\t\t\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\t\t\tstrokeDasharray: '4 4',\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t{hasPrev && (\n\t\t\t\t\t\t<Area\n\t\t\t\t\t\t\ttype=\"linear\"\n\t\t\t\t\t\t\tdataKey=\"prevRevenue\"\n\t\t\t\t\t\t\tstroke={colors.mutedForeground}\n\t\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\t\tstrokeDasharray=\"4 3\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\t\tactiveDot={false}\n\t\t\t\t\t\t\tconnectNulls\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t<Area\n\t\t\t\t\t\ttype=\"linear\"\n\t\t\t\t\t\tdataKey=\"revenue\"\n\t\t\t\t\t\tstroke=\"#22c55e\"\n\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\tfill=\"url(#revenueGradient)\"\n\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\tactiveDot={{\n\t\t\t\t\t\t\tr: 5,\n\t\t\t\t\t\t\tfill: '#22c55e',\n\t\t\t\t\t\t\tstroke: colors.cardBg,\n\t\t\t\t\t\t\tstrokeWidth: 2,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</AreaChart>\n\t\t\t</ResponsiveContainer>\n\t\t\t{hasPrev && (\n\t\t\t\t<div className=\"mt-2 flex items-center gap-4 text-[11px]\">\n\t\t\t\t\t<span className=\"flex items-center gap-1.5\">\n\t\t\t\t\t\t<span className=\"inline-block h-0.5 w-4 rounded bg-emerald-500\" />\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">Current period</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"flex items-center gap-1.5\">\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName=\"inline-block h-0.5 w-4 rounded\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tbackground: colors.mutedForeground,\n\t\t\t\t\t\t\t\tbackgroundImage:\n\t\t\t\t\t\t\t\t\t'repeating-linear-gradient(90deg, transparent, transparent 3px, currentColor 3px, currentColor 5px)',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">Previous period</span>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n"],"mappings":"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","names":["React","useState","useTransition","CheckIcon","ChevronDownIcon","ClipboardIcon","ClipboardListIcon","ClockIcon","DollarSignIcon","ExternalLinkIcon","FilmIcon","GlobeIcon","LinkIcon","Loader2Icon","MousePointerClickIcon","PlayIcon","ShoppingCartIcon","TrendingUpIcon","parseAsStringLiteral","useQueryState","Card","CardContent","CardDescription","CardHeader","CardTitle","React","Bar","BarChart","CartesianGrid","ResponsiveContainer","Tooltip","XAxis","YAxis","useEffect","useState","FALLBACK","primary","primaryMuted","foreground","mutedForeground","gridLine","cardBg","hoverBg","getCSSVar","name","getComputedStyle","document","documentElement","getPropertyValue","trim","oklchToUsable","raw","startsWith","useChartColors","colors","setColors","useState","useEffect","update","muted","mutedFg","fg","border","card","replace","observer","MutationObserver","observe","attributes","attributeFilter","disconnect","countryFlag","code","length","offset","a","toUpperCase","charCodeAt","b","String","fromCodePoint","formatCurrency","value","toFixed","CustomTooltip","active","payload","d","div","className","p","country","revenue","toLocaleString","undefined","minimumFractionDigits","maximumFractionDigits","count","CountryChart","data","colors","useChartColors","chartData","slice","map","label","ResponsiveContainer","width","height","BarChart","layout","margin","top","right","left","bottom","CartesianGrid","strokeDasharray","stroke","gridLine","horizontal","XAxis","type","tick","fill","mutedForeground","fontSize","axisLine","tickLine","tickFormatter","YAxis","dataKey","Tooltip","content","cursor","hoverBg","Bar","radius","maxBarSize","fillOpacity","React","useMemo","Area","AreaChart","CartesianGrid","ResponsiveContainer","Tooltip","XAxis","YAxis","formatDate","dateStr","d","Date","toLocaleDateString","month","day","formatCurrency","value","toFixed","CustomTooltip","active","payload","label","length","merged","current","revenue","previous","prevRevenue","hasPrev","delta","deltaColor","pct","React","div","className","p","toLocaleString","undefined","minimumFractionDigits","maximumFractionDigits","span","count","prevCount","RevenueChart","data","previousData","colors","useChartColors","useMemo","map","i","prev","maxRevenue","Math","max","nonZeroVals","filter","v","sort","a","b","useLog","median","floor","logFloor","ResponsiveContainer","width","height","AreaChart","margin","top","right","left","bottom","defs","linearGradient","id","x1","y1","x2","y2","stop","offset","stopColor","stopOpacity","CartesianGrid","strokeDasharray","stroke","gridLine","vertical","XAxis","dataKey","tickFormatter","tick","fill","mutedForeground","fontSize","axisLine","tickLine","interval","minTickGap","YAxis","scale","domain","ceil","allowDataOverflow","Tooltip","content","cursor","strokeWidth","Area","type","dot","activeDot","connectNulls","r","cardBg","style","background","backgroundImage","fmt$","v","Intl","NumberFormat","style","currency","minimumFractionDigits","maximumFractionDigits","format","fmtK","toFixed","toLocaleString","fmtWatchMs","ms","hours","fmtAgo","date","Date","now","getTime","h","Math","floor","d","countryFlag","code","length","offset","a","toUpperCase","charCodeAt","b","String","fromCodePoint","Stat","label","value","sub","icon","Icon","accent","React","div","className","span","p","AgentApiCard","appName","state","setState","useState","baseUrl","window","location","origin","endpoint","handleCopy","tokenRes","catalogRes","Promise","all","fetch","method","then","r","json","catch","ok","Error","token","ttlLabel","expiresAt","surfaces","categories","Map","s","set","category","get","categoryLine","entries","map","cat","count","join","picks","name","description","seen","Set","preferred","find","x","has","add","push","exampleLines","hasYouTube","some","ytNote","prompt","navigator","clipboard","writeText","setTimeout","href","target","rel","button","onClick","disabled","Loader2Icon","CheckIcon","ClipboardIcon","TopVideosCard","subtitle","iconColor","videos","Card","CardHeader","CardTitle","CardDescription","CardContent","i","Row","linkProps","key","title","thumbnailUrl","img","src","alt","width","height","loading","PlayIcon","aria-hidden","ClockIcon","watchTime","views","badge","ExternalLinkIcon","ShortlinksCard","shortlinks","totalClicks","expanded","setExpanded","visible","slice","hasMore","totalSignups","reduce","l","signups","totalPurchases","purchases","LinkIcon","table","thead","tr","th","tbody","link","shortlinkId","td","slug","url","replace","substring","clicks","ChevronDownIcon","RANGES","rangeParser","parseAsStringLiteral","withDefault","OmnibusDashboard","data","initialRange","surveyDrilldownHref","range","setRange","useQueryState","isPending","startTransition","useTransition","rangeLabel","signupCount","attribution","type","purchaseAttrCount","hasRevenue","summary","totalRevenue","purchaseCount","hasRevenueChart","daily","revenue","hasByProduct","byProduct","hasByCountry","byCountry","hasRecentPurchases","recentPurchases","hasAttribution","hasAttributionCoverage","attributionCoverage","hasMux","mux","hasTraffic","traffic","hasSurveys","surveySegments","hasSurveyCorrelation","surveyCorrelation","hasShortlinks","h1","avgOrderValue","DollarSignIcon","overview","totalPlayingTimeMs","totalViews","uniqueViewers","FilmIcon","sessions","totalUsers","pageviews","GlobeIcon","TrendingUpIcon","MousePointerClickIcon","q","responses","ClipboardListIcon","topVideos","muxThumbnails","playingTimeMs","attributedRevenue","attributionRate","unattributedRevenue","totalForQuestion","answerDistribution","questionId","question","pct","answer","max","strong","em","sc","totalRespondents","purchased","respondentsWhoPurchased","convRate","overallConversionRate","totalRevenueFromRespondents","baseline","baselineConversionRate","pre","prePurchaseRespondents","post","postPurchaseRespondents","never","neverPurchasedRespondents","allRows","byQuestion","questionIds","answerCounts","filteredQIds","filter","qId","answers","sort","respondents","questionTitle","row","conversionRate","purchasers","responded","RevenueChart","previousData","previousDaily","ShoppingCartIcon","productId","productName","min","CountryChart","id","totalAmount","seats","userName","userEmail","country","createdAt"]}
|
package/dist/engine.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { SurfaceMap, QueryOptions, QueryResult } from './types.js';
|
|
2
|
+
import { SurfaceEntry } from './catalog.js';
|
|
3
|
+
|
|
4
|
+
type AnalyticsProvider = Record<string, ((...args: any[]) => Promise<any>) | unknown>;
|
|
5
|
+
type ProviderMap = Record<string, AnalyticsProvider>;
|
|
6
|
+
/**
|
|
7
|
+
* Creates an analytics engine bound to the given provider map.
|
|
8
|
+
*
|
|
9
|
+
* @param providers - A map of provider name → provider implementation. Keys
|
|
10
|
+
* must match the `provider` field values used in the catalog
|
|
11
|
+
* ('database', 'ga4', 'youtube', 'derived', 'newsletter', 'survey').
|
|
12
|
+
* @returns An object with `query`, `queryMany`, and `getCatalog` methods.
|
|
13
|
+
*/
|
|
14
|
+
declare function createAnalyticsEngine(providers: ProviderMap): {
|
|
15
|
+
query: <S extends keyof SurfaceMap>(surface: S, options?: QueryOptions) => Promise<QueryResult<S>>;
|
|
16
|
+
queryMany: <S_1 extends keyof SurfaceMap>(surfaces: S_1[], options?: QueryOptions) => Promise<{ [K in S_1]: QueryResult<K>; }>;
|
|
17
|
+
getCatalog: () => SurfaceEntry[];
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export { type AnalyticsProvider, type ProviderMap, createAnalyticsEngine };
|