@fayz-ai/plugin-marketing 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/MarketingContext.d.ts +35 -0
- package/dist/MarketingContext.d.ts.map +1 -0
- package/dist/MarketingPage.d.ts +11 -0
- package/dist/MarketingPage.d.ts.map +1 -0
- package/dist/components/MarketingBits.d.ts +29 -0
- package/dist/components/MarketingBits.d.ts.map +1 -0
- package/dist/components/icons.d.ts +6 -0
- package/dist/components/icons.d.ts.map +1 -0
- package/dist/data/mock.d.ts +10 -0
- package/dist/data/mock.d.ts.map +1 -0
- package/dist/data/types.d.ts +32 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/format.d.ts +17 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/index.cjs +1354 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1346 -0
- package/dist/index.js.map +1 -0
- package/dist/locales/en.d.ts +2 -0
- package/dist/locales/en.d.ts.map +1 -0
- package/dist/locales/index.d.ts +2 -0
- package/dist/locales/index.d.ts.map +1 -0
- package/dist/locales/pt-BR.d.ts +2 -0
- package/dist/locales/pt-BR.d.ts.map +1 -0
- package/dist/presets.d.ts +20 -0
- package/dist/presets.d.ts.map +1 -0
- package/dist/store.d.ts +18 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/types.d.ts +89 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/views/CampaignComposer.d.ts +6 -0
- package/dist/views/CampaignComposer.d.ts.map +1 -0
- package/dist/views/CampaignsView.d.ts +3 -0
- package/dist/views/CampaignsView.d.ts.map +1 -0
- package/dist/views/ChannelDetailView.d.ts +6 -0
- package/dist/views/ChannelDetailView.d.ts.map +1 -0
- package/dist/views/ChannelsView.d.ts +5 -0
- package/dist/views/ChannelsView.d.ts.map +1 -0
- package/dist/views/FunnelView.d.ts +3 -0
- package/dist/views/FunnelView.d.ts.map +1 -0
- package/dist/views/LandingPagesView.d.ts +3 -0
- package/dist/views/LandingPagesView.d.ts.map +1 -0
- package/dist/views/OverviewView.d.ts +9 -0
- package/dist/views/OverviewView.d.ts.map +1 -0
- package/dist/views/SettingsView.d.ts +3 -0
- package/dist/views/SettingsView.d.ts.map +1 -0
- package/dist/views/dashboardWidgets.d.ts +11 -0
- package/dist/views/dashboardWidgets.d.ts.map +1 -0
- package/package.json +55 -0
- package/src/MarketingContext.tsx +39 -0
- package/src/MarketingPage.tsx +94 -0
- package/src/components/MarketingBits.tsx +131 -0
- package/src/components/icons.tsx +17 -0
- package/src/data/mock.ts +233 -0
- package/src/data/types.ts +55 -0
- package/src/format.ts +40 -0
- package/src/index.ts +225 -0
- package/src/locales/en.ts +74 -0
- package/src/locales/index.ts +7 -0
- package/src/locales/pt-BR.ts +74 -0
- package/src/presets.ts +115 -0
- package/src/store.ts +66 -0
- package/src/types.ts +114 -0
- package/src/views/CampaignComposer.tsx +89 -0
- package/src/views/CampaignsView.tsx +56 -0
- package/src/views/ChannelDetailView.tsx +59 -0
- package/src/views/ChannelsView.tsx +46 -0
- package/src/views/FunnelView.tsx +56 -0
- package/src/views/LandingPagesView.tsx +49 -0
- package/src/views/OverviewView.tsx +24 -0
- package/src/views/SettingsView.tsx +72 -0
- package/src/views/dashboardWidgets.tsx +173 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/MarketingContext.tsx","../src/views/OverviewView.tsx","../src/format.ts","../src/components/icons.tsx","../src/components/MarketingBits.tsx","../src/views/ChannelsView.tsx","../src/views/ChannelDetailView.tsx","../src/views/CampaignComposer.tsx","../src/views/CampaignsView.tsx","../src/views/FunnelView.tsx","../src/views/LandingPagesView.tsx","../src/MarketingPage.tsx","../src/views/SettingsView.tsx","../src/views/dashboardWidgets.tsx","../src/presets.ts","../src/data/mock.ts","../src/store.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/index.ts"],"names":["createPluginContext","React","jsx","DashboardCanvas","Search","Megaphone","Globe","Mail","Users","MousePointerClick","Instagram","MessageCircle","DoorOpen","Utensils","Bike","Link2","jsxs","cn","ArrowUpRight","ArrowDownRight","SegmentedControl","useTranslation","ChevronRight","DataTable","SubpageHeader","Target","Percent","DollarSign","Modal","ModalContent","ModalHeader","ModalTitle","ModalBody","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","ModalFooter","Button","Trash2","Plus","Layers","useModuleNavigation","createViewRouter","ModulePage","ModuleActionBar","SettingsGroup","SelectRow","ToggleRow","useEffect","KpiCard","Trophy","Card","CardHeader","CardTitle","CardContent","TableWidget","ctx","defineKpiWidget","defineCustomWidget","defineTableWidget","createStore","getSupabaseClientOptional","registerTranslations"],"mappings":"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","file":"index.cjs","sourcesContent":["import React from 'react'\nimport { createPluginContext } from '@fayz-ai/saas'\nimport type { AcquisitionChannel, ConversionModel } from './types'\nimport type { MarketingCurrency } from './format'\nimport type { MarketingDomainModules } from './presets'\nimport type { MarketingDataProvider } from './data/types'\nimport type { MarketingUIState } from './store'\n\nexport interface MarketingLabels {\n pageTitle: string\n pageSubtitle: string\n overview: string\n channels: string\n campaigns: string\n funnel: string\n landingPages: string\n settings: string\n}\n\nexport interface ResolvedMarketingConfig {\n conversion: ConversionModel\n channels: AcquisitionChannel[]\n modules: MarketingDomainModules\n currency: MarketingCurrency\n labels: MarketingLabels\n}\n\nconst ctx = createPluginContext<ResolvedMarketingConfig, MarketingDataProvider, MarketingUIState>('MarketingPage')\n\nexport const MarketingContextProvider = ctx.ContextProvider\nexport const useMarketingConfig = ctx.useConfig\nexport const useMarketingProvider = ctx.useProvider\nexport const useMarketingStore = ctx.useStore\n\n/** Convenience: look up a channel definition by id. */\nexport function useChannelLookup(): Map<string, AcquisitionChannel> {\n const { channels } = useMarketingConfig()\n return React.useMemo(() => new Map(channels.map((c) => [c.id, c])), [channels])\n}\n","import React from 'react'\nimport { DashboardCanvas } from '@fayz-ai/ui'\nimport { useMarketingStore } from '../MarketingContext'\nimport type { DateRangeKey } from '../types'\n\n/**\n * Marketing overview. KPIs, channel mix and the campaigns table are registered\n * dashboard widgets (see ./dashboardWidgets) rendered through DashboardCanvas —\n * the same widgets also surface on the global app home. The sticky range control\n * drives the marketing store's range, which refetches all widgets' data.\n */\nexport function OverviewView() {\n const setRange = useMarketingStore((s) => s.setRange)\n const range = useMarketingStore((s) => s.range)\n return (\n <DashboardCanvas\n surface=\"plugin-home\"\n domain=\"marketing\"\n showHeader={false}\n className=\"mx-auto max-w-6xl space-y-6\"\n range={{ default: range, onChange: (r) => void setRange(r as DateRangeKey) }}\n />\n )\n}\n","export interface MarketingCurrency {\n code: string\n locale: string\n symbol: string\n}\n\nexport const DEFAULT_CURRENCY: MarketingCurrency = { code: 'USD', locale: 'en-US', symbol: '$' }\n\nexport function formatCurrency(value: number, currency: MarketingCurrency): string {\n try {\n return new Intl.NumberFormat(currency.locale, {\n style: 'currency',\n currency: currency.code,\n maximumFractionDigits: value >= 1000 ? 0 : 2,\n }).format(value)\n } catch {\n return `${currency.symbol}${Math.round(value).toLocaleString()}`\n }\n}\n\nexport function formatNumber(value: number): string {\n return Math.round(value).toLocaleString()\n}\n\nexport function formatPercent(value: number, digits = 1): string {\n return `${value.toFixed(digits)}%`\n}\n\n/** Compact form for big reach numbers (12.4k). */\nexport function formatCompact(value: number): string {\n if (value >= 1000) return `${(value / 1000).toFixed(value >= 10000 ? 0 : 1)}k`\n return String(Math.round(value))\n}\n\n/** Percentage-point delta vs a previous value, signed. */\nexport function trendDelta(current: number, previous: number): { pct: number; dir: 'up' | 'down' | 'neutral' } {\n if (previous === 0) return { pct: current > 0 ? 100 : 0, dir: current > 0 ? 'up' : 'neutral' }\n const pct = ((current - previous) / previous) * 100\n return { pct: Math.abs(pct), dir: pct > 0.5 ? 'up' : pct < -0.5 ? 'down' : 'neutral' }\n}\n","import React from 'react'\nimport {\n Search, Megaphone, Globe, Mail, Users, MousePointerClick,\n Instagram, MessageCircle, DoorOpen, Utensils, Bike, Link2,\n} from 'lucide-react'\n\n// Channel icon names referenced by presets → lucide components. Falls back to\n// a generic link icon for anything unmapped.\nconst ICONS: Record<string, React.ComponentType<{ className?: string }>> = {\n Search, Megaphone, Globe, Mail, Users, MousePointerClick,\n Instagram, MessageCircle, DoorOpen, Utensils, Bike,\n}\n\nexport function ChannelIcon({ name, className }: { name: string; className?: string }) {\n const Icon = ICONS[name] ?? Link2\n return <Icon className={className} />\n}\n","import React from 'react'\nimport { ArrowDownRight, ArrowUpRight } from 'lucide-react'\nimport { cn, SegmentedControl } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { CampaignStatus, DateRangeKey } from '../types'\nimport { trendDelta } from '../format'\nimport { useMarketingStore } from '../MarketingContext'\nimport { ChannelIcon } from './icons'\nimport { useChannelLookup } from '../MarketingContext'\n\n// ---------------------------------------------------------------------------\n// KPI card with optional trend chip.\n// ---------------------------------------------------------------------------\n\nexport function KpiCard({\n icon: Icon, label, value, sub, current, previous, invertTrend,\n}: {\n icon: React.ComponentType<{ className?: string }>\n label: string\n value: string\n sub?: string\n current?: number\n previous?: number\n /** for cost-style metrics where down is good (e.g. CPA) */\n invertTrend?: boolean\n}) {\n const trend = current != null && previous != null ? trendDelta(current, previous) : null\n const good = trend ? (invertTrend ? trend.dir === 'down' : trend.dir === 'up') : false\n const bad = trend ? (invertTrend ? trend.dir === 'up' : trend.dir === 'down') : false\n return (\n <div className=\"rounded-card border border-border bg-card p-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground\">\n <Icon className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">{label}</span>\n </div>\n <div className=\"mt-2 flex items-end justify-between gap-2\">\n <p className=\"text-2xl font-semibold text-foreground\">{value}</p>\n {trend && trend.dir !== 'neutral' && (\n <span className={cn(\n 'mb-0.5 inline-flex items-center gap-0.5 text-xs font-medium',\n good && 'text-emerald-600', bad && 'text-rose-600',\n !good && !bad && 'text-muted-foreground',\n )}>\n {trend.dir === 'up' ? <ArrowUpRight className=\"h-3 w-3\" /> : <ArrowDownRight className=\"h-3 w-3\" />}\n {trend.pct.toFixed(0)}%\n </span>\n )}\n </div>\n {sub && <p className=\"mt-0.5 text-xs text-muted-foreground\">{sub}</p>}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Date-range selector (segmented). Reads/writes the shared store range.\n// ---------------------------------------------------------------------------\n\nconst RANGES: DateRangeKey[] = ['7d', '30d', '90d']\n\nexport function RangeTabs() {\n const range = useMarketingStore((s) => s.range)\n const setRange = useMarketingStore((s) => s.setRange)\n return (\n <SegmentedControl\n options={RANGES}\n value={range}\n onChange={(r) => void setRange(r)}\n aria-label=\"Time range\"\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// Status badge for campaigns.\n// ---------------------------------------------------------------------------\n\nconst STATUS_STYLE: Record<CampaignStatus, string> = {\n active: 'bg-emerald-100 text-emerald-700',\n paused: 'bg-amber-100 text-amber-700',\n ended: 'bg-muted text-muted-foreground',\n draft: 'bg-slate-100 text-slate-600',\n}\n\nexport function StatusBadge({ status }: { status: CampaignStatus }) {\n const t = useTranslation()\n return (\n <span className={cn('rounded-full px-2 py-0.5 text-xs font-medium capitalize', STATUS_STYLE[status])}>\n {t(`marketing.status.${status}`)}\n </span>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Channel cell (icon + label) used in tables.\n// ---------------------------------------------------------------------------\n\nexport function ChannelCell({ channelId }: { channelId: string }) {\n const lookup = useChannelLookup()\n const ch = lookup.get(channelId)\n return (\n <span className=\"inline-flex items-center gap-1.5 text-foreground\">\n <ChannelIcon name={ch?.icon ?? 'Link2'} className=\"h-3.5 w-3.5 text-muted-foreground\" />\n {ch?.label ?? channelId}\n </span>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Horizontal proportion bar (funnel / channel-mix), no charting dep.\n// ---------------------------------------------------------------------------\n\nexport function ProportionBar({ value, max, color, label, right }: {\n value: number\n max: number\n color: string\n label: React.ReactNode\n right?: React.ReactNode\n}) {\n const pct = max > 0 ? Math.max((value / max) * 100, 2) : 0\n return (\n <div className=\"flex items-center gap-3\">\n <div className=\"w-32 shrink-0 text-sm text-muted-foreground\">{label}</div>\n <div className=\"h-7 flex-1 overflow-hidden rounded-md bg-muted/40\">\n <div className=\"flex h-full items-center rounded-md px-2 text-xs font-semibold\"\n style={{ width: `${pct}%`, backgroundColor: color + '26', color }}>\n {right}\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { ChevronRight } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { DataTable } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useMarketingConfig, useMarketingStore } from '../MarketingContext'\nimport { formatCurrency, formatNumber, formatPercent } from '../format'\nimport { RangeTabs, ChannelCell } from '../components/MarketingBits'\nimport type { ChannelPerformance } from '../types'\n\nexport function ChannelsView({ onOpen }: { onOpen: (channelId: string) => void }) {\n const t = useTranslation()\n const { conversion, currency } = useMarketingConfig()\n const channels = useMarketingStore((s) => s.channels)\n\n // Default ordering by conversions; DataTable lets the user re-sort any column.\n const sorted = [...channels].sort((a, b) => b.conversions - a.conversions)\n\n const columns = React.useMemo<ColumnDef<ChannelPerformance, any>[]>(() => [\n { accessorKey: 'channelId', header: t('marketing.col.channel'), cell: ({ getValue }) => <ChannelCell channelId={getValue() as string} /> },\n { accessorKey: 'reach', header: t('marketing.col.reach'), cell: ({ getValue }) => <span className=\"text-muted-foreground\">{formatNumber(getValue() as number)}</span> },\n { accessorKey: 'leads', header: t('marketing.col.leads'), cell: ({ getValue }) => <span className=\"text-muted-foreground\">{formatNumber(getValue() as number)}</span> },\n { accessorKey: 'conversions', header: conversion.labelPlural, cell: ({ getValue }) => <span className=\"font-medium text-foreground\">{formatNumber(getValue() as number)}</span> },\n { accessorKey: 'cvr', header: t('marketing.col.cvr'), cell: ({ getValue }) => <span className=\"text-muted-foreground\">{formatPercent(getValue() as number)}</span> },\n { accessorKey: 'spend', header: t('marketing.col.spend'), cell: ({ getValue }) => { const v = getValue() as number; return <span className=\"text-muted-foreground\">{v > 0 ? formatCurrency(v, currency) : '—'}</span> } },\n { accessorKey: 'cpa', header: t('marketing.col.cpa'), cell: ({ getValue }) => { const v = getValue() as number; return <span className=\"text-muted-foreground\">{v > 0 ? formatCurrency(v, currency) : '—'}</span> } },\n { accessorKey: 'value', header: conversion.valueLabel, cell: ({ getValue }) => <span className=\"text-muted-foreground\">{formatCurrency(getValue() as number, currency)}</span> },\n { id: 'open', header: '', enableSorting: false, cell: () => <ChevronRight className=\"h-4 w-4 text-muted-foreground\" /> },\n ], [t, conversion.labelPlural, conversion.valueLabel, currency])\n\n return (\n <div className=\"mx-auto max-w-6xl space-y-4\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\">{t('marketing.channels.subtitle')}</p>\n <RangeTabs />\n </div>\n\n <DataTable\n columns={columns}\n data={sorted}\n onRowClick={(row) => onOpen(row.channelId)}\n emptyMessage={t('marketing.channels.subtitle')}\n />\n </div>\n )\n}\n","import React from 'react'\nimport { Target, Percent, DollarSign, Users } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { DataTable, SubpageHeader } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useMarketingConfig, useMarketingStore, useChannelLookup, useMarketingProvider } from '../MarketingContext'\nimport { formatCurrency, formatNumber, formatPercent } from '../format'\nimport { KpiCard, StatusBadge } from '../components/MarketingBits'\nimport type { Campaign } from '../types'\n\nexport function ChannelDetailView({ channelId, onBack }: { channelId: string; onBack: () => void }) {\n const t = useTranslation()\n const { conversion, currency, labels } = useMarketingConfig()\n const range = useMarketingStore((s) => s.range)\n const channels = useMarketingStore((s) => s.channels)\n const lookup = useChannelLookup()\n const provider = useMarketingProvider()\n const [campaigns, setCampaigns] = React.useState<Campaign[]>([])\n\n React.useEffect(() => {\n void provider.listCampaigns({ range, channelId }).then(setCampaigns)\n }, [provider, range, channelId])\n\n const perf = channels.find((c) => c.channelId === channelId)\n const channel = lookup.get(channelId)\n\n const columns = React.useMemo<ColumnDef<Campaign, any>[]>(() => [\n { accessorKey: 'name', header: t('marketing.col.campaign'), cell: ({ getValue }) => <span className=\"font-medium text-foreground\">{getValue() as string}</span> },\n { accessorKey: 'conversions', header: conversion.labelPlural, cell: ({ getValue }) => <span className=\"text-muted-foreground\">{formatNumber(getValue() as number)}</span> },\n { id: 'cvr', accessorFn: (c) => (c.reach > 0 ? (c.conversions / c.reach) * 100 : 0), header: t('marketing.col.cvr'), cell: ({ getValue }) => <span className=\"text-muted-foreground\">{formatPercent(getValue() as number)}</span> },\n { accessorKey: 'spend', header: t('marketing.col.spend'), cell: ({ getValue }) => { const v = getValue() as number; return <span className=\"text-muted-foreground\">{v > 0 ? formatCurrency(v, currency) : '—'}</span> } },\n { accessorKey: 'status', header: t('marketing.col.status'), cell: ({ getValue }) => <StatusBadge status={getValue() as Campaign['status']} /> },\n ], [t, conversion.labelPlural, currency])\n\n return (\n <div className=\"mx-auto max-w-6xl space-y-6\">\n <SubpageHeader\n title={channel?.label ?? channelId}\n subtitle={channel?.kind}\n onBack={onBack}\n parentLabel={labels.channels}\n />\n\n {perf && (\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n <KpiCard icon={Users} label={t('marketing.metric.reach')} value={formatNumber(perf.reach)} />\n <KpiCard icon={Target} label={conversion.labelPlural} value={formatNumber(perf.conversions)} />\n <KpiCard icon={Percent} label={t('marketing.metric.cvr')} value={formatPercent(perf.cvr)} />\n <KpiCard icon={DollarSign} label={t('marketing.col.cpa')} value={perf.cpa > 0 ? formatCurrency(perf.cpa, currency) : '—'} sub={perf.spend > 0 ? `${formatCurrency(perf.spend, currency)} ${t('marketing.metric.spend')}` : '—'} />\n </div>\n )}\n\n <div className=\"space-y-2\">\n <h2 className=\"text-sm font-semibold text-foreground\">{t('marketing.channels.campaignsOn')}</h2>\n <DataTable columns={columns} data={campaigns} emptyMessage={t('marketing.channels.noCampaigns')} />\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport {\n Modal, ModalContent, ModalHeader, ModalTitle, ModalBody, ModalFooter,\n Button, Input,\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useMarketingConfig, useMarketingStore } from '../MarketingContext'\nimport type { CampaignStatus } from '../types'\n\nconst STATUSES: CampaignStatus[] = ['draft', 'active', 'paused']\n\nexport function CampaignComposer({ open, onClose }: { open: boolean; onClose: () => void }) {\n const t = useTranslation()\n const { channels } = useMarketingConfig()\n const saveCampaign = useMarketingStore((s) => s.saveCampaign)\n\n const [name, setName] = React.useState('')\n const [channelId, setChannelId] = React.useState(channels[0]?.id ?? '')\n const [status, setStatus] = React.useState<CampaignStatus>('active')\n const [spend, setSpend] = React.useState('')\n const [saving, setSaving] = React.useState(false)\n\n React.useEffect(() => {\n if (open) {\n setName(''); setChannelId(channels[0]?.id ?? ''); setStatus('active'); setSpend('')\n }\n }, [open, channels])\n\n async function handleSave() {\n if (!name.trim() || !channelId) return\n setSaving(true)\n await saveCampaign({\n name: name.trim(),\n channelId,\n status,\n start: new Date().toISOString(),\n spend: Number(spend) || 0,\n })\n setSaving(false)\n onClose()\n }\n\n return (\n <Modal open={open} onOpenChange={(o) => { if (!o) onClose() }}>\n <ModalContent size=\"md\">\n <ModalHeader>\n <ModalTitle>{t('marketing.composer.title')}</ModalTitle>\n </ModalHeader>\n <ModalBody className=\"space-y-4\">\n <label className=\"block space-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">{t('marketing.composer.name')}</span>\n <Input value={name} onChange={(e) => setName(e.target.value)} placeholder={t('marketing.composer.namePlaceholder')} />\n </label>\n\n <label className=\"block space-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">{t('marketing.composer.channel')}</span>\n <Select value={channelId} onValueChange={setChannelId}>\n <SelectTrigger><SelectValue placeholder={t('marketing.composer.channelPlaceholder')} /></SelectTrigger>\n <SelectContent>\n {channels.map((c) => <SelectItem key={c.id} value={c.id}>{c.label}</SelectItem>)}\n </SelectContent>\n </Select>\n </label>\n\n <div className=\"grid grid-cols-2 gap-3\">\n <label className=\"block space-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">{t('marketing.composer.status')}</span>\n <Select value={status} onValueChange={(v) => setStatus(v as CampaignStatus)}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {STATUSES.map((s) => <SelectItem key={s} value={s} className=\"capitalize\">{t(`marketing.status.${s}`)}</SelectItem>)}\n </SelectContent>\n </Select>\n </label>\n <label className=\"block space-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">{t('marketing.composer.budget')}</span>\n <Input type=\"number\" min={0} value={spend} onChange={(e) => setSpend(e.target.value)} placeholder=\"0\" />\n </label>\n </div>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"outline\" onClick={onClose}>{t('marketing.composer.cancel')}</Button>\n <Button onClick={handleSave} disabled={saving || !name.trim()}>{t('marketing.composer.create')}</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","import React from 'react'\nimport { Plus, Trash2 } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Button, DataTable } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useMarketingConfig, useMarketingStore } from '../MarketingContext'\nimport { formatCurrency, formatNumber, formatPercent } from '../format'\nimport { RangeTabs, ChannelCell, StatusBadge } from '../components/MarketingBits'\nimport { CampaignComposer } from './CampaignComposer'\nimport type { Campaign } from '../types'\n\nexport function CampaignsView() {\n const t = useTranslation()\n const { conversion, currency } = useMarketingConfig()\n const campaigns = useMarketingStore((s) => s.campaigns)\n const deleteCampaign = useMarketingStore((s) => s.deleteCampaign)\n const [composerOpen, setComposerOpen] = React.useState(false)\n\n const columns = React.useMemo<ColumnDef<Campaign, any>[]>(() => [\n { accessorKey: 'name', header: t('marketing.col.campaign'), cell: ({ getValue }) => <span className=\"font-medium text-foreground\">{getValue() as string}</span> },\n { accessorKey: 'channelId', header: t('marketing.col.channel'), cell: ({ getValue }) => <ChannelCell channelId={getValue() as string} /> },\n { accessorKey: 'reach', header: t('marketing.col.reach'), cell: ({ getValue }) => <span className=\"text-muted-foreground\">{formatNumber(getValue() as number)}</span> },\n { accessorKey: 'conversions', header: conversion.labelPlural, cell: ({ getValue }) => <span className=\"font-medium text-foreground\">{formatNumber(getValue() as number)}</span> },\n { id: 'cvr', accessorFn: (c) => (c.reach > 0 ? (c.conversions / c.reach) * 100 : 0), header: t('marketing.col.cvr'), cell: ({ getValue }) => <span className=\"text-muted-foreground\">{formatPercent(getValue() as number)}</span> },\n { accessorKey: 'spend', header: t('marketing.col.spend'), cell: ({ getValue }) => { const v = getValue() as number; return <span className=\"text-muted-foreground\">{v > 0 ? formatCurrency(v, currency) : '—'}</span> } },\n { accessorKey: 'status', header: t('marketing.col.status'), cell: ({ getValue }) => <StatusBadge status={getValue() as Campaign['status']} /> },\n {\n id: 'actions', header: '', enableSorting: false,\n cell: ({ row }) => (\n <button\n onClick={(e) => { e.stopPropagation(); void deleteCampaign(row.original.id) }}\n className=\"rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive\"\n title={t('marketing.campaigns.delete')}\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n ),\n },\n ], [t, conversion.labelPlural, currency, deleteCampaign])\n\n return (\n <div className=\"mx-auto max-w-6xl space-y-4\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\">{t('marketing.campaigns.subtitle')}</p>\n <div className=\"flex items-center gap-2\">\n <RangeTabs />\n <Button onClick={() => setComposerOpen(true)}><Plus className=\"mr-1.5 h-4 w-4\" /> {t('marketing.campaigns.new')}</Button>\n </div>\n </div>\n\n <DataTable columns={columns} data={campaigns} emptyMessage={t('marketing.campaigns.empty')} />\n\n <CampaignComposer open={composerOpen} onClose={() => setComposerOpen(false)} />\n </div>\n )\n}\n","import React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useMarketingConfig, useMarketingStore } from '../MarketingContext'\nimport { formatNumber, formatPercent } from '../format'\nimport { RangeTabs } from '../components/MarketingBits'\n\nexport function FunnelView() {\n const t = useTranslation()\n const { conversion } = useMarketingConfig()\n const funnel = useMarketingStore((s) => s.funnel)\n const max = Math.max(...funnel.map((s) => s.count), 1)\n\n return (\n <div className=\"mx-auto max-w-4xl space-y-4\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\">\n {t('marketing.funnel.subtitlePrefix')} {conversion.label.toLowerCase()}\n </p>\n <RangeTabs />\n </div>\n\n <div className=\"rounded-card border border-border bg-card p-5\">\n <div className=\"space-y-3\">\n {funnel.map((stage, i) => {\n const pct = max > 0 ? Math.max((stage.count / max) * 100, 4) : 0\n const prev = funnel[i - 1]\n const stepRate = prev && prev.count > 0 ? (stage.count / prev.count) * 100 : null\n return (\n <div key={stage.id}>\n <div className=\"mb-1 flex items-center justify-between text-sm\">\n <span className=\"font-medium text-foreground\">{stage.label}</span>\n <span className=\"text-muted-foreground\">\n {formatNumber(stage.count)}\n {stepRate != null && <span className=\"ml-2 text-xs\">({formatPercent(stepRate, 0)} {t('marketing.funnel.ofPrev')})</span>}\n </span>\n </div>\n <div className=\"h-9 overflow-hidden rounded-md bg-muted/40\">\n <div className=\"h-full rounded-md\" style={{ width: `${pct}%`, backgroundColor: stage.color + '33', borderLeft: `3px solid ${stage.color}` }} />\n </div>\n </div>\n )\n })}\n </div>\n\n <div className=\"mt-5 border-t border-border pt-4 text-sm\">\n <span className=\"text-muted-foreground\">{t('marketing.funnel.overall')}: </span>\n <span className=\"font-semibold text-foreground\">\n {funnel.length > 1 && funnel[0].count > 0\n ? formatPercent((funnel[funnel.length - 1].count / funnel[0].count) * 100)\n : '—'}\n </span>\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { MousePointerClick, Layers, Percent } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { DataTable } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useMarketingStore } from '../MarketingContext'\nimport { formatNumber, formatPercent } from '../format'\nimport { KpiCard, RangeTabs } from '../components/MarketingBits'\nimport type { LandingPagePerf } from '../types'\n\nconst TYPE_STYLE: Record<string, string> = {\n Funnel: 'bg-indigo-100 text-indigo-700',\n 'Landing page': 'bg-pink-100 text-pink-700',\n Website: 'bg-sky-100 text-sky-700',\n}\n\nexport function LandingPagesView() {\n const t = useTranslation()\n const pages = useMarketingStore((s) => s.landingPages)\n\n const totalVisits = pages.reduce((s, p) => s + p.visits, 0)\n const totalConv = pages.reduce((s, p) => s + p.conversions, 0)\n const avgCvr = totalVisits > 0 ? (totalConv / totalVisits) * 100 : 0\n\n const columns = React.useMemo<ColumnDef<LandingPagePerf, any>[]>(() => [\n { accessorKey: 'name', header: t('marketing.col.page'), cell: ({ getValue }) => <span className=\"font-medium text-foreground\">{getValue() as string}</span> },\n { accessorKey: 'type', header: t('marketing.col.type'), cell: ({ getValue }) => { const v = getValue() as string; return <span className={`rounded-full px-2 py-0.5 text-xs font-medium ${TYPE_STYLE[v] ?? 'bg-muted text-muted-foreground'}`}>{v}</span> } },\n { accessorKey: 'visits', header: t('marketing.col.visits'), cell: ({ getValue }) => <span className=\"text-muted-foreground\">{formatNumber(getValue() as number)}</span> },\n { accessorKey: 'conversions', header: t('marketing.col.conversions'), cell: ({ getValue }) => <span className=\"font-medium text-foreground\">{formatNumber(getValue() as number)}</span> },\n { accessorKey: 'cvr', header: t('marketing.col.cvr'), cell: ({ getValue }) => <span className=\"text-muted-foreground\">{formatPercent(getValue() as number)}</span> },\n ], [t])\n\n return (\n <div className=\"mx-auto max-w-6xl space-y-4\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\">{t('marketing.landing.subtitle')}</p>\n <RangeTabs />\n </div>\n\n <div className=\"grid grid-cols-3 gap-4\">\n <KpiCard icon={MousePointerClick} label={t('marketing.metric.totalVisits')} value={formatNumber(totalVisits)} />\n <KpiCard icon={Layers} label={t('marketing.metric.pages')} value={String(pages.length)} />\n <KpiCard icon={Percent} label={t('marketing.metric.avgConversion')} value={formatPercent(avgCvr)} />\n </div>\n\n <DataTable columns={columns} data={pages} emptyMessage={t('marketing.landing.subtitle')} />\n </div>\n )\n}\n","import React from 'react'\nimport type { StoreApi } from 'zustand/vanilla'\nimport { ModulePage, type ModuleNavItem } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { PluginQuickAction } from '@fayz-ai/core'\nimport { useModuleNavigation, ModuleActionBar, createViewRouter } from '@fayz-ai/saas'\nimport { MarketingContextProvider, type ResolvedMarketingConfig } from './MarketingContext'\nimport type { MarketingDataProvider } from './data/types'\nimport type { MarketingUIState } from './store'\nimport { OverviewView } from './views/OverviewView'\nimport { ChannelsView } from './views/ChannelsView'\nimport { ChannelDetailView } from './views/ChannelDetailView'\nimport { CampaignsView } from './views/CampaignsView'\nimport { FunnelView } from './views/FunnelView'\nimport { LandingPagesView } from './views/LandingPagesView'\n\nfunction buildNav(\n config: ResolvedMarketingConfig,\n view: string,\n navigate: (v: string) => void,\n): ModuleNavItem[] {\n const items: ModuleNavItem[] = [\n { id: 'overview', label: config.labels.overview, icon: 'BarChart3', active: view === 'overview', onClick: () => navigate('overview') },\n ]\n if (config.modules.channels) {\n items.push({\n id: 'channels', label: config.labels.channels, icon: 'Radio',\n active: view === 'channels' || view.startsWith('channel-detail:'),\n onClick: () => navigate('channels'),\n })\n }\n if (config.modules.campaigns) {\n items.push({ id: 'campaigns', label: config.labels.campaigns, icon: 'Megaphone', active: view === 'campaigns', onClick: () => navigate('campaigns') })\n }\n if (config.modules.funnel) {\n items.push({ id: 'funnel', label: config.labels.funnel, icon: 'Filter', active: view === 'funnel', onClick: () => navigate('funnel') })\n }\n if (config.modules.landingPages) {\n items.push({ id: 'landing-pages', label: config.labels.landingPages, icon: 'LayoutTemplate', active: view === 'landing-pages', onClick: () => navigate('landing-pages') })\n }\n return items\n}\n\nexport function MarketingPage({ config, provider, store }: {\n config: ResolvedMarketingConfig\n provider: MarketingDataProvider\n store: StoreApi<MarketingUIState>\n}) {\n const t = useTranslation()\n const { view, direction, navigate } = useModuleNavigation('/marketing', {\n overview: 0, channels: 0, campaigns: 0, funnel: 0, 'landing-pages': 0,\n 'channel-detail': 1,\n }, 'overview')\n\n React.useEffect(() => { void store.getState().load() }, [store])\n\n const isOverview = view === 'overview'\n const nav = buildNav(config, view, navigate)\n\n const quickActions = React.useMemo<PluginQuickAction[]>(() => [\n { id: 'new-campaign', label: t('marketing.campaigns.new'), icon: 'Megaphone', description: config.labels.campaigns, action: () => navigate('campaigns') },\n ], [t, config.labels.campaigns])\n\n const renderView = createViewRouter([\n { id: 'channels', render: () => <ChannelsView onOpen={(id) => navigate(`channel-detail:${id}`)} /> },\n { id: 'channel-detail', render: ({ id }) => <ChannelDetailView channelId={id!} onBack={() => navigate('channels')} /> },\n { id: 'campaigns', render: () => <CampaignsView /> },\n { id: 'funnel', render: () => <FunnelView /> },\n { id: 'landing-pages', render: () => <LandingPagesView /> },\n { id: 'overview', render: () => <OverviewView /> },\n ], 'overview')\n\n return (\n <MarketingContextProvider config={config} provider={provider} store={store}>\n <ModulePage\n title={config.labels.pageTitle}\n subtitle={config.labels.pageSubtitle}\n nav={nav}\n showHeader={isOverview}\n viewKey={view}\n direction={direction}\n headerAction={\n <ModuleActionBar\n quickActions={quickActions}\n settingsPath=\"/settings/marketing\"\n settingsLabel={config.labels.pageTitle}\n />\n }\n >\n {renderView(view)}\n </ModulePage>\n </MarketingContextProvider>\n )\n}\n","import React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { SettingsGroup, ToggleRow, SelectRow } from '@fayz-ai/saas'\nimport { useMarketingConfig } from '../MarketingContext'\n\nconst SOURCE_OPTIONS = [\n { value: 'crm', label: 'CRM' },\n { value: 'agenda', label: 'Agenda' },\n { value: 'orders', label: 'Orders' },\n { value: 'custom', label: 'Custom' },\n]\n\nexport function SettingsView() {\n const t = useTranslation()\n const { conversion, channels } = useMarketingConfig()\n\n // Local UI state — mock toggles (no backend yet), mirrors other plugins' settings.\n const [source, setSource] = React.useState(conversion.source)\n const [trackValue, setTrackValue] = React.useState(true)\n const [autoSync, setAutoSync] = React.useState(true)\n const [assisted, setAssisted] = React.useState(false)\n const [tracked, setTracked] = React.useState<Record<string, boolean>>(\n () => Object.fromEntries(channels.map((c) => [c.id, true])),\n )\n\n return (\n <div className=\"space-y-4\">\n <SettingsGroup title={t('marketing.settings.conversionModel')} description={t('marketing.settings.conversionModelDesc')}>\n <SelectRow\n label={t('marketing.settings.attributedFrom')}\n description={conversion.label}\n value={source}\n options={SOURCE_OPTIONS}\n onChange={(v) => setSource(v as typeof source)}\n />\n <ToggleRow\n label={t('marketing.settings.trackValue')}\n description={t('marketing.settings.trackValueDesc')}\n checked={trackValue}\n onChange={setTrackValue}\n />\n </SettingsGroup>\n\n <SettingsGroup title={t('marketing.settings.channels')} description={t('marketing.settings.channelsDesc')}>\n {channels.map((c) => (\n <ToggleRow\n key={c.id}\n label={c.label}\n description={t('marketing.settings.channelTrackDesc')}\n checked={tracked[c.id] ?? true}\n onChange={(v) => setTracked((prev) => ({ ...prev, [c.id]: v }))}\n />\n ))}\n </SettingsGroup>\n\n <SettingsGroup title={t('marketing.settings.attribution')} description={t('marketing.settings.attributionDesc')}>\n <ToggleRow\n label={t('marketing.settings.autoSync')}\n description={t('marketing.settings.autoSyncDesc')}\n checked={autoSync}\n onChange={setAutoSync}\n />\n <ToggleRow\n label={t('marketing.settings.assisted')}\n description={t('marketing.settings.assistedDesc')}\n checked={assisted}\n onChange={setAssisted}\n />\n </SettingsGroup>\n </div>\n )\n}\n","import React, { useEffect } from 'react'\nimport { Target, Percent, DollarSign, Trophy } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport type { StoreApi } from 'zustand'\nimport type { DashboardWidgetDef } from '@fayz-ai/core'\nimport { useTranslation } from '@fayz-ai/core'\nimport {\n KpiCard, TableWidget, Card, CardHeader, CardTitle, CardContent,\n defineKpiWidget, defineCustomWidget, defineTableWidget,\n} from '@fayz-ai/ui'\nimport {\n MarketingContextProvider, useMarketingConfig, useMarketingStore, useChannelLookup,\n type ResolvedMarketingConfig,\n} from '../MarketingContext'\nimport type { MarketingDataProvider } from '../data/types'\nimport type { MarketingUIState } from '../store'\nimport { formatCurrency, formatNumber, formatPercent, formatCompact } from '../format'\nimport { ProportionBar, ChannelCell, StatusBadge } from '../components/MarketingBits'\nimport type { Campaign } from '../types'\n\n// Ensure marketing data is loaded — covers the global home, where MarketingPage\n// (which normally triggers load) is not mounted. Guarded to avoid refetch storms.\nfunction useEnsureMarketingData() {\n const overview = useMarketingStore((s) => s.overview)\n const loading = useMarketingStore((s) => s.loading)\n const load = useMarketingStore((s) => s.load)\n useEffect(() => { if (!overview && !loading) void load() }, [])\n}\n\n// ---------------------------------------------------------------------------\n// KPI widgets (shared KpiCard — trend chip from current/previous)\n// ---------------------------------------------------------------------------\n\nfunction ConversionsKpi() {\n const { conversion } = useMarketingConfig()\n const overview = useMarketingStore((s) => s.overview)\n useEnsureMarketingData()\n return (\n <KpiCard\n icon={Target} label={conversion.labelPlural}\n value={formatNumber(overview?.conversions ?? 0)}\n current={overview?.conversions} previous={overview?.conversionsPrev}\n />\n )\n}\n\nfunction ConversionRateKpi() {\n const t = useTranslation()\n const overview = useMarketingStore((s) => s.overview)\n useEnsureMarketingData()\n return (\n <KpiCard\n icon={Percent} label={t('marketing.metric.conversionRate')}\n value={formatPercent(overview?.cvr ?? 0)}\n current={overview?.cvr} previous={overview?.cvrPrev}\n />\n )\n}\n\nfunction CpaKpi() {\n const t = useTranslation()\n const { currency } = useMarketingConfig()\n const overview = useMarketingStore((s) => s.overview)\n useEnsureMarketingData()\n return (\n <KpiCard\n icon={DollarSign} label={t('marketing.metric.cpa')}\n value={overview && overview.cpa > 0 ? formatCurrency(overview.cpa, currency) : '—'}\n sub={`${formatCurrency(overview?.spend ?? 0, currency)} ${t('marketing.metric.spend')}`}\n />\n )\n}\n\nfunction TopChannelKpi() {\n const t = useTranslation()\n const { conversion, currency } = useMarketingConfig()\n const overview = useMarketingStore((s) => s.overview)\n const lookup = useChannelLookup()\n useEnsureMarketingData()\n return (\n <KpiCard\n icon={Trophy} label={t('marketing.metric.topChannel')}\n value={overview?.topChannelId ? lookup.get(overview.topChannelId)?.label ?? '—' : '—'}\n sub={`${conversion.valueLabel}: ${formatCurrency(overview?.value ?? 0, currency)}`}\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// Channel mix (custom — reuses the existing ProportionBar + channel icons)\n// ---------------------------------------------------------------------------\n\nfunction ChannelMixPanel() {\n const t = useTranslation()\n const { conversion } = useMarketingConfig()\n const overview = useMarketingStore((s) => s.overview)\n useEnsureMarketingData()\n const mix = overview?.channelMix ?? []\n const maxMix = Math.max(...mix.map((m) => m.conversions), 1)\n return (\n <Card>\n <CardHeader>\n <CardTitle>{conversion.labelPlural} {t('marketing.overview.byChannelSuffix')}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2.5\">\n {mix.map((m) => (\n <ProportionBar\n key={m.channelId}\n value={m.conversions}\n max={maxMix}\n color=\"#6366f1\"\n label={<ChannelCell channelId={m.channelId} />}\n right={<span>{formatNumber(m.conversions)}</span>}\n />\n ))}\n </CardContent>\n </Card>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Recent campaigns table\n// ---------------------------------------------------------------------------\n\nfunction CampaignsTable() {\n const t = useTranslation()\n const { conversion } = useMarketingConfig()\n const campaigns = useMarketingStore((s) => s.campaigns)\n useEnsureMarketingData()\n const columns: ColumnDef<Campaign, unknown>[] = [\n { accessorKey: 'name', header: t('marketing.col.campaign'), cell: ({ getValue }) => <span className=\"font-medium text-foreground\">{getValue() as string}</span> },\n { accessorKey: 'channelId', header: t('marketing.col.channel'), cell: ({ getValue }) => <ChannelCell channelId={getValue() as string} /> },\n { accessorKey: 'conversions', header: conversion.labelPlural, cell: ({ getValue }) => <span className=\"text-muted-foreground\">{formatCompact(getValue() as number)}</span> },\n { id: 'cvr', accessorFn: (c) => (c.reach > 0 ? (c.conversions / c.reach) * 100 : 0), header: t('marketing.col.cvr'), cell: ({ getValue }) => <span className=\"text-muted-foreground\">{formatPercent(getValue() as number)}</span> },\n { accessorKey: 'status', header: t('marketing.col.status'), cell: ({ getValue }) => <StatusBadge status={getValue() as Campaign['status']} /> },\n ]\n const recent = campaigns.filter((c) => c.status !== 'draft').slice(0, 5)\n return <TableWidget title={t('marketing.overview.recent')} icon=\"Megaphone\" columns={columns} data={recent} emptyMessage={t('marketing.campaigns.empty')} />\n}\n\n// ---------------------------------------------------------------------------\n// Registry builder — wraps each widget in MarketingContextProvider so it renders\n// on the global home (no MarketingPage around it) and the marketing plugin-home.\n// ---------------------------------------------------------------------------\n\nexport function createMarketingDashboardWidgets(ctx: {\n config: ResolvedMarketingConfig\n provider: MarketingDataProvider\n store: StoreApi<MarketingUIState>\n}): DashboardWidgetDef[] {\n const withCtx = (Inner: React.ComponentType): React.ComponentType<unknown> => {\n const Wrapped = () => (\n <MarketingContextProvider config={ctx.config} provider={ctx.provider} store={ctx.store}>\n <Inner />\n </MarketingContextProvider>\n )\n Wrapped.displayName = `MarketingWidget(${Inner.displayName ?? Inner.name})`\n return Wrapped\n }\n\n return [\n // Conversions is marketing's headline KPI on the global home; the rest are\n // home-hidden by default (shown on the marketing plugin-home, addable via Customize).\n defineKpiWidget({ id: 'marketing.kpi.conversions', title: 'marketing.metric.conversions', domain: 'marketing', defaultOrder: 0, component: withCtx(ConversionsKpi) }),\n defineKpiWidget({ id: 'marketing.kpi.conversion-rate', title: 'marketing.metric.conversionRate', domain: 'marketing', defaultOrder: 1, defaultVisible: false, component: withCtx(ConversionRateKpi) }),\n defineKpiWidget({ id: 'marketing.kpi.cpa', title: 'marketing.metric.cpa', domain: 'marketing', defaultOrder: 2, defaultVisible: false, component: withCtx(CpaKpi) }),\n defineKpiWidget({ id: 'marketing.kpi.top-channel', title: 'marketing.metric.topChannel', domain: 'marketing', defaultOrder: 3, defaultVisible: false, component: withCtx(TopChannelKpi) }),\n // Channel-mix + campaigns default to the marketing plugin-home only; the\n // global home stays a clean cross-domain KPI overview.\n defineCustomWidget({ id: 'marketing.panel.channel-mix', title: 'marketing.overview.byChannelSuffix', domain: 'marketing', span: 4, defaultOrder: 10, surfaces: ['plugin-home'], component: withCtx(ChannelMixPanel) }),\n defineTableWidget({ id: 'marketing.table.recent-campaigns', title: 'marketing.overview.recent', domain: 'marketing', span: 4, defaultOrder: 20, surfaces: ['plugin-home'], component: withCtx(CampaignsTable) }),\n ]\n}\n","import type { AcquisitionChannel, ConversionModel } from './types'\n\n// ---------------------------------------------------------------------------\n// Domain presets — the abstraction that lets ONE plugin feed every vertical.\n// Each preset defines what a \"conversion\" is (and where it's attributed from)\n// plus the acquisition channels that vertical actually uses. Channel ids align\n// with plugin-crm's `lead-sources` registry where they overlap.\n// ---------------------------------------------------------------------------\n\nexport type MarketingDomain = 'agency' | 'beauty' | 'resto'\n\nexport interface MarketingDomainModules {\n channels: boolean\n campaigns: boolean\n funnel: boolean\n landingPages: boolean\n /** Outbound — reserved, off by default, implemented in a later milestone. */\n broadcasts: boolean\n journeys: boolean\n}\n\nexport interface MarketingDomainPreset {\n conversion: ConversionModel\n channels: AcquisitionChannel[]\n modules: MarketingDomainModules\n}\n\nconst AGENCY: MarketingDomainPreset = {\n conversion: {\n id: 'won-deal',\n label: 'Won deal',\n labelPlural: 'Won deals',\n valueLabel: 'Pipeline value',\n source: 'crm',\n avgValue: 3200,\n },\n channels: [\n { id: 'paid-search', label: 'Paid Search', icon: 'Search', kind: 'paid' },\n { id: 'paid-social', label: 'Paid Social', icon: 'Megaphone', kind: 'paid' },\n { id: 'organic', label: 'Organic / SEO', icon: 'Globe', kind: 'organic' },\n { id: 'email', label: 'Email', icon: 'Mail', kind: 'outbound' },\n { id: 'referral', label: 'Referral', icon: 'Users', kind: 'referral' },\n { id: 'direct', label: 'Direct', icon: 'MousePointerClick', kind: 'direct' },\n ],\n modules: { channels: true, campaigns: true, funnel: true, landingPages: true, broadcasts: false, journeys: false },\n}\n\nconst BEAUTY: MarketingDomainPreset = {\n conversion: {\n id: 'booking',\n label: 'Booking',\n labelPlural: 'Bookings',\n valueLabel: 'Booking revenue',\n source: 'agenda',\n avgValue: 85,\n },\n channels: [\n { id: 'instagram', label: 'Instagram', icon: 'Instagram', kind: 'social' },\n { id: 'google', label: 'Google', icon: 'Globe', kind: 'organic' },\n { id: 'referral', label: 'Referral', icon: 'Users', kind: 'referral' },\n { id: 'whatsapp', label: 'WhatsApp', icon: 'MessageCircle', kind: 'social' },\n { id: 'walkin', label: 'Walk-in', icon: 'DoorOpen', kind: 'direct' },\n ],\n modules: { channels: true, campaigns: true, funnel: true, landingPages: false, broadcasts: false, journeys: false },\n}\n\nconst RESTO: MarketingDomainPreset = {\n conversion: {\n id: 'order',\n label: 'Order',\n labelPlural: 'Orders',\n valueLabel: 'Revenue',\n source: 'orders',\n avgValue: 42,\n },\n channels: [\n { id: 'ifood', label: 'iFood', icon: 'Utensils', kind: 'paid' },\n { id: 'delivery', label: 'Delivery apps', icon: 'Bike', kind: 'paid' },\n { id: 'google', label: 'Google', icon: 'Globe', kind: 'organic' },\n { id: 'instagram', label: 'Instagram', icon: 'Instagram', kind: 'social' },\n { id: 'walkin', label: 'Walk-in', icon: 'DoorOpen', kind: 'direct' },\n ],\n modules: { channels: true, campaigns: true, funnel: true, landingPages: false, broadcasts: false, journeys: false },\n}\n\nexport const MARKETING_PRESETS: Record<MarketingDomain, MarketingDomainPreset> = {\n agency: AGENCY,\n beauty: BEAUTY,\n resto: RESTO,\n}\n\n/** Vertical-flavored campaign name templates for the mock seed. */\nexport const CAMPAIGN_NAME_SEEDS: Record<MarketingDomain, string[]> = {\n agency: [\n 'Q2 Lead-gen — Search',\n 'LinkedIn Retargeting',\n 'Webinar Funnel',\n 'Newsletter Nurture',\n 'Partner Referral Push',\n ],\n beauty: [\n 'Summer Glow Promo',\n 'New Client — Instagram',\n 'Birthday Offer Blast',\n 'Win-back 90 days',\n 'Google Reviews Boost',\n ],\n resto: [\n 'iFood Weekend Combo',\n 'Happy Hour Promo',\n 'New Menu Launch',\n 'Loyalty Double Points',\n 'Instagram Stories Drop',\n ],\n}\n","import type { MarketingDataProvider, SaveCampaignInput } from './types'\nimport type {\n AcquisitionChannel,\n AcquisitionChannelKind,\n Campaign,\n ChannelPerformance,\n ConversionModel,\n DateRangeKey,\n FunnelStage,\n LandingPagePerf,\n MarketingOverview,\n MarketingQuery,\n} from '../types'\nimport { CAMPAIGN_NAME_SEEDS, type MarketingDomain } from '../presets'\n\n// ---------------------------------------------------------------------------\n// Deterministic seed knobs (no Date.now at module init for stable analytics).\n// ---------------------------------------------------------------------------\n\nconst RANGE_FACTOR: Record<DateRangeKey, number> = { '7d': 0.25, '30d': 1, '90d': 3.05 }\nconst BASE_REACH = [4200, 3100, 2600, 1900, 1500, 1200, 1000]\n\nconst KIND_LEAD_RATE: Record<AcquisitionChannelKind, number> = {\n paid: 0.18, social: 0.22, organic: 0.14, referral: 0.3, direct: 0.1, outbound: 0.16,\n}\nconst KIND_CONV_RATE: Record<AcquisitionChannelKind, number> = {\n paid: 0.28, social: 0.25, organic: 0.32, referral: 0.45, direct: 0.22, outbound: 0.24,\n}\nconst KIND_SPEND30: Record<AcquisitionChannelKind, number> = {\n paid: 2800, social: 900, outbound: 600, organic: 0, referral: 0, direct: 0,\n}\n\ninterface ChannelBase {\n channelId: string\n kind: AcquisitionChannelKind\n reach: number\n leads: number\n conversions: number\n spend: number\n value: number\n}\n\nexport interface MockMarketingConfig {\n channels: AcquisitionChannel[]\n conversion: ConversionModel\n domain: MarketingDomain\n}\n\nfunction channelBase30(channels: AcquisitionChannel[], conversion: ConversionModel): ChannelBase[] {\n return channels.map((ch, i) => {\n const reach = BASE_REACH[i % BASE_REACH.length]\n const leads = Math.round(reach * KIND_LEAD_RATE[ch.kind])\n const conversions = Math.round(leads * KIND_CONV_RATE[ch.kind])\n const spend = KIND_SPEND30[ch.kind]\n const value = Math.round(conversions * conversion.avgValue)\n return { channelId: ch.id, kind: ch.kind, reach, leads, conversions, spend, value }\n })\n}\n\nfunction scale(n: number, range: DateRangeKey): number {\n return Math.round(n * RANGE_FACTOR[range])\n}\n\nfunction toPerformance(base: ChannelBase, range: DateRangeKey): ChannelPerformance {\n const reach = scale(base.reach, range)\n const leads = scale(base.leads, range)\n const conversions = scale(base.conversions, range)\n const spend = scale(base.spend, range)\n const value = scale(base.value, range)\n return {\n channelId: base.channelId,\n reach, leads, conversions, spend, value,\n cvr: reach > 0 ? (conversions / reach) * 100 : 0,\n cpa: conversions > 0 && spend > 0 ? spend / conversions : 0,\n }\n}\n\nfunction seedCampaigns(cfg: MockMarketingConfig): Campaign[] {\n const names = CAMPAIGN_NAME_SEEDS[cfg.domain]\n const base = channelBase30(cfg.channels, cfg.conversion)\n const statuses: Campaign['status'][] = ['active', 'active', 'paused', 'ended', 'draft']\n const startDays = [12, 26, 40, 8, 3]\n const baseDate = new Date('2026-06-16T00:00:00Z').getTime()\n\n return names.map((name, i) => {\n const ch = cfg.channels[i % cfg.channels.length]\n const b = base[i % base.length]\n const status = statuses[i % statuses.length]\n const draft = status === 'draft'\n const start = new Date(baseDate - startDays[i % startDays.length] * 86_400_000).toISOString()\n // Campaigns carry a slice of their channel's volume so totals stay plausible.\n const share = 0.55 + (i % 3) * 0.12\n return {\n id: `cmp-${i + 1}`,\n name,\n channelId: ch.id,\n status,\n start,\n end: status === 'ended' ? new Date(baseDate - 2 * 86_400_000).toISOString() : undefined,\n spend: draft ? 0 : Math.round(b.spend * share),\n reach: draft ? 0 : Math.round(b.reach * share),\n leads: draft ? 0 : Math.round(b.leads * share),\n conversions: draft ? 0 : Math.round(b.conversions * share),\n value: draft ? 0 : Math.round(b.value * share),\n }\n })\n}\n\nfunction scaleCampaign(c: Campaign, range: DateRangeKey): Campaign {\n if (c.status === 'draft') return c\n return {\n ...c,\n spend: scale(c.spend, range),\n reach: scale(c.reach, range),\n leads: scale(c.leads, range),\n conversions: scale(c.conversions, range),\n value: scale(c.value, range),\n }\n}\n\nfunction seedLandingPages(): Array<Omit<LandingPagePerf, 'cvr'>> {\n // 30d baseline; scaled per range at read time.\n return [\n { id: 'lp-1', name: 'Free Consultation Funnel', type: 'Funnel', visits: 3820, conversions: 474 },\n { id: 'lp-2', name: 'Summer Promo Landing', type: 'Landing page', visits: 1560, conversions: 126 },\n { id: 'lp-3', name: 'Pricing Page', type: 'Landing page', visits: 2240, conversions: 198 },\n { id: 'lp-4', name: 'Company Website', type: 'Website', visits: 9240, conversions: 296 },\n ]\n}\n\nexport function createMockMarketingProvider(cfg: MockMarketingConfig): MarketingDataProvider {\n const base = channelBase30(cfg.channels, cfg.conversion)\n const campaigns = seedCampaigns(cfg)\n const landing = seedLandingPages()\n let counter = 100\n\n async function channelPerformance(query: MarketingQuery): Promise<ChannelPerformance[]> {\n const list = base.map((b) => toPerformance(b, query.range))\n return query.channelId ? list.filter((c) => c.channelId === query.channelId) : list\n }\n\n return {\n channelPerformance,\n\n async overview(query: MarketingQuery): Promise<MarketingOverview> {\n const perf = await channelPerformance(query)\n const reach = perf.reduce((s, c) => s + c.reach, 0)\n const conversions = perf.reduce((s, c) => s + c.conversions, 0)\n const spend = perf.reduce((s, c) => s + c.spend, 0)\n const value = perf.reduce((s, c) => s + c.value, 0)\n const cvr = reach > 0 ? (conversions / reach) * 100 : 0\n const top = [...perf].sort((a, b) => b.conversions - a.conversions)[0]\n return {\n conversions,\n conversionsPrev: Math.round(conversions * 0.86),\n cvr,\n cvrPrev: cvr * 0.94,\n spend,\n cpa: conversions > 0 && spend > 0 ? spend / conversions : 0,\n value,\n topChannelId: top?.channelId ?? null,\n channelMix: perf.map((c) => ({ channelId: c.channelId, conversions: c.conversions })),\n }\n },\n\n async funnel(query: MarketingQuery): Promise<FunnelStage[]> {\n const perf = await channelPerformance(query)\n const reach = perf.reduce((s, c) => s + c.reach, 0)\n const leads = perf.reduce((s, c) => s + c.leads, 0)\n const conversions = perf.reduce((s, c) => s + c.conversions, 0)\n const qualified = Math.round(leads * 0.62)\n return [\n { id: 'reach', label: 'Reach / visits', count: reach, color: '#6366f1' },\n { id: 'leads', label: 'Leads', count: leads, color: '#0ea5e9' },\n { id: 'qualified', label: 'Qualified', count: qualified, color: '#14b8a6' },\n { id: 'converted', label: cfg.conversion.labelPlural, count: conversions, color: '#22c55e' },\n ]\n },\n\n async listCampaigns(query: MarketingQuery): Promise<Campaign[]> {\n const list = query.channelId ? campaigns.filter((c) => c.channelId === query.channelId) : campaigns\n return list.map((c) => scaleCampaign(c, query.range))\n },\n\n async getCampaign(id: string): Promise<Campaign | null> {\n return campaigns.find((c) => c.id === id) ?? null\n },\n\n async saveCampaign(input: SaveCampaignInput): Promise<Campaign> {\n if (input.id) {\n const existing = campaigns.find((c) => c.id === input.id)\n if (existing) {\n Object.assign(existing, {\n name: input.name, channelId: input.channelId, status: input.status,\n start: input.start, end: input.end, spend: input.spend,\n })\n return existing\n }\n }\n const b = base.find((x) => x.channelId === input.channelId) ?? base[0]\n const active = input.status === 'active'\n const created: Campaign = {\n id: `cmp-${++counter}`,\n name: input.name,\n channelId: input.channelId,\n status: input.status,\n start: input.start,\n end: input.end,\n spend: input.spend,\n // New campaigns ramp from a small slice of their channel's volume.\n reach: active ? Math.round(b.reach * 0.15) : 0,\n leads: active ? Math.round(b.leads * 0.15) : 0,\n conversions: active ? Math.round(b.conversions * 0.15) : 0,\n value: active ? Math.round(b.value * 0.15) : 0,\n }\n campaigns.unshift(created)\n return created\n },\n\n async deleteCampaign(id: string): Promise<void> {\n const idx = campaigns.findIndex((c) => c.id === id)\n if (idx >= 0) campaigns.splice(idx, 1)\n },\n\n async landingPages(query: MarketingQuery): Promise<LandingPagePerf[]> {\n return landing.map((p) => {\n const visits = scale(p.visits, query.range)\n const conversions = scale(p.conversions, query.range)\n return { ...p, visits, conversions, cvr: visits > 0 ? (conversions / visits) * 100 : 0 }\n })\n },\n }\n}\n","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport type { MarketingDataProvider, SaveCampaignInput } from './data/types'\nimport type {\n Campaign,\n ChannelPerformance,\n DateRangeKey,\n FunnelStage,\n LandingPagePerf,\n MarketingOverview,\n} from './types'\n\nexport interface MarketingUIState {\n range: DateRangeKey\n overview: MarketingOverview | null\n channels: ChannelPerformance[]\n campaigns: Campaign[]\n funnel: FunnelStage[]\n landingPages: LandingPagePerf[]\n loading: boolean\n\n load(): Promise<void>\n setRange(range: DateRangeKey): Promise<void>\n saveCampaign(input: SaveCampaignInput): Promise<Campaign>\n deleteCampaign(id: string): Promise<void>\n}\n\nexport function createMarketingStore(provider: MarketingDataProvider): StoreApi<MarketingUIState> {\n return createStore<MarketingUIState>((set, get) => ({\n range: '30d',\n overview: null,\n channels: [],\n campaigns: [],\n funnel: [],\n landingPages: [],\n loading: false,\n\n async load() {\n const range = get().range\n set({ loading: true })\n const [overview, channels, campaigns, funnel, landingPages] = await Promise.all([\n provider.overview({ range }),\n provider.channelPerformance({ range }),\n provider.listCampaigns({ range }),\n provider.funnel({ range }),\n provider.landingPages({ range }),\n ])\n set({ overview, channels, campaigns, funnel, landingPages, loading: false })\n },\n\n async setRange(range) {\n set({ range })\n await get().load()\n },\n\n async saveCampaign(input) {\n const created = await provider.saveCampaign(input)\n await get().load()\n return created\n },\n\n async deleteCampaign(id) {\n await provider.deleteCampaign(id)\n await get().load()\n },\n }))\n}\n","export const en: Record<string, string> = {\n // metrics\n 'marketing.metric.conversionRate': 'Conversion rate',\n 'marketing.metric.cpa': 'Cost per acquisition',\n 'marketing.metric.topChannel': 'Top channel',\n 'marketing.metric.spend': 'spend',\n 'marketing.metric.reach': 'Reach',\n 'marketing.metric.cvr': 'CVR',\n 'marketing.metric.totalVisits': 'Total visits',\n 'marketing.metric.pages': 'Pages',\n 'marketing.metric.avgConversion': 'Avg. conversion',\n // columns\n 'marketing.col.campaign': 'Campaign',\n 'marketing.col.channel': 'Channel',\n 'marketing.col.reach': 'Reach',\n 'marketing.col.leads': 'Leads',\n 'marketing.col.cvr': 'CVR',\n 'marketing.col.spend': 'Spend',\n 'marketing.col.cpa': 'CPA',\n 'marketing.col.status': 'Status',\n 'marketing.col.visits': 'Visits',\n 'marketing.col.conversions': 'Conversions',\n 'marketing.col.type': 'Type',\n 'marketing.col.page': 'Page',\n // overview\n 'marketing.overview.byChannelSuffix': 'by channel',\n 'marketing.overview.recent': 'Recent campaigns',\n // channels\n 'marketing.channels.subtitle': 'Acquisition performance by channel',\n 'marketing.channels.campaignsOn': 'Campaigns on this channel',\n 'marketing.channels.noCampaigns': 'No campaigns yet on this channel.',\n // campaigns\n 'marketing.campaigns.subtitle': 'All acquisition campaigns and their conversion performance',\n 'marketing.campaigns.new': 'New campaign',\n 'marketing.campaigns.empty': 'No campaigns yet — create your first one.',\n 'marketing.campaigns.delete': 'Delete campaign',\n // composer\n 'marketing.composer.title': 'New campaign',\n 'marketing.composer.name': 'Campaign name',\n 'marketing.composer.namePlaceholder': 'e.g. Spring Promo — Paid Social',\n 'marketing.composer.channel': 'Channel',\n 'marketing.composer.channelPlaceholder': 'Select a channel',\n 'marketing.composer.status': 'Status',\n 'marketing.composer.budget': 'Budget / spend',\n 'marketing.composer.cancel': 'Cancel',\n 'marketing.composer.create': 'Create campaign',\n 'marketing.status.draft': 'draft',\n 'marketing.status.active': 'active',\n 'marketing.status.paused': 'paused',\n 'marketing.status.ended': 'ended',\n // funnel\n 'marketing.funnel.subtitlePrefix': 'Attribution funnel — reach to',\n 'marketing.funnel.overall': 'Overall conversion rate',\n 'marketing.funnel.ofPrev': 'of prev',\n // landing pages\n 'marketing.landing.subtitle': 'Per-page visits → conversions performance',\n // settings\n 'marketing.settings.conversionModel': 'Conversion model',\n 'marketing.settings.conversionModelDesc': \"What counts as a conversion in this workspace and where it's attributed from.\",\n 'marketing.settings.conversion': 'Conversion',\n 'marketing.settings.valueMetric': 'Value metric',\n 'marketing.settings.attributedFrom': 'Attributed from',\n 'marketing.settings.channels': 'Acquisition channels',\n 'marketing.settings.channelsDesc': 'Sources tracked for this workspace.',\n 'marketing.settings.trackValue': 'Track monetary value',\n 'marketing.settings.trackValueDesc': 'Attribute revenue to channels and campaigns.',\n 'marketing.settings.attribution': 'Attribution',\n 'marketing.settings.attributionDesc': 'How conversions are matched to channels.',\n 'marketing.settings.autoSync': 'Auto-sync conversions',\n 'marketing.settings.autoSyncDesc': 'Pull conversions automatically from the source.',\n 'marketing.settings.assisted': 'Count assisted conversions',\n 'marketing.settings.assistedDesc': 'Credit channels that contributed to a conversion.',\n 'marketing.settings.channelTrackDesc': 'Track this acquisition source.',\n}\n","export const ptBR: Record<string, string> = {\n // metrics\n 'marketing.metric.conversionRate': 'Taxa de conversão',\n 'marketing.metric.cpa': 'Custo por aquisição',\n 'marketing.metric.topChannel': 'Principal canal',\n 'marketing.metric.spend': 'investido',\n 'marketing.metric.reach': 'Alcance',\n 'marketing.metric.cvr': 'CVR',\n 'marketing.metric.totalVisits': 'Total de visitas',\n 'marketing.metric.pages': 'Páginas',\n 'marketing.metric.avgConversion': 'Conversão média',\n // columns\n 'marketing.col.campaign': 'Campanha',\n 'marketing.col.channel': 'Canal',\n 'marketing.col.reach': 'Alcance',\n 'marketing.col.leads': 'Leads',\n 'marketing.col.cvr': 'CVR',\n 'marketing.col.spend': 'Investimento',\n 'marketing.col.cpa': 'CPA',\n 'marketing.col.status': 'Status',\n 'marketing.col.visits': 'Visitas',\n 'marketing.col.conversions': 'Conversões',\n 'marketing.col.type': 'Tipo',\n 'marketing.col.page': 'Página',\n // overview\n 'marketing.overview.byChannelSuffix': 'por canal',\n 'marketing.overview.recent': 'Campanhas recentes',\n // channels\n 'marketing.channels.subtitle': 'Desempenho de aquisição por canal',\n 'marketing.channels.campaignsOn': 'Campanhas neste canal',\n 'marketing.channels.noCampaigns': 'Nenhuma campanha ainda neste canal.',\n // campaigns\n 'marketing.campaigns.subtitle': 'Todas as campanhas de aquisição e seu desempenho de conversão',\n 'marketing.campaigns.new': 'Nova campanha',\n 'marketing.campaigns.empty': 'Nenhuma campanha ainda — crie a primeira.',\n 'marketing.campaigns.delete': 'Excluir campanha',\n // composer\n 'marketing.composer.title': 'Nova campanha',\n 'marketing.composer.name': 'Nome da campanha',\n 'marketing.composer.namePlaceholder': 'ex.: Promo de Verão — Mídia Paga',\n 'marketing.composer.channel': 'Canal',\n 'marketing.composer.channelPlaceholder': 'Selecione um canal',\n 'marketing.composer.status': 'Status',\n 'marketing.composer.budget': 'Orçamento / investimento',\n 'marketing.composer.cancel': 'Cancelar',\n 'marketing.composer.create': 'Criar campanha',\n 'marketing.status.draft': 'rascunho',\n 'marketing.status.active': 'ativa',\n 'marketing.status.paused': 'pausada',\n 'marketing.status.ended': 'encerrada',\n // funnel\n 'marketing.funnel.subtitlePrefix': 'Funil de atribuição — alcance até',\n 'marketing.funnel.overall': 'Taxa de conversão geral',\n 'marketing.funnel.ofPrev': 'do anterior',\n // landing pages\n 'marketing.landing.subtitle': 'Desempenho de visitas → conversões por página',\n // settings\n 'marketing.settings.conversionModel': 'Modelo de conversão',\n 'marketing.settings.conversionModelDesc': 'O que conta como conversão neste workspace e de onde é atribuída.',\n 'marketing.settings.conversion': 'Conversão',\n 'marketing.settings.valueMetric': 'Métrica de valor',\n 'marketing.settings.attributedFrom': 'Atribuída de',\n 'marketing.settings.channels': 'Canais de aquisição',\n 'marketing.settings.channelsDesc': 'Fontes monitoradas neste workspace.',\n 'marketing.settings.trackValue': 'Acompanhar valor monetário',\n 'marketing.settings.trackValueDesc': 'Atribuir receita a canais e campanhas.',\n 'marketing.settings.attribution': 'Atribuição',\n 'marketing.settings.attributionDesc': 'Como as conversões são associadas aos canais.',\n 'marketing.settings.autoSync': 'Sincronizar conversões automaticamente',\n 'marketing.settings.autoSyncDesc': 'Importar conversões automaticamente da fonte.',\n 'marketing.settings.assisted': 'Contar conversões assistidas',\n 'marketing.settings.assistedDesc': 'Creditar canais que contribuíram para uma conversão.',\n 'marketing.settings.channelTrackDesc': 'Monitorar esta fonte de aquisição.',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const marketingLocales: Record<string, Record<string, string>> = {\n en,\n 'pt-BR': ptBR,\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { getSupabaseClientOptional, registerTranslations } from '@fayz-ai/core'\nimport { MarketingPage } from './MarketingPage'\nimport { SettingsView } from './views/SettingsView'\nimport { createMarketingDashboardWidgets } from './views/dashboardWidgets'\nimport {\n MarketingContextProvider,\n type ResolvedMarketingConfig,\n type MarketingLabels,\n} from './MarketingContext'\nimport type {\n AttributionBridge,\n MarketingDataProvider,\n SitesPerformanceBridge,\n} from './data/types'\nimport { createMockMarketingProvider } from './data/mock'\nimport { createMarketingStore } from './store'\nimport { DEFAULT_CURRENCY, type MarketingCurrency } from './format'\nimport { MARKETING_PRESETS, type MarketingDomain, type MarketingDomainModules } from './presets'\nimport type { AcquisitionChannel, ConversionModel } from './types'\nimport { marketingLocales } from './locales'\n\n// ---------------------------------------------------------------------------\n// @fayz-ai/plugin-marketing — acquisition & conversion analytics. ONE plugin,\n// every vertical: a `domain` preset (or explicit conversion + channels) adapts\n// what a conversion is and where it's attributed from. Channels, campaigns,\n// funnel and landing-page CVR are computed generically.\n//\n// Ships a vertical-flavored mock today; real attribution comes via the\n// AttributionBridge / SitesPerformanceBridge seams (read from crm/agenda/\n// orders/sites). Outbound broadcasts + journeys are reserved behind flags.\n// ---------------------------------------------------------------------------\n\nexport interface MarketingPluginOptions {\n /** Vertical preset for conversion model + channels + module defaults. */\n domain?: MarketingDomain\n /** Override the conversion model (else taken from the domain preset). */\n conversion?: ConversionModel\n /** Override the acquisition channels (else from the domain preset). */\n channels?: AcquisitionChannel[]\n modules?: Partial<MarketingDomainModules>\n currency?: Partial<MarketingCurrency>\n labels?: Partial<MarketingLabels>\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n navLabel?: string\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: MarketingDataProvider\n /** Optional DI to read real conversions (mounted later). */\n attributionBridge?: AttributionBridge\n /** Optional DI to read real landing-page performance (mounted later). */\n sitesBridge?: SitesPerformanceBridge\n}\n\nconst DEFAULT_LABELS: MarketingLabels = {\n pageTitle: 'Marketing',\n pageSubtitle: 'Acquisition & conversion performance',\n overview: 'Overview',\n channels: 'Channels',\n campaigns: 'Campaigns',\n funnel: 'Funnel',\n landingPages: 'Landing pages',\n settings: 'Settings',\n}\n\nfunction resolveConfig(options?: MarketingPluginOptions): { config: ResolvedMarketingConfig; domain: MarketingDomain } {\n const domain = options?.domain ?? 'agency'\n const preset = MARKETING_PRESETS[domain]\n const config: ResolvedMarketingConfig = {\n conversion: options?.conversion ?? preset.conversion,\n channels: options?.channels ?? preset.channels,\n modules: { ...preset.modules, ...options?.modules },\n currency: { ...DEFAULT_CURRENCY, ...options?.currency },\n labels: { ...DEFAULT_LABELS, ...options?.labels },\n }\n return { config, domain }\n}\n\nfunction createSafeProvider(config: ResolvedMarketingConfig, domain: MarketingDomain): MarketingDataProvider {\n // Supabase-backed + bridge-fed providers land later; mock powers it for now.\n void getSupabaseClientOptional()\n return createMockMarketingProvider({ channels: config.channels, conversion: config.conversion, domain })\n}\n\nexport function createMarketingPlugin(options?: MarketingPluginOptions): PluginManifest {\n registerTranslations(marketingLocales)\n const { config, domain } = resolveConfig(options)\n const provider = options?.dataProvider ?? createSafeProvider(config, domain)\n const store = createMarketingStore(provider)\n const dashboardWidgets = createMarketingDashboardWidgets({ config, provider, store })\n\n const PageComponent: React.ComponentType<unknown> = () =>\n React.createElement(MarketingContextProvider, { config, provider, store },\n React.createElement(MarketingPage, { config, provider, store }))\n PageComponent.displayName = 'MarketingPage'\n\n // Settings lives in the SDK-core central Settings area (not a module tab).\n const SettingsComponent: React.ComponentType<unknown> = () =>\n React.createElement(MarketingContextProvider, { config, provider, store },\n React.createElement(SettingsView))\n SettingsComponent.displayName = 'MarketingSettings'\n\n return {\n id: 'marketing',\n name: options?.navLabel ?? config.labels.pageTitle,\n icon: 'Megaphone',\n version: '1.0.0',\n scope: options?.scope ?? 'universal',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n declaredFeatures: [\n { id: 'marketing', label: config.labels.pageTitle, group: 'Engage' },\n ...(config.modules.landingPages ? [{ id: 'marketing.landing-pages', label: config.labels.landingPages, group: 'Engage' }] : []),\n ],\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 5,\n label: options?.navLabel ?? config.labels.pageTitle,\n route: '/marketing',\n icon: 'Megaphone',\n permission: { feature: 'marketing', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/marketing',\n component: PageComponent,\n permission: { feature: 'marketing', action: 'read' as const },\n },\n ],\n widgets: [],\n dashboardWidgets,\n events: [\n { name: 'marketing.conversion.tracked', description: 'A conversion was attributed to a channel/campaign' },\n { name: 'marketing.campaign.created', description: 'A campaign was created' },\n { name: 'marketing.campaign.updated', description: 'A campaign was updated' },\n { name: 'marketing.channel.synced', description: 'A channel pulled fresh attribution data' },\n ],\n aiTools: [\n {\n id: 'marketing.channel-performance',\n name: 'channelPerformance',\n description: 'Returns acquisition performance per channel (reach, conversions, CVR, spend, CPA).',\n icon: 'Radio',\n mode: 'read' as const,\n category: 'Marketing',\n parameters: {\n type: 'object' as const,\n properties: { range: { type: 'string' as const, enum: ['7d', '30d', '90d'] } },\n },\n suggestions: [{ label: 'Which channel converts best?' }, { label: 'What is my cost per acquisition?' }],\n permission: { feature: 'marketing', action: 'read' as const },\n },\n {\n id: 'marketing.top-channels',\n name: 'topChannels',\n description: 'Returns the top acquisition channels ranked by conversions.',\n icon: 'Trophy',\n mode: 'read' as const,\n category: 'Marketing',\n permission: { feature: 'marketing', action: 'read' as const },\n },\n {\n id: 'marketing.campaign-cvr',\n name: 'campaignCvr',\n description: 'Lists campaigns with their conversion rate for a date range.',\n icon: 'Percent',\n mode: 'read' as const,\n category: 'Marketing',\n parameters: {\n type: 'object' as const,\n properties: { range: { type: 'string' as const, enum: ['7d', '30d', '90d'] } },\n },\n permission: { feature: 'marketing', action: 'read' as const },\n },\n {\n id: 'marketing.create-campaign',\n name: 'createCampaign',\n description: 'Creates an acquisition campaign on a channel.',\n icon: 'Plus',\n mode: 'persist' as const,\n category: 'Marketing',\n parameters: {\n type: 'object' as const,\n properties: {\n name: { type: 'string' as const, description: 'Campaign name' },\n channelId: { type: 'string' as const, description: 'Acquisition channel id' },\n },\n required: ['name', 'channelId'],\n },\n permission: { feature: 'marketing', action: 'create' as const },\n },\n ],\n settings: [\n {\n id: 'marketing',\n label: config.labels.pageTitle,\n icon: 'Megaphone',\n component: SettingsComponent,\n order: 20,\n permission: { feature: 'marketing', action: 'read' as const },\n },\n ],\n locales: marketingLocales,\n }\n}\n\nexport type {\n MarketingDataProvider,\n AttributionBridge,\n SitesPerformanceBridge,\n} from './data/types'\nexport type {\n AcquisitionChannel,\n ConversionModel,\n Campaign,\n ChannelPerformance,\n LandingPagePerf,\n} from './types'\nexport { MARKETING_PRESETS, type MarketingDomain } from './presets'\nexport { createMockMarketingProvider } from './data/mock'\n"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core';
|
|
2
|
+
import { type MarketingLabels } from './MarketingContext';
|
|
3
|
+
import type { AttributionBridge, MarketingDataProvider, SitesPerformanceBridge } from './data/types';
|
|
4
|
+
import { type MarketingCurrency } from './format';
|
|
5
|
+
import { type MarketingDomain, type MarketingDomainModules } from './presets';
|
|
6
|
+
import type { AcquisitionChannel, ConversionModel } from './types';
|
|
7
|
+
export interface MarketingPluginOptions {
|
|
8
|
+
/** Vertical preset for conversion model + channels + module defaults. */
|
|
9
|
+
domain?: MarketingDomain;
|
|
10
|
+
/** Override the conversion model (else taken from the domain preset). */
|
|
11
|
+
conversion?: ConversionModel;
|
|
12
|
+
/** Override the acquisition channels (else from the domain preset). */
|
|
13
|
+
channels?: AcquisitionChannel[];
|
|
14
|
+
modules?: Partial<MarketingDomainModules>;
|
|
15
|
+
currency?: Partial<MarketingCurrency>;
|
|
16
|
+
labels?: Partial<MarketingLabels>;
|
|
17
|
+
navPosition?: number;
|
|
18
|
+
navSection?: 'main' | 'secondary' | 'settings';
|
|
19
|
+
navLabel?: string;
|
|
20
|
+
scope?: PluginScope;
|
|
21
|
+
verticalId?: VerticalId;
|
|
22
|
+
dataProvider?: MarketingDataProvider;
|
|
23
|
+
/** Optional DI to read real conversions (mounted later). */
|
|
24
|
+
attributionBridge?: AttributionBridge;
|
|
25
|
+
/** Optional DI to read real landing-page performance (mounted later). */
|
|
26
|
+
sitesBridge?: SitesPerformanceBridge;
|
|
27
|
+
}
|
|
28
|
+
export declare function createMarketingPlugin(options?: MarketingPluginOptions): PluginManifest;
|
|
29
|
+
export type { MarketingDataProvider, AttributionBridge, SitesPerformanceBridge, } from './data/types';
|
|
30
|
+
export type { AcquisitionChannel, ConversionModel, Campaign, ChannelPerformance, LandingPagePerf, } from './types';
|
|
31
|
+
export { MARKETING_PRESETS, type MarketingDomain } from './presets';
|
|
32
|
+
export { createMockMarketingProvider } from './data/mock';
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAK5E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,UAAU,CAAA;AACnE,OAAO,EAAqB,KAAK,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAChG,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAclE,MAAM,WAAW,sBAAsB;IACrC,yEAAyE;IACzE,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB,yEAAyE;IACzE,UAAU,CAAC,EAAE,eAAe,CAAA;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAA;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,YAAY,CAAC,EAAE,qBAAqB,CAAA;IACpC,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,yEAAyE;IACzE,WAAW,CAAC,EAAE,sBAAsB,CAAA;CACrC;AAgCD,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,cAAc,CA2HtF;AAED,YAAY,EACV,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,cAAc,CAAA;AACrB,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,QAAQ,EACR,kBAAkB,EAClB,eAAe,GAChB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,iBAAiB,EAAE,KAAK,eAAe,EAAE,MAAM,WAAW,CAAA;AACnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA"}
|