@fayz-ai/plugin-marketing 0.8.1 → 0.9.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/MarketingPage.d.ts.map +1 -1
  2. package/dist/data/capability.test.d.ts +2 -0
  3. package/dist/data/capability.test.d.ts.map +1 -0
  4. package/dist/data/supabase.d.ts +10 -0
  5. package/dist/data/supabase.d.ts.map +1 -0
  6. package/dist/data/tables.d.ts +7 -0
  7. package/dist/data/tables.d.ts.map +1 -1
  8. package/dist/data/types.d.ts +2 -0
  9. package/dist/data/types.d.ts.map +1 -1
  10. package/dist/index.d.ts +1 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +746 -61
  13. package/dist/index.js.map +1 -1
  14. package/dist/migrations/index.d.ts +3 -0
  15. package/dist/migrations/index.d.ts.map +1 -1
  16. package/dist/registries.d.ts +3 -3
  17. package/dist/registries.d.ts.map +1 -1
  18. package/dist/schema/index.d.ts +354 -0
  19. package/dist/schema/index.d.ts.map +1 -1
  20. package/dist/schema.cjs +30 -0
  21. package/dist/schema.cjs.map +1 -1
  22. package/dist/schema.js +30 -2
  23. package/dist/schema.js.map +1 -1
  24. package/dist/store.d.ts +2 -0
  25. package/dist/store.d.ts.map +1 -1
  26. package/dist/views/CampaignsView.d.ts.map +1 -1
  27. package/dist/views/blog/BlogEntityForm.d.ts.map +1 -1
  28. package/dist/views/content/ContentView.d.ts.map +1 -1
  29. package/package.json +16 -12
  30. package/src/MarketingPage.tsx +5 -1
  31. package/src/data/capability.test.ts +92 -0
  32. package/src/data/supabase.ts +401 -0
  33. package/src/data/tables.ts +9 -0
  34. package/src/data/types.ts +2 -0
  35. package/src/index.ts +138 -10
  36. package/src/migrations/005_analytics_base.sql +60 -0
  37. package/src/migrations/006_analytics_views.sql +68 -0
  38. package/src/migrations/007_agent_rpcs.sql +119 -0
  39. package/src/migrations/index.ts +257 -1
  40. package/src/registries.ts +18 -6
  41. package/src/schema/index.ts +38 -1
  42. package/src/store.ts +21 -8
  43. package/src/views/CampaignsView.tsx +4 -1
  44. package/src/views/blog/BlogEntityForm.tsx +11 -2
  45. package/src/views/content/ContentView.tsx +8 -1
  46. package/dist/index.cjs +0 -4551
  47. package/dist/index.cjs.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +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/views/content/ContentPlannerContext.tsx","../src/data/contentTypes.ts","../src/views/content/contentBits.tsx","../src/views/content/PlanBriefView.tsx","../src/views/content/ContentView.tsx","../src/data/contentMedia.ts","../src/views/content/RecordingChecklist.tsx","../src/views/content/PostSocialPreview.tsx","../src/views/content/templates.ts","../src/views/content/PostPage.tsx","../src/data/blogEntities.tsx","../src/views/blog/useEntityCrud.ts","../src/views/blog/BlogAdminView.tsx","../src/views/blog/BlogEntityForm.tsx","../src/MarketingPage.tsx","../src/views/SettingsView.tsx","../src/registries.ts","../src/views/dashboardWidgets.tsx","../src/presets.ts","../src/data/mock.ts","../src/data/contentMock.ts","../src/data/tables.ts","../src/data/contentSupabase.ts","../src/store.ts","../src/views/content/contentStore.ts","../src/migrations/index.ts","../src/integrations/ranklayer/data/supabase.ts","../src/integrations/ranklayer/connectorDef.tsx","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/index.ts"],"names":["React","jsx","useTranslation","jsxs","provider","Users","DataTable","Button","MousePointerClick","Percent","ctx","createPluginContext","cn","STATUS_STYLE","Input","SubpageHeader","Trash2","Plus","Modal","ModalContent","ModalHeader","ModalTitle","ModalBody","ModalFooter","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","SegmentedControl","ListIcon","ChevronRight","Checkbox","X","ImageIcon","MessageCircle","Globe","isVideo","toDraft","Skeleton","MarkdownEditor","ConfirmDialog","useMemo","useState","useEffect","KpiCard","Target","DollarSign","counter","acc","plan","post","getSupabaseClientOptional","getActiveTenantId","data","error","createStore","getClient","requireTenantId","Sparkles"],"mappings":"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","file":"index.js","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 content: string\n blog: string\n blogCategories: 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 Youtube, Facebook, Linkedin, Twitter, Music2, Pin, AtSign,\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\n// Platform icons for the content planner. Lucide has no TikTok / Pinterest /\n// Threads glyphs — Music2 / Pin / AtSign are the conventional stand-ins.\nconst PLATFORM_ICONS: Record<string, React.ComponentType<{ className?: string }>> = {\n instagram: Instagram,\n tiktok: Music2,\n youtube: Youtube,\n facebook: Facebook,\n linkedin: Linkedin,\n x: Twitter,\n pinterest: Pin,\n threads: AtSign,\n}\n\nexport function PlatformIcon({ platform, className }: { platform: string; className?: string }) {\n const Icon = PLATFORM_ICONS[platform] ?? 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 { createPluginContext } from '@fayz-ai/saas'\nimport type { ResolvedMarketingConfig } from '../../MarketingContext'\nimport type { ContentPlannerProvider } from '../../data/contentTypes'\nimport type { ContentPlannerUIState } from './contentStore'\n\n// Separate context trio for the content planner — MarketingContext's generics\n// are fixed to the analytics provider/store, so the planner mounts its own.\nconst ctx = createPluginContext<ResolvedMarketingConfig, ContentPlannerProvider, ContentPlannerUIState>('ContentPlanner')\n\nexport const ContentPlannerContextProvider = ctx.ContextProvider\nexport const useContentPlannerConfig = ctx.useConfig\nexport const useContentPlannerProvider = ctx.useProvider\nexport const useContentPlannerStore = ctx.useStore\n","// ---------------------------------------------------------------------------\n// Content planner — domain types + provider seam. Deliberately separate from\n// MarketingDataProvider: analytics is mock-until-bridges, while the planner is\n// a real CRUD surface (Supabase-backed via createSafeDataProvider). The\n// interface must stay methods-only (the safe-provider Proxy turns every\n// property access into a call).\n// ---------------------------------------------------------------------------\n\nexport type PostFormat = 'reel' | 'static' | 'carousel' | 'story' | 'video' | 'live' | 'article'\n\n/** Platforms an account can publish to. UI-driven list (the DB stores plain\n * text[]), so growing it is a one-line change here. */\nexport const PLATFORMS = [\n 'instagram',\n 'tiktok',\n 'youtube',\n 'facebook',\n 'linkedin',\n 'x',\n 'pinterest',\n 'threads',\n] as const\nexport type Platform = (typeof PLATFORMS)[number]\n\nexport type PostStatus = 'idea' | 'script' | 'recording' | 'editing' | 'scheduled' | 'published'\n\nexport const POST_STATUS_ORDER: PostStatus[] = ['idea', 'script', 'recording', 'editing', 'scheduled', 'published']\n\nexport interface SocialAccount {\n id: string\n name: string\n handle?: string\n /** Platforms this account/brand publishes to (one account, many connections). */\n platforms: string[]\n isActive: boolean\n}\n\nexport interface ContentPlan {\n id: string\n accountId: string\n name: string\n status: 'draft' | 'active' | 'archived'\n weeksCount: number\n startDate?: string\n /** Structured \"what we want\" config — feeds chips + future AI drafting. */\n objective?: string\n tone?: string\n pillars: string[]\n formats: PostFormat[]\n weeklyFrequency: number\n /** Free-form brief/strategy document (markdown). */\n briefMd: string\n}\n\n/** Recording-day checklist item (on-set companion). */\nexport interface ChecklistItem {\n id: string\n text: string\n done: boolean\n}\n\nexport interface ContentPost {\n id: string\n planId: string\n weekNumber: number\n position: number\n title: string\n format: PostFormat\n status: PostStatus\n scheduledDate?: string\n /** Target platforms for this post; empty = inherit the account's platforms. */\n platforms: string[]\n /** Recording-day checklist — persisted as the crew checks items off. */\n checklist: ChecklistItem[]\n /** Uploaded asset URL (static posts: caption + final art instead of a script). */\n mediaUrl?: string\n hook?: string\n cta?: string\n /** The Notion-style page body — the script/plan in markdown. */\n contentMd: string\n updatedAt?: string\n}\n\nexport interface SaveSocialAccountInput {\n id?: string\n name: string\n handle?: string\n platforms?: string[]\n isActive?: boolean\n}\n\nexport interface SaveContentPlanInput {\n id?: string\n accountId?: string\n name?: string\n status?: ContentPlan['status']\n weeksCount?: number\n startDate?: string | null\n objective?: string\n tone?: string\n pillars?: string[]\n formats?: PostFormat[]\n weeklyFrequency?: number\n briefMd?: string\n}\n\nexport interface SaveContentPostInput {\n id?: string\n planId?: string\n weekNumber?: number\n position?: number\n title?: string\n format?: PostFormat\n status?: PostStatus\n scheduledDate?: string | null\n platforms?: string[]\n checklist?: ChecklistItem[]\n mediaUrl?: string | null\n hook?: string\n cta?: string\n contentMd?: string\n}\n\nexport interface ContentPlannerProvider {\n listAccounts(): Promise<SocialAccount[]>\n saveAccount(input: SaveSocialAccountInput): Promise<SocialAccount>\n /** Hard delete — plans and posts cascade with the account. */\n deleteAccount(id: string): Promise<void>\n listPlans(accountId: string): Promise<ContentPlan[]>\n getPlan(id: string): Promise<ContentPlan | null>\n savePlan(input: SaveContentPlanInput): Promise<ContentPlan>\n deletePlan(id: string): Promise<void>\n /** Ordered by week_number then position. */\n listPosts(planId: string): Promise<ContentPost[]>\n getPost(id: string): Promise<ContentPost | null>\n savePost(input: SaveContentPostInput): Promise<ContentPost>\n deletePost(id: string): Promise<void>\n}\n","import React from 'react'\nimport { cn } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { PostFormat, PostStatus } from '../../data/contentTypes'\nimport { PLATFORMS, POST_STATUS_ORDER } from '../../data/contentTypes'\nimport { PlatformIcon } from '../../components/icons'\n\nexport const POST_FORMATS: PostFormat[] = ['reel', 'static', 'carousel', 'story', 'video', 'live', 'article']\nexport { POST_STATUS_ORDER }\n\nconst FORMAT_STYLE: Record<PostFormat, string> = {\n reel: 'bg-violet-100 text-violet-700',\n static: 'bg-sky-100 text-sky-700',\n carousel: 'bg-amber-100 text-amber-700',\n story: 'bg-pink-100 text-pink-700',\n video: 'bg-red-100 text-red-700',\n live: 'bg-rose-100 text-rose-700',\n article: 'bg-teal-100 text-teal-700',\n}\n\n// Status dot colors — same palette/semantics as plugin-agenda's booking\n// statuses (config.ts): gray backlog, indigo planned, warm amber/orange while\n// in production, blue when scheduled, emerald when done.\nexport const POST_STATUS_COLOR: Record<PostStatus, string> = {\n idea: '#6b7280',\n script: '#6366f1',\n recording: '#f59e0b',\n editing: '#f97316',\n scheduled: '#3b82f6',\n published: '#10b981',\n}\n\n/** Small status dot (agenda/CRM convention) for selects and lists. */\nexport function StatusDot({ status, className }: { status: PostStatus; className?: string }) {\n return (\n <span\n className={cn('h-2 w-2 shrink-0 rounded-full', className)}\n style={{ backgroundColor: POST_STATUS_COLOR[status] }}\n />\n )\n}\n\nconst STATUS_STYLE: Record<PostStatus, string> = {\n idea: 'bg-slate-100 text-slate-600',\n script: 'bg-indigo-100 text-indigo-700',\n recording: 'bg-amber-100 text-amber-700',\n editing: 'bg-orange-100 text-orange-700',\n scheduled: 'bg-sky-100 text-sky-700',\n published: 'bg-emerald-100 text-emerald-700',\n}\n\nexport function FormatBadge({ format }: { format: PostFormat }) {\n const t = useTranslation()\n return (\n <span className={cn('rounded-full px-2 py-0.5 text-xs font-medium', FORMAT_STYLE[format])}>\n {t(`marketing.content.format.${format}`)}\n </span>\n )\n}\n\nexport function PostStatusBadge({ status }: { status: PostStatus }) {\n const t = useTranslation()\n return (\n <span className={cn('rounded-full px-2 py-0.5 text-xs font-medium', STATUS_STYLE[status])}>\n {t(`marketing.content.status.${status}`)}\n </span>\n )\n}\n\n/** Compact row of platform glyphs (post targets or account connections). */\nexport function PlatformBadges({ platforms, className }: { platforms: string[]; className?: string }) {\n if (platforms.length === 0) return null\n return (\n <span className={cn('inline-flex items-center gap-1 text-muted-foreground', className)}>\n {platforms.map((p) => (\n <PlatformIcon key={p} platform={p} className=\"h-3.5 w-3.5\" />\n ))}\n </span>\n )\n}\n\n/** Toggleable platform chips — used by the add-account form and the post page. */\nexport function PlatformPicker({ value, onChange }: {\n value: string[]\n onChange: (platforms: string[]) => void\n}) {\n return (\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {PLATFORMS.map((platform) => {\n const selected = value.includes(platform)\n return (\n <button\n key={platform}\n type=\"button\"\n aria-pressed={selected}\n onClick={() =>\n onChange(selected ? value.filter((p) => p !== platform) : [...value, platform])\n }\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-xs font-medium capitalize transition-colors',\n selected\n ? 'border-primary bg-primary/10 text-foreground'\n : 'border-border text-muted-foreground hover:bg-muted/40',\n )}\n >\n <PlatformIcon platform={platform} className=\"h-3.5 w-3.5\" />\n {platform}\n </button>\n )\n })}\n </div>\n )\n}\n\n","import React from 'react'\nimport { X } from 'lucide-react'\nimport {\n Button, Input, MarkdownEditor, SubpageHeader, Checkbox,\n Sheet, SheetContent, SheetHeader, SheetBody, SheetFooter, SheetTitle, SheetDescription,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { ContentPlan, PostFormat } from '../../data/contentTypes'\nimport { useContentPlannerStore } from './ContentPlannerContext'\nimport { POST_FORMATS } from './contentBits'\n\n// ---------------------------------------------------------------------------\n// Plan brief — the \"what we want\" page: structured strategy fields (pillars,\n// objective, tone, formats, cadence) plus a free-form markdown brief.\n// ---------------------------------------------------------------------------\n\ninterface Draft {\n name: string\n objective: string\n tone: string\n pillars: string[]\n formats: PostFormat[]\n weeklyFrequency: number\n weeksCount: number\n briefMd: string\n}\n\nfunction toDraft(plan: ContentPlan): Draft {\n return {\n name: plan.name,\n objective: plan.objective ?? '',\n tone: plan.tone ?? '',\n pillars: plan.pillars,\n formats: plan.formats,\n weeklyFrequency: plan.weeklyFrequency,\n weeksCount: plan.weeksCount,\n briefMd: plan.briefMd,\n }\n}\n\nfunction Field({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{label}</label>\n {children}\n </div>\n )\n}\n\nfunction useBriefDraft() {\n const plan = useContentPlannerStore((s) => s.activePlan)\n const savePlan = useContentPlannerStore((s) => s.savePlan)\n\n const [draft, setDraft] = React.useState<Draft | null>(plan ? toDraft(plan) : null)\n const [saving, setSaving] = React.useState(false)\n\n React.useEffect(() => {\n if (plan) setDraft(toDraft(plan))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [plan?.id])\n\n const patch = (partial: Partial<Draft>) => setDraft((d) => (d ? { ...d, ...partial } : d))\n const dirty = !!plan && !!draft && JSON.stringify(draft) !== JSON.stringify(toDraft(plan))\n\n const save = async () => {\n if (!plan || !draft) return\n setSaving(true)\n try {\n await savePlan({\n id: plan.id,\n name: draft.name,\n objective: draft.objective,\n tone: draft.tone,\n pillars: draft.pillars,\n formats: draft.formats,\n weeklyFrequency: draft.weeklyFrequency,\n weeksCount: draft.weeksCount,\n briefMd: draft.briefMd,\n })\n } finally {\n setSaving(false)\n }\n }\n\n return { plan, draft, patch, dirty, saving, save }\n}\n\nfunction BriefFields({ draft, patch }: { draft: Draft; patch: (p: Partial<Draft>) => void }) {\n const t = useTranslation()\n const [pillarInput, setPillarInput] = React.useState('')\n\n const addPillar = () => {\n const value = pillarInput.trim()\n if (!value || draft.pillars.includes(value)) return\n patch({ pillars: [...draft.pillars, value] })\n setPillarInput('')\n }\n\n const toggleFormat = (format: PostFormat) => {\n patch({\n formats: draft.formats.includes(format)\n ? draft.formats.filter((f) => f !== format)\n : [...draft.formats, format],\n })\n }\n\n return (\n <div className=\"space-y-5\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <Field label={t('marketing.content.planName')}>\n <Input value={draft.name} onChange={(e) => patch({ name: e.target.value })} />\n </Field>\n <Field label={t('marketing.content.objective')}>\n <Input\n value={draft.objective}\n onChange={(e) => patch({ objective: e.target.value })}\n placeholder={t('marketing.content.objectivePlaceholder')}\n />\n </Field>\n <Field label={t('marketing.content.tone')}>\n <Input\n value={draft.tone}\n onChange={(e) => patch({ tone: e.target.value })}\n placeholder={t('marketing.content.tonePlaceholder')}\n />\n </Field>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label={t('marketing.content.weeklyFrequency')}>\n <Input\n type=\"number\"\n min={1}\n max={14}\n value={draft.weeklyFrequency}\n onChange={(e) => patch({ weeklyFrequency: Math.max(1, Number(e.target.value) || 1) })}\n />\n </Field>\n <Field label={t('marketing.content.weeksCount')}>\n <Input\n type=\"number\"\n min={1}\n max={52}\n value={draft.weeksCount}\n onChange={(e) => patch({ weeksCount: Math.max(1, Number(e.target.value) || 1) })}\n />\n </Field>\n </div>\n </div>\n\n <Field label={t('marketing.content.pillars')}>\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {draft.pillars.map((pillar) => (\n <span\n key={pillar}\n className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2.5 py-0.5 text-xs font-medium text-foreground\"\n >\n {pillar}\n <button\n type=\"button\"\n onClick={() => patch({ pillars: draft.pillars.filter((p) => p !== pillar) })}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n ))}\n <Input\n value={pillarInput}\n onChange={(e) => setPillarInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n addPillar()\n }\n }}\n onBlur={addPillar}\n placeholder={t('marketing.content.pillarPlaceholder')}\n className=\"h-7 w-44 text-xs\"\n />\n </div>\n </Field>\n\n <Field label={t('marketing.content.formatsLabel')}>\n <div className=\"flex flex-wrap gap-4\">\n {POST_FORMATS.map((format) => (\n <label key={format} className=\"flex items-center gap-2 text-sm text-foreground\">\n <Checkbox\n checked={draft.formats.includes(format)}\n onChange={() => toggleFormat(format)}\n />\n {t(`marketing.content.format.${format}`)}\n </label>\n ))}\n </div>\n </Field>\n\n <Field label={t('marketing.content.briefBody')}>\n <MarkdownEditor\n value={draft.briefMd}\n onChange={(briefMd) => patch({ briefMd })}\n placeholder={t('marketing.content.briefPlaceholder')}\n editLabel={t('marketing.content.edit')}\n previewLabel={t('marketing.content.preview')}\n minRows={10}\n />\n </Field>\n </div>\n )\n}\n\n/** Full-page variant — kept for the /marketing/content/brief deep link. */\nexport function PlanBriefView({ onBack }: { onBack: () => void }) {\n const t = useTranslation()\n const { plan, draft, patch, dirty, saving, save } = useBriefDraft()\n\n if (!plan || !draft) {\n return <div className=\"mx-auto max-w-3xl text-sm text-muted-foreground\">…</div>\n }\n\n return (\n <div className=\"mx-auto max-w-3xl space-y-5\">\n <SubpageHeader\n title={t('marketing.content.brief')}\n subtitle={plan.name}\n parentLabel={t('marketing.content.title')}\n onBack={onBack}\n actions={\n <Button size=\"sm\" onClick={() => void save()} disabled={!dirty || saving}>\n {t('marketing.content.save')}\n </Button>\n }\n />\n <BriefFields draft={draft} patch={patch} />\n </div>\n )\n}\n\n/** Right slide-over variant — the board's Briefing button opens this, keeping\n * the calendar in sight while the strategy is edited. */\nexport function PlanBriefSheet({ open, onClose }: { open: boolean; onClose: () => void }) {\n const t = useTranslation()\n const { plan, draft, patch, dirty, saving, save } = useBriefDraft()\n\n return (\n <Sheet open={open} onOpenChange={(v) => { if (!v) onClose() }}>\n <SheetContent width=\"max-w-2xl\">\n <SheetHeader>\n <SheetTitle>{t('marketing.content.brief')}</SheetTitle>\n {plan && <SheetDescription>{plan.name}</SheetDescription>}\n </SheetHeader>\n <SheetBody>\n {draft ? (\n <BriefFields draft={draft} patch={patch} />\n ) : (\n <p className=\"text-sm text-muted-foreground\">…</p>\n )}\n </SheetBody>\n <SheetFooter>\n <Button variant=\"outline\" onClick={onClose} disabled={saving}>\n {t('marketing.content.cancel')}\n </Button>\n <Button onClick={() => void save()} disabled={!dirty || saving}>\n {t('marketing.content.save')}\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n )\n}\n","import React from 'react'\nimport {\n Plus, NotebookPen, ChevronLeft, ChevronRight,\n Columns3, CalendarDays, List as ListIcon, Trash2, GripVertical, Settings2,\n} from 'lucide-react'\nimport type { SocialAccount } from '../../data/contentTypes'\nimport {\n Button, Input, Skeleton, cn, ConfirmDialog, SegmentedControl,\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem, SelectSeparator,\n Modal, ModalContent, ModalHeader, ModalTitle, ModalBody, ModalFooter,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useOrganizationStore } from '@fayz-ai/saas'\nimport { PlanBriefSheet } from './PlanBriefView'\nimport type { ContentPost } from '../../data/contentTypes'\nimport { useContentPlannerStore } from './ContentPlannerContext'\nimport { FormatBadge, PostStatusBadge, PlatformBadges, PlatformPicker } from './contentBits'\nimport type { BoardViewMode } from './contentStore'\n\n// ---------------------------------------------------------------------------\n// Content board — the spreadsheet, productized. Three lenses on the same plan\n// (content-planning best practice: plan by cadence, schedule by date, audit by\n// status): Board (weeks as columns), Calendar (posts on real dates) and List\n// (flat audit table). The page never blanks out: with no account or plan the\n// calendar renders as an empty ghost grid and the account selector carries an\n// inline add-account flow with platform connections.\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_WEEKS = 8\nconst ADD_ACCOUNT_VALUE = '__add-account__'\n// Custom MIME so week columns only react to post-card drags\nconst POST_DRAG_MIME = 'application/x-mkt-post'\n\nfunction PostCard({ post, onOpen, onDelete }: {\n post: ContentPost\n onOpen: () => void\n onDelete?: () => void\n}) {\n const t = useTranslation()\n const [dragging, setDragging] = React.useState(false)\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onOpen}\n onKeyDown={(e) => { if (e.key === 'Enter') onOpen() }}\n draggable\n onDragStart={(e) => {\n e.dataTransfer.setData(POST_DRAG_MIME, post.id)\n e.dataTransfer.effectAllowed = 'move'\n setDragging(true)\n }}\n onDragEnd={() => setDragging(false)}\n className={cn(\n 'group/post relative w-full cursor-pointer rounded-card border border-border bg-card p-3 pl-7 text-left transition-colors hover:bg-muted/40',\n dragging && 'opacity-50',\n )}\n >\n <GripVertical\n className=\"absolute left-1.5 top-3 h-4 w-4 cursor-grab text-muted-foreground/50 opacity-0 transition-opacity group-hover/post:opacity-100\"\n aria-hidden\n />\n {onDelete && (\n <button\n type=\"button\"\n aria-label={t('marketing.content.deletePost')}\n onClick={(e) => {\n e.stopPropagation()\n onDelete()\n }}\n className=\"absolute right-1.5 top-2 rounded p-1 text-muted-foreground/60 opacity-0 transition-opacity hover:bg-destructive/10 hover:text-destructive group-hover/post:opacity-100\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n )}\n <p className=\"pr-5 text-sm font-medium text-foreground\">\n {post.title || t('marketing.content.untitled')}\n </p>\n <div className=\"mt-2 flex flex-wrap items-center gap-1.5\">\n <FormatBadge format={post.format} />\n <PostStatusBadge status={post.status} />\n {post.scheduledDate && (\n <span className=\"text-xs text-muted-foreground\">{post.scheduledDate}</span>\n )}\n <PlatformBadges platforms={post.platforms} />\n </div>\n </div>\n )\n}\n\nfunction WeekColumn({ week, rangeLabel, posts, onOpenPost, onNewPost, onDeletePost, onDropPost, disabled }: {\n week: number\n /** Real date range of the week (e.g. \"6 – 12 out\"). */\n rangeLabel: string\n posts: ContentPost[]\n onOpenPost: (id: string) => void\n onNewPost: (week: number) => void\n onDeletePost?: (id: string) => void\n onDropPost?: (postId: string, week: number) => void\n disabled?: boolean\n}) {\n const t = useTranslation()\n const [isDropTarget, setIsDropTarget] = React.useState(false)\n return (\n <div\n className={cn(\n 'flex flex-col gap-2 rounded-card border border-border bg-muted/20 p-2.5 transition-colors',\n isDropTarget && 'border-primary bg-primary/5 ring-1 ring-primary/40',\n )}\n onDragOver={(e) => {\n if (!onDropPost || !e.dataTransfer.types.includes(POST_DRAG_MIME)) return\n e.preventDefault()\n e.dataTransfer.dropEffect = 'move'\n setIsDropTarget(true)\n }}\n onDragLeave={() => setIsDropTarget(false)}\n onDrop={(e) => {\n if (!onDropPost) return\n e.preventDefault()\n setIsDropTarget(false)\n const postId = e.dataTransfer.getData(POST_DRAG_MIME)\n if (postId) onDropPost(postId, week)\n }}\n >\n <div className=\"flex items-baseline justify-between px-1\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {t('marketing.content.week')} {week}\n </p>\n <p className=\"text-xs text-muted-foreground/80\">{rangeLabel}</p>\n </div>\n {posts.map((post) => (\n <PostCard\n key={post.id}\n post={post}\n onOpen={() => onOpenPost(post.id)}\n onDelete={onDeletePost ? () => onDeletePost(post.id) : undefined}\n />\n ))}\n <button\n type=\"button\"\n onClick={() => onNewPost(week)}\n disabled={disabled}\n className=\"flex items-center justify-center gap-1 rounded-card border border-dashed border-border p-2 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted/40 hover:text-foreground disabled:pointer-events-none disabled:opacity-50\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n {t('marketing.content.newPost')}\n </button>\n </div>\n )\n}\n\n/** Account modal — create (\"+\" option) or settings (cog on an account):\n * name, handle, platform connections, and delete on the edit variant. */\nfunction AccountModal({ open, account, onClose }: {\n open: boolean\n account?: SocialAccount | null\n onClose: () => void\n}) {\n const t = useTranslation()\n const saveAccount = useContentPlannerStore((s) => s.saveAccount)\n const deleteAccount = useContentPlannerStore((s) => s.deleteAccount)\n const isEdit = !!account\n const [name, setName] = React.useState('')\n const [handle, setHandle] = React.useState('')\n const [platforms, setPlatforms] = React.useState<string[]>(['instagram'])\n const [saving, setSaving] = React.useState(false)\n const [confirmDelete, setConfirmDelete] = React.useState(false)\n\n // Prefill per open (edit) / reset (create) so drafts don't leak between uses\n React.useEffect(() => {\n if (open) {\n setName(account?.name ?? '')\n setHandle(account?.handle ?? '')\n setPlatforms(account?.platforms?.length ? account.platforms : ['instagram'])\n setSaving(false)\n setConfirmDelete(false)\n }\n }, [open, account])\n\n const create = async () => {\n if (!name.trim() || platforms.length === 0 || saving) return\n setSaving(true)\n try {\n await saveAccount({\n ...(isEdit ? { id: account.id } : {}),\n name: name.trim(),\n handle: handle.trim() || undefined,\n platforms,\n })\n onClose()\n } finally {\n setSaving(false)\n }\n }\n\n const remove = async () => {\n if (!account || saving) return\n setSaving(true)\n try {\n await deleteAccount(account.id)\n onClose()\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <Modal open={open} onOpenChange={(o) => { if (!o) onClose() }}>\n <ModalContent size=\"sm\">\n <ModalHeader>\n <ModalTitle>\n {isEdit ? t('marketing.content.editAccountTitle') : t('marketing.content.addAccountTitle')}\n </ModalTitle>\n </ModalHeader>\n <ModalBody className=\"space-y-4\">\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n {t('marketing.content.nameLabel')}\n </label>\n <Input\n autoFocus\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t('marketing.content.accountNamePlaceholder')}\n onKeyDown={(e) => { if (e.key === 'Enter') void create() }}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n {t('marketing.content.handleLabel')}\n </label>\n <Input\n value={handle}\n onChange={(e) => setHandle(e.target.value)}\n placeholder={t('marketing.content.handlePlaceholder')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n {t('marketing.content.platformsLabel')}\n </label>\n <PlatformPicker value={platforms} onChange={setPlatforms} />\n </div>\n </ModalBody>\n <ModalFooter>\n {/* Delete is a two-step INLINE confirm — never a dialog stacked on a\n modal (no modal-over-modal, house rule). */}\n {confirmDelete && isEdit ? (\n <div className=\"flex w-full items-center gap-3 rounded-card border border-destructive/30 bg-destructive/5 p-3\">\n <p className=\"flex-1 text-xs text-destructive\">\n {t('marketing.content.deleteAccountConfirm')}\n </p>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setConfirmDelete(false)} disabled={saving}>\n {t('marketing.content.cancel')}\n </Button>\n <Button variant=\"destructive\" size=\"sm\" onClick={() => void remove()} disabled={saving}>\n {t('marketing.content.deleteAccount')}\n </Button>\n </div>\n ) : (\n <>\n {isEdit && (\n <Button\n variant=\"outline\"\n onClick={() => setConfirmDelete(true)}\n disabled={saving}\n className=\"mr-auto text-destructive hover:text-destructive\"\n >\n <Trash2 className=\"mr-1.5 h-4 w-4\" />\n {t('marketing.content.deleteAccount')}\n </Button>\n )}\n <Button variant=\"outline\" onClick={onClose} disabled={saving}>\n {t('marketing.content.cancel')}\n </Button>\n <Button onClick={() => void create()} disabled={saving || !name.trim() || platforms.length === 0}>\n {isEdit ? t('marketing.content.save') : t('marketing.content.createAccount')}\n </Button>\n </>\n )}\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n\n/** Master account dropdown — always visible at the top. Each account carries\n * a cog that opens its settings (edit / delete); the last option creates. */\nfunction AccountSelector() {\n const t = useTranslation()\n const loaded = useContentPlannerStore((s) => s.loaded)\n const accounts = useContentPlannerStore((s) => s.accounts)\n const activeAccountId = useContentPlannerStore((s) => s.activeAccountId)\n const setAccount = useContentPlannerStore((s) => s.setAccount)\n const [open, setOpen] = React.useState(false)\n const [modal, setModal] = React.useState<{ mode: 'create' } | { mode: 'edit'; account: SocialAccount } | null>(null)\n\n const activeAccount = accounts.find((a) => a.id === activeAccountId) ?? null\n\n if (!loaded) {\n return (\n <div className=\"flex items-center gap-1\">\n <Skeleton className=\"h-9 w-64\" />\n <Skeleton className=\"h-9 w-9\" />\n </div>\n )\n }\n\n const openSettings = (account: SocialAccount) => {\n setOpen(false)\n setModal({ mode: 'edit', account })\n }\n\n return (\n <>\n <div className=\"flex items-center gap-1\">\n <Select\n open={open}\n onOpenChange={setOpen}\n value={activeAccountId ?? undefined}\n onValueChange={(id) => {\n if (id === ADD_ACCOUNT_VALUE) {\n setModal({ mode: 'create' })\n return\n }\n void setAccount(id)\n }}\n >\n <SelectTrigger className=\"w-64\">\n <SelectValue placeholder={t('marketing.content.account')} />\n </SelectTrigger>\n <SelectContent>\n {accounts.length === 0 ? (\n <SelectItem value=\"__none__\" disabled>\n {t('marketing.content.noAccountsAvailable')}\n </SelectItem>\n ) : (\n accounts.map((acc) => (\n <div key={acc.id} className=\"relative\">\n <SelectItem value={acc.id} className=\"pr-9\">\n <span className=\"flex items-center gap-2\">\n {acc.name}\n <PlatformBadges platforms={acc.platforms} />\n </span>\n </SelectItem>\n {/* Sits on top of the item — pointer events stop here so the\n cog opens settings instead of selecting the account. */}\n <button\n type=\"button\"\n aria-label={t('marketing.content.accountSettings')}\n onPointerDown={(e) => { e.stopPropagation(); e.preventDefault() }}\n onPointerUp={(e) => { e.stopPropagation(); e.preventDefault() }}\n onClick={(e) => {\n e.stopPropagation()\n openSettings(acc)\n }}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 rounded p-1 text-muted-foreground/70 transition-colors hover:bg-muted/60 hover:text-foreground\"\n >\n <Settings2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n ))\n )}\n <SelectSeparator />\n <SelectItem value={ADD_ACCOUNT_VALUE}>\n <span className=\"flex items-center gap-1.5\">\n <Plus className=\"h-3.5 w-3.5\" />\n {t('marketing.content.addAccount')}\n </span>\n </SelectItem>\n </SelectContent>\n </Select>\n {activeAccount && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-9 w-9 p-0 text-muted-foreground\"\n aria-label={t('marketing.content.accountSettings')}\n onClick={() => setModal({ mode: 'edit', account: activeAccount })}\n >\n <Settings2 className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n <AccountModal\n open={!!modal}\n account={modal?.mode === 'edit' ? modal.account : null}\n onClose={() => setModal(null)}\n />\n </>\n )\n}\n\n// ---------------------------------------------------------------------------\n// View switcher\n// ---------------------------------------------------------------------------\n\nfunction ViewSwitcher({ mode, onChange }: { mode: BoardViewMode; onChange: (m: BoardViewMode) => void }) {\n const t = useTranslation()\n return (\n <SegmentedControl<BoardViewMode>\n size=\"md\"\n aria-label={t('marketing.content.viewBoard')}\n value={mode}\n onChange={onChange}\n options={[\n { value: 'board', label: <span className=\"flex items-center gap-1.5\"><Columns3 className=\"h-3.5 w-3.5\" />{t('marketing.content.viewBoard')}</span> },\n { value: 'calendar', label: <span className=\"flex items-center gap-1.5\"><CalendarDays className=\"h-3.5 w-3.5\" />{t('marketing.content.viewCalendar')}</span> },\n { value: 'list', label: <span className=\"flex items-center gap-1.5\"><ListIcon className=\"h-3.5 w-3.5\" />{t('marketing.content.viewList')}</span> },\n ]}\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// Board view — weeks as columns grouped by month blocks (cadence planning)\n// ---------------------------------------------------------------------------\n\ninterface BoardWeek {\n week: number\n rangeLabel: string\n monthLabel: string\n}\n\nfunction shortDay(d: Date): string {\n return d.toLocaleDateString(undefined, { day: 'numeric', month: 'short' })\n}\n\n/** Anchor each plan week to real dates (same reference the calendar view\n * uses): week N starts at startDate + (N-1) weeks; month sections group by\n * the month the week starts in. */\nfunction buildBoardWeeks(startDate: Date, weeksCount: number): BoardWeek[] {\n return Array.from({ length: weeksCount }, (_, i) => {\n const start = new Date(startDate)\n start.setDate(start.getDate() + i * 7)\n const end = new Date(start)\n end.setDate(start.getDate() + 6)\n return {\n week: i + 1,\n rangeLabel: `${shortDay(start)} – ${shortDay(end)}`,\n monthLabel: start.toLocaleDateString(undefined, { month: 'long', year: 'numeric' }),\n }\n })\n}\n\nfunction BoardView({ startDate, weeksCount, postsByWeek, onOpenPost, onNewPost, onDeletePost, onDropPost, disabled }: {\n startDate: Date\n weeksCount: number\n postsByWeek: Map<number, ContentPost[]>\n onOpenPost: (id: string) => void\n onNewPost: (week: number) => void\n onDeletePost: (id: string) => void\n onDropPost: (postId: string, week: number) => void\n disabled: boolean\n}) {\n const months: Array<{ label: string; weeks: BoardWeek[] }> = []\n for (const bw of buildBoardWeeks(startDate, weeksCount)) {\n const current = months[months.length - 1]\n if (current && current.label === bw.monthLabel) current.weeks.push(bw)\n else months.push({ label: bw.monthLabel, weeks: [bw] })\n }\n return (\n <div className=\"space-y-8\">\n {months.map(({ label, weeks }) => (\n <section key={label} className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold uppercase tracking-wide text-muted-foreground\">\n {label}\n </h3>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n {weeks.map(({ week, rangeLabel }) => (\n <WeekColumn\n key={week}\n week={week}\n rangeLabel={rangeLabel}\n posts={postsByWeek.get(week) ?? []}\n onOpenPost={onOpenPost}\n onNewPost={onNewPost}\n onDeletePost={onDeletePost}\n onDropPost={onDropPost}\n disabled={disabled}\n />\n ))}\n </div>\n </section>\n ))}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Calendar view — posts pinned to real dates, month by month\n// ---------------------------------------------------------------------------\n\nfunction toISODate(d: Date): string {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n}\n\nfunction mondayOfCurrentWeek(): Date {\n const now = new Date()\n const monday = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n monday.setDate(monday.getDate() - ((monday.getDay() + 6) % 7))\n return monday\n}\n\nfunction CalendarView({ posts, onOpenPost, onNewPostAt, disabled }: {\n posts: ContentPost[]\n onOpenPost: (id: string) => void\n onNewPostAt: (isoDate: string) => void\n disabled: boolean\n}) {\n const t = useTranslation()\n const [cursor, setCursor] = React.useState(() => {\n const first = posts.find((p) => p.scheduledDate)?.scheduledDate\n const base = first ? new Date(`${first}T00:00:00`) : new Date()\n return new Date(base.getFullYear(), base.getMonth(), 1)\n })\n // Days showing their full list when they hold more posts than the cap\n const [expandedDay, setExpandedDay] = React.useState<string | null>(null)\n const MAX_VISIBLE = 3\n\n const postsByDate = React.useMemo(() => {\n const map = new Map<string, ContentPost[]>()\n for (const post of posts) {\n if (!post.scheduledDate) continue\n const list = map.get(post.scheduledDate) ?? []\n list.push(post)\n map.set(post.scheduledDate, list)\n }\n return map\n }, [posts])\n\n const unscheduled = posts.filter((p) => !p.scheduledDate)\n\n // Monday-first grid covering the whole displayed month.\n const days = React.useMemo(() => {\n const firstOfMonth = new Date(cursor.getFullYear(), cursor.getMonth(), 1)\n const start = new Date(firstOfMonth)\n start.setDate(start.getDate() - ((firstOfMonth.getDay() + 6) % 7))\n const cells: Date[] = []\n for (let i = 0; i < 42; i++) {\n const d = new Date(start)\n d.setDate(start.getDate() + i)\n cells.push(d)\n }\n // Trim trailing full weeks outside the month\n while (cells.length > 7 && cells[cells.length - 7].getMonth() !== cursor.getMonth()) {\n cells.splice(cells.length - 7, 7)\n }\n return cells\n }, [cursor])\n\n const monthLabel = cursor.toLocaleDateString(undefined, { month: 'long', year: 'numeric' })\n const weekdayLabels = days.slice(0, 7).map((d) =>\n d.toLocaleDateString(undefined, { weekday: 'short' }),\n )\n const todayISO = toISODate(new Date())\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold capitalize text-foreground\">{monthLabel}</h3>\n <div className=\"flex items-center gap-1\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setCursor(new Date(cursor.getFullYear(), cursor.getMonth() - 1, 1))}>\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setCursor(new Date(cursor.getFullYear(), cursor.getMonth() + 1, 1))}>\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {unscheduled.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-2 rounded-card border border-dashed border-border bg-muted/20 p-2.5\">\n <span className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {t('marketing.content.unscheduled')}\n </span>\n {unscheduled.map((post) => (\n <button\n key={post.id}\n type=\"button\"\n onClick={() => onOpenPost(post.id)}\n className=\"inline-flex items-center gap-1.5 rounded-full border border-border bg-card px-2.5 py-1 text-xs font-medium text-foreground transition-colors hover:bg-muted/40\"\n >\n {post.title || t('marketing.content.untitled')}\n <FormatBadge format={post.format} />\n </button>\n ))}\n </div>\n )}\n\n <div className=\"overflow-hidden rounded-card border border-border\">\n <div className=\"grid grid-cols-7 border-b border-border bg-muted/30\">\n {weekdayLabels.map((label, i) => (\n <div key={i} className=\"px-2 py-1.5 text-center text-xs font-medium capitalize text-muted-foreground\">\n {label}\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-7\">\n {days.map((day, i) => {\n const iso = toISODate(day)\n const inMonth = day.getMonth() === cursor.getMonth()\n const dayPosts = postsByDate.get(iso) ?? []\n return (\n <div\n key={i}\n className={cn(\n 'group min-h-24 border-b border-r border-border p-1.5 [&:nth-child(7n)]:border-r-0',\n !inMonth && 'bg-muted/20',\n )}\n >\n <div className=\"flex items-center justify-between\">\n <span\n className={cn(\n 'text-xs',\n inMonth ? 'text-foreground' : 'text-muted-foreground/60',\n iso === todayISO && 'flex h-5 w-5 items-center justify-center rounded-full bg-primary font-semibold text-primary-foreground',\n )}\n >\n {day.getDate()}\n </span>\n {!disabled && (\n <button\n type=\"button\"\n onClick={() => onNewPostAt(iso)}\n className=\"rounded p-0.5 text-muted-foreground opacity-0 transition-opacity hover:bg-muted/60 hover:text-foreground group-hover:opacity-100\"\n aria-label={t('marketing.content.newPost')}\n >\n <Plus className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n <div className=\"mt-1 space-y-1\">\n {(expandedDay === iso ? dayPosts : dayPosts.slice(0, MAX_VISIBLE)).map((post) => (\n <button\n key={post.id}\n type=\"button\"\n onClick={() => onOpenPost(post.id)}\n className=\"block w-full truncate rounded border border-border bg-card px-1.5 py-1 text-left text-xs text-foreground transition-colors hover:bg-muted/40\"\n >\n {post.title || t('marketing.content.untitled')}\n </button>\n ))}\n {dayPosts.length > MAX_VISIBLE && (\n <button\n type=\"button\"\n onClick={() => setExpandedDay(expandedDay === iso ? null : iso)}\n className=\"block w-full px-1.5 py-0.5 text-left text-xs font-medium text-muted-foreground transition-colors hover:text-foreground\"\n >\n {expandedDay === iso\n ? t('marketing.content.showLess')\n : `+${dayPosts.length - MAX_VISIBLE}`}\n </button>\n )}\n </div>\n </div>\n )\n })}\n </div>\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// List view — flat audit table (sorted by week, then position)\n// ---------------------------------------------------------------------------\n\nfunction ListView({ posts, onOpenPost }: { posts: ContentPost[]; onOpenPost: (id: string) => void }) {\n const t = useTranslation()\n if (posts.length === 0) {\n return <p className=\"text-sm text-muted-foreground\">{t('marketing.content.noPosts')}</p>\n }\n return (\n <div className=\"overflow-hidden rounded-card border border-border\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border bg-muted/30 text-left text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n <th className=\"px-3 py-2\">{t('marketing.content.listWeek')}</th>\n <th className=\"px-3 py-2\">{t('marketing.content.listTitle')}</th>\n <th className=\"px-3 py-2\">{t('marketing.content.listFormat')}</th>\n <th className=\"px-3 py-2\">{t('marketing.content.listStatus')}</th>\n <th className=\"px-3 py-2\">{t('marketing.content.listDate')}</th>\n </tr>\n </thead>\n <tbody>\n {posts.map((post) => (\n <tr\n key={post.id}\n onClick={() => onOpenPost(post.id)}\n className=\"cursor-pointer border-b border-border last:border-b-0 transition-colors hover:bg-muted/30\"\n >\n <td className=\"px-3 py-2 text-muted-foreground\">{post.weekNumber}</td>\n <td className=\"px-3 py-2 font-medium text-foreground\">\n <span className=\"flex items-center gap-2\">\n {post.title || t('marketing.content.untitled')}\n <PlatformBadges platforms={post.platforms} />\n </span>\n </td>\n <td className=\"px-3 py-2\"><FormatBadge format={post.format} /></td>\n <td className=\"px-3 py-2\"><PostStatusBadge status={post.status} /></td>\n <td className=\"px-3 py-2 text-muted-foreground\">{post.scheduledDate ?? '—'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n\nexport function ContentView({ onOpenPost }: {\n onOpenPost: (id: string) => void\n}) {\n const t = useTranslation()\n const loaded = useContentPlannerStore((s) => s.loaded)\n const loading = useContentPlannerStore((s) => s.loading)\n const accounts = useContentPlannerStore((s) => s.accounts)\n const activeAccountId = useContentPlannerStore((s) => s.activeAccountId)\n const plan = useContentPlannerStore((s) => s.activePlan)\n const posts = useContentPlannerStore((s) => s.posts)\n const load = useContentPlannerStore((s) => s.load)\n const savePlan = useContentPlannerStore((s) => s.savePlan)\n const savePost = useContentPlannerStore((s) => s.savePost)\n const deletePost = useContentPlannerStore((s) => s.deletePost)\n const viewMode = useContentPlannerStore((s) => s.viewMode)\n const setViewMode = useContentPlannerStore((s) => s.setViewMode)\n const loadedTenantId = useContentPlannerStore((s) => s.loadedTenantId)\n\n const [briefOpen, setBriefOpen] = React.useState(false)\n const [pendingDeleteId, setPendingDeleteId] = React.useState<string | null>(null)\n\n // The tenant hydrates async after login/refresh — (re)load whenever the\n // active tenant diverges from the one the current data belongs to. Also\n // covers org switching.\n const tenantId = useOrganizationStore((state) => state.currentOrg?.id)\n React.useEffect(() => {\n if (!loading && (!loaded || (tenantId && tenantId !== loadedTenantId))) void load()\n }, [tenantId, loadedTenantId, loaded, loading, load])\n\n const postsByWeek = React.useMemo(() => {\n const map = new Map<number, ContentPost[]>()\n for (const post of posts) {\n const list = map.get(post.weekNumber) ?? []\n list.push(post)\n map.set(post.weekNumber, list)\n }\n return map\n }, [posts])\n\n const ensurePlan = async () => {\n if (plan) return plan\n if (!activeAccountId) return null\n return savePlan({\n accountId: activeAccountId,\n name: t('marketing.content.defaultPlanName'),\n status: 'active',\n weeksCount: DEFAULT_WEEKS,\n startDate: toISODate(mondayOfCurrentWeek()),\n })\n }\n\n // With an account but no plan yet, the first \"new post\" click bootstraps the\n // default plan and drops the post straight into it. The scheduled date\n // prefills with the first day of the selected week so the post lands dated.\n const createPost = async (week: number) => {\n const targetPlan = await ensurePlan()\n if (!targetPlan) return\n const start = targetPlan.startDate\n ? new Date(`${targetPlan.startDate}T00:00:00`)\n : mondayOfCurrentWeek()\n start.setDate(start.getDate() + (week - 1) * 7)\n const post = await savePost({\n planId: targetPlan.id,\n weekNumber: week,\n title: '',\n format: 'reel',\n status: 'idea',\n scheduledDate: toISODate(start),\n })\n onOpenPost(post.id)\n }\n\n const movePost = async (postId: string, week: number) => {\n const post = posts.find((p) => p.id === postId)\n if (!post || post.weekNumber === week) return\n await savePost({ id: postId, weekNumber: week })\n }\n\n // Calendar day click → derive the plan week from startDate when available.\n const createPostAt = async (isoDate: string) => {\n const targetPlan = await ensurePlan()\n if (!targetPlan) return\n let week = 1\n if (targetPlan.startDate) {\n const start = new Date(`${targetPlan.startDate}T00:00:00`)\n const day = new Date(`${isoDate}T00:00:00`)\n const diff = Math.floor((day.getTime() - start.getTime()) / (7 * 24 * 3600 * 1000)) + 1\n week = Math.min(Math.max(diff, 1), targetPlan.weeksCount)\n }\n const post = await savePost({\n planId: targetPlan.id,\n weekNumber: week,\n title: '',\n format: 'reel',\n status: 'idea',\n scheduledDate: isoDate,\n })\n onOpenPost(post.id)\n }\n\n // Initial load, tenant hydration and account switches all re-skeleton the\n // board so stale posts never flash under the new selection.\n const busy = !loaded || loading\n\n const hasAccount = accounts.length > 0\n const weeksCount = plan?.weeksCount ?? DEFAULT_WEEKS\n // Same date anchor the calendar view uses. Plans without a start date\n // (legacy rows) display against the current week.\n const boardStart = plan?.startDate\n ? new Date(`${plan.startDate}T00:00:00`)\n : mondayOfCurrentWeek()\n\n return (\n <div className=\"mx-auto max-w-6xl space-y-6\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <AccountSelector />\n {plan && <span className=\"text-sm text-muted-foreground\">{plan.name}</span>}\n </div>\n <div className=\"flex items-center gap-2\">\n <ViewSwitcher mode={viewMode} onChange={setViewMode} />\n {plan && (\n <Button variant=\"outline\" size=\"sm\" onClick={() => setBriefOpen(true)}>\n <NotebookPen className=\"mr-1.5 h-4 w-4\" />\n {t('marketing.content.brief')}\n </Button>\n )}\n </div>\n </div>\n\n {!busy && !hasAccount && (\n <p className=\"text-sm text-muted-foreground\">\n {t('marketing.content.noAccountsHint')}\n </p>\n )}\n\n {busy && viewMode === 'board' && (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n {Array.from({ length: 8 }, (_, i) => <Skeleton key={i} className=\"h-44\" />)}\n </div>\n )}\n {busy && viewMode === 'calendar' && <Skeleton className=\"h-96 w-full\" />}\n {busy && viewMode === 'list' && (\n <div className=\"space-y-2\">\n {Array.from({ length: 6 }, (_, i) => <Skeleton key={i} className=\"h-10 w-full\" />)}\n </div>\n )}\n\n {!busy && viewMode === 'board' && (\n <BoardView\n startDate={boardStart}\n weeksCount={weeksCount}\n postsByWeek={postsByWeek}\n onOpenPost={onOpenPost}\n onNewPost={(w) => void createPost(w)}\n onDeletePost={setPendingDeleteId}\n onDropPost={(id, w) => void movePost(id, w)}\n disabled={!hasAccount}\n />\n )}\n {!busy && viewMode === 'calendar' && (\n <CalendarView\n posts={posts}\n onOpenPost={onOpenPost}\n onNewPostAt={(iso) => void createPostAt(iso)}\n disabled={!hasAccount}\n />\n )}\n {!busy && viewMode === 'list' && <ListView posts={posts} onOpenPost={onOpenPost} />}\n\n <PlanBriefSheet open={briefOpen} onClose={() => setBriefOpen(false)} />\n\n <ConfirmDialog\n open={!!pendingDeleteId}\n variant=\"destructive\"\n title={t('marketing.content.deletePost')}\n description={t('marketing.content.deletePostConfirm')}\n confirmLabel={t('marketing.content.deletePost')}\n cancelLabel={t('marketing.content.cancel')}\n onCancel={() => setPendingDeleteId(null)}\n onConfirm={() => {\n const id = pendingDeleteId\n setPendingDeleteId(null)\n if (id) void deletePost(id)\n }}\n />\n </div>\n )\n}\n","import { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Media asset upload for content posts (static art, covers). Public bucket\n// `mkt-media` (created by migration 003); path content/{tenantId}/{postId}-{ts}.{ext}\n// so re-uploads never collide and old URLs keep resolving until replaced.\n// ---------------------------------------------------------------------------\n\nexport function canUploadMedia(): boolean {\n return !!getSupabaseClientOptional()\n}\n\nexport async function uploadPostMedia(postId: string, file: File): Promise<string> {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n const tenantId = getActiveTenantId()\n if (!tenantId) throw new Error('No active tenant')\n\n const ext = file.name.split('.').pop()?.toLowerCase() ?? 'bin'\n const path = `content/${tenantId}/${postId}-${Date.now()}.${ext}`\n const { error } = await supabase.storage.from('mkt-media').upload(path, file, { upsert: true })\n if (error) throw error\n const { data } = supabase.storage.from('mkt-media').getPublicUrl(path)\n return data.publicUrl as string\n}\n","import React from 'react'\nimport { Plus, Sparkles, X } from 'lucide-react'\nimport { Button, Checkbox, Input, cn } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { ChecklistItem, ContentPost } from '../../data/contentTypes'\nimport { useContentPlannerStore } from './ContentPlannerContext'\n\n// ---------------------------------------------------------------------------\n// Recording-day checklist — the on-set companion inside the post's aside\n// panel (ContentSplit). Mobile-first: big touch targets, every change persists\n// immediately (the crew checks items off from a phone between takes).\n// \"Generate from script\" seeds one item per `## TAKE …` heading.\n// ---------------------------------------------------------------------------\n\nfunction newId(): string {\n return typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `ck-${Date.now()}-${Math.floor(Math.random() * 1e6)}`\n}\n\nexport function RecordingChecklist({ post }: { post: ContentPost }) {\n const t = useTranslation()\n const savePost = useContentPlannerStore((s) => s.savePost)\n const [items, setItems] = React.useState<ChecklistItem[]>(post.checklist)\n const [text, setText] = React.useState('')\n\n // Re-sync when navigating between posts\n React.useEffect(() => {\n setItems(post.checklist)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [post.id])\n\n const persist = (next: ChecklistItem[]) => {\n setItems(next)\n void savePost({ id: post.id, checklist: next })\n }\n\n const toggle = (id: string) =>\n persist(items.map((i) => (i.id === id ? { ...i, done: !i.done } : i)))\n\n const remove = (id: string) => persist(items.filter((i) => i.id !== id))\n\n const add = () => {\n const value = text.trim()\n if (!value) return\n persist([...items, { id: newId(), text: value, done: false }])\n setText('')\n }\n\n const generateFromScript = () => {\n const takes = [...post.contentMd.matchAll(/^##\\s+(TAKE\\s+.+)$/gim)].map((m) =>\n m[1].trim(),\n )\n const existing = new Set(items.map((i) => i.text))\n const fresh = takes\n .filter((take) => !existing.has(take))\n .map((take) => ({ id: newId(), text: take, done: false }))\n if (fresh.length > 0) persist([...items, ...fresh])\n }\n\n const hasTakes = /^##\\s+TAKE\\s+/im.test(post.contentMd)\n const done = items.filter((i) => i.done).length\n\n return (\n <div className=\"space-y-3\">\n {items.length > 0 && (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span>{done}/{items.length}</span>\n {hasTakes && (\n <button\n type=\"button\"\n onClick={generateFromScript}\n className=\"flex items-center gap-1 font-medium text-muted-foreground transition-colors hover:text-foreground\"\n >\n <Sparkles className=\"h-3 w-3\" />\n {t('marketing.content.checklistGenerate')}\n </button>\n )}\n </div>\n <div className=\"h-1 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full rounded-full bg-primary transition-[width]\"\n style={{ width: items.length ? `${(done / items.length) * 100}%` : 0 }}\n />\n </div>\n </div>\n )}\n\n {items.length === 0 && (\n <div className=\"space-y-3 rounded-card border border-dashed border-border p-3 text-center\">\n <p className=\"text-xs text-muted-foreground\">\n {t('marketing.content.checklistEmpty')}\n </p>\n {hasTakes && (\n <Button variant=\"outline\" size=\"sm\" onClick={generateFromScript}>\n <Sparkles className=\"mr-1.5 h-3.5 w-3.5\" />\n {t('marketing.content.checklistGenerate')}\n </Button>\n )}\n </div>\n )}\n\n <ul className=\"space-y-1\">\n {items.map((item) => (\n <li key={item.id} className=\"group/item flex items-start gap-2.5 rounded-button px-1 py-2 transition-colors hover:bg-muted/40\">\n {/* label wraps the row → the whole line is the touch target */}\n <label className=\"flex min-w-0 flex-1 cursor-pointer items-start gap-2.5\">\n <Checkbox checked={item.done} onChange={() => toggle(item.id)} className=\"mt-0.5\" />\n <span\n className={cn(\n 'min-w-0 flex-1 text-sm leading-snug',\n item.done ? 'text-muted-foreground line-through' : 'text-foreground',\n )}\n >\n {item.text}\n </span>\n </label>\n <button\n type=\"button\"\n aria-label={t('marketing.content.cancel')}\n onClick={() => remove(item.id)}\n className=\"rounded p-0.5 text-muted-foreground/50 opacity-0 transition-opacity hover:text-destructive group-hover/item:opacity-100 focus:opacity-100\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </li>\n ))}\n </ul>\n\n <div className=\"flex items-center gap-2\">\n <Input\n value={text}\n onChange={(e) => setText(e.target.value)}\n placeholder={t('marketing.content.checklistAddPlaceholder')}\n onKeyDown={(e) => { if (e.key === 'Enter') add() }}\n className=\"h-8 text-sm\"\n />\n <Button variant=\"outline\" size=\"sm\" onClick={add} disabled={!text.trim()} aria-label={t('marketing.content.checklistAdd')}>\n <Plus className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport {\n Heart, MessageCircle, Send, Bookmark, MoreHorizontal, ThumbsUp, Share2,\n Repeat2, BarChart2, Image as ImageIcon, Globe,\n} from 'lucide-react'\nimport { cn } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { PlatformIcon } from '../../components/icons'\n\n// ---------------------------------------------------------------------------\n// Social post preview — the caption \"Visualizar\" mode renders the post the way\n// the platform will show it (asset + caption + action row). One tab per\n// selected platform; Instagram is the frame for look-alikes (TikTok/Threads/\n// Pinterest/YouTube get their own frames in a later pass).\n// ---------------------------------------------------------------------------\n\ninterface PreviewProps {\n caption: string\n mediaUrl?: string\n accountName: string\n accountHandle?: string\n platforms: string[]\n}\n\n/** Captions are plain text on every network — strip the markdown skeleton. */\nfunction toCaption(md: string): string {\n return md\n .replace(/^#+\\s*/gm, '')\n .replace(/\\*\\*/g, '')\n .replace(/^[-*]\\s+/gm, '')\n .trim()\n}\n\nfunction isVideo(url?: string): boolean {\n return !!url && /\\.(mp4|webm|mov)($|\\?)/i.test(url)\n}\n\nfunction Media({ mediaUrl, className }: { mediaUrl?: string; className?: string }) {\n if (!mediaUrl) {\n return (\n <div className={cn('flex aspect-square w-full items-center justify-center bg-muted/40', className)}>\n <ImageIcon className=\"h-8 w-8 text-muted-foreground/40\" />\n </div>\n )\n }\n return isVideo(mediaUrl) ? (\n <video src={mediaUrl} controls className={cn('w-full bg-black object-contain', className)} />\n ) : (\n <img src={mediaUrl} alt=\"\" className={cn('w-full object-cover', className)} />\n )\n}\n\nfunction Avatar({ name, ring }: { name: string; ring?: boolean }) {\n return (\n <span\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-muted text-xs font-semibold text-foreground',\n ring && 'ring-2 ring-offset-2 ring-pink-500/60',\n )}\n >\n {(name.replace(/^@/, '')[0] ?? '?').toUpperCase()}\n </span>\n )\n}\n\nfunction InstagramFrame({ caption, mediaUrl, accountName, accountHandle }: PreviewProps) {\n const t = useTranslation()\n const handle = (accountHandle || accountName).replace(/^@/, '')\n return (\n <div className=\"mx-auto w-full max-w-sm overflow-hidden rounded-card border border-border bg-card\">\n <div className=\"flex items-center gap-2.5 px-3 py-2.5\">\n <Avatar name={handle} ring />\n <span className=\"flex-1 truncate text-sm font-semibold text-foreground\">{handle}</span>\n <MoreHorizontal className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n <Media mediaUrl={mediaUrl} />\n <div className=\"space-y-2 px-3 py-2.5\">\n <div className=\"flex items-center gap-4 text-foreground\">\n <Heart className=\"h-6 w-6\" />\n <MessageCircle className=\"h-6 w-6\" />\n <Send className=\"h-6 w-6\" />\n <Bookmark className=\"ml-auto h-6 w-6\" />\n </div>\n <p className=\"whitespace-pre-wrap text-sm leading-snug text-foreground\">\n <span className=\"mr-1.5 font-semibold\">{handle}</span>\n {toCaption(caption)}\n </p>\n <p className=\"text-[11px] uppercase tracking-wide text-muted-foreground\">\n {t('marketing.content.previewNow')}\n </p>\n </div>\n </div>\n )\n}\n\nfunction FacebookFrame({ caption, mediaUrl, accountName }: PreviewProps) {\n const t = useTranslation()\n return (\n <div className=\"mx-auto w-full max-w-sm overflow-hidden rounded-card border border-border bg-card\">\n <div className=\"flex items-center gap-2.5 px-3 py-2.5\">\n <Avatar name={accountName} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold text-foreground\">{accountName.replace(/^@/, '')}</p>\n <p className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n {t('marketing.content.previewNow')} · <Globe className=\"h-3 w-3\" />\n </p>\n </div>\n <MoreHorizontal className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n <p className=\"whitespace-pre-wrap px-3 pb-2.5 text-sm leading-snug text-foreground\">{toCaption(caption)}</p>\n <Media mediaUrl={mediaUrl} className=\"aspect-auto\" />\n <div className=\"flex items-center justify-around border-t border-border px-3 py-2 text-muted-foreground\">\n <span className=\"flex items-center gap-1.5 text-xs font-medium\"><ThumbsUp className=\"h-4 w-4\" /> {t('marketing.content.previewLike')}</span>\n <span className=\"flex items-center gap-1.5 text-xs font-medium\"><MessageCircle className=\"h-4 w-4\" /> {t('marketing.content.previewComment')}</span>\n <span className=\"flex items-center gap-1.5 text-xs font-medium\"><Share2 className=\"h-4 w-4\" /> {t('marketing.content.previewShare')}</span>\n </div>\n </div>\n )\n}\n\nfunction LinkedinFrame({ caption, mediaUrl, accountName }: PreviewProps) {\n const t = useTranslation()\n return (\n <div className=\"mx-auto w-full max-w-sm overflow-hidden rounded-card border border-border bg-card\">\n <div className=\"flex items-center gap-2.5 px-3 py-2.5\">\n <Avatar name={accountName} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold text-foreground\">{accountName.replace(/^@/, '')}</p>\n <p className=\"text-xs text-muted-foreground\">{t('marketing.content.previewNow')}</p>\n </div>\n </div>\n <p className=\"whitespace-pre-wrap px-3 pb-2.5 text-sm leading-snug text-foreground\">{toCaption(caption)}</p>\n <Media mediaUrl={mediaUrl} className=\"aspect-auto\" />\n <div className=\"flex items-center justify-around border-t border-border px-3 py-2 text-muted-foreground\">\n <ThumbsUp className=\"h-4 w-4\" />\n <MessageCircle className=\"h-4 w-4\" />\n <Repeat2 className=\"h-4 w-4\" />\n <Send className=\"h-4 w-4\" />\n </div>\n </div>\n )\n}\n\nfunction XFrame({ caption, mediaUrl, accountName, accountHandle }: PreviewProps) {\n const t = useTranslation()\n const handle = (accountHandle || accountName).replace(/^@/, '')\n return (\n <div className=\"mx-auto w-full max-w-sm rounded-card border border-border bg-card p-3\">\n <div className=\"flex gap-2.5\">\n <Avatar name={handle} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm text-foreground\">\n <span className=\"font-semibold\">{accountName.replace(/^@/, '')}</span>\n <span className=\"text-muted-foreground\"> @{handle} · {t('marketing.content.previewNow')}</span>\n </p>\n <p className=\"mt-0.5 whitespace-pre-wrap text-sm leading-snug text-foreground\">{toCaption(caption)}</p>\n <div className=\"mt-2 overflow-hidden rounded-xl border border-border\">\n <Media mediaUrl={mediaUrl} className=\"aspect-auto\" />\n </div>\n <div className=\"mt-2 flex items-center justify-between pr-6 text-muted-foreground\">\n <MessageCircle className=\"h-4 w-4\" />\n <Repeat2 className=\"h-4 w-4\" />\n <Heart className=\"h-4 w-4\" />\n <BarChart2 className=\"h-4 w-4\" />\n <Share2 className=\"h-4 w-4\" />\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nconst FRAMES: Record<string, React.ComponentType<PreviewProps>> = {\n instagram: InstagramFrame,\n facebook: FacebookFrame,\n linkedin: LinkedinFrame,\n x: XFrame,\n}\n\nexport function PostSocialPreview(props: PreviewProps) {\n const platforms = props.platforms.length > 0 ? props.platforms : ['instagram']\n const [selected, setSelected] = React.useState(platforms[0])\n const active = platforms.includes(selected) ? selected : platforms[0]\n const Frame = FRAMES[active] ?? InstagramFrame\n\n return (\n <div className=\"space-y-3 rounded-md border border-border bg-muted/20 p-4\">\n {platforms.length > 1 && (\n <div className=\"flex items-center justify-center gap-1\">\n {platforms.map((platform) => (\n <button\n key={platform}\n type=\"button\"\n onClick={() => setSelected(platform)}\n aria-pressed={active === platform}\n className={cn(\n 'flex items-center gap-1.5 rounded-button px-2.5 py-1.5 text-xs font-medium capitalize transition-colors',\n active === platform\n ? 'bg-card text-foreground shadow-button'\n : 'text-muted-foreground hover:text-foreground',\n )}\n >\n <PlatformIcon platform={platform} className=\"h-3.5 w-3.5\" />\n {platform}\n </button>\n ))}\n </div>\n )}\n <Frame {...props} />\n </div>\n )\n}\n","import type { PostFormat } from '../../data/contentTypes'\n\n// ---------------------------------------------------------------------------\n// Default markdown scaffolds inserted when a post's page is still empty.\n// The section headers follow the script format clinics/creators actually use\n// (hook-first reels, on-screen text + spoken line per take). Body text is user\n// content, so it ships in pt-BR — the product's first content-planner users.\n// ---------------------------------------------------------------------------\n\nconst reel = (title: string) => `# ${title}\n\n**TEMA:** ${title.toUpperCase()}\n**Formato:** Reel · **Duração:** 45 a 60 segundos\n\n---\n\n## TAKE 1 – GANCHO (0s a 5s)\n\n*Direção de cena: olhando para a câmera, energia alta.*\n\n**Texto na tela:** …\n\n**Fala:** \"…\"\n\n---\n\n## TAKE 2 – DESENVOLVIMENTO (5s a 40s)\n\n*Direção de cena: …*\n\n**Texto na tela:** …\n\n**Fala:** \"…\"\n\n---\n\n## TAKE 3 – CTA (40s a 60s)\n\n**Fala:** \"…\"\n\n**CTA:** …\n`\n\nconst staticPost = (title: string) => `# ${title}\n\n**TEMA:** ${title.toUpperCase()}\n**Formato:** Estático\n\n## Texto da arte\n\n…\n\n## Legenda\n\n…\n\n**CTA:** …\n`\n\nconst carousel = (title: string) => `# ${title}\n\n**TEMA:** ${title.toUpperCase()}\n**Formato:** Carrossel\n\n## Slide 1 — Capa (gancho)\n\n…\n\n## Slide 2\n\n…\n\n## Slide 3\n\n…\n\n## Último slide — CTA\n\n…\n`\n\nconst story = (title: string) => `# ${title}\n\n**TEMA:** ${title.toUpperCase()}\n**Formato:** Story\n\n## Frame 1\n\n…\n\n## Frame 2\n\n…\n\n## Frame final — CTA\n\n*Sticker de link / caixa de pergunta / enquete.*\n\n…\n`\n\nconst video = (title: string) => `# ${title}\n\n**TEMA:** ${title.toUpperCase()}\n**Formato:** Vídeo longo (YouTube) · **Duração:** 8 a 12 minutos\n\n## Gancho (0s a 30s)\n\n…\n\n## Roteiro por blocos\n\n### Bloco 1 — Contexto\n\n…\n\n### Bloco 2 — Desenvolvimento\n\n…\n\n### Bloco 3 — Fechamento\n\n…\n\n**CTA:** inscreva-se / comente / link na descrição\n`\n\nconst live = (title: string) => `# ${title}\n\n**TEMA:** ${title.toUpperCase()}\n**Formato:** Live\n\n## Pauta\n\n1. Abertura e aquecimento (5 min)\n2. …\n3. Perguntas e respostas (15 min)\n\n## Avisos / CTAs durante a live\n\n…\n`\n\nconst article = (title: string) => `# ${title}\n\n**TEMA:** ${title.toUpperCase()}\n**Formato:** Artigo / Newsletter\n\n## Título de trabalho\n\n…\n\n## Estrutura\n\n- Abertura (dor / promessa)\n- Desenvolvimento em 3 pontos\n- Conclusão + CTA\n\n## Rascunho\n\n…\n`\n\nexport const POST_TEMPLATES: Record<PostFormat, (title: string) => string> = {\n reel,\n static: staticPost,\n carousel,\n story,\n video,\n live,\n article,\n}\n","import React from 'react'\nimport { ImagePlus, Loader2, X } from 'lucide-react'\nimport {\n Button, Input, MarkdownEditor, SubpageHeader, ConfirmDialog, Skeleton,\n ContentSplit, ContentSplitTrigger,\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { canUploadMedia, uploadPostMedia } from '../../data/contentMedia'\nimport { RecordingChecklist } from './RecordingChecklist'\nimport { PostSocialPreview } from './PostSocialPreview'\nimport type { ContentPost, PostFormat, PostStatus } from '../../data/contentTypes'\nimport { useContentPlannerProvider, useContentPlannerStore } from './ContentPlannerContext'\nimport { POST_FORMATS, POST_STATUS_ORDER, PlatformPicker, StatusDot } from './contentBits'\nimport { POST_TEMPLATES } from './templates'\n\n// ---------------------------------------------------------------------------\n// Post page — the Notion-style page behind each board card: title, a compact\n// meta row (format / status / date / hook / CTA) and the markdown script body.\n// ---------------------------------------------------------------------------\n\nfunction MediaAsset({ post, onChanged }: {\n post: ContentPost\n onChanged: (mediaUrl: string | null) => void\n}) {\n const t = useTranslation()\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [busy, setBusy] = React.useState(false)\n const isVideo = post.mediaUrl ? /\\.(mp4|webm|mov)($|\\?)/i.test(post.mediaUrl) : false\n\n const pick = () => inputRef.current?.click()\n\n const upload = async (file: File) => {\n setBusy(true)\n try {\n const url = await uploadPostMedia(post.id, file)\n onChanged(url)\n } finally {\n setBusy(false)\n }\n }\n\n if (!canUploadMedia()) {\n return <p className=\"text-xs text-muted-foreground\">{t('marketing.content.mediaUnavailable')}</p>\n }\n\n return (\n <div className=\"space-y-2\">\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*,video/*\"\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n if (file) void upload(file)\n e.target.value = ''\n }}\n />\n {post.mediaUrl ? (\n <div className=\"relative overflow-hidden rounded-card border border-border bg-muted/20\">\n {isVideo ? (\n <video src={post.mediaUrl} controls className=\"max-h-72 w-full object-contain\" />\n ) : (\n <img src={post.mediaUrl} alt=\"\" className=\"max-h-72 w-full object-contain\" />\n )}\n <div className=\"flex items-center justify-end gap-2 border-t border-border p-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={pick} disabled={busy}>\n {busy ? <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" /> : <ImagePlus className=\"mr-1.5 h-3.5 w-3.5\" />}\n {t('marketing.content.mediaReplace')}\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => onChanged(null)} disabled={busy}>\n <X className=\"mr-1 h-3.5 w-3.5\" />\n {t('marketing.content.mediaRemove')}\n </Button>\n </div>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={pick}\n disabled={busy}\n className=\"flex w-full flex-col items-center justify-center gap-2 rounded-card border border-dashed border-border p-6 text-muted-foreground transition-colors hover:bg-muted/30 hover:text-foreground\"\n >\n {busy ? <Loader2 className=\"h-5 w-5 animate-spin\" /> : <ImagePlus className=\"h-5 w-5\" />}\n <span className=\"text-sm font-medium\">{t('marketing.content.mediaUpload')}</span>\n <span className=\"text-xs\">{t('marketing.content.mediaHint')}</span>\n </button>\n )}\n </div>\n )\n}\n\ninterface Draft {\n title: string\n format: PostFormat\n status: PostStatus\n scheduledDate: string\n platforms: string[]\n hook: string\n cta: string\n contentMd: string\n}\n\nfunction toDraft(post: ContentPost): Draft {\n return {\n title: post.title,\n format: post.format,\n status: post.status,\n scheduledDate: post.scheduledDate ?? '',\n platforms: post.platforms,\n hook: post.hook ?? '',\n cta: post.cta ?? '',\n contentMd: post.contentMd,\n }\n}\n\nexport function PostPage({ postId, onBack }: { postId: string; onBack: () => void }) {\n const t = useTranslation()\n const provider = useContentPlannerProvider()\n const storePost = useContentPlannerStore((s) => s.posts.find((p) => p.id === postId))\n const savePost = useContentPlannerStore((s) => s.savePost)\n const deletePost = useContentPlannerStore((s) => s.deletePost)\n const accounts = useContentPlannerStore((s) => s.accounts)\n const activeAccountId = useContentPlannerStore((s) => s.activeAccountId)\n\n const [post, setPost] = React.useState<ContentPost | null>(storePost ?? null)\n const [draft, setDraft] = React.useState<Draft | null>(storePost ? toDraft(storePost) : null)\n const [saving, setSaving] = React.useState(false)\n const [confirmDelete, setConfirmDelete] = React.useState(false)\n\n // Deep links land here before the board loaded the plan — fetch directly.\n React.useEffect(() => {\n if (post?.id === postId) return\n if (storePost) {\n setPost(storePost)\n setDraft(toDraft(storePost))\n return\n }\n void provider.getPost(postId).then((fetched) => {\n if (fetched) {\n setPost(fetched)\n setDraft(toDraft(fetched))\n }\n })\n }, [postId, storePost, post?.id, provider])\n\n if (!post || !draft) {\n return (\n <div className=\"mx-auto max-w-3xl space-y-5\">\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-8 w-56\" />\n <Skeleton className=\"h-8 w-40\" />\n </div>\n <Skeleton className=\"h-10 w-full\" />\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n {Array.from({ length: 3 }, (_, i) => <Skeleton key={i} className=\"h-14\" />)}\n </div>\n <Skeleton className=\"h-64 w-full\" />\n </div>\n )\n }\n\n const dirty =\n draft.title !== post.title ||\n draft.format !== post.format ||\n draft.status !== post.status ||\n draft.scheduledDate !== (post.scheduledDate ?? '') ||\n draft.platforms.join(',') !== post.platforms.join(',') ||\n draft.hook !== (post.hook ?? '') ||\n draft.cta !== (post.cta ?? '') ||\n draft.contentMd !== post.contentMd\n\n const patch = (partial: Partial<Draft>) => setDraft((d) => (d ? { ...d, ...partial } : d))\n\n const save = async () => {\n setSaving(true)\n try {\n const updated = await savePost({\n id: post.id,\n title: draft.title,\n format: draft.format,\n status: draft.status,\n scheduledDate: draft.scheduledDate || null,\n platforms: draft.platforms,\n hook: draft.hook,\n cta: draft.cta,\n contentMd: draft.contentMd,\n })\n setPost(updated)\n setDraft(toDraft(updated))\n } finally {\n setSaving(false)\n }\n }\n\n const insertTemplate = () => {\n patch({ contentMd: POST_TEMPLATES[draft.format](draft.title || t('marketing.content.untitled')) })\n }\n\n const isStatic = draft.format === 'static'\n const account = accounts.find((a) => a.id === activeAccountId) ?? null\n\n // Recording day: the checklist panel starts expanded only when today IS the\n // post's scheduled date — otherwise it waits collapsed in the rail.\n const now = new Date()\n const todayISO = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`\n const isReleaseDay = !!post.scheduledDate && post.scheduledDate === todayISO\n\n const handleMediaChanged = (mediaUrl: string | null) => {\n void savePost({ id: post.id, mediaUrl }).then((updated) => {\n setPost(updated)\n setDraft((d) => (d ? { ...d } : d))\n })\n }\n\n return (\n <ContentSplit\n key={post.id}\n className=\"mx-auto max-w-5xl\"\n aside={<RecordingChecklist post={post} />}\n asideTitle={t('marketing.content.checklistTitle')}\n asideDescription={t('marketing.content.checklistDescription')}\n collapsible\n defaultCollapsed={!isReleaseDay}\n >\n <div className=\"space-y-5\">\n <SubpageHeader\n title={draft.title || t('marketing.content.untitled')}\n parentLabel={t('marketing.content.title')}\n onBack={onBack}\n actions={\n <div className=\"flex items-center gap-2\">\n <ContentSplitTrigger label={t('marketing.content.checklistOpen')} />\n <Button variant=\"outline\" size=\"sm\" onClick={() => setConfirmDelete(true)}>\n {t('marketing.content.deletePost')}\n </Button>\n <Button size=\"sm\" onClick={() => void save()} disabled={!dirty || saving}>\n {t('marketing.content.save')}\n </Button>\n </div>\n }\n />\n\n <Input\n value={draft.title}\n onChange={(e) => patch({ title: e.target.value })}\n placeholder={t('marketing.content.titlePlaceholder')}\n className=\"text-base font-medium\"\n />\n\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('marketing.content.formatLabel')}</label>\n <Select value={draft.format} onValueChange={(v) => patch({ format: v as PostFormat })}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {POST_FORMATS.map((f) => (\n <SelectItem key={f} value={f}>{t(`marketing.content.format.${f}`)}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('marketing.content.statusLabel')}</label>\n <Select value={draft.status} onValueChange={(v) => patch({ status: v as PostStatus })}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {POST_STATUS_ORDER.map((s) => (\n <SelectItem key={s} value={s}>\n <span className=\"flex items-center gap-2\">\n <StatusDot status={s} />\n {t(`marketing.content.status.${s}`)}\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('marketing.content.scheduledDate')}</label>\n <Input\n type=\"date\"\n value={draft.scheduledDate}\n onChange={(e) => patch({ scheduledDate: e.target.value })}\n />\n </div>\n <div className=\"space-y-1 sm:col-span-2\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('marketing.content.hook')}</label>\n <Input\n value={draft.hook}\n onChange={(e) => patch({ hook: e.target.value })}\n placeholder={t('marketing.content.hookPlaceholder')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('marketing.content.cta')}</label>\n <Input\n value={draft.cta}\n onChange={(e) => patch({ cta: e.target.value })}\n placeholder={t('marketing.content.ctaPlaceholder')}\n />\n </div>\n <div className=\"space-y-1 sm:col-span-3\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('marketing.content.platformsLabel')}</label>\n <PlatformPicker value={draft.platforms} onChange={(platforms) => patch({ platforms })} />\n </div>\n </div>\n\n {isStatic && (\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n {t('marketing.content.mediaLabel')}\n </label>\n <MediaAsset post={post} onChanged={handleMediaChanged} />\n </div>\n )}\n\n <div className=\"space-y-1\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n {isStatic ? t('marketing.content.captionLabel') : t('marketing.content.scriptLabel')}\n </label>\n {draft.contentMd.trim() === '' && (\n <Button variant=\"outline\" size=\"sm\" onClick={insertTemplate}>\n {t('marketing.content.insertTemplate')}\n </Button>\n )}\n </div>\n <MarkdownEditor\n value={draft.contentMd}\n onChange={(contentMd) => patch({ contentMd })}\n placeholder={isStatic ? t('marketing.content.captionPlaceholder') : t('marketing.content.bodyPlaceholder')}\n editLabel={t('marketing.content.edit')}\n previewLabel={t('marketing.content.preview')}\n renderPreview={\n isStatic\n ? (value) => (\n <PostSocialPreview\n caption={value}\n mediaUrl={post.mediaUrl}\n accountName={account?.name ?? '@conta'}\n accountHandle={account?.handle}\n platforms={\n draft.platforms.length > 0 ? draft.platforms : account?.platforms ?? []\n }\n />\n )\n : undefined\n }\n />\n </div>\n\n <ConfirmDialog\n open={confirmDelete}\n variant=\"destructive\"\n title={t('marketing.content.deletePost')}\n description={t('marketing.content.deletePostConfirm')}\n confirmLabel={t('marketing.content.deletePost')}\n cancelLabel={t('marketing.content.cancel')}\n onCancel={() => setConfirmDelete(false)}\n onConfirm={() => {\n setConfirmDelete(false)\n void deletePost(post.id).then(onBack)\n }}\n />\n </div>\n </ContentSplit>\n )\n}\n","import type { EntityDef, FieldDef } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Blog backoffice entities — the single source of truth that drives BOTH the\n// generic list (CrudListView columns + facets) and the create/edit form\n// (CrudFormPage fields, incl. the markdown body + category relation).\n//\n// Persistence is the generic Supabase provider resolved from `data.table`\n// (plg_blog_posts / plg_blog_categories, owned by @fayz-ai/plugin-blog's\n// migrations). camelCase field keys map to snake_case columns automatically.\n// The website reads the same rows through the anon v_public_blog_posts view.\n// ---------------------------------------------------------------------------\n\nexport const BLOG_POSTS_TABLE = 'plg_blog_posts'\nexport const BLOG_CATEGORIES_TABLE = 'plg_blog_categories'\n\nexport interface BlogPostRow {\n id: string\n title: string\n slug: string\n excerpt: string\n body: string\n categoryId?: string\n coverImage?: string\n authorName?: string\n authorRole?: string\n authorAvatarUrl?: string\n authorBio?: string\n status: 'draft' | 'published'\n readTime?: string\n publishedAt?: string\n}\n\nexport interface BlogCategoryRow {\n id: string\n name: string\n slug: string\n description?: string\n}\n\nexport function buildBlogPostEntity(): EntityDef<BlogPostRow> {\n const fields: FieldDef[] = [\n { key: 'title', label: 'Title', type: 'text', required: true, searchable: true, showInTable: true, sortable: true },\n { key: 'slug', label: 'Slug', type: 'text', required: true, searchable: true, showInTable: false, hint: 'URL identifier, e.g. \"cannabis-and-oral-health\"' },\n { key: 'status', label: 'Status', type: 'select', options: ['draft', 'published'], showInTable: true, defaultValue: 'draft' },\n { key: 'categoryId', label: 'Category', type: 'relation', relation: { table: BLOG_CATEGORIES_TABLE, valueField: 'id', labelField: 'name', tenantScoped: true }, showInTable: false },\n { key: 'excerpt', label: 'Excerpt', type: 'textarea', span: 2, showInTable: false, placeholder: 'Short summary shown on cards' },\n { key: 'body', label: 'Body', type: 'markdown', span: 2, showInTable: false },\n { key: 'coverImage', label: 'Cover image', type: 'image', showInTable: false, placeholder: 'https://…' },\n { key: 'readTime', label: 'Read time', type: 'text', showInTable: false, placeholder: '5 min' },\n { key: 'publishedAt', label: 'Published at', type: 'date', showInTable: true, sortable: true },\n { key: 'authorName', label: 'Author name', type: 'text', showInTable: false },\n { key: 'authorRole', label: 'Author role', type: 'text', showInTable: false, placeholder: 'e.g. Cirurgião-Dentista' },\n { key: 'authorAvatarUrl', label: 'Author avatar', type: 'image', showInTable: false, placeholder: 'https://…' },\n { key: 'authorBio', label: 'Author bio', type: 'textarea', span: 2, showInTable: false },\n ]\n return {\n name: 'Post',\n namePlural: 'Posts',\n icon: 'Newspaper',\n fields,\n displayField: 'title',\n subtitleField: 'slug',\n facets: [{ field: 'status', allLabel: 'All' }],\n data: {\n table: BLOG_POSTS_TABLE,\n tenantScoped: true,\n searchColumns: ['title', 'slug', 'excerpt'],\n },\n }\n}\n\nexport function buildBlogCategoryEntity(): EntityDef<BlogCategoryRow> {\n const fields: FieldDef[] = [\n { key: 'name', label: 'Name', type: 'text', required: true, searchable: true, showInTable: true, sortable: true },\n { key: 'slug', label: 'Slug', type: 'text', required: true, searchable: true, showInTable: true, hint: 'URL identifier' },\n { key: 'description', label: 'Description', type: 'textarea', span: 2, showInTable: false },\n ]\n return {\n name: 'Category',\n namePlural: 'Categories',\n icon: 'Tags',\n fields,\n displayField: 'name',\n data: {\n table: BLOG_CATEGORIES_TABLE,\n tenantScoped: true,\n searchColumns: ['name', 'slug'],\n },\n }\n}\n","import { useMemo, useState, useCallback } from 'react'\nimport { resolveDataProvider } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\ninterface ListQuery {\n search?: string\n filters?: Record<string, unknown>\n page?: number\n pageSize?: number\n sortBy?: string\n sortDir?: 'asc' | 'desc'\n}\n\n/**\n * Minimal store-less CRUD wiring for a plugin that owns its data + routing.\n * Resolves the generic Supabase provider from the EntityDef's `data.table`\n * (mock fallback when Supabase is not configured) and exposes list/get/save/\n * remove. Used by the blog backoffice list + form views — the heavy list/form\n * rendering stays in the shared CrudListView / CrudFormPage.\n */\nexport function useEntityCrud<T extends { id: string }>(entity: EntityDef<T>) {\n const provider = useMemo(() => resolveDataProvider<T>(entity), [entity])\n const [items, setItems] = useState<T[] | null>(null)\n const [total, setTotal] = useState(0)\n\n const fetch = useCallback(async (query: ListQuery = {}) => {\n try {\n const res = await provider.list(query as any)\n setItems(res.data)\n setTotal(res.total)\n } catch (err) {\n // Table not provisioned yet (migration not applied to this pool) or a\n // transient error — surface an empty list instead of a perpetual skeleton.\n console.warn('[blog] list failed; showing empty. Apply the plugin-blog migration to this pool.', err)\n setItems([])\n setTotal(0)\n }\n }, [provider])\n\n const getById = useCallback(async (id: string): Promise<T | null> => {\n const res = await provider.list({ filters: { id }, page: 1, pageSize: 1 } as any)\n return res.data[0] ?? null\n }, [provider])\n\n const create = useCallback((data: Record<string, unknown>) => provider.create(data as any), [provider])\n const update = useCallback((id: string, data: Record<string, unknown>) => provider.update(id, data as any), [provider])\n const remove = useCallback((id: string) => provider.remove(id), [provider])\n\n return { items, total, fetch, getById, create, update, remove }\n}\n","import React, { useEffect, useMemo, useState } from 'react'\nimport { CrudListView } from '@fayz-ai/saas'\nimport { SegmentedControl } from '@fayz-ai/ui'\nimport { useMarketingConfig } from '../../MarketingContext'\nimport { buildBlogPostEntity, buildBlogCategoryEntity } from '../../data/blogEntities'\nimport { useEntityCrud } from './useEntityCrud'\n\n// ---------------------------------------------------------------------------\n// Blog backoffice — an in-page marketing tab with two lenses (Posts /\n// Categories), each a generic CrudListView backed by the blog tables. Follows\n// the content-planner pattern: this plugin owns the data + routing; create/edit\n// deep-link through the marketing module nav (navigate('blog-post:id') etc.).\n// ---------------------------------------------------------------------------\n\nfunction PostsList({ navigate }: { navigate: (view: string) => void }) {\n const entity = useMemo(() => buildBlogPostEntity(), [])\n const { items, total, fetch } = useEntityCrud(entity)\n const [search, setSearch] = useState('')\n const [statusFilter, setStatusFilter] = useState<string | undefined>()\n const [loadedOnce, setLoadedOnce] = useState(false)\n\n useEffect(() => {\n let active = true\n Promise.resolve(\n fetch({ search: search || undefined, filters: statusFilter ? { status: statusFilter } : undefined }),\n ).finally(() => { if (active) setLoadedOnce(true) })\n return () => { active = false }\n }, [search, statusFilter, fetch])\n\n const facets = useMemo(() => [{\n field: 'status',\n allLabel: 'All',\n options: [{ value: 'draft', label: 'Draft' }, { value: 'published', label: 'Published' }],\n }], [])\n\n return (\n <CrudListView\n entityDef={entity}\n items={loadedOnce ? items : null}\n total={total}\n search={search}\n onSearchChange={setSearch}\n searchPlaceholder=\"Search posts…\"\n facets={facets}\n activeFilters={{ status: statusFilter }}\n onFacetChange={(_field, value) => setStatusFilter(value)}\n onNew={() => navigate('blog-new')}\n addLabel=\"New post\"\n onRowClick={(row) => navigate(`blog-post:${(row as { id: string }).id}`)}\n />\n )\n}\n\nfunction CategoriesList({ navigate }: { navigate: (view: string) => void }) {\n const entity = useMemo(() => buildBlogCategoryEntity(), [])\n const { items, total, fetch } = useEntityCrud(entity)\n const [search, setSearch] = useState('')\n const [loadedOnce, setLoadedOnce] = useState(false)\n\n useEffect(() => {\n let active = true\n Promise.resolve(fetch({ search: search || undefined })).finally(() => { if (active) setLoadedOnce(true) })\n return () => { active = false }\n }, [search, fetch])\n\n return (\n <CrudListView\n entityDef={entity}\n items={loadedOnce ? items : null}\n total={total}\n search={search}\n onSearchChange={setSearch}\n searchPlaceholder=\"Search categories…\"\n onNew={() => navigate('blog-cat-new')}\n addLabel=\"New category\"\n onRowClick={(row) => navigate(`blog-cat:${(row as { id: string }).id}`)}\n />\n )\n}\n\nexport function BlogAdminView({ navigate }: { navigate: (view: string) => void }) {\n const { labels } = useMarketingConfig()\n const [lens, setLens] = useState<'posts' | 'categories'>('posts')\n\n return (\n <div className=\"space-y-4\">\n <SegmentedControl\n aria-label=\"Blog section\"\n options={[\n { value: 'posts', label: labels.blog },\n { value: 'categories', label: labels.blogCategories },\n ]}\n value={lens}\n onChange={(v) => setLens(v as 'posts' | 'categories')}\n />\n {lens === 'posts' ? <PostsList navigate={navigate} /> : <CategoriesList navigate={navigate} />}\n </div>\n )\n}\n","import React from 'react'\nimport { SubpageHeader, Button, toast } from '@fayz-ai/ui'\nimport { CrudFormPage } from '@fayz-ai/saas'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { useEntityCrud } from './useEntityCrud'\n\n// ---------------------------------------------------------------------------\n// Generic create/edit for a blog entity (post or category), rendered through\n// the shared CrudFormPage (declarative EntityDef → fields, incl. the markdown\n// body + category relation). Persistence flows through the generic Supabase\n// provider; this only wires load / save / delete + the back link.\n// ---------------------------------------------------------------------------\n\nexport function BlogEntityForm<T extends { id: string }>({\n entity,\n editId,\n parentLabel,\n onDone,\n}: {\n entity: EntityDef<T>\n editId?: string\n parentLabel: string\n onDone: () => void\n}) {\n const { getById, create, update, remove } = useEntityCrud(entity)\n const isEdit = !!editId\n const namePlural = entity.namePlural ?? entity.name + 's'\n const [initialData, setInitialData] = React.useState<Record<string, any> | null>(isEdit ? null : {})\n\n React.useEffect(() => {\n if (!editId) return\n let cancelled = false\n ;(async () => {\n const item = await getById(editId)\n if (!cancelled) setInitialData((item as Record<string, any>) ?? {})\n })()\n return () => { cancelled = true }\n }, [editId, getById])\n\n async function save(values: Record<string, any>) {\n try {\n if (isEdit) await update(editId!, values)\n else await create(values)\n toast.success(isEdit ? `${entity.name} updated` : `${entity.name} created`)\n onDone()\n } catch (err) {\n toast.error(`Failed to save ${entity.name.toLowerCase()}`)\n throw err\n }\n }\n\n async function del() {\n if (!editId) return\n try {\n await remove(editId)\n toast.success(`${entity.name} deleted`)\n onDone()\n } catch {\n toast.error(`Failed to delete ${entity.name.toLowerCase()}`)\n }\n }\n\n const title = isEdit\n ? (initialData?.[entity.displayField ?? 'name'] ?? entity.name)\n : `New ${entity.name.toLowerCase()}`\n\n return (\n <div className=\"space-y-4\">\n <SubpageHeader\n title={String(title)}\n onBack={onDone}\n parentLabel={parentLabel}\n actions={isEdit ? (\n <Button variant=\"ghost\" className=\"text-destructive hover:text-destructive\" onClick={del}>\n Delete\n </Button>\n ) : undefined}\n />\n {initialData !== null && (\n <CrudFormPage\n entityDef={entity}\n mode={isEdit ? 'edit' : 'create'}\n initialData={initialData}\n namePlural={namePlural}\n onCancel={onDone}\n onSubmit={save}\n hideBreadcrumb\n />\n )}\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 { ContentPlannerProvider } from './data/contentTypes'\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'\nimport { ContentPlannerContextProvider } from './views/content/ContentPlannerContext'\nimport type { ContentPlannerUIState } from './views/content/contentStore'\nimport { ContentView } from './views/content/ContentView'\nimport { PostPage } from './views/content/PostPage'\nimport { PlanBriefView } from './views/content/PlanBriefView'\nimport { BlogAdminView } from './views/blog/BlogAdminView'\nimport { BlogEntityForm } from './views/blog/BlogEntityForm'\nimport { buildBlogPostEntity, buildBlogCategoryEntity } from './data/blogEntities'\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 if (config.modules.contentPlanner) {\n items.push({\n id: 'content', label: config.labels.content, icon: 'Clapperboard',\n active: view === 'content' || view === 'content-brief' || view.startsWith('content-post:'),\n onClick: () => navigate('content'),\n })\n }\n if (config.modules.blog) {\n items.push({\n id: 'blog', label: config.labels.blog, icon: 'Newspaper',\n active: view === 'blog' || view === 'blog-new' || view.startsWith('blog-post:')\n || view === 'blog-cat-new' || view.startsWith('blog-cat:'),\n onClick: () => navigate('blog'),\n })\n }\n return items\n}\n\nexport function MarketingPage({ config, provider, store, contentProvider, contentStore }: {\n config: ResolvedMarketingConfig\n provider: MarketingDataProvider\n store: StoreApi<MarketingUIState>\n contentProvider: ContentPlannerProvider\n contentStore: StoreApi<ContentPlannerUIState>\n}) {\n const t = useTranslation()\n const { view, direction, navigate } = useModuleNavigation('/marketing', {\n overview: 0, channels: 0, campaigns: 0, funnel: 0, 'landing-pages': 0, content: 0, blog: 0,\n 'channel-detail': 1, 'content-post': 1, 'content-brief': 1,\n 'blog-new': 1, 'blog-post': 1, 'blog-cat-new': 1, 'blog-cat': 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 // Blog backoffice entities — one shared EntityDef each drives the list + form.\n const blogPostEntity = React.useMemo(() => buildBlogPostEntity(), [])\n const blogCategoryEntity = React.useMemo(() => buildBlogCategoryEntity(), [])\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: 'content', render: () => <ContentView onOpenPost={(id) => navigate(`content-post:${id}`)} /> },\n { id: 'content-post', render: ({ id }) => <PostPage postId={id!} onBack={() => navigate('content')} /> },\n { id: 'content-brief', render: () => <PlanBriefView onBack={() => navigate('content')} /> },\n { id: 'blog', render: () => <BlogAdminView navigate={navigate} /> },\n { id: 'blog-new', render: () => <BlogEntityForm entity={blogPostEntity} parentLabel={config.labels.blog} onDone={() => navigate('blog')} /> },\n { id: 'blog-post', render: ({ id }) => <BlogEntityForm entity={blogPostEntity} editId={id!} parentLabel={config.labels.blog} onDone={() => navigate('blog')} /> },\n { id: 'blog-cat-new', render: () => <BlogEntityForm entity={blogCategoryEntity} parentLabel={config.labels.blogCategories} onDone={() => navigate('blog')} /> },\n { id: 'blog-cat', render: ({ id }) => <BlogEntityForm entity={blogCategoryEntity} editId={id!} parentLabel={config.labels.blogCategories} onDone={() => navigate('blog')} /> },\n { id: 'overview', render: () => <OverviewView /> },\n ], 'overview')\n\n return (\n <MarketingContextProvider config={config} provider={provider} store={store}>\n <ContentPlannerContextProvider config={config} provider={contentProvider} store={contentStore}>\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 </ContentPlannerContextProvider>\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 type { PluginRegistryDef, EntityDef } from '@fayz-ai/core'\nimport type { AcquisitionChannel } from './types'\n\n// ---------------------------------------------------------------------------\n// Settings registries — surfaced as CRUD tabs in the central Settings area\n// (mirrors how plugin-menu exposes Allergens / Dietary Tags). \"Channels\" lists\n// the acquisition channels resolved from the domain preset.\n// ---------------------------------------------------------------------------\n\nconst KIND_OPTIONS = [\n { value: 'paid', label: 'Paid' },\n { value: 'organic', label: 'Organic' },\n { value: 'social', label: 'Social' },\n { value: 'referral', label: 'Referral' },\n { value: 'direct', label: 'Direct' },\n { value: 'outbound', label: 'Outbound' },\n]\n\nconst channelEntity: EntityDef = {\n name: 'Channel',\n namePlural: 'Channels',\n icon: 'Radio',\n displayField: 'label',\n defaultSort: 'label',\n fields: [\n { key: 'label', label: 'Channel', type: 'text', required: true, showInTable: true, searchable: true },\n { key: 'kind', label: 'Type', type: 'select', options: KIND_OPTIONS, showInTable: true },\n { key: 'icon', label: 'Icon', type: 'text', showInTable: true },\n ],\n facets: [{ field: 'kind' }],\n}\n\n/** Build the marketing settings registries, seeding Channels from the resolved\n * domain preset. Read-only today (channels come from the preset); flip\n * readOnly + add a `data.table` to make them tenant-editable. */\nexport function buildMarketingRegistries(channels: AcquisitionChannel[]): PluginRegistryDef[] {\n return [\n {\n id: 'channels',\n entity: channelEntity,\n icon: 'Radio',\n description: 'Acquisition channels tracked for this workspace',\n display: 'table',\n readOnly: true,\n seedData: channels.map((c) => ({ id: c.id, label: c.label, kind: c.kind, icon: c.icon })),\n },\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 /** Social content planner — accounts, week board, markdown post pages. */\n contentPlanner: boolean\n /** Blog backoffice — posts + categories CMS feeding @fayz-ai/plugin-blog. Off by default. */\n blog: 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, contentPlanner: false, blog: false, 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, contentPlanner: true, blog: 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, contentPlanner: false, blog: 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 type {\n ContentPlan,\n ContentPlannerProvider,\n ContentPost,\n SocialAccount,\n} from './contentTypes'\n\n// ---------------------------------------------------------------------------\n// Mock content-planner provider — in-memory CRUD seeded with a realistic\n// 8-week clinic plan (2 reels + 1 static per week) so the surface demos well\n// without Supabase. Same shape the beauty seed uses in production.\n// ---------------------------------------------------------------------------\n\nlet counter = 0\nconst nextId = (prefix: string) => `${prefix}-${++counter}`\n\nconst SAMPLE_SCRIPT = `# 5 sinais de que sua queda capilar não é normal\n\n**TEMA:** 5 SINAIS DE QUE SUA QUEDA CAPILAR NÃO É NORMAL\n**Formato:** Reel · **Duração:** 45 a 60 segundos\n\n---\n\n## TAKE 1 – GANCHO (0s a 5s)\n\n*Dra. andando até a câmera.*\n\n**Texto na tela:** ⚠️ 5 sinais de alerta\n\n**Fala:** \"Seu cabelo está caindo e você não sabe se isso é normal? Existem sinais que merecem atenção.\"\n\n---\n\n## TAKE 2 – SINAL 1 (5s a 12s)\n\n*Mostrar a Dra. segurando alguns fios de cabelo ou imagem ilustrativa.*\n\n**Texto na tela:** Excesso de fios caindo.\n\n**Fala:** \"Primeiro sinal: você percebe muitos fios no travesseiro, no banho ou ao pentear os cabelos.\"\n\n---\n\n## TAKE 3 – CTA (40s a 60s)\n\n**Fala:** \"Se você se identificou com algum desses sinais, agende uma avaliação capilar.\"\n\n**CTA:** Agende sua avaliação\n`\n\nconst WEEK_TITLES: Array<[string, string]> = [\n ['5 sinais de que sua queda capilar não é normal', 'Antes e depois de tratamento capilar'],\n ['O que é DHT?', 'Tour pela clínica'],\n ['3 erros que aceleram a calvície', 'Depoimento de paciente'],\n ['Como funciona uma avaliação capilar', 'Mitos sobre queda de cabelo'],\n ['Por que seu tratamento anterior não funcionou?', 'Ozonioterapia para gordura localizada'],\n ['Diferença entre dermatologista e tricologista', 'Caso real de evolução'],\n ['Alopecia feminina explicada', 'Bastidores da clínica'],\n ['Quando procurar ajuda para queda capilar', 'Convite para avaliação gratuita'],\n]\n\nfunction buildSeed() {\n const account: SocialAccount = {\n id: nextId('acc'),\n name: 'Conta demo',\n handle: '@clinica.demo',\n platforms: ['instagram'],\n isActive: true,\n }\n const plan: ContentPlan = {\n id: nextId('plan'),\n accountId: account.id,\n name: 'Plano de conteúdo — 8 semanas',\n status: 'active',\n weeksCount: 8,\n objective: 'Atrair pacientes qualificados para avaliação capilar',\n tone: 'Autoridade acessível — técnica, mas em linguagem simples',\n pillars: ['Educação', 'Autoridade', 'Prova social', 'Bastidores', 'Conversão'],\n formats: ['reel', 'static'],\n weeklyFrequency: 3,\n briefMd: '## Objetivo\\n\\nPosicionar a especialista como referência em saúde capilar e gerar agendamentos de avaliação.\\n\\n## Estratégia\\n\\n- 2 reels educativos/prova social por semana\\n- 1 post estático por semana\\n- CTA recorrente: agendar avaliação',\n }\n const posts: ContentPost[] = []\n WEEK_TITLES.forEach(([reel1, reel2], i) => {\n const week = i + 1\n posts.push(\n {\n id: nextId('post'), planId: plan.id, weekNumber: week, position: 0,\n title: reel1, format: 'reel', status: week === 1 ? 'script' : 'idea',\n platforms: [], checklist: [], contentMd: week === 1 ? SAMPLE_SCRIPT : '',\n },\n {\n id: nextId('post'), planId: plan.id, weekNumber: week, position: 1,\n title: reel2, format: 'reel', status: 'idea', platforms: [], checklist: [], contentMd: '',\n },\n {\n id: nextId('post'), planId: plan.id, weekNumber: week, position: 2,\n title: 'Estático', format: 'static', status: 'idea', platforms: [], checklist: [], contentMd: '',\n },\n )\n })\n return { accounts: [account], plans: [plan], posts }\n}\n\nexport function createMockContentPlannerProvider(): ContentPlannerProvider {\n const db = buildSeed()\n\n return {\n async listAccounts() {\n return [...db.accounts]\n },\n\n async saveAccount(input) {\n if (input.id) {\n const acc = db.accounts.find((a) => a.id === input.id)\n if (!acc) throw new Error('Account not found')\n Object.assign(acc, {\n name: input.name ?? acc.name,\n handle: input.handle ?? acc.handle,\n platforms: input.platforms ?? acc.platforms,\n isActive: input.isActive ?? acc.isActive,\n })\n return { ...acc }\n }\n const acc: SocialAccount = {\n id: nextId('acc'),\n name: input.name,\n handle: input.handle,\n platforms: input.platforms ?? ['instagram'],\n isActive: input.isActive ?? true,\n }\n db.accounts.push(acc)\n return { ...acc }\n },\n\n async deleteAccount(id) {\n db.accounts = db.accounts.filter((a) => a.id !== id)\n const planIds = new Set(db.plans.filter((p) => p.accountId === id).map((p) => p.id))\n db.plans = db.plans.filter((p) => p.accountId !== id)\n db.posts = db.posts.filter((p) => !planIds.has(p.planId))\n },\n\n async listPlans(accountId) {\n return db.plans.filter((p) => p.accountId === accountId).map((p) => ({ ...p }))\n },\n\n async getPlan(id) {\n const plan = db.plans.find((p) => p.id === id)\n return plan ? { ...plan } : null\n },\n\n async savePlan(input) {\n if (input.id) {\n const plan = db.plans.find((p) => p.id === input.id)\n if (!plan) throw new Error('Plan not found')\n Object.assign(plan, {\n ...(input.name !== undefined && { name: input.name }),\n ...(input.status !== undefined && { status: input.status }),\n ...(input.weeksCount !== undefined && { weeksCount: input.weeksCount }),\n ...(input.startDate !== undefined && { startDate: input.startDate ?? undefined }),\n ...(input.objective !== undefined && { objective: input.objective }),\n ...(input.tone !== undefined && { tone: input.tone }),\n ...(input.pillars !== undefined && { pillars: input.pillars }),\n ...(input.formats !== undefined && { formats: input.formats }),\n ...(input.weeklyFrequency !== undefined && { weeklyFrequency: input.weeklyFrequency }),\n ...(input.briefMd !== undefined && { briefMd: input.briefMd }),\n })\n return { ...plan }\n }\n if (!input.accountId) throw new Error('accountId is required')\n const plan: ContentPlan = {\n id: nextId('plan'),\n accountId: input.accountId,\n name: input.name ?? 'Novo plano',\n status: input.status ?? 'draft',\n weeksCount: input.weeksCount ?? 4,\n startDate: input.startDate ?? undefined,\n objective: input.objective,\n tone: input.tone,\n pillars: input.pillars ?? [],\n formats: input.formats ?? ['reel', 'static'],\n weeklyFrequency: input.weeklyFrequency ?? 3,\n briefMd: input.briefMd ?? '',\n }\n db.plans.push(plan)\n return { ...plan }\n },\n\n async deletePlan(id) {\n db.plans = db.plans.filter((p) => p.id !== id)\n db.posts = db.posts.filter((p) => p.planId !== id)\n },\n\n async listPosts(planId) {\n return db.posts\n .filter((p) => p.planId === planId)\n .sort((a, b) => a.weekNumber - b.weekNumber || a.position - b.position)\n .map((p) => ({ ...p }))\n },\n\n async getPost(id) {\n const post = db.posts.find((p) => p.id === id)\n return post ? { ...post } : null\n },\n\n async savePost(input) {\n if (input.id) {\n const post = db.posts.find((p) => p.id === input.id)\n if (!post) throw new Error('Post not found')\n Object.assign(post, {\n ...(input.weekNumber !== undefined && { weekNumber: input.weekNumber }),\n ...(input.position !== undefined && { position: input.position }),\n ...(input.title !== undefined && { title: input.title }),\n ...(input.format !== undefined && { format: input.format }),\n ...(input.status !== undefined && { status: input.status }),\n ...(input.scheduledDate !== undefined && { scheduledDate: input.scheduledDate ?? undefined }),\n ...(input.platforms !== undefined && { platforms: input.platforms }),\n ...(input.checklist !== undefined && { checklist: input.checklist }),\n ...(input.mediaUrl !== undefined && { mediaUrl: input.mediaUrl ?? undefined }),\n ...(input.hook !== undefined && { hook: input.hook }),\n ...(input.cta !== undefined && { cta: input.cta }),\n ...(input.contentMd !== undefined && { contentMd: input.contentMd }),\n })\n return { ...post }\n }\n if (!input.planId) throw new Error('planId is required')\n const week = input.weekNumber ?? 1\n const siblings = db.posts.filter((p) => p.planId === input.planId && p.weekNumber === week)\n const post: ContentPost = {\n id: nextId('post'),\n planId: input.planId,\n weekNumber: week,\n position: input.position ?? siblings.length,\n title: input.title ?? '',\n format: input.format ?? 'reel',\n status: input.status ?? 'idea',\n scheduledDate: input.scheduledDate ?? undefined,\n platforms: input.platforms ?? [],\n checklist: input.checklist ?? [],\n mediaUrl: input.mediaUrl ?? undefined,\n hook: input.hook,\n cta: input.cta,\n contentMd: input.contentMd ?? '',\n }\n db.posts.push(post)\n return { ...post }\n },\n\n async deletePost(id) {\n db.posts = db.posts.filter((p) => p.id !== id)\n },\n }\n}\n","// Physical table names for the marketing plugin (plg_marketing_* prefix). Import T\n// and reference T.<key> in the data providers so a rename lands in one place.\nexport const T = {\n socialAccounts: 'plg_marketing_social_accounts',\n contentPlans: 'plg_marketing_content_plans',\n contentPosts: 'plg_marketing_content_posts',\n} as const\n","import { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport type {\n ContentPlan,\n ContentPlannerProvider,\n ContentPost,\n SocialAccount,\n} from './contentTypes'\nimport { T } from './tables'\n\n// ---------------------------------------------------------------------------\n// Supabase content-planner provider. Tables: plg_marketing_social_accounts,\n// plg_marketing_content_plans, plg_marketing_content_posts (see src/migrations/001_content_planner.sql).\n// RLS scopes rows to the user's tenants; we still filter tenant_id explicitly\n// on reads so multi-tenant sessions see only the active tenant.\n// ---------------------------------------------------------------------------\n\nfunction getClient() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n return supabase\n}\n\nfunction requireTenantId(): string {\n const tenantId = getActiveTenantId()\n if (!tenantId) throw new Error('No active tenant')\n return tenantId\n}\n\nfunction snakeToCamel(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key.replace(/_([a-z])/g, (_, c) => c.toUpperCase())] = value ?? undefined\n }\n return result\n}\n\nfunction toAccount(row: Record<string, unknown>): SocialAccount {\n const account = snakeToCamel(row) as unknown as SocialAccount\n if (!Array.isArray(account.platforms)) account.platforms = []\n return account\n}\n\nfunction toPlan(row: Record<string, unknown>): ContentPlan {\n const plan = snakeToCamel(row) as unknown as ContentPlan\n if (!Array.isArray(plan.pillars)) plan.pillars = []\n if (!Array.isArray(plan.formats)) plan.formats = []\n plan.briefMd = plan.briefMd ?? ''\n return plan\n}\n\nfunction toPost(row: Record<string, unknown>): ContentPost {\n const post = snakeToCamel(row) as unknown as ContentPost\n post.contentMd = post.contentMd ?? ''\n if (!Array.isArray(post.platforms)) post.platforms = []\n if (!Array.isArray(post.checklist)) post.checklist = []\n return post\n}\n\nexport function createSupabaseContentPlannerProvider(): ContentPlannerProvider {\n return {\n async listAccounts() {\n const tenantId = getActiveTenantId()\n if (!tenantId) return []\n const { data } = await getClient()\n .from(T.socialAccounts)\n .select('*')\n .eq('tenant_id', tenantId)\n .eq('is_active', true)\n .order('created_at', { ascending: true })\n return (data ?? []).map(toAccount)\n },\n\n async saveAccount(input) {\n if (input.id) {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.handle !== undefined) payload.handle = input.handle\n if (input.platforms !== undefined) payload.platforms = input.platforms\n if (input.isActive !== undefined) payload.is_active = input.isActive\n const { data, error } = await getClient()\n .from(T.socialAccounts)\n .update(payload)\n .eq('id', input.id)\n .select('*')\n .single()\n if (error) throw error\n return toAccount(data)\n }\n const { data, error } = await getClient()\n .from(T.socialAccounts)\n .insert({\n tenant_id: requireTenantId(),\n name: input.name,\n handle: input.handle ?? null,\n platforms: input.platforms ?? ['instagram'],\n is_active: input.isActive ?? true,\n })\n .select('*')\n .single()\n if (error) throw error\n return toAccount(data)\n },\n\n async deleteAccount(id) {\n const { error } = await getClient().from(T.socialAccounts).delete().eq('id', id)\n if (error) throw error\n },\n\n async listPlans(accountId) {\n const tenantId = getActiveTenantId()\n if (!tenantId) return []\n const { data } = await getClient()\n .from(T.contentPlans)\n .select('*')\n .eq('tenant_id', tenantId)\n .eq('account_id', accountId)\n .order('created_at', { ascending: false })\n return (data ?? []).map(toPlan)\n },\n\n async getPlan(id) {\n const { data } = await getClient()\n .from(T.contentPlans)\n .select('*')\n .eq('id', id)\n .maybeSingle()\n return data ? toPlan(data) : null\n },\n\n async savePlan(input) {\n if (input.id) {\n const payload: Record<string, unknown> = { updated_at: new Date().toISOString() }\n if (input.name !== undefined) payload.name = input.name\n if (input.status !== undefined) payload.status = input.status\n if (input.weeksCount !== undefined) payload.weeks_count = input.weeksCount\n if (input.startDate !== undefined) payload.start_date = input.startDate\n if (input.objective !== undefined) payload.objective = input.objective\n if (input.tone !== undefined) payload.tone = input.tone\n if (input.pillars !== undefined) payload.pillars = input.pillars\n if (input.formats !== undefined) payload.formats = input.formats\n if (input.weeklyFrequency !== undefined) payload.weekly_frequency = input.weeklyFrequency\n if (input.briefMd !== undefined) payload.brief_md = input.briefMd\n const { data, error } = await getClient()\n .from(T.contentPlans)\n .update(payload)\n .eq('id', input.id)\n .select('*')\n .single()\n if (error) throw error\n return toPlan(data)\n }\n if (!input.accountId) throw new Error('accountId is required')\n const { data, error } = await getClient()\n .from(T.contentPlans)\n .insert({\n tenant_id: requireTenantId(),\n account_id: input.accountId,\n name: input.name ?? 'Novo plano',\n status: input.status ?? 'draft',\n weeks_count: input.weeksCount ?? 4,\n start_date: input.startDate ?? null,\n objective: input.objective ?? null,\n tone: input.tone ?? null,\n pillars: input.pillars ?? [],\n formats: input.formats ?? ['reel', 'static'],\n weekly_frequency: input.weeklyFrequency ?? 3,\n brief_md: input.briefMd ?? '',\n })\n .select('*')\n .single()\n if (error) throw error\n return toPlan(data)\n },\n\n async deletePlan(id) {\n await getClient().from(T.contentPlans).delete().eq('id', id)\n },\n\n async listPosts(planId) {\n const { data } = await getClient()\n .from(T.contentPosts)\n .select('*')\n .eq('plan_id', planId)\n .order('week_number', { ascending: true })\n .order('position', { ascending: true })\n return (data ?? []).map(toPost)\n },\n\n async getPost(id) {\n const { data } = await getClient()\n .from(T.contentPosts)\n .select('*')\n .eq('id', id)\n .maybeSingle()\n return data ? toPost(data) : null\n },\n\n async savePost(input) {\n if (input.id) {\n const payload: Record<string, unknown> = { updated_at: new Date().toISOString() }\n if (input.weekNumber !== undefined) payload.week_number = input.weekNumber\n if (input.position !== undefined) payload.position = input.position\n if (input.title !== undefined) payload.title = input.title\n if (input.format !== undefined) payload.format = input.format\n if (input.status !== undefined) payload.status = input.status\n if (input.scheduledDate !== undefined) payload.scheduled_date = input.scheduledDate\n if (input.platforms !== undefined) payload.platforms = input.platforms\n if (input.checklist !== undefined) payload.checklist = input.checklist\n if (input.mediaUrl !== undefined) payload.media_url = input.mediaUrl\n if (input.hook !== undefined) payload.hook = input.hook\n if (input.cta !== undefined) payload.cta = input.cta\n if (input.contentMd !== undefined) payload.content_md = input.contentMd\n const { data, error } = await getClient()\n .from(T.contentPosts)\n .update(payload)\n .eq('id', input.id)\n .select('*')\n .single()\n if (error) throw error\n return toPost(data)\n }\n if (!input.planId) throw new Error('planId is required')\n const week = input.weekNumber ?? 1\n\n // Next position within the (plan, week) group.\n const { data: maxData } = await getClient()\n .from(T.contentPosts)\n .select('position')\n .eq('plan_id', input.planId)\n .eq('week_number', week)\n .order('position', { ascending: false })\n .limit(1)\n const maxPos = maxData?.[0]?.position ?? -1\n\n const { data, error } = await getClient()\n .from(T.contentPosts)\n .insert({\n tenant_id: requireTenantId(),\n plan_id: input.planId,\n week_number: week,\n position: input.position ?? maxPos + 1,\n title: input.title ?? '',\n format: input.format ?? 'reel',\n status: input.status ?? 'idea',\n scheduled_date: input.scheduledDate ?? null,\n platforms: input.platforms ?? [],\n checklist: input.checklist ?? [],\n media_url: input.mediaUrl ?? null,\n hook: input.hook ?? null,\n cta: input.cta ?? null,\n content_md: input.contentMd ?? '',\n })\n .select('*')\n .single()\n if (error) throw error\n return toPost(data)\n },\n\n async deletePost(id) {\n await getClient().from(T.contentPosts).delete().eq('id', id)\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","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport { getActiveTenantId } from '@fayz-ai/core'\nimport type {\n ContentPlan,\n ContentPlannerProvider,\n ContentPost,\n SaveContentPlanInput,\n SaveContentPostInput,\n SaveSocialAccountInput,\n SocialAccount,\n} from '../../data/contentTypes'\n\n// ---------------------------------------------------------------------------\n// Content-planner UI state — separate from the analytics store on purpose:\n// the Conteúdo tab loads lazily on first visit and never gates (or is gated\n// by) the overview's five analytics fetches.\n// ---------------------------------------------------------------------------\n\nexport type BoardViewMode = 'board' | 'calendar' | 'list'\n\nexport interface ContentPlannerUIState {\n loaded: boolean\n loading: boolean\n /** Tenant the current data was loaded for. The tenant hydrates async after\n * login/refresh, so views re-load when this diverges from the active one. */\n loadedTenantId: string | null\n /** Board / calendar / list — survives opening a post and coming back. */\n viewMode: BoardViewMode\n setViewMode(mode: BoardViewMode): void\n accounts: SocialAccount[]\n activeAccountId: string | null\n plans: ContentPlan[]\n activePlan: ContentPlan | null\n posts: ContentPost[]\n\n load(): Promise<void>\n setAccount(accountId: string): Promise<void>\n selectPlan(planId: string): Promise<void>\n saveAccount(input: SaveSocialAccountInput): Promise<SocialAccount>\n deleteAccount(id: string): Promise<void>\n savePlan(input: SaveContentPlanInput): Promise<ContentPlan>\n savePost(input: SaveContentPostInput): Promise<ContentPost>\n deletePost(id: string): Promise<void>\n}\n\nexport function createContentPlannerStore(\n provider: ContentPlannerProvider,\n): StoreApi<ContentPlannerUIState> {\n async function loadPlansFor(accountId: string): Promise<{ plans: ContentPlan[]; activePlan: ContentPlan | null; posts: ContentPost[] }> {\n const plans = await provider.listPlans(accountId)\n const activePlan = plans.find((p) => p.status === 'active') ?? plans[0] ?? null\n const posts = activePlan ? await provider.listPosts(activePlan.id) : []\n return { plans, activePlan, posts }\n }\n\n return createStore<ContentPlannerUIState>((set, get) => ({\n loaded: false,\n loading: false,\n loadedTenantId: null,\n viewMode: 'board',\n setViewMode(mode) { set({ viewMode: mode }) },\n accounts: [],\n activeAccountId: null,\n plans: [],\n activePlan: null,\n posts: [],\n\n async load() {\n if (get().loading) return\n set({ loading: true })\n try {\n const accounts = await provider.listAccounts()\n const current = get().activeAccountId\n const activeAccountId = (current && accounts.some((a) => a.id === current) ? current : accounts[0]?.id) ?? null\n const { plans, activePlan, posts } = activeAccountId\n ? await loadPlansFor(activeAccountId)\n : { plans: [], activePlan: null, posts: [] }\n set({\n accounts, activeAccountId, plans, activePlan, posts,\n loaded: true, loading: false,\n loadedTenantId: getActiveTenantId() ?? null,\n })\n } catch (err) {\n set({ loading: false, loaded: true })\n throw err\n }\n },\n\n async setAccount(accountId) {\n set({ activeAccountId: accountId, loading: true })\n try {\n const { plans, activePlan, posts } = await loadPlansFor(accountId)\n set({ plans, activePlan, posts, loading: false })\n } catch (err) {\n set({ loading: false })\n throw err\n }\n },\n\n async selectPlan(planId) {\n const plan = get().plans.find((p) => p.id === planId) ?? null\n const posts = plan ? await provider.listPosts(plan.id) : []\n set({ activePlan: plan, posts })\n },\n\n async saveAccount(input) {\n const account = await provider.saveAccount(input)\n const accounts = await provider.listAccounts()\n set({ accounts })\n if (!get().activeAccountId) await get().setAccount(account.id)\n return account\n },\n\n async deleteAccount(id) {\n await provider.deleteAccount(id)\n const accounts = await provider.listAccounts()\n const wasActive = get().activeAccountId === id\n set({ accounts })\n if (wasActive) {\n const next = accounts[0]?.id ?? null\n if (next) {\n await get().setAccount(next)\n } else {\n set({ activeAccountId: null, plans: [], activePlan: null, posts: [] })\n }\n }\n },\n\n async savePlan(input) {\n const plan = await provider.savePlan(input)\n const accountId = get().activeAccountId\n if (accountId) {\n const plans = await provider.listPlans(accountId)\n const activePlan = plans.find((p) => p.id === plan.id) ?? get().activePlan\n const posts = activePlan ? await provider.listPosts(activePlan.id) : []\n set({ plans, activePlan, posts })\n }\n return plan\n },\n\n async savePost(input) {\n const post = await provider.savePost(input)\n const planId = get().activePlan?.id\n if (planId && post.planId === planId) {\n const posts = await provider.listPosts(planId)\n set({ posts })\n }\n return post\n },\n\n async deletePost(id) {\n await provider.deletePost(id)\n const planId = get().activePlan?.id\n if (planId) {\n const posts = await provider.listPosts(planId)\n set({ posts })\n }\n },\n }))\n}\n","// AUTO-GENERATED from 000_plg_rename.sql, 001_content_planner.sql, 002_multi_platform.sql, 003_recording_ops.sql, 004_ranklayer.sql — regenerate with scripts/embed-migrations.mjs\n// SQL files are the source of truth; this inline copy lets the manifest declare\n// migrations as data. Do not edit by hand — run the embed script instead.\n\nexport const MIGRATION_000_PLG_RENAME = `-- 000_plg_rename.sql — rename legacy marketing tables to plg_marketing_* for pools\n-- provisioned before the industry-pool rename. Guarded: fires only when legacy\n-- name exists and target does not, so fresh pools skip every branch.\nDO $$\nBEGIN\n IF to_regclass('public.mkt_social_accounts') IS NOT NULL AND to_regclass('public.plg_marketing_social_accounts') IS NULL THEN\n ALTER TABLE public.mkt_social_accounts RENAME TO plg_marketing_social_accounts;\n END IF;\n IF to_regclass('public.mkt_content_plans') IS NOT NULL AND to_regclass('public.plg_marketing_content_plans') IS NULL THEN\n ALTER TABLE public.mkt_content_plans RENAME TO plg_marketing_content_plans;\n END IF;\n IF to_regclass('public.mkt_content_posts') IS NOT NULL AND to_regclass('public.plg_marketing_content_posts') IS NULL THEN\n ALTER TABLE public.mkt_content_posts RENAME TO plg_marketing_content_posts;\n END IF;\nEND $$;\n`\n\nexport const MIGRATION_001_CONTENT_PLANNER = `-- Marketing Plugin: Content Planner\n-- Prefix: plg_marketing_\n-- Social accounts + content plans + posts (Notion-style markdown pages).\n\nCREATE TABLE IF NOT EXISTS public.plg_marketing_social_accounts (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n name text NOT NULL,\n handle text,\n platform text NOT NULL DEFAULT 'instagram'\n CHECK (platform IN ('instagram', 'tiktok', 'youtube', 'facebook', 'linkedin')),\n is_active boolean NOT NULL DEFAULT true,\n created_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_marketing_social_accounts ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_marketing_social_accounts_tenant ON public.plg_marketing_social_accounts(tenant_id);\n\nCREATE TABLE IF NOT EXISTS public.plg_marketing_content_plans (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n account_id uuid NOT NULL REFERENCES public.plg_marketing_social_accounts(id) ON DELETE CASCADE,\n name text NOT NULL,\n status text NOT NULL DEFAULT 'active'\n CHECK (status IN ('draft', 'active', 'archived')),\n weeks_count integer NOT NULL DEFAULT 8,\n start_date date,\n objective text,\n tone text,\n pillars jsonb NOT NULL DEFAULT '[]'::jsonb,\n formats jsonb NOT NULL DEFAULT '[]'::jsonb,\n weekly_frequency integer NOT NULL DEFAULT 3,\n brief_md text NOT NULL DEFAULT '',\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_marketing_content_plans ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_marketing_content_plans_tenant ON public.plg_marketing_content_plans(tenant_id);\nCREATE INDEX IF NOT EXISTS idx_plg_marketing_content_plans_account ON public.plg_marketing_content_plans(account_id);\n\nCREATE TABLE IF NOT EXISTS public.plg_marketing_content_posts (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n plan_id uuid NOT NULL REFERENCES public.plg_marketing_content_plans(id) ON DELETE CASCADE,\n week_number integer NOT NULL DEFAULT 1,\n position integer NOT NULL DEFAULT 0,\n title text NOT NULL,\n format text NOT NULL DEFAULT 'reel'\n CHECK (format IN ('reel', 'static', 'carousel', 'story')),\n status text NOT NULL DEFAULT 'idea'\n CHECK (status IN ('idea', 'script', 'recording', 'editing', 'scheduled', 'published')),\n scheduled_date date,\n hook text,\n cta text,\n content_md text NOT NULL DEFAULT '',\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_marketing_content_posts ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_marketing_content_posts_tenant ON public.plg_marketing_content_posts(tenant_id);\nCREATE INDEX IF NOT EXISTS idx_plg_marketing_content_posts_plan ON public.plg_marketing_content_posts(plan_id, week_number, position);\nCREATE INDEX IF NOT EXISTS idx_plg_marketing_content_posts_status ON public.plg_marketing_content_posts(tenant_id, status);\n\n-- RLS policies for plg_marketing_social_accounts\nDROP POLICY IF EXISTS plg_marketing_social_accounts_select ON public.plg_marketing_social_accounts;\nDROP POLICY IF EXISTS plg_marketing_social_accounts_insert ON public.plg_marketing_social_accounts;\nDROP POLICY IF EXISTS plg_marketing_social_accounts_update ON public.plg_marketing_social_accounts;\nDROP POLICY IF EXISTS plg_marketing_social_accounts_delete ON public.plg_marketing_social_accounts;\nCREATE POLICY plg_marketing_social_accounts_select ON public.plg_marketing_social_accounts FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_social_accounts_insert ON public.plg_marketing_social_accounts FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_social_accounts_update ON public.plg_marketing_social_accounts FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_social_accounts_delete ON public.plg_marketing_social_accounts FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nGRANT SELECT, INSERT, UPDATE, DELETE ON public.plg_marketing_social_accounts TO authenticated;\n\n-- RLS policies for plg_marketing_content_plans\nDROP POLICY IF EXISTS plg_marketing_content_plans_select ON public.plg_marketing_content_plans;\nDROP POLICY IF EXISTS plg_marketing_content_plans_insert ON public.plg_marketing_content_plans;\nDROP POLICY IF EXISTS plg_marketing_content_plans_update ON public.plg_marketing_content_plans;\nDROP POLICY IF EXISTS plg_marketing_content_plans_delete ON public.plg_marketing_content_plans;\nCREATE POLICY plg_marketing_content_plans_select ON public.plg_marketing_content_plans FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_content_plans_insert ON public.plg_marketing_content_plans FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_content_plans_update ON public.plg_marketing_content_plans FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_content_plans_delete ON public.plg_marketing_content_plans FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nGRANT SELECT, INSERT, UPDATE, DELETE ON public.plg_marketing_content_plans TO authenticated;\n\n-- RLS policies for plg_marketing_content_posts\nDROP POLICY IF EXISTS plg_marketing_content_posts_select ON public.plg_marketing_content_posts;\nDROP POLICY IF EXISTS plg_marketing_content_posts_insert ON public.plg_marketing_content_posts;\nDROP POLICY IF EXISTS plg_marketing_content_posts_update ON public.plg_marketing_content_posts;\nDROP POLICY IF EXISTS plg_marketing_content_posts_delete ON public.plg_marketing_content_posts;\nCREATE POLICY plg_marketing_content_posts_select ON public.plg_marketing_content_posts FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_content_posts_insert ON public.plg_marketing_content_posts FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_content_posts_update ON public.plg_marketing_content_posts FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_content_posts_delete ON public.plg_marketing_content_posts FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nGRANT SELECT, INSERT, UPDATE, DELETE ON public.plg_marketing_content_posts TO authenticated;\n`\n\nexport const MIGRATION_002_MULTI_PLATFORM = `-- Marketing Plugin: multi-platform accounts + per-post targets.\n-- An account is a brand/profile that publishes to MANY platforms (Instagram,\n-- YouTube, TikTok, ...). Posts optionally narrow the target platforms; an\n-- empty array means \"inherit the account's platforms\".\n\nALTER TABLE public.plg_marketing_social_accounts\n ADD COLUMN IF NOT EXISTS platforms text[] NOT NULL DEFAULT '{instagram}';\n\n-- Backfill from the legacy single-platform column, then drop it (also drops\n-- its CHECK constraint — the platform list is UI-driven from here on).\nDO $$\nBEGIN\n IF EXISTS (\n SELECT 1 FROM information_schema.columns\n WHERE table_schema = 'public' AND table_name = 'plg_marketing_social_accounts' AND column_name = 'platform'\n ) THEN\n UPDATE public.plg_marketing_social_accounts\n SET platforms = ARRAY[platform]\n WHERE platform IS NOT NULL AND platforms = '{instagram}';\n ALTER TABLE public.plg_marketing_social_accounts DROP COLUMN platform;\n END IF;\nEND $$;\n\nALTER TABLE public.plg_marketing_content_posts\n ADD COLUMN IF NOT EXISTS platforms text[] NOT NULL DEFAULT '{}';\n`\n\nexport const MIGRATION_003_RECORDING_OPS = `-- Marketing Plugin: recording-day ops on posts.\n-- checklist: shooting checklist items [{ id, text, done }] — the on-set\n-- companion for recording day. media_url: uploaded asset (static posts get a\n-- caption + final art instead of a script).\n\nALTER TABLE public.plg_marketing_content_posts\n ADD COLUMN IF NOT EXISTS checklist jsonb NOT NULL DEFAULT '[]';\n\nALTER TABLE public.plg_marketing_content_posts\n ADD COLUMN IF NOT EXISTS media_url text;\n\n-- Public media bucket for content assets (mirrors the avatars-bucket pattern:\n-- public read, authenticated write). Path convention: content/{tenantId}/{postId}-{ts}.{ext}\nINSERT INTO storage.buckets (id, name, public)\n VALUES ('mkt-media', 'mkt-media', true)\n ON CONFLICT (id) DO NOTHING;\n\nDROP POLICY IF EXISTS plg_marketing_media_read ON storage.objects;\nDROP POLICY IF EXISTS plg_marketing_media_insert ON storage.objects;\nDROP POLICY IF EXISTS plg_marketing_media_update ON storage.objects;\nDROP POLICY IF EXISTS plg_marketing_media_delete ON storage.objects;\nCREATE POLICY plg_marketing_media_read ON storage.objects FOR SELECT TO public USING (bucket_id = 'mkt-media');\nCREATE POLICY plg_marketing_media_insert ON storage.objects FOR INSERT TO authenticated WITH CHECK (bucket_id = 'mkt-media');\nCREATE POLICY plg_marketing_media_update ON storage.objects FOR UPDATE TO authenticated USING (bucket_id = 'mkt-media');\nCREATE POLICY plg_marketing_media_delete ON storage.objects FOR DELETE TO authenticated USING (bucket_id = 'mkt-media');\n`\n\nexport const MIGRATION_004_RANKLAYER = `-- Marketing Plugin: RankLayer integration (SEO content publishing).\n-- Control-plane state for the RankLayer connector rendered in Marketing →\n-- Integrações. Prefix: plg_marketing_ranklayer_. Scaffold: the real sync\n-- (edge function + RankLayer API calls) lands via an external PR — see\n-- src/integrations/ranklayer/RANKLAYER.md.\n\nCREATE TABLE IF NOT EXISTS public.plg_marketing_ranklayer_integrations (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n api_key text,\n site_domain text,\n active boolean NOT NULL DEFAULT true,\n last_sync_at timestamptz,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_marketing_ranklayer_integrations ENABLE ROW LEVEL SECURITY;\nCREATE UNIQUE INDEX IF NOT EXISTS uq_plg_marketing_ranklayer_integrations_tenant\n ON public.plg_marketing_ranklayer_integrations(tenant_id);\n\nCREATE TABLE IF NOT EXISTS public.plg_marketing_ranklayer_sync_log (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n integration_id uuid REFERENCES public.plg_marketing_ranklayer_integrations(id) ON DELETE CASCADE,\n status text NOT NULL DEFAULT 'success' CHECK (status IN ('success', 'partial', 'error')),\n message text,\n fetched integer NOT NULL DEFAULT 0,\n written integer NOT NULL DEFAULT 0,\n created_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_marketing_ranklayer_sync_log ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_marketing_ranklayer_sync_log_tenant\n ON public.plg_marketing_ranklayer_sync_log(tenant_id, created_at DESC);\n\n-- RLS: authenticated tenant CRUD\nDROP POLICY IF EXISTS plg_marketing_ranklayer_integrations_select ON public.plg_marketing_ranklayer_integrations;\nDROP POLICY IF EXISTS plg_marketing_ranklayer_integrations_insert ON public.plg_marketing_ranklayer_integrations;\nDROP POLICY IF EXISTS plg_marketing_ranklayer_integrations_update ON public.plg_marketing_ranklayer_integrations;\nDROP POLICY IF EXISTS plg_marketing_ranklayer_integrations_delete ON public.plg_marketing_ranklayer_integrations;\nCREATE POLICY plg_marketing_ranklayer_integrations_select ON public.plg_marketing_ranklayer_integrations FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_ranklayer_integrations_insert ON public.plg_marketing_ranklayer_integrations FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_ranklayer_integrations_update ON public.plg_marketing_ranklayer_integrations FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_ranklayer_integrations_delete ON public.plg_marketing_ranklayer_integrations FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nGRANT SELECT, INSERT, UPDATE, DELETE ON public.plg_marketing_ranklayer_integrations TO authenticated;\n\nDROP POLICY IF EXISTS plg_marketing_ranklayer_sync_log_select ON public.plg_marketing_ranklayer_sync_log;\nDROP POLICY IF EXISTS plg_marketing_ranklayer_sync_log_insert ON public.plg_marketing_ranklayer_sync_log;\nCREATE POLICY plg_marketing_ranklayer_sync_log_select ON public.plg_marketing_ranklayer_sync_log FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_ranklayer_sync_log_insert ON public.plg_marketing_ranklayer_sync_log FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));\nGRANT SELECT, INSERT ON public.plg_marketing_ranklayer_sync_log TO authenticated;\n`\n\nexport const MIGRATIONS: Array<{ id: string; sql: string }> = [\n { id: \"000_plg_rename\", sql: MIGRATION_000_PLG_RENAME },\n { id: \"001_content_planner\", sql: MIGRATION_001_CONTENT_PLANNER },\n { id: \"002_multi_platform\", sql: MIGRATION_002_MULTI_PLATFORM },\n { id: \"003_recording_ops\", sql: MIGRATION_003_RECORDING_OPS },\n { id: \"004_ranklayer\", sql: MIGRATION_004_RANKLAYER },\n]\n","import { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport type { TestConnectionResult } from '@fayz-ai/core'\nimport type { RankLayerIntegration, RankLayerSyncLogEntry } from '../types'\n\n// ---------------------------------------------------------------------------\n// RankLayer connector — control-plane client (SCAFFOLD).\n//\n// Reads/writes the connection row (plg_marketing_ranklayer_integrations) and\n// reads the sync log. `testConnection` and `sync` are stubbed: RankLayer has no\n// public API wired yet, so the real work (an edge function calling RankLayer)\n// lands via an external PR — see ../RANKLAYER.md. Everything here is safe to\n// ship: it only persists the tenant's API key + domain and surfaces status.\n// ---------------------------------------------------------------------------\n\nconst INTEGRATIONS = 'plg_marketing_ranklayer_integrations'\nconst SYNC_LOG = 'plg_marketing_ranklayer_sync_log'\n\nfunction getClient() {\n const supabase = getSupabaseClientOptional() as { from: (t: string) => any } | null\n if (!supabase) throw new Error('[ranklayer] Supabase not initialized')\n return supabase\n}\n\nfunction requireTenantId(): string {\n const tenantId = getActiveTenantId()\n if (!tenantId) throw new Error('[ranklayer] No active tenant')\n return tenantId\n}\n\nfunction toIntegration(row: Record<string, any>): RankLayerIntegration {\n return {\n id: row.id,\n apiKey: row.api_key ?? undefined,\n siteDomain: row.site_domain ?? undefined,\n active: row.active ?? true,\n lastSyncAt: row.last_sync_at ?? undefined,\n }\n}\n\nexport function createRankLayerProvider() {\n return {\n async getIntegration(): Promise<RankLayerIntegration | null> {\n const tenantId = getActiveTenantId()\n if (!tenantId) return null\n const { data } = await getClient()\n .from(INTEGRATIONS)\n .select('*')\n .eq('tenant_id', tenantId)\n .maybeSingle()\n return data ? toIntegration(data) : null\n },\n\n async saveIntegration(values: { apiKey: string; siteDomain?: string }): Promise<RankLayerIntegration> {\n const tenantId = requireTenantId()\n const payload = {\n tenant_id: tenantId,\n api_key: values.apiKey,\n site_domain: values.siteDomain ?? null,\n active: true,\n updated_at: new Date().toISOString(),\n }\n // Upsert on the unique tenant_id.\n const { data, error } = await getClient()\n .from(INTEGRATIONS)\n .upsert(payload, { onConflict: 'tenant_id' })\n .select('*')\n .single()\n if (error) throw error\n return toIntegration(data)\n },\n\n async disconnect(): Promise<void> {\n const tenantId = getActiveTenantId()\n if (!tenantId) return\n await getClient().from(INTEGRATIONS).delete().eq('tenant_id', tenantId)\n },\n\n // SCAFFOLD: no RankLayer API yet — accept any non-empty key so the connect\n // flow can be exercised. Replace with a real credential check in the PR.\n async testConnection(values: { apiKey: string }): Promise<TestConnectionResult> {\n if (!values.apiKey || values.apiKey.trim().length < 8) {\n return { ok: false, message: 'Informe uma API Key válida da RankLayer.' }\n }\n return { ok: true, message: 'Chave aceita (validação real pendente — integração em preparação).' }\n },\n\n async getSyncLog(integrationId: string): Promise<RankLayerSyncLogEntry[]> {\n const { data } = await getClient()\n .from(SYNC_LOG)\n .select('*')\n .eq('integration_id', integrationId)\n .order('created_at', { ascending: false })\n .limit(20)\n return (data ?? []).map((r: Record<string, any>) => ({\n id: r.id,\n createdAt: r.created_at,\n status: r.status,\n message: r.message ?? undefined,\n fetched: r.fetched ?? 0,\n written: r.written ?? 0,\n }))\n },\n }\n}\n\nexport type RankLayerProvider = ReturnType<typeof createRankLayerProvider>\n","// RankLayer as a unified ConnectorDefinition, surfaced in Marketing → settings\n// → Integrações (rendered by the shared ConnectorsHub). SCAFFOLD: the hub gives\n// us the API-key form + Test/Save; the ExtraPanel below explains that automated\n// SEO content sync is being prepared. The real sync lands via an external PR —\n// see ./RANKLAYER.md.\nimport React, { useEffect, useState } from 'react'\nimport { Sparkles, History, CheckCircle2, AlertCircle } from 'lucide-react'\nimport type { ConnectorDefinition } from '@fayz-ai/core'\nimport { createRankLayerProvider } from './data/supabase'\nimport type { RankLayerIntegration, RankLayerSyncLogEntry } from './types'\n\nconst provider = createRankLayerProvider()\n\nfunction RankLayerExtraPanel() {\n const [integration, setIntegration] = useState<RankLayerIntegration | null>(null)\n const [log, setLog] = useState<RankLayerSyncLogEntry[]>([])\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n ;(async () => {\n try {\n const found = await provider.getIntegration()\n if (cancelled) return\n setIntegration(found)\n if (found) setLog(await provider.getSyncLog(found.id))\n } catch {\n /* not connected / no client — nothing to show */\n } finally {\n if (!cancelled) setLoaded(true)\n }\n })()\n return () => { cancelled = true }\n }, [])\n\n if (!loaded || !integration) return null // nothing until the connection is saved\n\n return (\n <div className=\"space-y-4 border-t pt-4\">\n <div className=\"flex items-start gap-3 rounded-md border border-dashed p-3\">\n <Sparkles className=\"mt-0.5 h-4 w-4 shrink-0 text-muted-foreground\" />\n <div className=\"space-y-1\">\n <h4 className=\"text-sm font-semibold\">Sincronização de conteúdo — em breve</h4>\n <p className=\"text-xs text-muted-foreground\">\n A publicação automática de páginas e artigos de SEO com a RankLayer está em preparação.\n {integration.siteDomain ? ` Domínio configurado: ${integration.siteDomain}.` : ''} Assim que a\n integração estiver ativa, o histórico de sincronizações aparece aqui.\n </p>\n </div>\n </div>\n\n {log.length > 0 && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <History className=\"h-4 w-4 text-muted-foreground\" />\n <h4 className=\"text-sm font-semibold\">Histórico</h4>\n </div>\n <div className=\"divide-y rounded-md border text-sm\">\n {log.map((r) => (\n <div key={r.id} className=\"flex items-center gap-3 px-3 py-2\">\n <span className=\"text-xs text-muted-foreground\">{new Date(r.createdAt).toLocaleString('pt-BR')}</span>\n <span className=\"ml-auto text-xs\">{r.written}/{r.fetched} publicadas</span>\n {r.status === 'success'\n ? <CheckCircle2 className=\"h-3.5 w-3.5 text-success\" />\n : <AlertCircle className=\"h-3.5 w-3.5 text-warning\" />}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport const ranklayerConnectorDef: ConnectorDefinition = {\n id: 'ranklayer',\n hostPluginId: 'marketing',\n name: 'RankLayer',\n description: 'Publicação de conteúdo e páginas de SEO por serviço/bairro para ser encontrado no Google e em assistentes de IA.',\n icon: 'Search',\n authKind: 'api-key',\n fields: [\n { key: 'apiKey', label: 'API Key', type: 'password', placeholder: '••••••••' },\n { key: 'siteDomain', label: 'Domínio do site', type: 'text', placeholder: 'exemplo.com.br' },\n ],\n async getStatus() {\n try {\n const found = await provider.getIntegration()\n return { connected: !!found?.apiKey, detail: found?.siteDomain }\n } catch {\n return { connected: false }\n }\n },\n testConnection: (values) => provider.testConnection({ apiKey: values.apiKey }),\n saveConnection: async (values) => { await provider.saveIntegration({ apiKey: values.apiKey, siteDomain: values.siteDomain }) },\n disconnect: () => provider.disconnect(),\n ExtraPanel: RankLayerExtraPanel,\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 // content planner\n 'marketing.content.title': 'Content',\n 'marketing.content.week': 'Week',\n 'marketing.content.month': 'Month',\n 'marketing.content.newPost': 'New post',\n 'marketing.content.untitled': 'Untitled',\n 'marketing.content.account': 'Account',\n 'marketing.content.addAccount': 'Add account',\n 'marketing.content.previewNow': 'Just now',\n 'marketing.content.previewLike': 'Like',\n 'marketing.content.previewComment': 'Comment',\n 'marketing.content.previewShare': 'Share',\n 'marketing.content.showLess': 'show less',\n 'marketing.content.checklistTitle': 'Recording checklist',\n 'marketing.content.checklistDescription': 'Shooting-day operations',\n 'marketing.content.checklistOpen': 'Checklist',\n 'marketing.content.checklistEmpty': 'No items yet — generate them from the script or add your own below.',\n 'marketing.content.checklistAddPlaceholder': 'New item…',\n 'marketing.content.checklistAdd': 'Add item',\n 'marketing.content.checklistGenerate': 'Generate from script',\n 'marketing.content.scriptLabel': 'Script',\n 'marketing.content.captionLabel': 'Caption',\n 'marketing.content.captionPlaceholder': 'Write the post caption…',\n 'marketing.content.mediaLabel': 'Media asset',\n 'marketing.content.mediaUpload': 'Upload media',\n 'marketing.content.mediaHint': 'Image or video for this post',\n 'marketing.content.mediaReplace': 'Replace',\n 'marketing.content.mediaRemove': 'Remove',\n 'marketing.content.mediaUnavailable': 'Media upload requires a connected Supabase project.',\n 'marketing.content.editAccountTitle': 'Account settings',\n 'marketing.content.accountSettings': 'Account settings',\n 'marketing.content.deleteAccount': 'Delete account',\n 'marketing.content.deleteAccountConfirm': 'The account and all of its content plans and posts will be permanently deleted.',\n 'marketing.content.noAccountsAvailable': 'No accounts available',\n 'marketing.content.addAccountTitle': 'New account',\n 'marketing.content.nameLabel': 'Name',\n 'marketing.content.handleLabel': 'Handle',\n 'marketing.content.handlePlaceholder': '@handle (optional)',\n 'marketing.content.viewBoard': 'Weekly',\n 'marketing.content.viewCalendar': 'Monthly',\n 'marketing.content.viewList': 'List',\n 'marketing.content.unscheduled': 'Unscheduled',\n 'marketing.content.noPosts': 'No posts yet — add your first one from any week.',\n 'marketing.content.listTitle': 'Title',\n 'marketing.content.listWeek': 'Week',\n 'marketing.content.listDate': 'Date',\n 'marketing.content.listFormat': 'Format',\n 'marketing.content.listStatus': 'Status',\n 'marketing.content.noAccountsHint': 'Create the account (e.g. your Instagram profile) to start planning content.',\n 'marketing.content.accountNamePlaceholder': 'e.g. @myclinic',\n 'marketing.content.createAccount': 'Create account',\n 'marketing.content.defaultPlanName': 'Content plan — 8 weeks',\n 'marketing.content.brief': 'Brief',\n 'marketing.content.planName': 'Plan name',\n 'marketing.content.objective': 'Objective',\n 'marketing.content.objectivePlaceholder': 'e.g. generate evaluation bookings',\n 'marketing.content.tone': 'Tone of voice',\n 'marketing.content.tonePlaceholder': 'e.g. approachable authority, plain language',\n 'marketing.content.pillars': 'Content pillars',\n 'marketing.content.pillarPlaceholder': 'Add pillar…',\n 'marketing.content.formatsLabel': 'Formats',\n 'marketing.content.weeklyFrequency': 'Posts per week',\n 'marketing.content.weeksCount': 'Weeks',\n 'marketing.content.briefBody': 'Brief (markdown)',\n 'marketing.content.briefPlaceholder': 'Describe the strategy, references and what the content should achieve…',\n 'marketing.content.formatLabel': 'Format',\n 'marketing.content.statusLabel': 'Status',\n 'marketing.content.scheduledDate': 'Planned date',\n 'marketing.content.hook': 'Hook',\n 'marketing.content.hookPlaceholder': 'The first line that grabs attention…',\n 'marketing.content.cta': 'CTA',\n 'marketing.content.ctaPlaceholder': 'e.g. Book your evaluation',\n 'marketing.content.titlePlaceholder': 'Post title…',\n 'marketing.content.bodyPlaceholder': 'Post script / plan in markdown…',\n 'marketing.content.insertTemplate': 'Insert script template',\n 'marketing.content.save': 'Save',\n 'marketing.content.cancel': 'Cancel',\n 'marketing.content.edit': 'Edit',\n 'marketing.content.preview': 'Preview',\n 'marketing.content.deletePost': 'Delete post',\n 'marketing.content.deletePostConfirm': 'This post and its script will be permanently removed.',\n 'marketing.content.format.reel': 'Reel',\n 'marketing.content.format.static': 'Static',\n 'marketing.content.format.carousel': 'Carousel',\n 'marketing.content.format.story': 'Story',\n 'marketing.content.format.video': 'Video',\n 'marketing.content.format.live': 'Live',\n 'marketing.content.format.article': 'Article',\n 'marketing.content.platformsLabel': 'Platforms',\n 'marketing.content.status.idea': 'idea',\n 'marketing.content.status.script': 'script',\n 'marketing.content.status.recording': 'recording',\n 'marketing.content.status.editing': 'editing',\n 'marketing.content.status.scheduled': 'scheduled',\n 'marketing.content.status.published': 'published',\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 // content planner\n 'marketing.content.title': 'Conteúdo',\n 'marketing.content.week': 'Semana',\n 'marketing.content.month': 'Mês',\n 'marketing.content.newPost': 'Novo post',\n 'marketing.content.untitled': 'Sem título',\n 'marketing.content.account': 'Conta',\n 'marketing.content.addAccount': 'Adicionar conta',\n 'marketing.content.previewNow': 'Agora',\n 'marketing.content.previewLike': 'Curtir',\n 'marketing.content.previewComment': 'Comentar',\n 'marketing.content.previewShare': 'Compartilhar',\n 'marketing.content.showLess': 'mostrar menos',\n 'marketing.content.checklistTitle': 'Checklist de gravação',\n 'marketing.content.checklistDescription': 'Operação do dia de gravação',\n 'marketing.content.checklistOpen': 'Checklist',\n 'marketing.content.checklistEmpty': 'Nenhum item ainda — gere a partir do roteiro ou adicione o seu abaixo.',\n 'marketing.content.checklistAddPlaceholder': 'Novo item…',\n 'marketing.content.checklistAdd': 'Adicionar item',\n 'marketing.content.checklistGenerate': 'Gerar do roteiro',\n 'marketing.content.scriptLabel': 'Roteiro',\n 'marketing.content.captionLabel': 'Legenda',\n 'marketing.content.captionPlaceholder': 'Escreva a legenda do post…',\n 'marketing.content.mediaLabel': 'Arte / mídia',\n 'marketing.content.mediaUpload': 'Enviar mídia',\n 'marketing.content.mediaHint': 'Imagem ou vídeo deste post',\n 'marketing.content.mediaReplace': 'Substituir',\n 'marketing.content.mediaRemove': 'Remover',\n 'marketing.content.mediaUnavailable': 'O upload de mídia requer um projeto Supabase conectado.',\n 'marketing.content.editAccountTitle': 'Configurações da conta',\n 'marketing.content.accountSettings': 'Configurações da conta',\n 'marketing.content.deleteAccount': 'Excluir conta',\n 'marketing.content.deleteAccountConfirm': 'A conta e todos os planos e posts de conteúdo dela serão excluídos permanentemente.',\n 'marketing.content.noAccountsAvailable': 'Nenhuma conta disponível',\n 'marketing.content.addAccountTitle': 'Nova conta',\n 'marketing.content.nameLabel': 'Nome',\n 'marketing.content.handleLabel': 'Usuário',\n 'marketing.content.handlePlaceholder': '@usuario (opcional)',\n 'marketing.content.viewBoard': 'Semanal',\n 'marketing.content.viewCalendar': 'Mensal',\n 'marketing.content.viewList': 'Lista',\n 'marketing.content.unscheduled': 'Sem data',\n 'marketing.content.noPosts': 'Nenhum post ainda — adicione o primeiro em qualquer semana.',\n 'marketing.content.listTitle': 'Título',\n 'marketing.content.listWeek': 'Semana',\n 'marketing.content.listDate': 'Data',\n 'marketing.content.listFormat': 'Formato',\n 'marketing.content.listStatus': 'Status',\n 'marketing.content.noAccountsHint': 'Crie a conta (ex.: o perfil do Instagram) para começar a planejar o conteúdo.',\n 'marketing.content.accountNamePlaceholder': 'ex.: @minhaclinica',\n 'marketing.content.createAccount': 'Criar conta',\n 'marketing.content.defaultPlanName': 'Plano de conteúdo — 8 semanas',\n 'marketing.content.brief': 'Briefing',\n 'marketing.content.planName': 'Nome do plano',\n 'marketing.content.objective': 'Objetivo',\n 'marketing.content.objectivePlaceholder': 'ex.: gerar agendamentos de avaliação',\n 'marketing.content.tone': 'Tom de voz',\n 'marketing.content.tonePlaceholder': 'ex.: autoridade acessível, linguagem simples',\n 'marketing.content.pillars': 'Pilares de conteúdo',\n 'marketing.content.pillarPlaceholder': 'Adicionar pilar…',\n 'marketing.content.formatsLabel': 'Formatos',\n 'marketing.content.weeklyFrequency': 'Posts por semana',\n 'marketing.content.weeksCount': 'Semanas',\n 'marketing.content.briefBody': 'Briefing (markdown)',\n 'marketing.content.briefPlaceholder': 'Descreva a estratégia, referências e o que se quer com o conteúdo…',\n 'marketing.content.formatLabel': 'Formato',\n 'marketing.content.statusLabel': 'Status',\n 'marketing.content.scheduledDate': 'Data prevista',\n 'marketing.content.hook': 'Gancho',\n 'marketing.content.hookPlaceholder': 'A primeira frase que segura a atenção…',\n 'marketing.content.cta': 'CTA',\n 'marketing.content.ctaPlaceholder': 'ex.: Agende sua avaliação',\n 'marketing.content.titlePlaceholder': 'Título do post…',\n 'marketing.content.bodyPlaceholder': 'Roteiro / plano do post em markdown…',\n 'marketing.content.insertTemplate': 'Inserir modelo de roteiro',\n 'marketing.content.save': 'Salvar',\n 'marketing.content.cancel': 'Cancelar',\n 'marketing.content.edit': 'Editar',\n 'marketing.content.preview': 'Visualizar',\n 'marketing.content.deletePost': 'Excluir post',\n 'marketing.content.deletePostConfirm': 'Este post e seu roteiro serão removidos permanentemente.',\n 'marketing.content.format.reel': 'Reel',\n 'marketing.content.format.static': 'Estático',\n 'marketing.content.format.carousel': 'Carrossel',\n 'marketing.content.format.story': 'Story',\n 'marketing.content.format.video': 'Vídeo',\n 'marketing.content.format.live': 'Live',\n 'marketing.content.format.article': 'Artigo',\n 'marketing.content.platformsLabel': 'Plataformas',\n 'marketing.content.status.idea': 'ideia',\n 'marketing.content.status.script': 'roteiro',\n 'marketing.content.status.recording': 'gravação',\n 'marketing.content.status.editing': 'edição',\n 'marketing.content.status.scheduled': 'agendado',\n 'marketing.content.status.published': 'publicado',\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, PluginRegistryDef, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { createSafeDataProvider, getSupabaseClientOptional, registerTranslations } from '@fayz-ai/core'\nimport { PluginSettingsPanel } from '@fayz-ai/saas'\nimport { MarketingPage } from './MarketingPage'\nimport { SettingsView } from './views/SettingsView'\nimport { buildMarketingRegistries } from './registries'\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 type { ContentPlannerProvider } from './data/contentTypes'\nimport { createMockContentPlannerProvider } from './data/contentMock'\nimport { createSupabaseContentPlannerProvider } from './data/contentSupabase'\nimport { createMarketingStore } from './store'\nimport { createContentPlannerStore } from './views/content/contentStore'\nimport { MIGRATION_000_PLG_RENAME, MIGRATION_001_CONTENT_PLANNER, MIGRATION_002_MULTI_PLATFORM, MIGRATION_003_RECORDING_OPS, MIGRATION_004_RANKLAYER } from './migrations'\nimport { ranklayerConnectorDef } from './integrations/ranklayer/connectorDef'\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 /** Content planner options (module toggled via `modules.contentPlanner`). */\n contentPlanner?: { dataProvider?: ContentPlannerProvider }\n /** App/vertical-owned settings registries rendered inside Marketing settings. */\n settingsRegistries?: PluginRegistryDef[]\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 content: 'Content',\n blog: 'Blog',\n blogCategories: 'Categorias',\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 // Content planner has its own provider seam: real Supabase CRUD (with mock\n // fallback) while the analytics provider stays mock-until-bridges.\n const contentProvider = options?.contentPlanner?.dataProvider ?? createSafeDataProvider(\n () => createSupabaseContentPlannerProvider(),\n () => createMockContentPlannerProvider(),\n )\n const contentStore = createContentPlannerStore(contentProvider)\n\n const PageComponent: React.ComponentType<unknown> = () =>\n React.createElement(MarketingContextProvider, { config, provider, store },\n React.createElement(MarketingPage, { config, provider, store, contentProvider, contentStore }))\n PageComponent.displayName = 'MarketingPage'\n\n // Settings lives in the SDK-core central Settings area (not a module tab).\n // General preferences (channel tracking toggles) + a Channels registry tab,\n // mirroring how plugin-menu surfaces Allergens.\n const marketingRegistries = [\n ...buildMarketingRegistries(config.channels),\n ...(options?.settingsRegistries ?? []),\n ]\n const SettingsComponent: React.ComponentType<unknown> = () =>\n React.createElement(MarketingContextProvider, { config, provider, store },\n React.createElement(PluginSettingsPanel, {\n title: config.labels.settings ?? config.labels.pageTitle,\n subtitle: config.labels.pageSubtitle,\n generalSettings: React.createElement(SettingsView),\n registries: marketingRegistries,\n // Enables the \"Integrações\" tab (renders manifest connectors for this host).\n hostPluginId: 'marketing',\n routeBase: '/settings/marketing',\n }))\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 // Admin content-planning surface (campaigns, content calendar) — targets the\n // saas/admin Panel world, not the ecommerce storefront/operator console.\n scaffolds: ['saas'],\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 ...(config.modules.contentPlanner ? [{ id: 'marketing.content', label: config.labels.content, group: 'Engage' }] : []),\n ...(config.modules.blog ? [{ id: 'marketing.blog', label: config.labels.blog, 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 { name: 'marketing.content.plan.updated', description: 'A content plan (brief/config) was updated' },\n { name: 'marketing.content.post.created', description: 'A content post was created' },\n { name: 'marketing.content.post.updated', description: 'A content post was updated' },\n ],\n migrations: [\n {\n id: 'marketing-000-plg-rename',\n version: '1.0.0',\n sql: MIGRATION_000_PLG_RENAME,\n description: 'Rename legacy mkt_* tables to plg_marketing_* in-place for pools provisioned before the industry-pool rename (guarded no-op on fresh pools)',\n },\n {\n id: 'marketing-001-content-planner',\n version: '1.0.0',\n sql: MIGRATION_001_CONTENT_PLANNER,\n description: 'Create plg_marketing_social_accounts, plg_marketing_content_plans and plg_marketing_content_posts',\n },\n {\n id: 'marketing-002-multi-platform',\n version: '1.1.0',\n sql: MIGRATION_002_MULTI_PLATFORM,\n description: 'Accounts publish to many platforms (platforms[]); posts gain optional platform targets',\n },\n {\n id: 'marketing-003-recording-ops',\n version: '1.2.0',\n sql: MIGRATION_003_RECORDING_OPS,\n description: 'Recording-day checklist + media asset URL on posts; content-media storage bucket',\n },\n {\n id: 'marketing-004-ranklayer',\n version: '1.3.0',\n sql: MIGRATION_004_RANKLAYER,\n description: 'RankLayer connector state: plg_marketing_ranklayer_integrations + _sync_log (tenant RLS)',\n },\n ],\n // RankLayer SEO connector — renders in the Integrações settings tab. Scaffold\n // (control plane only); the real sync lands via an external PR (RANKLAYER.md).\n connectors: [ranklayerConnectorDef],\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 registries: marketingRegistries,\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'\nexport type {\n ContentPlannerProvider,\n ContentPlan,\n ContentPost,\n SocialAccount,\n PostFormat,\n PostStatus,\n SaveContentPlanInput,\n SaveContentPostInput,\n SaveSocialAccountInput,\n} from './data/contentTypes'\nexport { createMockContentPlannerProvider } from './data/contentMock'\nexport { createSupabaseContentPlannerProvider } from './data/contentSupabase'\n"]}
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/views/content/ContentPlannerContext.tsx","../src/data/contentTypes.ts","../src/views/content/contentBits.tsx","../src/views/content/PlanBriefView.tsx","../src/views/content/ContentView.tsx","../src/data/contentMedia.ts","../src/views/content/RecordingChecklist.tsx","../src/views/content/PostSocialPreview.tsx","../src/views/content/templates.ts","../src/views/content/PostPage.tsx","../src/data/blogEntities.tsx","../src/views/blog/useEntityCrud.ts","../src/views/blog/BlogAdminView.tsx","../src/views/blog/BlogEntityForm.tsx","../src/MarketingPage.tsx","../src/views/SettingsView.tsx","../src/data/tables.ts","../src/registries.ts","../src/views/dashboardWidgets.tsx","../src/presets.ts","../src/data/mock.ts","../src/data/supabase.ts","../src/data/contentMock.ts","../src/data/contentSupabase.ts","../src/store.ts","../src/views/content/contentStore.ts","../src/migrations/index.ts","../src/integrations/ranklayer/data/supabase.ts","../src/integrations/ranklayer/connectorDef.tsx","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/index.ts"],"names":["React","jsx","useTranslation","jsxs","provider","Users","DataTable","Button","MousePointerClick","Percent","ctx","createPluginContext","cn","STATUS_STYLE","Input","SubpageHeader","Trash2","Plus","Modal","ModalContent","ModalHeader","ModalTitle","ModalBody","ModalFooter","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","SegmentedControl","ListIcon","ChevronRight","Checkbox","X","ImageIcon","MessageCircle","Globe","isVideo","toDraft","Skeleton","MarkdownEditor","ConfirmDialog","useMemo","useState","useLimitGuard","invalidateLimit","useEffect","KpiCard","Target","DollarSign","counter","getSupabaseClientOptional","getActiveTenantId","data","error","acc","plan","post","getClient","requireTenantId","createStore","Sparkles"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA8DrC,IAAM,6BAAA,GAAgC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAsEtC,IAAM,wBAAA,GAA2B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AA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","file":"index.js","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 content: string\n blog: string\n blogCategories: 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 Youtube, Facebook, Linkedin, Twitter, Music2, Pin, AtSign,\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\n// Platform icons for the content planner. Lucide has no TikTok / Pinterest /\n// Threads glyphs — Music2 / Pin / AtSign are the conventional stand-ins.\nconst PLATFORM_ICONS: Record<string, React.ComponentType<{ className?: string }>> = {\n instagram: Instagram,\n tiktok: Music2,\n youtube: Youtube,\n facebook: Facebook,\n linkedin: Linkedin,\n x: Twitter,\n pinterest: Pin,\n threads: AtSign,\n}\n\nexport function PlatformIcon({ platform, className }: { platform: string; className?: string }) {\n const Icon = PLATFORM_ICONS[platform] ?? 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 { PermissionGate } from '@fayz-ai/saas'\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 <PermissionGate feature=\"marketing\" action=\"create\">\n <Button onClick={() => setComposerOpen(true)}><Plus className=\"mr-1.5 h-4 w-4\" /> {t('marketing.campaigns.new')}</Button>\n </PermissionGate>\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 { createPluginContext } from '@fayz-ai/saas'\nimport type { ResolvedMarketingConfig } from '../../MarketingContext'\nimport type { ContentPlannerProvider } from '../../data/contentTypes'\nimport type { ContentPlannerUIState } from './contentStore'\n\n// Separate context trio for the content planner — MarketingContext's generics\n// are fixed to the analytics provider/store, so the planner mounts its own.\nconst ctx = createPluginContext<ResolvedMarketingConfig, ContentPlannerProvider, ContentPlannerUIState>('ContentPlanner')\n\nexport const ContentPlannerContextProvider = ctx.ContextProvider\nexport const useContentPlannerConfig = ctx.useConfig\nexport const useContentPlannerProvider = ctx.useProvider\nexport const useContentPlannerStore = ctx.useStore\n","// ---------------------------------------------------------------------------\n// Content planner — domain types + provider seam. Deliberately separate from\n// MarketingDataProvider: analytics is mock-until-bridges, while the planner is\n// a real CRUD surface (Supabase-backed via createSafeDataProvider). The\n// interface must stay methods-only (the safe-provider Proxy turns every\n// property access into a call).\n// ---------------------------------------------------------------------------\n\nexport type PostFormat = 'reel' | 'static' | 'carousel' | 'story' | 'video' | 'live' | 'article'\n\n/** Platforms an account can publish to. UI-driven list (the DB stores plain\n * text[]), so growing it is a one-line change here. */\nexport const PLATFORMS = [\n 'instagram',\n 'tiktok',\n 'youtube',\n 'facebook',\n 'linkedin',\n 'x',\n 'pinterest',\n 'threads',\n] as const\nexport type Platform = (typeof PLATFORMS)[number]\n\nexport type PostStatus = 'idea' | 'script' | 'recording' | 'editing' | 'scheduled' | 'published'\n\nexport const POST_STATUS_ORDER: PostStatus[] = ['idea', 'script', 'recording', 'editing', 'scheduled', 'published']\n\nexport interface SocialAccount {\n id: string\n name: string\n handle?: string\n /** Platforms this account/brand publishes to (one account, many connections). */\n platforms: string[]\n isActive: boolean\n}\n\nexport interface ContentPlan {\n id: string\n accountId: string\n name: string\n status: 'draft' | 'active' | 'archived'\n weeksCount: number\n startDate?: string\n /** Structured \"what we want\" config — feeds chips + future AI drafting. */\n objective?: string\n tone?: string\n pillars: string[]\n formats: PostFormat[]\n weeklyFrequency: number\n /** Free-form brief/strategy document (markdown). */\n briefMd: string\n}\n\n/** Recording-day checklist item (on-set companion). */\nexport interface ChecklistItem {\n id: string\n text: string\n done: boolean\n}\n\nexport interface ContentPost {\n id: string\n planId: string\n weekNumber: number\n position: number\n title: string\n format: PostFormat\n status: PostStatus\n scheduledDate?: string\n /** Target platforms for this post; empty = inherit the account's platforms. */\n platforms: string[]\n /** Recording-day checklist — persisted as the crew checks items off. */\n checklist: ChecklistItem[]\n /** Uploaded asset URL (static posts: caption + final art instead of a script). */\n mediaUrl?: string\n hook?: string\n cta?: string\n /** The Notion-style page body — the script/plan in markdown. */\n contentMd: string\n updatedAt?: string\n}\n\nexport interface SaveSocialAccountInput {\n id?: string\n name: string\n handle?: string\n platforms?: string[]\n isActive?: boolean\n}\n\nexport interface SaveContentPlanInput {\n id?: string\n accountId?: string\n name?: string\n status?: ContentPlan['status']\n weeksCount?: number\n startDate?: string | null\n objective?: string\n tone?: string\n pillars?: string[]\n formats?: PostFormat[]\n weeklyFrequency?: number\n briefMd?: string\n}\n\nexport interface SaveContentPostInput {\n id?: string\n planId?: string\n weekNumber?: number\n position?: number\n title?: string\n format?: PostFormat\n status?: PostStatus\n scheduledDate?: string | null\n platforms?: string[]\n checklist?: ChecklistItem[]\n mediaUrl?: string | null\n hook?: string\n cta?: string\n contentMd?: string\n}\n\nexport interface ContentPlannerProvider {\n listAccounts(): Promise<SocialAccount[]>\n saveAccount(input: SaveSocialAccountInput): Promise<SocialAccount>\n /** Hard delete — plans and posts cascade with the account. */\n deleteAccount(id: string): Promise<void>\n listPlans(accountId: string): Promise<ContentPlan[]>\n getPlan(id: string): Promise<ContentPlan | null>\n savePlan(input: SaveContentPlanInput): Promise<ContentPlan>\n deletePlan(id: string): Promise<void>\n /** Ordered by week_number then position. */\n listPosts(planId: string): Promise<ContentPost[]>\n getPost(id: string): Promise<ContentPost | null>\n savePost(input: SaveContentPostInput): Promise<ContentPost>\n deletePost(id: string): Promise<void>\n}\n","import React from 'react'\nimport { cn } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { PostFormat, PostStatus } from '../../data/contentTypes'\nimport { PLATFORMS, POST_STATUS_ORDER } from '../../data/contentTypes'\nimport { PlatformIcon } from '../../components/icons'\n\nexport const POST_FORMATS: PostFormat[] = ['reel', 'static', 'carousel', 'story', 'video', 'live', 'article']\nexport { POST_STATUS_ORDER }\n\nconst FORMAT_STYLE: Record<PostFormat, string> = {\n reel: 'bg-violet-100 text-violet-700',\n static: 'bg-sky-100 text-sky-700',\n carousel: 'bg-amber-100 text-amber-700',\n story: 'bg-pink-100 text-pink-700',\n video: 'bg-red-100 text-red-700',\n live: 'bg-rose-100 text-rose-700',\n article: 'bg-teal-100 text-teal-700',\n}\n\n// Status dot colors — same palette/semantics as plugin-agenda's booking\n// statuses (config.ts): gray backlog, indigo planned, warm amber/orange while\n// in production, blue when scheduled, emerald when done.\nexport const POST_STATUS_COLOR: Record<PostStatus, string> = {\n idea: '#6b7280',\n script: '#6366f1',\n recording: '#f59e0b',\n editing: '#f97316',\n scheduled: '#3b82f6',\n published: '#10b981',\n}\n\n/** Small status dot (agenda/CRM convention) for selects and lists. */\nexport function StatusDot({ status, className }: { status: PostStatus; className?: string }) {\n return (\n <span\n className={cn('h-2 w-2 shrink-0 rounded-full', className)}\n style={{ backgroundColor: POST_STATUS_COLOR[status] }}\n />\n )\n}\n\nconst STATUS_STYLE: Record<PostStatus, string> = {\n idea: 'bg-slate-100 text-slate-600',\n script: 'bg-indigo-100 text-indigo-700',\n recording: 'bg-amber-100 text-amber-700',\n editing: 'bg-orange-100 text-orange-700',\n scheduled: 'bg-sky-100 text-sky-700',\n published: 'bg-emerald-100 text-emerald-700',\n}\n\nexport function FormatBadge({ format }: { format: PostFormat }) {\n const t = useTranslation()\n return (\n <span className={cn('rounded-full px-2 py-0.5 text-xs font-medium', FORMAT_STYLE[format])}>\n {t(`marketing.content.format.${format}`)}\n </span>\n )\n}\n\nexport function PostStatusBadge({ status }: { status: PostStatus }) {\n const t = useTranslation()\n return (\n <span className={cn('rounded-full px-2 py-0.5 text-xs font-medium', STATUS_STYLE[status])}>\n {t(`marketing.content.status.${status}`)}\n </span>\n )\n}\n\n/** Compact row of platform glyphs (post targets or account connections). */\nexport function PlatformBadges({ platforms, className }: { platforms: string[]; className?: string }) {\n if (platforms.length === 0) return null\n return (\n <span className={cn('inline-flex items-center gap-1 text-muted-foreground', className)}>\n {platforms.map((p) => (\n <PlatformIcon key={p} platform={p} className=\"h-3.5 w-3.5\" />\n ))}\n </span>\n )\n}\n\n/** Toggleable platform chips — used by the add-account form and the post page. */\nexport function PlatformPicker({ value, onChange }: {\n value: string[]\n onChange: (platforms: string[]) => void\n}) {\n return (\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {PLATFORMS.map((platform) => {\n const selected = value.includes(platform)\n return (\n <button\n key={platform}\n type=\"button\"\n aria-pressed={selected}\n onClick={() =>\n onChange(selected ? value.filter((p) => p !== platform) : [...value, platform])\n }\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-xs font-medium capitalize transition-colors',\n selected\n ? 'border-primary bg-primary/10 text-foreground'\n : 'border-border text-muted-foreground hover:bg-muted/40',\n )}\n >\n <PlatformIcon platform={platform} className=\"h-3.5 w-3.5\" />\n {platform}\n </button>\n )\n })}\n </div>\n )\n}\n\n","import React from 'react'\nimport { X } from 'lucide-react'\nimport {\n Button, Input, MarkdownEditor, SubpageHeader, Checkbox,\n Sheet, SheetContent, SheetHeader, SheetBody, SheetFooter, SheetTitle, SheetDescription,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { ContentPlan, PostFormat } from '../../data/contentTypes'\nimport { useContentPlannerStore } from './ContentPlannerContext'\nimport { POST_FORMATS } from './contentBits'\n\n// ---------------------------------------------------------------------------\n// Plan brief — the \"what we want\" page: structured strategy fields (pillars,\n// objective, tone, formats, cadence) plus a free-form markdown brief.\n// ---------------------------------------------------------------------------\n\ninterface Draft {\n name: string\n objective: string\n tone: string\n pillars: string[]\n formats: PostFormat[]\n weeklyFrequency: number\n weeksCount: number\n briefMd: string\n}\n\nfunction toDraft(plan: ContentPlan): Draft {\n return {\n name: plan.name,\n objective: plan.objective ?? '',\n tone: plan.tone ?? '',\n pillars: plan.pillars,\n formats: plan.formats,\n weeklyFrequency: plan.weeklyFrequency,\n weeksCount: plan.weeksCount,\n briefMd: plan.briefMd,\n }\n}\n\nfunction Field({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{label}</label>\n {children}\n </div>\n )\n}\n\nfunction useBriefDraft() {\n const plan = useContentPlannerStore((s) => s.activePlan)\n const savePlan = useContentPlannerStore((s) => s.savePlan)\n\n const [draft, setDraft] = React.useState<Draft | null>(plan ? toDraft(plan) : null)\n const [saving, setSaving] = React.useState(false)\n\n React.useEffect(() => {\n if (plan) setDraft(toDraft(plan))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [plan?.id])\n\n const patch = (partial: Partial<Draft>) => setDraft((d) => (d ? { ...d, ...partial } : d))\n const dirty = !!plan && !!draft && JSON.stringify(draft) !== JSON.stringify(toDraft(plan))\n\n const save = async () => {\n if (!plan || !draft) return\n setSaving(true)\n try {\n await savePlan({\n id: plan.id,\n name: draft.name,\n objective: draft.objective,\n tone: draft.tone,\n pillars: draft.pillars,\n formats: draft.formats,\n weeklyFrequency: draft.weeklyFrequency,\n weeksCount: draft.weeksCount,\n briefMd: draft.briefMd,\n })\n } finally {\n setSaving(false)\n }\n }\n\n return { plan, draft, patch, dirty, saving, save }\n}\n\nfunction BriefFields({ draft, patch }: { draft: Draft; patch: (p: Partial<Draft>) => void }) {\n const t = useTranslation()\n const [pillarInput, setPillarInput] = React.useState('')\n\n const addPillar = () => {\n const value = pillarInput.trim()\n if (!value || draft.pillars.includes(value)) return\n patch({ pillars: [...draft.pillars, value] })\n setPillarInput('')\n }\n\n const toggleFormat = (format: PostFormat) => {\n patch({\n formats: draft.formats.includes(format)\n ? draft.formats.filter((f) => f !== format)\n : [...draft.formats, format],\n })\n }\n\n return (\n <div className=\"space-y-5\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <Field label={t('marketing.content.planName')}>\n <Input value={draft.name} onChange={(e) => patch({ name: e.target.value })} />\n </Field>\n <Field label={t('marketing.content.objective')}>\n <Input\n value={draft.objective}\n onChange={(e) => patch({ objective: e.target.value })}\n placeholder={t('marketing.content.objectivePlaceholder')}\n />\n </Field>\n <Field label={t('marketing.content.tone')}>\n <Input\n value={draft.tone}\n onChange={(e) => patch({ tone: e.target.value })}\n placeholder={t('marketing.content.tonePlaceholder')}\n />\n </Field>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label={t('marketing.content.weeklyFrequency')}>\n <Input\n type=\"number\"\n min={1}\n max={14}\n value={draft.weeklyFrequency}\n onChange={(e) => patch({ weeklyFrequency: Math.max(1, Number(e.target.value) || 1) })}\n />\n </Field>\n <Field label={t('marketing.content.weeksCount')}>\n <Input\n type=\"number\"\n min={1}\n max={52}\n value={draft.weeksCount}\n onChange={(e) => patch({ weeksCount: Math.max(1, Number(e.target.value) || 1) })}\n />\n </Field>\n </div>\n </div>\n\n <Field label={t('marketing.content.pillars')}>\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {draft.pillars.map((pillar) => (\n <span\n key={pillar}\n className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2.5 py-0.5 text-xs font-medium text-foreground\"\n >\n {pillar}\n <button\n type=\"button\"\n onClick={() => patch({ pillars: draft.pillars.filter((p) => p !== pillar) })}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n ))}\n <Input\n value={pillarInput}\n onChange={(e) => setPillarInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n addPillar()\n }\n }}\n onBlur={addPillar}\n placeholder={t('marketing.content.pillarPlaceholder')}\n className=\"h-7 w-44 text-xs\"\n />\n </div>\n </Field>\n\n <Field label={t('marketing.content.formatsLabel')}>\n <div className=\"flex flex-wrap gap-4\">\n {POST_FORMATS.map((format) => (\n <label key={format} className=\"flex items-center gap-2 text-sm text-foreground\">\n <Checkbox\n checked={draft.formats.includes(format)}\n onChange={() => toggleFormat(format)}\n />\n {t(`marketing.content.format.${format}`)}\n </label>\n ))}\n </div>\n </Field>\n\n <Field label={t('marketing.content.briefBody')}>\n <MarkdownEditor\n value={draft.briefMd}\n onChange={(briefMd) => patch({ briefMd })}\n placeholder={t('marketing.content.briefPlaceholder')}\n editLabel={t('marketing.content.edit')}\n previewLabel={t('marketing.content.preview')}\n minRows={10}\n />\n </Field>\n </div>\n )\n}\n\n/** Full-page variant — kept for the /marketing/content/brief deep link. */\nexport function PlanBriefView({ onBack }: { onBack: () => void }) {\n const t = useTranslation()\n const { plan, draft, patch, dirty, saving, save } = useBriefDraft()\n\n if (!plan || !draft) {\n return <div className=\"mx-auto max-w-3xl text-sm text-muted-foreground\">…</div>\n }\n\n return (\n <div className=\"mx-auto max-w-3xl space-y-5\">\n <SubpageHeader\n title={t('marketing.content.brief')}\n subtitle={plan.name}\n parentLabel={t('marketing.content.title')}\n onBack={onBack}\n actions={\n <Button size=\"sm\" onClick={() => void save()} disabled={!dirty || saving}>\n {t('marketing.content.save')}\n </Button>\n }\n />\n <BriefFields draft={draft} patch={patch} />\n </div>\n )\n}\n\n/** Right slide-over variant — the board's Briefing button opens this, keeping\n * the calendar in sight while the strategy is edited. */\nexport function PlanBriefSheet({ open, onClose }: { open: boolean; onClose: () => void }) {\n const t = useTranslation()\n const { plan, draft, patch, dirty, saving, save } = useBriefDraft()\n\n return (\n <Sheet open={open} onOpenChange={(v) => { if (!v) onClose() }}>\n <SheetContent width=\"max-w-2xl\">\n <SheetHeader>\n <SheetTitle>{t('marketing.content.brief')}</SheetTitle>\n {plan && <SheetDescription>{plan.name}</SheetDescription>}\n </SheetHeader>\n <SheetBody>\n {draft ? (\n <BriefFields draft={draft} patch={patch} />\n ) : (\n <p className=\"text-sm text-muted-foreground\">…</p>\n )}\n </SheetBody>\n <SheetFooter>\n <Button variant=\"outline\" onClick={onClose} disabled={saving}>\n {t('marketing.content.cancel')}\n </Button>\n <Button onClick={() => void save()} disabled={!dirty || saving}>\n {t('marketing.content.save')}\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n )\n}\n","import React from 'react'\nimport {\n Plus, NotebookPen, ChevronLeft, ChevronRight,\n Columns3, CalendarDays, List as ListIcon, Trash2, GripVertical, Settings2,\n} from 'lucide-react'\nimport type { SocialAccount } from '../../data/contentTypes'\nimport {\n Button, Input, Skeleton, cn, ConfirmDialog, SegmentedControl,\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem, SelectSeparator,\n Modal, ModalContent, ModalHeader, ModalTitle, ModalBody, ModalFooter,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useOrganizationStore, useLimitGuard, invalidateLimit } from '@fayz-ai/saas'\nimport { PlanBriefSheet } from './PlanBriefView'\nimport type { ContentPost } from '../../data/contentTypes'\nimport { useContentPlannerStore } from './ContentPlannerContext'\nimport { FormatBadge, PostStatusBadge, PlatformBadges, PlatformPicker } from './contentBits'\nimport type { BoardViewMode } from './contentStore'\n\n// ---------------------------------------------------------------------------\n// Content board — the spreadsheet, productized. Three lenses on the same plan\n// (content-planning best practice: plan by cadence, schedule by date, audit by\n// status): Board (weeks as columns), Calendar (posts on real dates) and List\n// (flat audit table). The page never blanks out: with no account or plan the\n// calendar renders as an empty ghost grid and the account selector carries an\n// inline add-account flow with platform connections.\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_WEEKS = 8\nconst ADD_ACCOUNT_VALUE = '__add-account__'\n// Custom MIME so week columns only react to post-card drags\nconst POST_DRAG_MIME = 'application/x-mkt-post'\n\nfunction PostCard({ post, onOpen, onDelete }: {\n post: ContentPost\n onOpen: () => void\n onDelete?: () => void\n}) {\n const t = useTranslation()\n const [dragging, setDragging] = React.useState(false)\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onOpen}\n onKeyDown={(e) => { if (e.key === 'Enter') onOpen() }}\n draggable\n onDragStart={(e) => {\n e.dataTransfer.setData(POST_DRAG_MIME, post.id)\n e.dataTransfer.effectAllowed = 'move'\n setDragging(true)\n }}\n onDragEnd={() => setDragging(false)}\n className={cn(\n 'group/post relative w-full cursor-pointer rounded-card border border-border bg-card p-3 pl-7 text-left transition-colors hover:bg-muted/40',\n dragging && 'opacity-50',\n )}\n >\n <GripVertical\n className=\"absolute left-1.5 top-3 h-4 w-4 cursor-grab text-muted-foreground/50 opacity-0 transition-opacity group-hover/post:opacity-100\"\n aria-hidden\n />\n {onDelete && (\n <button\n type=\"button\"\n aria-label={t('marketing.content.deletePost')}\n onClick={(e) => {\n e.stopPropagation()\n onDelete()\n }}\n className=\"absolute right-1.5 top-2 rounded p-1 text-muted-foreground/60 opacity-0 transition-opacity hover:bg-destructive/10 hover:text-destructive group-hover/post:opacity-100\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n )}\n <p className=\"pr-5 text-sm font-medium text-foreground\">\n {post.title || t('marketing.content.untitled')}\n </p>\n <div className=\"mt-2 flex flex-wrap items-center gap-1.5\">\n <FormatBadge format={post.format} />\n <PostStatusBadge status={post.status} />\n {post.scheduledDate && (\n <span className=\"text-xs text-muted-foreground\">{post.scheduledDate}</span>\n )}\n <PlatformBadges platforms={post.platforms} />\n </div>\n </div>\n )\n}\n\nfunction WeekColumn({ week, rangeLabel, posts, onOpenPost, onNewPost, onDeletePost, onDropPost, disabled }: {\n week: number\n /** Real date range of the week (e.g. \"6 – 12 out\"). */\n rangeLabel: string\n posts: ContentPost[]\n onOpenPost: (id: string) => void\n onNewPost: (week: number) => void\n onDeletePost?: (id: string) => void\n onDropPost?: (postId: string, week: number) => void\n disabled?: boolean\n}) {\n const t = useTranslation()\n const [isDropTarget, setIsDropTarget] = React.useState(false)\n return (\n <div\n className={cn(\n 'flex flex-col gap-2 rounded-card border border-border bg-muted/20 p-2.5 transition-colors',\n isDropTarget && 'border-primary bg-primary/5 ring-1 ring-primary/40',\n )}\n onDragOver={(e) => {\n if (!onDropPost || !e.dataTransfer.types.includes(POST_DRAG_MIME)) return\n e.preventDefault()\n e.dataTransfer.dropEffect = 'move'\n setIsDropTarget(true)\n }}\n onDragLeave={() => setIsDropTarget(false)}\n onDrop={(e) => {\n if (!onDropPost) return\n e.preventDefault()\n setIsDropTarget(false)\n const postId = e.dataTransfer.getData(POST_DRAG_MIME)\n if (postId) onDropPost(postId, week)\n }}\n >\n <div className=\"flex items-baseline justify-between px-1\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {t('marketing.content.week')} {week}\n </p>\n <p className=\"text-xs text-muted-foreground/80\">{rangeLabel}</p>\n </div>\n {posts.map((post) => (\n <PostCard\n key={post.id}\n post={post}\n onOpen={() => onOpenPost(post.id)}\n onDelete={onDeletePost ? () => onDeletePost(post.id) : undefined}\n />\n ))}\n <button\n type=\"button\"\n onClick={() => onNewPost(week)}\n disabled={disabled}\n className=\"flex items-center justify-center gap-1 rounded-card border border-dashed border-border p-2 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted/40 hover:text-foreground disabled:pointer-events-none disabled:opacity-50\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n {t('marketing.content.newPost')}\n </button>\n </div>\n )\n}\n\n/** Account modal — create (\"+\" option) or settings (cog on an account):\n * name, handle, platform connections, and delete on the edit variant. */\nfunction AccountModal({ open, account, onClose }: {\n open: boolean\n account?: SocialAccount | null\n onClose: () => void\n}) {\n const t = useTranslation()\n const saveAccount = useContentPlannerStore((s) => s.saveAccount)\n const deleteAccount = useContentPlannerStore((s) => s.deleteAccount)\n const isEdit = !!account\n const [name, setName] = React.useState('')\n const [handle, setHandle] = React.useState('')\n const [platforms, setPlatforms] = React.useState<string[]>(['instagram'])\n const [saving, setSaving] = React.useState(false)\n const [confirmDelete, setConfirmDelete] = React.useState(false)\n\n // Prefill per open (edit) / reset (create) so drafts don't leak between uses\n React.useEffect(() => {\n if (open) {\n setName(account?.name ?? '')\n setHandle(account?.handle ?? '')\n setPlatforms(account?.platforms?.length ? account.platforms : ['instagram'])\n setSaving(false)\n setConfirmDelete(false)\n }\n }, [open, account])\n\n const create = async () => {\n if (!name.trim() || platforms.length === 0 || saving) return\n setSaving(true)\n try {\n await saveAccount({\n ...(isEdit ? { id: account.id } : {}),\n name: name.trim(),\n handle: handle.trim() || undefined,\n platforms,\n })\n onClose()\n } finally {\n setSaving(false)\n }\n }\n\n const remove = async () => {\n if (!account || saving) return\n setSaving(true)\n try {\n await deleteAccount(account.id)\n onClose()\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <Modal open={open} onOpenChange={(o) => { if (!o) onClose() }}>\n <ModalContent size=\"sm\">\n <ModalHeader>\n <ModalTitle>\n {isEdit ? t('marketing.content.editAccountTitle') : t('marketing.content.addAccountTitle')}\n </ModalTitle>\n </ModalHeader>\n <ModalBody className=\"space-y-4\">\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n {t('marketing.content.nameLabel')}\n </label>\n <Input\n autoFocus\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t('marketing.content.accountNamePlaceholder')}\n onKeyDown={(e) => { if (e.key === 'Enter') void create() }}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n {t('marketing.content.handleLabel')}\n </label>\n <Input\n value={handle}\n onChange={(e) => setHandle(e.target.value)}\n placeholder={t('marketing.content.handlePlaceholder')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n {t('marketing.content.platformsLabel')}\n </label>\n <PlatformPicker value={platforms} onChange={setPlatforms} />\n </div>\n </ModalBody>\n <ModalFooter>\n {/* Delete is a two-step INLINE confirm — never a dialog stacked on a\n modal (no modal-over-modal, house rule). */}\n {confirmDelete && isEdit ? (\n <div className=\"flex w-full items-center gap-3 rounded-card border border-destructive/30 bg-destructive/5 p-3\">\n <p className=\"flex-1 text-xs text-destructive\">\n {t('marketing.content.deleteAccountConfirm')}\n </p>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setConfirmDelete(false)} disabled={saving}>\n {t('marketing.content.cancel')}\n </Button>\n <Button variant=\"destructive\" size=\"sm\" onClick={() => void remove()} disabled={saving}>\n {t('marketing.content.deleteAccount')}\n </Button>\n </div>\n ) : (\n <>\n {isEdit && (\n <Button\n variant=\"outline\"\n onClick={() => setConfirmDelete(true)}\n disabled={saving}\n className=\"mr-auto text-destructive hover:text-destructive\"\n >\n <Trash2 className=\"mr-1.5 h-4 w-4\" />\n {t('marketing.content.deleteAccount')}\n </Button>\n )}\n <Button variant=\"outline\" onClick={onClose} disabled={saving}>\n {t('marketing.content.cancel')}\n </Button>\n <Button onClick={() => void create()} disabled={saving || !name.trim() || platforms.length === 0}>\n {isEdit ? t('marketing.content.save') : t('marketing.content.createAccount')}\n </Button>\n </>\n )}\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n\n/** Master account dropdown — always visible at the top. Each account carries\n * a cog that opens its settings (edit / delete); the last option creates. */\nfunction AccountSelector() {\n const t = useTranslation()\n const loaded = useContentPlannerStore((s) => s.loaded)\n const accounts = useContentPlannerStore((s) => s.accounts)\n const activeAccountId = useContentPlannerStore((s) => s.activeAccountId)\n const setAccount = useContentPlannerStore((s) => s.setAccount)\n const [open, setOpen] = React.useState(false)\n const [modal, setModal] = React.useState<{ mode: 'create' } | { mode: 'edit'; account: SocialAccount } | null>(null)\n\n const activeAccount = accounts.find((a) => a.id === activeAccountId) ?? null\n\n if (!loaded) {\n return (\n <div className=\"flex items-center gap-1\">\n <Skeleton className=\"h-9 w-64\" />\n <Skeleton className=\"h-9 w-9\" />\n </div>\n )\n }\n\n const openSettings = (account: SocialAccount) => {\n setOpen(false)\n setModal({ mode: 'edit', account })\n }\n\n return (\n <>\n <div className=\"flex items-center gap-1\">\n <Select\n open={open}\n onOpenChange={setOpen}\n value={activeAccountId ?? undefined}\n onValueChange={(id) => {\n if (id === ADD_ACCOUNT_VALUE) {\n setModal({ mode: 'create' })\n return\n }\n void setAccount(id)\n }}\n >\n <SelectTrigger className=\"w-64\">\n <SelectValue placeholder={t('marketing.content.account')} />\n </SelectTrigger>\n <SelectContent>\n {accounts.length === 0 ? (\n <SelectItem value=\"__none__\" disabled>\n {t('marketing.content.noAccountsAvailable')}\n </SelectItem>\n ) : (\n accounts.map((acc) => (\n <div key={acc.id} className=\"relative\">\n <SelectItem value={acc.id} className=\"pr-9\">\n <span className=\"flex items-center gap-2\">\n {acc.name}\n <PlatformBadges platforms={acc.platforms} />\n </span>\n </SelectItem>\n {/* Sits on top of the item — pointer events stop here so the\n cog opens settings instead of selecting the account. */}\n <button\n type=\"button\"\n aria-label={t('marketing.content.accountSettings')}\n onPointerDown={(e) => { e.stopPropagation(); e.preventDefault() }}\n onPointerUp={(e) => { e.stopPropagation(); e.preventDefault() }}\n onClick={(e) => {\n e.stopPropagation()\n openSettings(acc)\n }}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 rounded p-1 text-muted-foreground/70 transition-colors hover:bg-muted/60 hover:text-foreground\"\n >\n <Settings2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n ))\n )}\n <SelectSeparator />\n <SelectItem value={ADD_ACCOUNT_VALUE}>\n <span className=\"flex items-center gap-1.5\">\n <Plus className=\"h-3.5 w-3.5\" />\n {t('marketing.content.addAccount')}\n </span>\n </SelectItem>\n </SelectContent>\n </Select>\n {activeAccount && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-9 w-9 p-0 text-muted-foreground\"\n aria-label={t('marketing.content.accountSettings')}\n onClick={() => setModal({ mode: 'edit', account: activeAccount })}\n >\n <Settings2 className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n <AccountModal\n open={!!modal}\n account={modal?.mode === 'edit' ? modal.account : null}\n onClose={() => setModal(null)}\n />\n </>\n )\n}\n\n// ---------------------------------------------------------------------------\n// View switcher\n// ---------------------------------------------------------------------------\n\nfunction ViewSwitcher({ mode, onChange }: { mode: BoardViewMode; onChange: (m: BoardViewMode) => void }) {\n const t = useTranslation()\n return (\n <SegmentedControl<BoardViewMode>\n size=\"md\"\n aria-label={t('marketing.content.viewBoard')}\n value={mode}\n onChange={onChange}\n options={[\n { value: 'board', label: <span className=\"flex items-center gap-1.5\"><Columns3 className=\"h-3.5 w-3.5\" />{t('marketing.content.viewBoard')}</span> },\n { value: 'calendar', label: <span className=\"flex items-center gap-1.5\"><CalendarDays className=\"h-3.5 w-3.5\" />{t('marketing.content.viewCalendar')}</span> },\n { value: 'list', label: <span className=\"flex items-center gap-1.5\"><ListIcon className=\"h-3.5 w-3.5\" />{t('marketing.content.viewList')}</span> },\n ]}\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// Board view — weeks as columns grouped by month blocks (cadence planning)\n// ---------------------------------------------------------------------------\n\ninterface BoardWeek {\n week: number\n rangeLabel: string\n monthLabel: string\n}\n\nfunction shortDay(d: Date): string {\n return d.toLocaleDateString(undefined, { day: 'numeric', month: 'short' })\n}\n\n/** Anchor each plan week to real dates (same reference the calendar view\n * uses): week N starts at startDate + (N-1) weeks; month sections group by\n * the month the week starts in. */\nfunction buildBoardWeeks(startDate: Date, weeksCount: number): BoardWeek[] {\n return Array.from({ length: weeksCount }, (_, i) => {\n const start = new Date(startDate)\n start.setDate(start.getDate() + i * 7)\n const end = new Date(start)\n end.setDate(start.getDate() + 6)\n return {\n week: i + 1,\n rangeLabel: `${shortDay(start)} – ${shortDay(end)}`,\n monthLabel: start.toLocaleDateString(undefined, { month: 'long', year: 'numeric' }),\n }\n })\n}\n\nfunction BoardView({ startDate, weeksCount, postsByWeek, onOpenPost, onNewPost, onDeletePost, onDropPost, disabled }: {\n startDate: Date\n weeksCount: number\n postsByWeek: Map<number, ContentPost[]>\n onOpenPost: (id: string) => void\n onNewPost: (week: number) => void\n onDeletePost: (id: string) => void\n onDropPost: (postId: string, week: number) => void\n disabled: boolean\n}) {\n const months: Array<{ label: string; weeks: BoardWeek[] }> = []\n for (const bw of buildBoardWeeks(startDate, weeksCount)) {\n const current = months[months.length - 1]\n if (current && current.label === bw.monthLabel) current.weeks.push(bw)\n else months.push({ label: bw.monthLabel, weeks: [bw] })\n }\n return (\n <div className=\"space-y-8\">\n {months.map(({ label, weeks }) => (\n <section key={label} className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold uppercase tracking-wide text-muted-foreground\">\n {label}\n </h3>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n {weeks.map(({ week, rangeLabel }) => (\n <WeekColumn\n key={week}\n week={week}\n rangeLabel={rangeLabel}\n posts={postsByWeek.get(week) ?? []}\n onOpenPost={onOpenPost}\n onNewPost={onNewPost}\n onDeletePost={onDeletePost}\n onDropPost={onDropPost}\n disabled={disabled}\n />\n ))}\n </div>\n </section>\n ))}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Calendar view — posts pinned to real dates, month by month\n// ---------------------------------------------------------------------------\n\nfunction toISODate(d: Date): string {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n}\n\nfunction mondayOfCurrentWeek(): Date {\n const now = new Date()\n const monday = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n monday.setDate(monday.getDate() - ((monday.getDay() + 6) % 7))\n return monday\n}\n\nfunction CalendarView({ posts, onOpenPost, onNewPostAt, disabled }: {\n posts: ContentPost[]\n onOpenPost: (id: string) => void\n onNewPostAt: (isoDate: string) => void\n disabled: boolean\n}) {\n const t = useTranslation()\n const [cursor, setCursor] = React.useState(() => {\n const first = posts.find((p) => p.scheduledDate)?.scheduledDate\n const base = first ? new Date(`${first}T00:00:00`) : new Date()\n return new Date(base.getFullYear(), base.getMonth(), 1)\n })\n // Days showing their full list when they hold more posts than the cap\n const [expandedDay, setExpandedDay] = React.useState<string | null>(null)\n const MAX_VISIBLE = 3\n\n const postsByDate = React.useMemo(() => {\n const map = new Map<string, ContentPost[]>()\n for (const post of posts) {\n if (!post.scheduledDate) continue\n const list = map.get(post.scheduledDate) ?? []\n list.push(post)\n map.set(post.scheduledDate, list)\n }\n return map\n }, [posts])\n\n const unscheduled = posts.filter((p) => !p.scheduledDate)\n\n // Monday-first grid covering the whole displayed month.\n const days = React.useMemo(() => {\n const firstOfMonth = new Date(cursor.getFullYear(), cursor.getMonth(), 1)\n const start = new Date(firstOfMonth)\n start.setDate(start.getDate() - ((firstOfMonth.getDay() + 6) % 7))\n const cells: Date[] = []\n for (let i = 0; i < 42; i++) {\n const d = new Date(start)\n d.setDate(start.getDate() + i)\n cells.push(d)\n }\n // Trim trailing full weeks outside the month\n while (cells.length > 7 && cells[cells.length - 7].getMonth() !== cursor.getMonth()) {\n cells.splice(cells.length - 7, 7)\n }\n return cells\n }, [cursor])\n\n const monthLabel = cursor.toLocaleDateString(undefined, { month: 'long', year: 'numeric' })\n const weekdayLabels = days.slice(0, 7).map((d) =>\n d.toLocaleDateString(undefined, { weekday: 'short' }),\n )\n const todayISO = toISODate(new Date())\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold capitalize text-foreground\">{monthLabel}</h3>\n <div className=\"flex items-center gap-1\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setCursor(new Date(cursor.getFullYear(), cursor.getMonth() - 1, 1))}>\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setCursor(new Date(cursor.getFullYear(), cursor.getMonth() + 1, 1))}>\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {unscheduled.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-2 rounded-card border border-dashed border-border bg-muted/20 p-2.5\">\n <span className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {t('marketing.content.unscheduled')}\n </span>\n {unscheduled.map((post) => (\n <button\n key={post.id}\n type=\"button\"\n onClick={() => onOpenPost(post.id)}\n className=\"inline-flex items-center gap-1.5 rounded-full border border-border bg-card px-2.5 py-1 text-xs font-medium text-foreground transition-colors hover:bg-muted/40\"\n >\n {post.title || t('marketing.content.untitled')}\n <FormatBadge format={post.format} />\n </button>\n ))}\n </div>\n )}\n\n <div className=\"overflow-hidden rounded-card border border-border\">\n <div className=\"grid grid-cols-7 border-b border-border bg-muted/30\">\n {weekdayLabels.map((label, i) => (\n <div key={i} className=\"px-2 py-1.5 text-center text-xs font-medium capitalize text-muted-foreground\">\n {label}\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-7\">\n {days.map((day, i) => {\n const iso = toISODate(day)\n const inMonth = day.getMonth() === cursor.getMonth()\n const dayPosts = postsByDate.get(iso) ?? []\n return (\n <div\n key={i}\n className={cn(\n 'group min-h-24 border-b border-r border-border p-1.5 [&:nth-child(7n)]:border-r-0',\n !inMonth && 'bg-muted/20',\n )}\n >\n <div className=\"flex items-center justify-between\">\n <span\n className={cn(\n 'text-xs',\n inMonth ? 'text-foreground' : 'text-muted-foreground/60',\n iso === todayISO && 'flex h-5 w-5 items-center justify-center rounded-full bg-primary font-semibold text-primary-foreground',\n )}\n >\n {day.getDate()}\n </span>\n {!disabled && (\n <button\n type=\"button\"\n onClick={() => onNewPostAt(iso)}\n className=\"rounded p-0.5 text-muted-foreground opacity-0 transition-opacity hover:bg-muted/60 hover:text-foreground group-hover:opacity-100\"\n aria-label={t('marketing.content.newPost')}\n >\n <Plus className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n <div className=\"mt-1 space-y-1\">\n {(expandedDay === iso ? dayPosts : dayPosts.slice(0, MAX_VISIBLE)).map((post) => (\n <button\n key={post.id}\n type=\"button\"\n onClick={() => onOpenPost(post.id)}\n className=\"block w-full truncate rounded border border-border bg-card px-1.5 py-1 text-left text-xs text-foreground transition-colors hover:bg-muted/40\"\n >\n {post.title || t('marketing.content.untitled')}\n </button>\n ))}\n {dayPosts.length > MAX_VISIBLE && (\n <button\n type=\"button\"\n onClick={() => setExpandedDay(expandedDay === iso ? null : iso)}\n className=\"block w-full px-1.5 py-0.5 text-left text-xs font-medium text-muted-foreground transition-colors hover:text-foreground\"\n >\n {expandedDay === iso\n ? t('marketing.content.showLess')\n : `+${dayPosts.length - MAX_VISIBLE}`}\n </button>\n )}\n </div>\n </div>\n )\n })}\n </div>\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// List view — flat audit table (sorted by week, then position)\n// ---------------------------------------------------------------------------\n\nfunction ListView({ posts, onOpenPost }: { posts: ContentPost[]; onOpenPost: (id: string) => void }) {\n const t = useTranslation()\n if (posts.length === 0) {\n return <p className=\"text-sm text-muted-foreground\">{t('marketing.content.noPosts')}</p>\n }\n return (\n <div className=\"overflow-hidden rounded-card border border-border\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border bg-muted/30 text-left text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n <th className=\"px-3 py-2\">{t('marketing.content.listWeek')}</th>\n <th className=\"px-3 py-2\">{t('marketing.content.listTitle')}</th>\n <th className=\"px-3 py-2\">{t('marketing.content.listFormat')}</th>\n <th className=\"px-3 py-2\">{t('marketing.content.listStatus')}</th>\n <th className=\"px-3 py-2\">{t('marketing.content.listDate')}</th>\n </tr>\n </thead>\n <tbody>\n {posts.map((post) => (\n <tr\n key={post.id}\n onClick={() => onOpenPost(post.id)}\n className=\"cursor-pointer border-b border-border last:border-b-0 transition-colors hover:bg-muted/30\"\n >\n <td className=\"px-3 py-2 text-muted-foreground\">{post.weekNumber}</td>\n <td className=\"px-3 py-2 font-medium text-foreground\">\n <span className=\"flex items-center gap-2\">\n {post.title || t('marketing.content.untitled')}\n <PlatformBadges platforms={post.platforms} />\n </span>\n </td>\n <td className=\"px-3 py-2\"><FormatBadge format={post.format} /></td>\n <td className=\"px-3 py-2\"><PostStatusBadge status={post.status} /></td>\n <td className=\"px-3 py-2 text-muted-foreground\">{post.scheduledDate ?? '—'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n\nexport function ContentView({ onOpenPost }: {\n onOpenPost: (id: string) => void\n}) {\n const t = useTranslation()\n const loaded = useContentPlannerStore((s) => s.loaded)\n const loading = useContentPlannerStore((s) => s.loading)\n const accounts = useContentPlannerStore((s) => s.accounts)\n const activeAccountId = useContentPlannerStore((s) => s.activeAccountId)\n const plan = useContentPlannerStore((s) => s.activePlan)\n const posts = useContentPlannerStore((s) => s.posts)\n const load = useContentPlannerStore((s) => s.load)\n const savePlan = useContentPlannerStore((s) => s.savePlan)\n const savePost = useContentPlannerStore((s) => s.savePost)\n const deletePost = useContentPlannerStore((s) => s.deletePost)\n const viewMode = useContentPlannerStore((s) => s.viewMode)\n const setViewMode = useContentPlannerStore((s) => s.setViewMode)\n const loadedTenantId = useContentPlannerStore((s) => s.loadedTenantId)\n const guardContentPosts = useLimitGuard('content_posts_month')\n\n const [briefOpen, setBriefOpen] = React.useState(false)\n const [pendingDeleteId, setPendingDeleteId] = React.useState<string | null>(null)\n\n // The tenant hydrates async after login/refresh — (re)load whenever the\n // active tenant diverges from the one the current data belongs to. Also\n // covers org switching.\n const tenantId = useOrganizationStore((state) => state.currentOrg?.id)\n React.useEffect(() => {\n if (!loading && (!loaded || (tenantId && tenantId !== loadedTenantId))) void load()\n }, [tenantId, loadedTenantId, loaded, loading, load])\n\n const postsByWeek = React.useMemo(() => {\n const map = new Map<number, ContentPost[]>()\n for (const post of posts) {\n const list = map.get(post.weekNumber) ?? []\n list.push(post)\n map.set(post.weekNumber, list)\n }\n return map\n }, [posts])\n\n const ensurePlan = async () => {\n if (plan) return plan\n if (!activeAccountId) return null\n return savePlan({\n accountId: activeAccountId,\n name: t('marketing.content.defaultPlanName'),\n status: 'active',\n weeksCount: DEFAULT_WEEKS,\n startDate: toISODate(mondayOfCurrentWeek()),\n })\n }\n\n // With an account but no plan yet, the first \"new post\" click bootstraps the\n // default plan and drops the post straight into it. The scheduled date\n // prefills with the first day of the selected week so the post lands dated.\n const createPost = async (week: number) => {\n // Client-side monthly-quota guard before the store create.\n if ((await guardContentPosts()) === 'blocked') return\n const targetPlan = await ensurePlan()\n if (!targetPlan) return\n const start = targetPlan.startDate\n ? new Date(`${targetPlan.startDate}T00:00:00`)\n : mondayOfCurrentWeek()\n start.setDate(start.getDate() + (week - 1) * 7)\n const post = await savePost({\n planId: targetPlan.id,\n weekNumber: week,\n title: '',\n format: 'reel',\n status: 'idea',\n scheduledDate: toISODate(start),\n })\n invalidateLimit('content_posts_month')\n onOpenPost(post.id)\n }\n\n const movePost = async (postId: string, week: number) => {\n const post = posts.find((p) => p.id === postId)\n if (!post || post.weekNumber === week) return\n await savePost({ id: postId, weekNumber: week })\n }\n\n // Calendar day click → derive the plan week from startDate when available.\n const createPostAt = async (isoDate: string) => {\n // Client-side monthly-quota guard before the store create.\n if ((await guardContentPosts()) === 'blocked') return\n const targetPlan = await ensurePlan()\n if (!targetPlan) return\n let week = 1\n if (targetPlan.startDate) {\n const start = new Date(`${targetPlan.startDate}T00:00:00`)\n const day = new Date(`${isoDate}T00:00:00`)\n const diff = Math.floor((day.getTime() - start.getTime()) / (7 * 24 * 3600 * 1000)) + 1\n week = Math.min(Math.max(diff, 1), targetPlan.weeksCount)\n }\n const post = await savePost({\n planId: targetPlan.id,\n weekNumber: week,\n title: '',\n format: 'reel',\n status: 'idea',\n scheduledDate: isoDate,\n })\n invalidateLimit('content_posts_month')\n onOpenPost(post.id)\n }\n\n // Initial load, tenant hydration and account switches all re-skeleton the\n // board so stale posts never flash under the new selection.\n const busy = !loaded || loading\n\n const hasAccount = accounts.length > 0\n const weeksCount = plan?.weeksCount ?? DEFAULT_WEEKS\n // Same date anchor the calendar view uses. Plans without a start date\n // (legacy rows) display against the current week.\n const boardStart = plan?.startDate\n ? new Date(`${plan.startDate}T00:00:00`)\n : mondayOfCurrentWeek()\n\n return (\n <div className=\"mx-auto max-w-6xl space-y-6\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <AccountSelector />\n {plan && <span className=\"text-sm text-muted-foreground\">{plan.name}</span>}\n </div>\n <div className=\"flex items-center gap-2\">\n <ViewSwitcher mode={viewMode} onChange={setViewMode} />\n {plan && (\n <Button variant=\"outline\" size=\"sm\" onClick={() => setBriefOpen(true)}>\n <NotebookPen className=\"mr-1.5 h-4 w-4\" />\n {t('marketing.content.brief')}\n </Button>\n )}\n </div>\n </div>\n\n {!busy && !hasAccount && (\n <p className=\"text-sm text-muted-foreground\">\n {t('marketing.content.noAccountsHint')}\n </p>\n )}\n\n {busy && viewMode === 'board' && (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n {Array.from({ length: 8 }, (_, i) => <Skeleton key={i} className=\"h-44\" />)}\n </div>\n )}\n {busy && viewMode === 'calendar' && <Skeleton className=\"h-96 w-full\" />}\n {busy && viewMode === 'list' && (\n <div className=\"space-y-2\">\n {Array.from({ length: 6 }, (_, i) => <Skeleton key={i} className=\"h-10 w-full\" />)}\n </div>\n )}\n\n {!busy && viewMode === 'board' && (\n <BoardView\n startDate={boardStart}\n weeksCount={weeksCount}\n postsByWeek={postsByWeek}\n onOpenPost={onOpenPost}\n onNewPost={(w) => void createPost(w)}\n onDeletePost={setPendingDeleteId}\n onDropPost={(id, w) => void movePost(id, w)}\n disabled={!hasAccount}\n />\n )}\n {!busy && viewMode === 'calendar' && (\n <CalendarView\n posts={posts}\n onOpenPost={onOpenPost}\n onNewPostAt={(iso) => void createPostAt(iso)}\n disabled={!hasAccount}\n />\n )}\n {!busy && viewMode === 'list' && <ListView posts={posts} onOpenPost={onOpenPost} />}\n\n <PlanBriefSheet open={briefOpen} onClose={() => setBriefOpen(false)} />\n\n <ConfirmDialog\n open={!!pendingDeleteId}\n variant=\"destructive\"\n title={t('marketing.content.deletePost')}\n description={t('marketing.content.deletePostConfirm')}\n confirmLabel={t('marketing.content.deletePost')}\n cancelLabel={t('marketing.content.cancel')}\n onCancel={() => setPendingDeleteId(null)}\n onConfirm={() => {\n const id = pendingDeleteId\n setPendingDeleteId(null)\n if (id) void deletePost(id)\n }}\n />\n </div>\n )\n}\n","import { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Media asset upload for content posts (static art, covers). Public bucket\n// `mkt-media` (created by migration 003); path content/{tenantId}/{postId}-{ts}.{ext}\n// so re-uploads never collide and old URLs keep resolving until replaced.\n// ---------------------------------------------------------------------------\n\nexport function canUploadMedia(): boolean {\n return !!getSupabaseClientOptional()\n}\n\nexport async function uploadPostMedia(postId: string, file: File): Promise<string> {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n const tenantId = getActiveTenantId()\n if (!tenantId) throw new Error('No active tenant')\n\n const ext = file.name.split('.').pop()?.toLowerCase() ?? 'bin'\n const path = `content/${tenantId}/${postId}-${Date.now()}.${ext}`\n const { error } = await supabase.storage.from('mkt-media').upload(path, file, { upsert: true })\n if (error) throw error\n const { data } = supabase.storage.from('mkt-media').getPublicUrl(path)\n return data.publicUrl as string\n}\n","import React from 'react'\nimport { Plus, Sparkles, X } from 'lucide-react'\nimport { Button, Checkbox, Input, cn } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { ChecklistItem, ContentPost } from '../../data/contentTypes'\nimport { useContentPlannerStore } from './ContentPlannerContext'\n\n// ---------------------------------------------------------------------------\n// Recording-day checklist — the on-set companion inside the post's aside\n// panel (ContentSplit). Mobile-first: big touch targets, every change persists\n// immediately (the crew checks items off from a phone between takes).\n// \"Generate from script\" seeds one item per `## TAKE …` heading.\n// ---------------------------------------------------------------------------\n\nfunction newId(): string {\n return typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `ck-${Date.now()}-${Math.floor(Math.random() * 1e6)}`\n}\n\nexport function RecordingChecklist({ post }: { post: ContentPost }) {\n const t = useTranslation()\n const savePost = useContentPlannerStore((s) => s.savePost)\n const [items, setItems] = React.useState<ChecklistItem[]>(post.checklist)\n const [text, setText] = React.useState('')\n\n // Re-sync when navigating between posts\n React.useEffect(() => {\n setItems(post.checklist)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [post.id])\n\n const persist = (next: ChecklistItem[]) => {\n setItems(next)\n void savePost({ id: post.id, checklist: next })\n }\n\n const toggle = (id: string) =>\n persist(items.map((i) => (i.id === id ? { ...i, done: !i.done } : i)))\n\n const remove = (id: string) => persist(items.filter((i) => i.id !== id))\n\n const add = () => {\n const value = text.trim()\n if (!value) return\n persist([...items, { id: newId(), text: value, done: false }])\n setText('')\n }\n\n const generateFromScript = () => {\n const takes = [...post.contentMd.matchAll(/^##\\s+(TAKE\\s+.+)$/gim)].map((m) =>\n m[1].trim(),\n )\n const existing = new Set(items.map((i) => i.text))\n const fresh = takes\n .filter((take) => !existing.has(take))\n .map((take) => ({ id: newId(), text: take, done: false }))\n if (fresh.length > 0) persist([...items, ...fresh])\n }\n\n const hasTakes = /^##\\s+TAKE\\s+/im.test(post.contentMd)\n const done = items.filter((i) => i.done).length\n\n return (\n <div className=\"space-y-3\">\n {items.length > 0 && (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span>{done}/{items.length}</span>\n {hasTakes && (\n <button\n type=\"button\"\n onClick={generateFromScript}\n className=\"flex items-center gap-1 font-medium text-muted-foreground transition-colors hover:text-foreground\"\n >\n <Sparkles className=\"h-3 w-3\" />\n {t('marketing.content.checklistGenerate')}\n </button>\n )}\n </div>\n <div className=\"h-1 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full rounded-full bg-primary transition-[width]\"\n style={{ width: items.length ? `${(done / items.length) * 100}%` : 0 }}\n />\n </div>\n </div>\n )}\n\n {items.length === 0 && (\n <div className=\"space-y-3 rounded-card border border-dashed border-border p-3 text-center\">\n <p className=\"text-xs text-muted-foreground\">\n {t('marketing.content.checklistEmpty')}\n </p>\n {hasTakes && (\n <Button variant=\"outline\" size=\"sm\" onClick={generateFromScript}>\n <Sparkles className=\"mr-1.5 h-3.5 w-3.5\" />\n {t('marketing.content.checklistGenerate')}\n </Button>\n )}\n </div>\n )}\n\n <ul className=\"space-y-1\">\n {items.map((item) => (\n <li key={item.id} className=\"group/item flex items-start gap-2.5 rounded-button px-1 py-2 transition-colors hover:bg-muted/40\">\n {/* label wraps the row → the whole line is the touch target */}\n <label className=\"flex min-w-0 flex-1 cursor-pointer items-start gap-2.5\">\n <Checkbox checked={item.done} onChange={() => toggle(item.id)} className=\"mt-0.5\" />\n <span\n className={cn(\n 'min-w-0 flex-1 text-sm leading-snug',\n item.done ? 'text-muted-foreground line-through' : 'text-foreground',\n )}\n >\n {item.text}\n </span>\n </label>\n <button\n type=\"button\"\n aria-label={t('marketing.content.cancel')}\n onClick={() => remove(item.id)}\n className=\"rounded p-0.5 text-muted-foreground/50 opacity-0 transition-opacity hover:text-destructive group-hover/item:opacity-100 focus:opacity-100\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </li>\n ))}\n </ul>\n\n <div className=\"flex items-center gap-2\">\n <Input\n value={text}\n onChange={(e) => setText(e.target.value)}\n placeholder={t('marketing.content.checklistAddPlaceholder')}\n onKeyDown={(e) => { if (e.key === 'Enter') add() }}\n className=\"h-8 text-sm\"\n />\n <Button variant=\"outline\" size=\"sm\" onClick={add} disabled={!text.trim()} aria-label={t('marketing.content.checklistAdd')}>\n <Plus className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport {\n Heart, MessageCircle, Send, Bookmark, MoreHorizontal, ThumbsUp, Share2,\n Repeat2, BarChart2, Image as ImageIcon, Globe,\n} from 'lucide-react'\nimport { cn } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { PlatformIcon } from '../../components/icons'\n\n// ---------------------------------------------------------------------------\n// Social post preview — the caption \"Visualizar\" mode renders the post the way\n// the platform will show it (asset + caption + action row). One tab per\n// selected platform; Instagram is the frame for look-alikes (TikTok/Threads/\n// Pinterest/YouTube get their own frames in a later pass).\n// ---------------------------------------------------------------------------\n\ninterface PreviewProps {\n caption: string\n mediaUrl?: string\n accountName: string\n accountHandle?: string\n platforms: string[]\n}\n\n/** Captions are plain text on every network — strip the markdown skeleton. */\nfunction toCaption(md: string): string {\n return md\n .replace(/^#+\\s*/gm, '')\n .replace(/\\*\\*/g, '')\n .replace(/^[-*]\\s+/gm, '')\n .trim()\n}\n\nfunction isVideo(url?: string): boolean {\n return !!url && /\\.(mp4|webm|mov)($|\\?)/i.test(url)\n}\n\nfunction Media({ mediaUrl, className }: { mediaUrl?: string; className?: string }) {\n if (!mediaUrl) {\n return (\n <div className={cn('flex aspect-square w-full items-center justify-center bg-muted/40', className)}>\n <ImageIcon className=\"h-8 w-8 text-muted-foreground/40\" />\n </div>\n )\n }\n return isVideo(mediaUrl) ? (\n <video src={mediaUrl} controls className={cn('w-full bg-black object-contain', className)} />\n ) : (\n <img src={mediaUrl} alt=\"\" className={cn('w-full object-cover', className)} />\n )\n}\n\nfunction Avatar({ name, ring }: { name: string; ring?: boolean }) {\n return (\n <span\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-muted text-xs font-semibold text-foreground',\n ring && 'ring-2 ring-offset-2 ring-pink-500/60',\n )}\n >\n {(name.replace(/^@/, '')[0] ?? '?').toUpperCase()}\n </span>\n )\n}\n\nfunction InstagramFrame({ caption, mediaUrl, accountName, accountHandle }: PreviewProps) {\n const t = useTranslation()\n const handle = (accountHandle || accountName).replace(/^@/, '')\n return (\n <div className=\"mx-auto w-full max-w-sm overflow-hidden rounded-card border border-border bg-card\">\n <div className=\"flex items-center gap-2.5 px-3 py-2.5\">\n <Avatar name={handle} ring />\n <span className=\"flex-1 truncate text-sm font-semibold text-foreground\">{handle}</span>\n <MoreHorizontal className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n <Media mediaUrl={mediaUrl} />\n <div className=\"space-y-2 px-3 py-2.5\">\n <div className=\"flex items-center gap-4 text-foreground\">\n <Heart className=\"h-6 w-6\" />\n <MessageCircle className=\"h-6 w-6\" />\n <Send className=\"h-6 w-6\" />\n <Bookmark className=\"ml-auto h-6 w-6\" />\n </div>\n <p className=\"whitespace-pre-wrap text-sm leading-snug text-foreground\">\n <span className=\"mr-1.5 font-semibold\">{handle}</span>\n {toCaption(caption)}\n </p>\n <p className=\"text-[11px] uppercase tracking-wide text-muted-foreground\">\n {t('marketing.content.previewNow')}\n </p>\n </div>\n </div>\n )\n}\n\nfunction FacebookFrame({ caption, mediaUrl, accountName }: PreviewProps) {\n const t = useTranslation()\n return (\n <div className=\"mx-auto w-full max-w-sm overflow-hidden rounded-card border border-border bg-card\">\n <div className=\"flex items-center gap-2.5 px-3 py-2.5\">\n <Avatar name={accountName} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold text-foreground\">{accountName.replace(/^@/, '')}</p>\n <p className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n {t('marketing.content.previewNow')} · <Globe className=\"h-3 w-3\" />\n </p>\n </div>\n <MoreHorizontal className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n <p className=\"whitespace-pre-wrap px-3 pb-2.5 text-sm leading-snug text-foreground\">{toCaption(caption)}</p>\n <Media mediaUrl={mediaUrl} className=\"aspect-auto\" />\n <div className=\"flex items-center justify-around border-t border-border px-3 py-2 text-muted-foreground\">\n <span className=\"flex items-center gap-1.5 text-xs font-medium\"><ThumbsUp className=\"h-4 w-4\" /> {t('marketing.content.previewLike')}</span>\n <span className=\"flex items-center gap-1.5 text-xs font-medium\"><MessageCircle className=\"h-4 w-4\" /> {t('marketing.content.previewComment')}</span>\n <span className=\"flex items-center gap-1.5 text-xs font-medium\"><Share2 className=\"h-4 w-4\" /> {t('marketing.content.previewShare')}</span>\n </div>\n </div>\n )\n}\n\nfunction LinkedinFrame({ caption, mediaUrl, accountName }: PreviewProps) {\n const t = useTranslation()\n return (\n <div className=\"mx-auto w-full max-w-sm overflow-hidden rounded-card border border-border bg-card\">\n <div className=\"flex items-center gap-2.5 px-3 py-2.5\">\n <Avatar name={accountName} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold text-foreground\">{accountName.replace(/^@/, '')}</p>\n <p className=\"text-xs text-muted-foreground\">{t('marketing.content.previewNow')}</p>\n </div>\n </div>\n <p className=\"whitespace-pre-wrap px-3 pb-2.5 text-sm leading-snug text-foreground\">{toCaption(caption)}</p>\n <Media mediaUrl={mediaUrl} className=\"aspect-auto\" />\n <div className=\"flex items-center justify-around border-t border-border px-3 py-2 text-muted-foreground\">\n <ThumbsUp className=\"h-4 w-4\" />\n <MessageCircle className=\"h-4 w-4\" />\n <Repeat2 className=\"h-4 w-4\" />\n <Send className=\"h-4 w-4\" />\n </div>\n </div>\n )\n}\n\nfunction XFrame({ caption, mediaUrl, accountName, accountHandle }: PreviewProps) {\n const t = useTranslation()\n const handle = (accountHandle || accountName).replace(/^@/, '')\n return (\n <div className=\"mx-auto w-full max-w-sm rounded-card border border-border bg-card p-3\">\n <div className=\"flex gap-2.5\">\n <Avatar name={handle} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm text-foreground\">\n <span className=\"font-semibold\">{accountName.replace(/^@/, '')}</span>\n <span className=\"text-muted-foreground\"> @{handle} · {t('marketing.content.previewNow')}</span>\n </p>\n <p className=\"mt-0.5 whitespace-pre-wrap text-sm leading-snug text-foreground\">{toCaption(caption)}</p>\n <div className=\"mt-2 overflow-hidden rounded-xl border border-border\">\n <Media mediaUrl={mediaUrl} className=\"aspect-auto\" />\n </div>\n <div className=\"mt-2 flex items-center justify-between pr-6 text-muted-foreground\">\n <MessageCircle className=\"h-4 w-4\" />\n <Repeat2 className=\"h-4 w-4\" />\n <Heart className=\"h-4 w-4\" />\n <BarChart2 className=\"h-4 w-4\" />\n <Share2 className=\"h-4 w-4\" />\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nconst FRAMES: Record<string, React.ComponentType<PreviewProps>> = {\n instagram: InstagramFrame,\n facebook: FacebookFrame,\n linkedin: LinkedinFrame,\n x: XFrame,\n}\n\nexport function PostSocialPreview(props: PreviewProps) {\n const platforms = props.platforms.length > 0 ? props.platforms : ['instagram']\n const [selected, setSelected] = React.useState(platforms[0])\n const active = platforms.includes(selected) ? selected : platforms[0]\n const Frame = FRAMES[active] ?? InstagramFrame\n\n return (\n <div className=\"space-y-3 rounded-md border border-border bg-muted/20 p-4\">\n {platforms.length > 1 && (\n <div className=\"flex items-center justify-center gap-1\">\n {platforms.map((platform) => (\n <button\n key={platform}\n type=\"button\"\n onClick={() => setSelected(platform)}\n aria-pressed={active === platform}\n className={cn(\n 'flex items-center gap-1.5 rounded-button px-2.5 py-1.5 text-xs font-medium capitalize transition-colors',\n active === platform\n ? 'bg-card text-foreground shadow-button'\n : 'text-muted-foreground hover:text-foreground',\n )}\n >\n <PlatformIcon platform={platform} className=\"h-3.5 w-3.5\" />\n {platform}\n </button>\n ))}\n </div>\n )}\n <Frame {...props} />\n </div>\n )\n}\n","import type { PostFormat } from '../../data/contentTypes'\n\n// ---------------------------------------------------------------------------\n// Default markdown scaffolds inserted when a post's page is still empty.\n// The section headers follow the script format clinics/creators actually use\n// (hook-first reels, on-screen text + spoken line per take). Body text is user\n// content, so it ships in pt-BR — the product's first content-planner users.\n// ---------------------------------------------------------------------------\n\nconst reel = (title: string) => `# ${title}\n\n**TEMA:** ${title.toUpperCase()}\n**Formato:** Reel · **Duração:** 45 a 60 segundos\n\n---\n\n## TAKE 1 – GANCHO (0s a 5s)\n\n*Direção de cena: olhando para a câmera, energia alta.*\n\n**Texto na tela:** …\n\n**Fala:** \"…\"\n\n---\n\n## TAKE 2 – DESENVOLVIMENTO (5s a 40s)\n\n*Direção de cena: …*\n\n**Texto na tela:** …\n\n**Fala:** \"…\"\n\n---\n\n## TAKE 3 – CTA (40s a 60s)\n\n**Fala:** \"…\"\n\n**CTA:** …\n`\n\nconst staticPost = (title: string) => `# ${title}\n\n**TEMA:** ${title.toUpperCase()}\n**Formato:** Estático\n\n## Texto da arte\n\n…\n\n## Legenda\n\n…\n\n**CTA:** …\n`\n\nconst carousel = (title: string) => `# ${title}\n\n**TEMA:** ${title.toUpperCase()}\n**Formato:** Carrossel\n\n## Slide 1 — Capa (gancho)\n\n…\n\n## Slide 2\n\n…\n\n## Slide 3\n\n…\n\n## Último slide — CTA\n\n…\n`\n\nconst story = (title: string) => `# ${title}\n\n**TEMA:** ${title.toUpperCase()}\n**Formato:** Story\n\n## Frame 1\n\n…\n\n## Frame 2\n\n…\n\n## Frame final — CTA\n\n*Sticker de link / caixa de pergunta / enquete.*\n\n…\n`\n\nconst video = (title: string) => `# ${title}\n\n**TEMA:** ${title.toUpperCase()}\n**Formato:** Vídeo longo (YouTube) · **Duração:** 8 a 12 minutos\n\n## Gancho (0s a 30s)\n\n…\n\n## Roteiro por blocos\n\n### Bloco 1 — Contexto\n\n…\n\n### Bloco 2 — Desenvolvimento\n\n…\n\n### Bloco 3 — Fechamento\n\n…\n\n**CTA:** inscreva-se / comente / link na descrição\n`\n\nconst live = (title: string) => `# ${title}\n\n**TEMA:** ${title.toUpperCase()}\n**Formato:** Live\n\n## Pauta\n\n1. Abertura e aquecimento (5 min)\n2. …\n3. Perguntas e respostas (15 min)\n\n## Avisos / CTAs durante a live\n\n…\n`\n\nconst article = (title: string) => `# ${title}\n\n**TEMA:** ${title.toUpperCase()}\n**Formato:** Artigo / Newsletter\n\n## Título de trabalho\n\n…\n\n## Estrutura\n\n- Abertura (dor / promessa)\n- Desenvolvimento em 3 pontos\n- Conclusão + CTA\n\n## Rascunho\n\n…\n`\n\nexport const POST_TEMPLATES: Record<PostFormat, (title: string) => string> = {\n reel,\n static: staticPost,\n carousel,\n story,\n video,\n live,\n article,\n}\n","import React from 'react'\nimport { ImagePlus, Loader2, X } from 'lucide-react'\nimport {\n Button, Input, MarkdownEditor, SubpageHeader, ConfirmDialog, Skeleton,\n ContentSplit, ContentSplitTrigger,\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { canUploadMedia, uploadPostMedia } from '../../data/contentMedia'\nimport { RecordingChecklist } from './RecordingChecklist'\nimport { PostSocialPreview } from './PostSocialPreview'\nimport type { ContentPost, PostFormat, PostStatus } from '../../data/contentTypes'\nimport { useContentPlannerProvider, useContentPlannerStore } from './ContentPlannerContext'\nimport { POST_FORMATS, POST_STATUS_ORDER, PlatformPicker, StatusDot } from './contentBits'\nimport { POST_TEMPLATES } from './templates'\n\n// ---------------------------------------------------------------------------\n// Post page — the Notion-style page behind each board card: title, a compact\n// meta row (format / status / date / hook / CTA) and the markdown script body.\n// ---------------------------------------------------------------------------\n\nfunction MediaAsset({ post, onChanged }: {\n post: ContentPost\n onChanged: (mediaUrl: string | null) => void\n}) {\n const t = useTranslation()\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [busy, setBusy] = React.useState(false)\n const isVideo = post.mediaUrl ? /\\.(mp4|webm|mov)($|\\?)/i.test(post.mediaUrl) : false\n\n const pick = () => inputRef.current?.click()\n\n const upload = async (file: File) => {\n setBusy(true)\n try {\n const url = await uploadPostMedia(post.id, file)\n onChanged(url)\n } finally {\n setBusy(false)\n }\n }\n\n if (!canUploadMedia()) {\n return <p className=\"text-xs text-muted-foreground\">{t('marketing.content.mediaUnavailable')}</p>\n }\n\n return (\n <div className=\"space-y-2\">\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*,video/*\"\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n if (file) void upload(file)\n e.target.value = ''\n }}\n />\n {post.mediaUrl ? (\n <div className=\"relative overflow-hidden rounded-card border border-border bg-muted/20\">\n {isVideo ? (\n <video src={post.mediaUrl} controls className=\"max-h-72 w-full object-contain\" />\n ) : (\n <img src={post.mediaUrl} alt=\"\" className=\"max-h-72 w-full object-contain\" />\n )}\n <div className=\"flex items-center justify-end gap-2 border-t border-border p-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={pick} disabled={busy}>\n {busy ? <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" /> : <ImagePlus className=\"mr-1.5 h-3.5 w-3.5\" />}\n {t('marketing.content.mediaReplace')}\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => onChanged(null)} disabled={busy}>\n <X className=\"mr-1 h-3.5 w-3.5\" />\n {t('marketing.content.mediaRemove')}\n </Button>\n </div>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={pick}\n disabled={busy}\n className=\"flex w-full flex-col items-center justify-center gap-2 rounded-card border border-dashed border-border p-6 text-muted-foreground transition-colors hover:bg-muted/30 hover:text-foreground\"\n >\n {busy ? <Loader2 className=\"h-5 w-5 animate-spin\" /> : <ImagePlus className=\"h-5 w-5\" />}\n <span className=\"text-sm font-medium\">{t('marketing.content.mediaUpload')}</span>\n <span className=\"text-xs\">{t('marketing.content.mediaHint')}</span>\n </button>\n )}\n </div>\n )\n}\n\ninterface Draft {\n title: string\n format: PostFormat\n status: PostStatus\n scheduledDate: string\n platforms: string[]\n hook: string\n cta: string\n contentMd: string\n}\n\nfunction toDraft(post: ContentPost): Draft {\n return {\n title: post.title,\n format: post.format,\n status: post.status,\n scheduledDate: post.scheduledDate ?? '',\n platforms: post.platforms,\n hook: post.hook ?? '',\n cta: post.cta ?? '',\n contentMd: post.contentMd,\n }\n}\n\nexport function PostPage({ postId, onBack }: { postId: string; onBack: () => void }) {\n const t = useTranslation()\n const provider = useContentPlannerProvider()\n const storePost = useContentPlannerStore((s) => s.posts.find((p) => p.id === postId))\n const savePost = useContentPlannerStore((s) => s.savePost)\n const deletePost = useContentPlannerStore((s) => s.deletePost)\n const accounts = useContentPlannerStore((s) => s.accounts)\n const activeAccountId = useContentPlannerStore((s) => s.activeAccountId)\n\n const [post, setPost] = React.useState<ContentPost | null>(storePost ?? null)\n const [draft, setDraft] = React.useState<Draft | null>(storePost ? toDraft(storePost) : null)\n const [saving, setSaving] = React.useState(false)\n const [confirmDelete, setConfirmDelete] = React.useState(false)\n\n // Deep links land here before the board loaded the plan — fetch directly.\n React.useEffect(() => {\n if (post?.id === postId) return\n if (storePost) {\n setPost(storePost)\n setDraft(toDraft(storePost))\n return\n }\n void provider.getPost(postId).then((fetched) => {\n if (fetched) {\n setPost(fetched)\n setDraft(toDraft(fetched))\n }\n })\n }, [postId, storePost, post?.id, provider])\n\n if (!post || !draft) {\n return (\n <div className=\"mx-auto max-w-3xl space-y-5\">\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-8 w-56\" />\n <Skeleton className=\"h-8 w-40\" />\n </div>\n <Skeleton className=\"h-10 w-full\" />\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n {Array.from({ length: 3 }, (_, i) => <Skeleton key={i} className=\"h-14\" />)}\n </div>\n <Skeleton className=\"h-64 w-full\" />\n </div>\n )\n }\n\n const dirty =\n draft.title !== post.title ||\n draft.format !== post.format ||\n draft.status !== post.status ||\n draft.scheduledDate !== (post.scheduledDate ?? '') ||\n draft.platforms.join(',') !== post.platforms.join(',') ||\n draft.hook !== (post.hook ?? '') ||\n draft.cta !== (post.cta ?? '') ||\n draft.contentMd !== post.contentMd\n\n const patch = (partial: Partial<Draft>) => setDraft((d) => (d ? { ...d, ...partial } : d))\n\n const save = async () => {\n setSaving(true)\n try {\n const updated = await savePost({\n id: post.id,\n title: draft.title,\n format: draft.format,\n status: draft.status,\n scheduledDate: draft.scheduledDate || null,\n platforms: draft.platforms,\n hook: draft.hook,\n cta: draft.cta,\n contentMd: draft.contentMd,\n })\n setPost(updated)\n setDraft(toDraft(updated))\n } finally {\n setSaving(false)\n }\n }\n\n const insertTemplate = () => {\n patch({ contentMd: POST_TEMPLATES[draft.format](draft.title || t('marketing.content.untitled')) })\n }\n\n const isStatic = draft.format === 'static'\n const account = accounts.find((a) => a.id === activeAccountId) ?? null\n\n // Recording day: the checklist panel starts expanded only when today IS the\n // post's scheduled date — otherwise it waits collapsed in the rail.\n const now = new Date()\n const todayISO = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`\n const isReleaseDay = !!post.scheduledDate && post.scheduledDate === todayISO\n\n const handleMediaChanged = (mediaUrl: string | null) => {\n void savePost({ id: post.id, mediaUrl }).then((updated) => {\n setPost(updated)\n setDraft((d) => (d ? { ...d } : d))\n })\n }\n\n return (\n <ContentSplit\n key={post.id}\n className=\"mx-auto max-w-5xl\"\n aside={<RecordingChecklist post={post} />}\n asideTitle={t('marketing.content.checklistTitle')}\n asideDescription={t('marketing.content.checklistDescription')}\n collapsible\n defaultCollapsed={!isReleaseDay}\n >\n <div className=\"space-y-5\">\n <SubpageHeader\n title={draft.title || t('marketing.content.untitled')}\n parentLabel={t('marketing.content.title')}\n onBack={onBack}\n actions={\n <div className=\"flex items-center gap-2\">\n <ContentSplitTrigger label={t('marketing.content.checklistOpen')} />\n <Button variant=\"outline\" size=\"sm\" onClick={() => setConfirmDelete(true)}>\n {t('marketing.content.deletePost')}\n </Button>\n <Button size=\"sm\" onClick={() => void save()} disabled={!dirty || saving}>\n {t('marketing.content.save')}\n </Button>\n </div>\n }\n />\n\n <Input\n value={draft.title}\n onChange={(e) => patch({ title: e.target.value })}\n placeholder={t('marketing.content.titlePlaceholder')}\n className=\"text-base font-medium\"\n />\n\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('marketing.content.formatLabel')}</label>\n <Select value={draft.format} onValueChange={(v) => patch({ format: v as PostFormat })}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {POST_FORMATS.map((f) => (\n <SelectItem key={f} value={f}>{t(`marketing.content.format.${f}`)}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('marketing.content.statusLabel')}</label>\n <Select value={draft.status} onValueChange={(v) => patch({ status: v as PostStatus })}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {POST_STATUS_ORDER.map((s) => (\n <SelectItem key={s} value={s}>\n <span className=\"flex items-center gap-2\">\n <StatusDot status={s} />\n {t(`marketing.content.status.${s}`)}\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('marketing.content.scheduledDate')}</label>\n <Input\n type=\"date\"\n value={draft.scheduledDate}\n onChange={(e) => patch({ scheduledDate: e.target.value })}\n />\n </div>\n <div className=\"space-y-1 sm:col-span-2\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('marketing.content.hook')}</label>\n <Input\n value={draft.hook}\n onChange={(e) => patch({ hook: e.target.value })}\n placeholder={t('marketing.content.hookPlaceholder')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('marketing.content.cta')}</label>\n <Input\n value={draft.cta}\n onChange={(e) => patch({ cta: e.target.value })}\n placeholder={t('marketing.content.ctaPlaceholder')}\n />\n </div>\n <div className=\"space-y-1 sm:col-span-3\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('marketing.content.platformsLabel')}</label>\n <PlatformPicker value={draft.platforms} onChange={(platforms) => patch({ platforms })} />\n </div>\n </div>\n\n {isStatic && (\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n {t('marketing.content.mediaLabel')}\n </label>\n <MediaAsset post={post} onChanged={handleMediaChanged} />\n </div>\n )}\n\n <div className=\"space-y-1\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n {isStatic ? t('marketing.content.captionLabel') : t('marketing.content.scriptLabel')}\n </label>\n {draft.contentMd.trim() === '' && (\n <Button variant=\"outline\" size=\"sm\" onClick={insertTemplate}>\n {t('marketing.content.insertTemplate')}\n </Button>\n )}\n </div>\n <MarkdownEditor\n value={draft.contentMd}\n onChange={(contentMd) => patch({ contentMd })}\n placeholder={isStatic ? t('marketing.content.captionPlaceholder') : t('marketing.content.bodyPlaceholder')}\n editLabel={t('marketing.content.edit')}\n previewLabel={t('marketing.content.preview')}\n renderPreview={\n isStatic\n ? (value) => (\n <PostSocialPreview\n caption={value}\n mediaUrl={post.mediaUrl}\n accountName={account?.name ?? '@conta'}\n accountHandle={account?.handle}\n platforms={\n draft.platforms.length > 0 ? draft.platforms : account?.platforms ?? []\n }\n />\n )\n : undefined\n }\n />\n </div>\n\n <ConfirmDialog\n open={confirmDelete}\n variant=\"destructive\"\n title={t('marketing.content.deletePost')}\n description={t('marketing.content.deletePostConfirm')}\n confirmLabel={t('marketing.content.deletePost')}\n cancelLabel={t('marketing.content.cancel')}\n onCancel={() => setConfirmDelete(false)}\n onConfirm={() => {\n setConfirmDelete(false)\n void deletePost(post.id).then(onBack)\n }}\n />\n </div>\n </ContentSplit>\n )\n}\n","import type { EntityDef, FieldDef } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Blog backoffice entities — the single source of truth that drives BOTH the\n// generic list (CrudListView columns + facets) and the create/edit form\n// (CrudFormPage fields, incl. the markdown body + category relation).\n//\n// Persistence is the generic Supabase provider resolved from `data.table`\n// (plg_blog_posts / plg_blog_categories, owned by @fayz-ai/plugin-blog's\n// migrations). camelCase field keys map to snake_case columns automatically.\n// The website reads the same rows through the anon v_public_blog_posts view.\n// ---------------------------------------------------------------------------\n\nexport const BLOG_POSTS_TABLE = 'plg_blog_posts'\nexport const BLOG_CATEGORIES_TABLE = 'plg_blog_categories'\n\nexport interface BlogPostRow {\n id: string\n title: string\n slug: string\n excerpt: string\n body: string\n categoryId?: string\n coverImage?: string\n authorName?: string\n authorRole?: string\n authorAvatarUrl?: string\n authorBio?: string\n status: 'draft' | 'published'\n readTime?: string\n publishedAt?: string\n}\n\nexport interface BlogCategoryRow {\n id: string\n name: string\n slug: string\n description?: string\n}\n\nexport function buildBlogPostEntity(): EntityDef<BlogPostRow> {\n const fields: FieldDef[] = [\n { key: 'title', label: 'Title', type: 'text', required: true, searchable: true, showInTable: true, sortable: true },\n { key: 'slug', label: 'Slug', type: 'text', required: true, searchable: true, showInTable: false, hint: 'URL identifier, e.g. \"cannabis-and-oral-health\"' },\n { key: 'status', label: 'Status', type: 'select', options: ['draft', 'published'], showInTable: true, defaultValue: 'draft' },\n { key: 'categoryId', label: 'Category', type: 'relation', relation: { table: BLOG_CATEGORIES_TABLE, valueField: 'id', labelField: 'name', tenantScoped: true }, showInTable: false },\n { key: 'excerpt', label: 'Excerpt', type: 'textarea', span: 2, showInTable: false, placeholder: 'Short summary shown on cards' },\n { key: 'body', label: 'Body', type: 'markdown', span: 2, showInTable: false },\n { key: 'coverImage', label: 'Cover image', type: 'image', showInTable: false, placeholder: 'https://…' },\n { key: 'readTime', label: 'Read time', type: 'text', showInTable: false, placeholder: '5 min' },\n { key: 'publishedAt', label: 'Published at', type: 'date', showInTable: true, sortable: true },\n { key: 'authorName', label: 'Author name', type: 'text', showInTable: false },\n { key: 'authorRole', label: 'Author role', type: 'text', showInTable: false, placeholder: 'e.g. Cirurgião-Dentista' },\n { key: 'authorAvatarUrl', label: 'Author avatar', type: 'image', showInTable: false, placeholder: 'https://…' },\n { key: 'authorBio', label: 'Author bio', type: 'textarea', span: 2, showInTable: false },\n ]\n return {\n name: 'Post',\n namePlural: 'Posts',\n icon: 'Newspaper',\n fields,\n displayField: 'title',\n subtitleField: 'slug',\n facets: [{ field: 'status', allLabel: 'All' }],\n data: {\n table: BLOG_POSTS_TABLE,\n tenantScoped: true,\n searchColumns: ['title', 'slug', 'excerpt'],\n },\n }\n}\n\nexport function buildBlogCategoryEntity(): EntityDef<BlogCategoryRow> {\n const fields: FieldDef[] = [\n { key: 'name', label: 'Name', type: 'text', required: true, searchable: true, showInTable: true, sortable: true },\n { key: 'slug', label: 'Slug', type: 'text', required: true, searchable: true, showInTable: true, hint: 'URL identifier' },\n { key: 'description', label: 'Description', type: 'textarea', span: 2, showInTable: false },\n ]\n return {\n name: 'Category',\n namePlural: 'Categories',\n icon: 'Tags',\n fields,\n displayField: 'name',\n data: {\n table: BLOG_CATEGORIES_TABLE,\n tenantScoped: true,\n searchColumns: ['name', 'slug'],\n },\n }\n}\n","import { useMemo, useState, useCallback } from 'react'\nimport { resolveDataProvider } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\ninterface ListQuery {\n search?: string\n filters?: Record<string, unknown>\n page?: number\n pageSize?: number\n sortBy?: string\n sortDir?: 'asc' | 'desc'\n}\n\n/**\n * Minimal store-less CRUD wiring for a plugin that owns its data + routing.\n * Resolves the generic Supabase provider from the EntityDef's `data.table`\n * (mock fallback when Supabase is not configured) and exposes list/get/save/\n * remove. Used by the blog backoffice list + form views — the heavy list/form\n * rendering stays in the shared CrudListView / CrudFormPage.\n */\nexport function useEntityCrud<T extends { id: string }>(entity: EntityDef<T>) {\n const provider = useMemo(() => resolveDataProvider<T>(entity), [entity])\n const [items, setItems] = useState<T[] | null>(null)\n const [total, setTotal] = useState(0)\n\n const fetch = useCallback(async (query: ListQuery = {}) => {\n try {\n const res = await provider.list(query as any)\n setItems(res.data)\n setTotal(res.total)\n } catch (err) {\n // Table not provisioned yet (migration not applied to this pool) or a\n // transient error — surface an empty list instead of a perpetual skeleton.\n console.warn('[blog] list failed; showing empty. Apply the plugin-blog migration to this pool.', err)\n setItems([])\n setTotal(0)\n }\n }, [provider])\n\n const getById = useCallback(async (id: string): Promise<T | null> => {\n const res = await provider.list({ filters: { id }, page: 1, pageSize: 1 } as any)\n return res.data[0] ?? null\n }, [provider])\n\n const create = useCallback((data: Record<string, unknown>) => provider.create(data as any), [provider])\n const update = useCallback((id: string, data: Record<string, unknown>) => provider.update(id, data as any), [provider])\n const remove = useCallback((id: string) => provider.remove(id), [provider])\n\n return { items, total, fetch, getById, create, update, remove }\n}\n","import React, { useEffect, useMemo, useState } from 'react'\nimport { CrudListView } from '@fayz-ai/saas'\nimport { SegmentedControl } from '@fayz-ai/ui'\nimport { useMarketingConfig } from '../../MarketingContext'\nimport { buildBlogPostEntity, buildBlogCategoryEntity } from '../../data/blogEntities'\nimport { useEntityCrud } from './useEntityCrud'\n\n// ---------------------------------------------------------------------------\n// Blog backoffice — an in-page marketing tab with two lenses (Posts /\n// Categories), each a generic CrudListView backed by the blog tables. Follows\n// the content-planner pattern: this plugin owns the data + routing; create/edit\n// deep-link through the marketing module nav (navigate('blog-post:id') etc.).\n// ---------------------------------------------------------------------------\n\nfunction PostsList({ navigate }: { navigate: (view: string) => void }) {\n const entity = useMemo(() => buildBlogPostEntity(), [])\n const { items, total, fetch } = useEntityCrud(entity)\n const [search, setSearch] = useState('')\n const [statusFilter, setStatusFilter] = useState<string | undefined>()\n const [loadedOnce, setLoadedOnce] = useState(false)\n\n useEffect(() => {\n let active = true\n Promise.resolve(\n fetch({ search: search || undefined, filters: statusFilter ? { status: statusFilter } : undefined }),\n ).finally(() => { if (active) setLoadedOnce(true) })\n return () => { active = false }\n }, [search, statusFilter, fetch])\n\n const facets = useMemo(() => [{\n field: 'status',\n allLabel: 'All',\n options: [{ value: 'draft', label: 'Draft' }, { value: 'published', label: 'Published' }],\n }], [])\n\n return (\n <CrudListView\n entityDef={entity}\n items={loadedOnce ? items : null}\n total={total}\n search={search}\n onSearchChange={setSearch}\n searchPlaceholder=\"Search posts…\"\n facets={facets}\n activeFilters={{ status: statusFilter }}\n onFacetChange={(_field, value) => setStatusFilter(value)}\n onNew={() => navigate('blog-new')}\n addLabel=\"New post\"\n onRowClick={(row) => navigate(`blog-post:${(row as { id: string }).id}`)}\n />\n )\n}\n\nfunction CategoriesList({ navigate }: { navigate: (view: string) => void }) {\n const entity = useMemo(() => buildBlogCategoryEntity(), [])\n const { items, total, fetch } = useEntityCrud(entity)\n const [search, setSearch] = useState('')\n const [loadedOnce, setLoadedOnce] = useState(false)\n\n useEffect(() => {\n let active = true\n Promise.resolve(fetch({ search: search || undefined })).finally(() => { if (active) setLoadedOnce(true) })\n return () => { active = false }\n }, [search, fetch])\n\n return (\n <CrudListView\n entityDef={entity}\n items={loadedOnce ? items : null}\n total={total}\n search={search}\n onSearchChange={setSearch}\n searchPlaceholder=\"Search categories…\"\n onNew={() => navigate('blog-cat-new')}\n addLabel=\"New category\"\n onRowClick={(row) => navigate(`blog-cat:${(row as { id: string }).id}`)}\n />\n )\n}\n\nexport function BlogAdminView({ navigate }: { navigate: (view: string) => void }) {\n const { labels } = useMarketingConfig()\n const [lens, setLens] = useState<'posts' | 'categories'>('posts')\n\n return (\n <div className=\"space-y-4\">\n <SegmentedControl\n aria-label=\"Blog section\"\n options={[\n { value: 'posts', label: labels.blog },\n { value: 'categories', label: labels.blogCategories },\n ]}\n value={lens}\n onChange={(v) => setLens(v as 'posts' | 'categories')}\n />\n {lens === 'posts' ? <PostsList navigate={navigate} /> : <CategoriesList navigate={navigate} />}\n </div>\n )\n}\n","import React from 'react'\nimport { SubpageHeader, Button, toast } from '@fayz-ai/ui'\nimport { CrudFormPage, useLimitGuard, invalidateLimit } from '@fayz-ai/saas'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { useEntityCrud } from './useEntityCrud'\nimport { BLOG_POSTS_TABLE } from '../../data/blogEntities'\n\n// ---------------------------------------------------------------------------\n// Generic create/edit for a blog entity (post or category), rendered through\n// the shared CrudFormPage (declarative EntityDef → fields, incl. the markdown\n// body + category relation). Persistence flows through the generic Supabase\n// provider; this only wires load / save / delete + the back link.\n// ---------------------------------------------------------------------------\n\nexport function BlogEntityForm<T extends { id: string }>({\n entity,\n editId,\n parentLabel,\n onDone,\n}: {\n entity: EntityDef<T>\n editId?: string\n parentLabel: string\n onDone: () => void\n}) {\n const { getById, create, update, remove } = useEntityCrud(entity)\n const isEdit = !!editId\n // Plan quantity guard applies to blog POSTS only (categories are unbounded).\n const isPost = (entity as { data?: { table?: string } }).data?.table === BLOG_POSTS_TABLE\n const guardBlogPosts = useLimitGuard('blog_posts')\n const namePlural = entity.namePlural ?? entity.name + 's'\n const [initialData, setInitialData] = React.useState<Record<string, any> | null>(isEdit ? null : {})\n\n React.useEffect(() => {\n if (!editId) return\n let cancelled = false\n ;(async () => {\n const item = await getById(editId)\n if (!cancelled) setInitialData((item as Record<string, any>) ?? {})\n })()\n return () => { cancelled = true }\n }, [editId, getById])\n\n async function save(values: Record<string, any>) {\n // Client-side plan guard before the provider create — posts only, on create.\n if (!isEdit && isPost && (await guardBlogPosts()) === 'blocked') return\n try {\n if (isEdit) await update(editId!, values)\n else {\n await create(values)\n if (isPost) invalidateLimit('blog_posts')\n }\n toast.success(isEdit ? `${entity.name} updated` : `${entity.name} created`)\n onDone()\n } catch (err) {\n toast.error(`Failed to save ${entity.name.toLowerCase()}`)\n throw err\n }\n }\n\n async function del() {\n if (!editId) return\n try {\n await remove(editId)\n toast.success(`${entity.name} deleted`)\n onDone()\n } catch {\n toast.error(`Failed to delete ${entity.name.toLowerCase()}`)\n }\n }\n\n const title = isEdit\n ? (initialData?.[entity.displayField ?? 'name'] ?? entity.name)\n : `New ${entity.name.toLowerCase()}`\n\n return (\n <div className=\"space-y-4\">\n <SubpageHeader\n title={String(title)}\n onBack={onDone}\n parentLabel={parentLabel}\n actions={isEdit ? (\n <Button variant=\"ghost\" className=\"text-destructive hover:text-destructive\" onClick={del}>\n Delete\n </Button>\n ) : undefined}\n />\n {initialData !== null && (\n <CrudFormPage\n entityDef={entity}\n mode={isEdit ? 'edit' : 'create'}\n initialData={initialData}\n namePlural={namePlural}\n onCancel={onDone}\n onSubmit={save}\n hideBreadcrumb\n />\n )}\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, useDataChanged } 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 { ContentPlannerProvider } from './data/contentTypes'\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'\nimport { ContentPlannerContextProvider } from './views/content/ContentPlannerContext'\nimport type { ContentPlannerUIState } from './views/content/contentStore'\nimport { ContentView } from './views/content/ContentView'\nimport { PostPage } from './views/content/PostPage'\nimport { PlanBriefView } from './views/content/PlanBriefView'\nimport { BlogAdminView } from './views/blog/BlogAdminView'\nimport { BlogEntityForm } from './views/blog/BlogEntityForm'\nimport { buildBlogPostEntity, buildBlogCategoryEntity } from './data/blogEntities'\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 if (config.modules.contentPlanner) {\n items.push({\n id: 'content', label: config.labels.content, icon: 'Clapperboard',\n active: view === 'content' || view === 'content-brief' || view.startsWith('content-post:'),\n onClick: () => navigate('content'),\n })\n }\n if (config.modules.blog) {\n items.push({\n id: 'blog', label: config.labels.blog, icon: 'Newspaper',\n active: view === 'blog' || view === 'blog-new' || view.startsWith('blog-post:')\n || view === 'blog-cat-new' || view.startsWith('blog-cat:'),\n onClick: () => navigate('blog'),\n })\n }\n return items\n}\n\nexport function MarketingPage({ config, provider, store, contentProvider, contentStore }: {\n config: ResolvedMarketingConfig\n provider: MarketingDataProvider\n store: StoreApi<MarketingUIState>\n contentProvider: ContentPlannerProvider\n contentStore: StoreApi<ContentPlannerUIState>\n}) {\n const t = useTranslation()\n const { view, direction, navigate } = useModuleNavigation('/marketing', {\n overview: 0, channels: 0, campaigns: 0, funnel: 0, 'landing-pages': 0, content: 0, blog: 0,\n 'channel-detail': 1, 'content-post': 1, 'content-brief': 1,\n 'blog-new': 1, 'blog-post': 1, 'blog-cat-new': 1, 'blog-cat': 1,\n }, 'overview')\n\n React.useEffect(() => { void store.getState().load() }, [store])\n\n // Agent RPC writes (createCampaign) land outside the provider — refresh past\n // its read cache when any agent write is announced.\n useDataChanged({ table: 'plg_marketing_campaigns' }, () => { void store.getState().refresh() }, [store])\n\n const isOverview = view === 'overview'\n const nav = buildNav(config, view, navigate)\n\n // Blog backoffice entities — one shared EntityDef each drives the list + form.\n const blogPostEntity = React.useMemo(() => buildBlogPostEntity(), [])\n const blogCategoryEntity = React.useMemo(() => buildBlogCategoryEntity(), [])\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: 'content', render: () => <ContentView onOpenPost={(id) => navigate(`content-post:${id}`)} /> },\n { id: 'content-post', render: ({ id }) => <PostPage postId={id!} onBack={() => navigate('content')} /> },\n { id: 'content-brief', render: () => <PlanBriefView onBack={() => navigate('content')} /> },\n { id: 'blog', render: () => <BlogAdminView navigate={navigate} /> },\n { id: 'blog-new', render: () => <BlogEntityForm entity={blogPostEntity} parentLabel={config.labels.blog} onDone={() => navigate('blog')} /> },\n { id: 'blog-post', render: ({ id }) => <BlogEntityForm entity={blogPostEntity} editId={id!} parentLabel={config.labels.blog} onDone={() => navigate('blog')} /> },\n { id: 'blog-cat-new', render: () => <BlogEntityForm entity={blogCategoryEntity} parentLabel={config.labels.blogCategories} onDone={() => navigate('blog')} /> },\n { id: 'blog-cat', render: ({ id }) => <BlogEntityForm entity={blogCategoryEntity} editId={id!} parentLabel={config.labels.blogCategories} onDone={() => navigate('blog')} /> },\n { id: 'overview', render: () => <OverviewView /> },\n ], 'overview')\n\n return (\n <MarketingContextProvider config={config} provider={provider} store={store}>\n <ContentPlannerContextProvider config={config} provider={contentProvider} store={contentStore}>\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 </ContentPlannerContextProvider>\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","// Physical table names for the marketing plugin (plg_marketing_* prefix). Import T\n// and reference T.<key> in the data providers so a rename lands in one place.\nexport const T = {\n socialAccounts: 'plg_marketing_social_accounts',\n contentPlans: 'plg_marketing_content_plans',\n contentPosts: 'plg_marketing_content_posts',\n channels: 'plg_marketing_channels',\n campaigns: 'plg_marketing_campaigns',\n} as const\n\n// Read views (bridge views over spine + plugin tables; see 006_analytics_views.sql)\nexport const V = {\n channels: 'v_marketing_channels',\n campaigns: 'v_marketing_campaigns',\n attribution: 'v_marketing_attribution',\n} as const\n","import type { PluginRegistryDef, EntityDef } from '@fayz-ai/core'\nimport type { AcquisitionChannel } from './types'\nimport { T } from './data/tables'\n\n// ---------------------------------------------------------------------------\n// Settings registries — surfaced as CRUD tabs in the central Settings area\n// (mirrors how plugin-menu exposes Allergens / Dietary Tags). \"Channels\" lists\n// the acquisition channels resolved from the domain preset.\n// ---------------------------------------------------------------------------\n\nconst KIND_OPTIONS = [\n { value: 'paid', label: 'Paid' },\n { value: 'organic', label: 'Organic' },\n { value: 'social', label: 'Social' },\n { value: 'referral', label: 'Referral' },\n { value: 'direct', label: 'Direct' },\n { value: 'outbound', label: 'Outbound' },\n]\n\nconst channelEntity: EntityDef = {\n name: 'Channel',\n namePlural: 'Channels',\n icon: 'Radio',\n displayField: 'label',\n defaultSort: 'label',\n fields: [\n { key: 'label', label: 'Channel', type: 'text', required: true, showInTable: true, searchable: true },\n { key: 'channelKey', label: 'Key', type: 'text', required: true, showInTable: true },\n { key: 'kind', label: 'Type', type: 'select', options: KIND_OPTIONS, showInTable: true },\n { key: 'icon', label: 'Icon', type: 'text' },\n { key: 'monthlySpend', label: 'Monthly spend', type: 'number', showInTable: true, defaultValue: 0 },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true, inlineToggle: true },\n ],\n facets: [{ field: 'kind' }],\n data: {\n table: T.channels,\n tenantScoped: true,\n searchColumns: ['label', 'channel_key'],\n },\n}\n\n/** Build the marketing settings registries. Channels are tenant-editable rows\n * in plg_marketing_channels; the Supabase provider lazily seeds them from the\n * resolved domain preset (seedData doubles as walkable mock data). */\nexport function buildMarketingRegistries(channels: AcquisitionChannel[]): PluginRegistryDef[] {\n return [\n {\n id: 'channels',\n entity: channelEntity,\n icon: 'Radio',\n description: 'Acquisition channels tracked for this workspace',\n display: 'table',\n seedData: [\n ...channels.map((c) => ({\n id: c.id, channelKey: c.id, label: c.label, kind: c.kind, icon: c.icon, isActive: true, monthlySpend: 0,\n })),\n ],\n },\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 /** Social content planner — accounts, week board, markdown post pages. */\n contentPlanner: boolean\n /** Blog backoffice — posts + categories CMS feeding @fayz-ai/plugin-blog. Off by default. */\n blog: 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, contentPlanner: false, blog: false, 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, contentPlanner: true, blog: 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, contentPlanner: false, blog: 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 { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport type {\n AttributionBridge,\n MarketingDataProvider,\n SaveCampaignInput,\n SitesPerformanceBridge,\n} from './types'\nimport type {\n AcquisitionChannel,\n Campaign,\n ChannelPerformance,\n ConversionModel,\n DateRangeKey,\n FunnelStage,\n LandingPagePerf,\n MarketingOverview,\n MarketingQuery,\n} from '../types'\nimport { T, V } from './tables'\n\n// ---------------------------------------------------------------------------\n// Supabase marketing provider. Channels/campaigns are real CRUD rows\n// (plg_marketing_channels/_campaigns, lazily seeded from the app's channel\n// config); performance is derived from v_marketing_attribution — REAL\n// conversions (bookings/orders/won deals) and leads, attributed by matching\n// the event's origin string against the channel set. Reach has no generic\n// source yet, so it reads 0 until a sites/ads integration feeds it.\n// ---------------------------------------------------------------------------\n\nexport interface SupabaseMarketingProviderOptions {\n channels: AcquisitionChannel[]\n conversion: ConversionModel\n attributionBridge?: AttributionBridge\n sitesBridge?: SitesPerformanceBridge\n}\n\nconst RANGE_DAYS: Record<DateRangeKey, number> = { '7d': 7, '30d': 30, '90d': 90 }\n\nfunction getClient() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n return supabase\n}\n\nfunction requireTenantId(): string {\n const tenantId = getActiveTenantId()\n if (!tenantId) throw new Error('No active tenant')\n return tenantId\n}\n\n/** 'Walk-in' → 'walkin', 'paid-search' → 'paidsearch' — origin strings match\n * channel ids OR labels regardless of case/punctuation. */\nfunction normKey(value: string | null | undefined): string {\n return (value ?? '').toLowerCase().replace(/[^a-z0-9]/g, '')\n}\n\ninterface AttributionRow {\n kind: 'lead' | 'conversion'\n source: string\n channel_raw: string | null\n occurred_at: string\n value: number | null\n}\n\nexport function createSupabaseMarketingProvider(\n options: SupabaseMarketingProviderOptions,\n): MarketingDataProvider {\n const { channels, conversion, attributionBridge, sitesBridge } = options\n\n const channelByNorm = new Map<string, string>()\n for (const ch of channels) {\n channelByNorm.set(normKey(ch.id), ch.id)\n channelByNorm.set(normKey(ch.label), ch.id)\n }\n const resolveChannel = (raw: string | null): string | null =>\n channelByNorm.get(normKey(raw)) ?? null\n\n // Lazy per-tenant seed: the channel set comes from app config (SQL can't know\n // the domain), so the first read upserts the preset rows. Idempotent via the\n // (tenant_id, channel_key) unique index.\n const seeded = new Set<string>()\n async function ensureChannels(tenantId: string): Promise<void> {\n if (seeded.has(tenantId)) return\n seeded.add(tenantId)\n await getClient()\n .from(T.channels)\n .upsert(\n channels.map((c) => ({\n tenant_id: tenantId,\n channel_key: c.id,\n label: c.label,\n icon: c.icon,\n kind: c.kind,\n })),\n { onConflict: 'tenant_id,channel_key', ignoreDuplicates: true },\n )\n }\n\n // One store.load() fans out to overview + channels + funnel + campaigns, and\n // dashboard widgets pile on top — without dedup that's ~10 concurrent\n // requests per mount (a stampede the instant mock never surfaced). Share\n // in-flight promises and cache briefly; writes clear the cache.\n const CACHE_TTL_MS = 30_000\n const cache = new Map<string, { at: number; promise: Promise<unknown> }>()\n function memo<T>(key: string, fn: () => Promise<T>): Promise<T> {\n const hit = cache.get(key)\n if (hit && Date.now() - hit.at < CACHE_TTL_MS) return hit.promise as Promise<T>\n const promise = fn().catch((err) => {\n cache.delete(key)\n throw err\n })\n cache.set(key, { at: Date.now(), promise })\n return promise\n }\n\n function windowFor(range: DateRangeKey): { since: Date; days: number } {\n const days = RANGE_DAYS[range]\n // Quantized to the minute so equal ranges hit the same cache key.\n const now = Math.floor(Date.now() / 60_000) * 60_000\n return { since: new Date(now - days * 86_400_000), days }\n }\n\n function fetchAttribution(\n tenantId: string,\n since: Date,\n until?: Date,\n ): Promise<AttributionRow[]> {\n const key = `attr:${tenantId}:${since.getTime()}:${until?.getTime() ?? ''}`\n return memo(key, async () => {\n let q = getClient()\n .from(V.attribution)\n .select('kind, source, channel_raw, occurred_at, value')\n .eq('tenant_id', tenantId)\n .gte('occurred_at', since.toISOString())\n // Leads always count; conversions only from the vertical's source.\n .or(`kind.eq.lead,and(kind.eq.conversion,source.eq.${conversion.source})`)\n if (until) q = q.lt('occurred_at', until.toISOString())\n const { data, error } = await q\n if (error) throw error\n return (data ?? []) as AttributionRow[]\n })\n }\n\n interface ChannelRollup {\n leads: number\n conversions: number\n value: number\n }\n\n function rollup(rows: AttributionRow[]): Map<string, ChannelRollup> {\n const map = new Map<string, ChannelRollup>()\n for (const row of rows) {\n const channelId = resolveChannel(row.channel_raw)\n if (!channelId) continue\n const agg = map.get(channelId) ?? { leads: 0, conversions: 0, value: 0 }\n if (row.kind === 'lead') agg.leads += 1\n else {\n agg.conversions += 1\n agg.value += Number(row.value ?? conversion.avgValue)\n }\n map.set(channelId, agg)\n }\n return map\n }\n\n function fetchSpend(\n tenantId: string,\n days: number,\n since: Date,\n ): Promise<Map<string, number>> {\n return memo(`spend:${tenantId}:${days}:${since.getTime()}`, () => fetchSpendRaw(tenantId, days, since))\n }\n\n async function fetchSpendRaw(\n tenantId: string,\n days: number,\n since: Date,\n ): Promise<Map<string, number>> {\n const client = getClient()\n const [channelRows, campaignRows] = await Promise.all([\n client.from(V.channels).select('channel_key, monthly_spend').eq('tenant_id', tenantId),\n client\n .from(V.campaigns)\n .select('channel_key, spend, status, starts_at, ends_at')\n .eq('tenant_id', tenantId)\n .neq('status', 'draft'),\n ])\n const spend = new Map<string, number>()\n for (const row of channelRows.data ?? []) {\n const id = resolveChannel(row.channel_key)\n if (!id) continue\n spend.set(id, (spend.get(id) ?? 0) + (Number(row.monthly_spend) * days) / 30)\n }\n for (const row of campaignRows.data ?? []) {\n const id = resolveChannel(row.channel_key)\n if (!id) continue\n // Count a campaign's spend when its window overlaps the query window.\n const ended = row.ends_at ? new Date(row.ends_at) : null\n if (ended && ended < since) continue\n spend.set(id, (spend.get(id) ?? 0) + Number(row.spend))\n }\n return spend\n }\n\n async function channelPerformance(query: MarketingQuery): Promise<ChannelPerformance[]> {\n const tenantId = requireTenantId()\n await ensureChannels(tenantId)\n const { since, days } = windowFor(query.range)\n const [rows, spend] = await Promise.all([\n fetchAttribution(tenantId, since),\n fetchSpend(tenantId, days, since),\n ])\n const byChannel = rollup(rows)\n if (attributionBridge) {\n const bridged = await attributionBridge.conversionsByChannel(query)\n for (const b of bridged) {\n const agg = byChannel.get(b.channelId) ?? { leads: 0, conversions: 0, value: 0 }\n agg.conversions = b.conversions\n agg.value = b.value\n byChannel.set(b.channelId, agg)\n }\n }\n const list = channels.map((ch) => {\n const agg = byChannel.get(ch.id) ?? { leads: 0, conversions: 0, value: 0 }\n const chSpend = spend.get(ch.id) ?? 0\n return {\n channelId: ch.id,\n reach: 0,\n leads: agg.leads,\n conversions: agg.conversions,\n spend: Math.round(chSpend),\n value: Math.round(agg.value),\n cvr: 0,\n cpa: agg.conversions > 0 && chSpend > 0 ? chSpend / agg.conversions : 0,\n }\n })\n return query.channelId ? list.filter((c) => c.channelId === query.channelId) : list\n }\n\n function campaignFromRow(row: Record<string, any>): Campaign {\n return {\n id: row.id,\n name: row.name,\n channelId: row.channel_key,\n status: row.status,\n start: row.starts_at ?? row.created_at,\n end: row.ends_at ?? undefined,\n spend: Number(row.spend ?? 0),\n reach: 0,\n leads: 0,\n conversions: 0,\n value: 0,\n }\n }\n\n function withDerived(campaign: Campaign, rows: AttributionRow[]): Campaign {\n const start = new Date(campaign.start).getTime()\n const end = campaign.end ? new Date(campaign.end).getTime() : Number.POSITIVE_INFINITY\n let leads = 0\n let conversions = 0\n let value = 0\n for (const row of rows) {\n if (resolveChannel(row.channel_raw) !== campaign.channelId) continue\n const at = new Date(row.occurred_at).getTime()\n if (at < start || at > end) continue\n if (row.kind === 'lead') leads += 1\n else {\n conversions += 1\n value += Number(row.value ?? conversion.avgValue)\n }\n }\n return { ...campaign, leads, conversions, value: Math.round(value) }\n }\n\n return {\n channelPerformance,\n\n async overview(query: MarketingQuery): Promise<MarketingOverview> {\n const tenantId = requireTenantId()\n const perf = await channelPerformance(query)\n const { since, days } = windowFor(query.range)\n const prevRows = await fetchAttribution(\n tenantId,\n new Date(since.getTime() - days * 86_400_000),\n since,\n )\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 conversionsPrev = prevRows.filter(\n (r) => r.kind === 'conversion' && resolveChannel(r.channel_raw),\n ).length\n const top = [...perf].sort((a, b) => b.conversions - a.conversions)[0]\n return {\n conversions,\n conversionsPrev,\n cvr: 0,\n cvrPrev: 0,\n spend,\n cpa: conversions > 0 && spend > 0 ? spend / conversions : 0,\n value,\n topChannelId: top && top.conversions > 0 ? 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 if (attributionBridge) return attributionBridge.funnel(query)\n const tenantId = requireTenantId()\n const { since } = windowFor(query.range)\n const rows = await fetchAttribution(tenantId, since)\n const leads = rows.filter((r) => r.kind === 'lead').length\n const conversions = rows.filter((r) => r.kind === 'conversion').length\n return [\n { id: 'leads', label: 'Leads', count: leads, color: '#0ea5e9' },\n { id: 'converted', label: conversion.labelPlural, count: conversions, color: '#22c55e' },\n ]\n },\n\n async listCampaigns(query: MarketingQuery): Promise<Campaign[]> {\n const tenantId = requireTenantId()\n const fetchRows = () =>\n memo(`campaigns:${tenantId}`, async () => {\n const { data, error } = await getClient()\n .from(V.campaigns)\n .select('*')\n .eq('tenant_id', tenantId)\n .order('created_at', { ascending: false })\n if (error) throw error\n return (data ?? []) as Record<string, any>[]\n })\n const [data, rows] = await Promise.all([\n fetchRows(),\n fetchAttribution(tenantId, windowFor(query.range).since),\n ])\n const list = query.channelId ? data.filter((r) => r.channel_key === query.channelId) : data\n return list.map((row) => withDerived(campaignFromRow(row), rows))\n },\n\n async getCampaign(id: string): Promise<Campaign | null> {\n const tenantId = requireTenantId()\n const { data, error } = await getClient()\n .from(V.campaigns)\n .select('*')\n .eq('tenant_id', tenantId)\n .eq('id', id)\n .maybeSingle()\n if (error) throw error\n if (!data) return null\n const campaign = campaignFromRow(data)\n const rows = await fetchAttribution(tenantId, new Date(campaign.start))\n return withDerived(campaign, rows)\n },\n\n async saveCampaign(input: SaveCampaignInput): Promise<Campaign> {\n const tenantId = requireTenantId()\n const payload = {\n name: input.name,\n channel_key: input.channelId,\n status: input.status,\n starts_at: input.start || null,\n ends_at: input.end || null,\n spend: input.spend ?? 0,\n }\n if (input.id) {\n const { data, error } = await getClient()\n .from(T.campaigns)\n .update(payload)\n .eq('id', input.id)\n .select('*')\n .single()\n if (error) throw error\n cache.clear()\n return campaignFromRow(data)\n }\n const { data, error } = await getClient()\n .from(T.campaigns)\n .insert({ tenant_id: tenantId, ...payload })\n .select('*')\n .single()\n if (error) throw error\n cache.clear()\n return campaignFromRow(data)\n },\n\n async deleteCampaign(id: string): Promise<void> {\n const { error } = await getClient().from(T.campaigns).delete().eq('id', id)\n if (error) throw error\n cache.clear()\n },\n\n invalidateCache() {\n cache.clear()\n },\n\n async landingPages(query: MarketingQuery): Promise<LandingPagePerf[]> {\n if (sitesBridge) return sitesBridge.landingPages(query)\n return []\n },\n }\n}\n","import type {\n ContentPlan,\n ContentPlannerProvider,\n ContentPost,\n SocialAccount,\n} from './contentTypes'\n\n// ---------------------------------------------------------------------------\n// Mock content-planner provider — in-memory CRUD seeded with a realistic\n// 8-week clinic plan (2 reels + 1 static per week) so the surface demos well\n// without Supabase. Same shape the beauty seed uses in production.\n// ---------------------------------------------------------------------------\n\nlet counter = 0\nconst nextId = (prefix: string) => `${prefix}-${++counter}`\n\nconst SAMPLE_SCRIPT = `# 5 sinais de que sua queda capilar não é normal\n\n**TEMA:** 5 SINAIS DE QUE SUA QUEDA CAPILAR NÃO É NORMAL\n**Formato:** Reel · **Duração:** 45 a 60 segundos\n\n---\n\n## TAKE 1 – GANCHO (0s a 5s)\n\n*Dra. andando até a câmera.*\n\n**Texto na tela:** ⚠️ 5 sinais de alerta\n\n**Fala:** \"Seu cabelo está caindo e você não sabe se isso é normal? Existem sinais que merecem atenção.\"\n\n---\n\n## TAKE 2 – SINAL 1 (5s a 12s)\n\n*Mostrar a Dra. segurando alguns fios de cabelo ou imagem ilustrativa.*\n\n**Texto na tela:** Excesso de fios caindo.\n\n**Fala:** \"Primeiro sinal: você percebe muitos fios no travesseiro, no banho ou ao pentear os cabelos.\"\n\n---\n\n## TAKE 3 – CTA (40s a 60s)\n\n**Fala:** \"Se você se identificou com algum desses sinais, agende uma avaliação capilar.\"\n\n**CTA:** Agende sua avaliação\n`\n\nconst WEEK_TITLES: Array<[string, string]> = [\n ['5 sinais de que sua queda capilar não é normal', 'Antes e depois de tratamento capilar'],\n ['O que é DHT?', 'Tour pela clínica'],\n ['3 erros que aceleram a calvície', 'Depoimento de paciente'],\n ['Como funciona uma avaliação capilar', 'Mitos sobre queda de cabelo'],\n ['Por que seu tratamento anterior não funcionou?', 'Ozonioterapia para gordura localizada'],\n ['Diferença entre dermatologista e tricologista', 'Caso real de evolução'],\n ['Alopecia feminina explicada', 'Bastidores da clínica'],\n ['Quando procurar ajuda para queda capilar', 'Convite para avaliação gratuita'],\n]\n\nfunction buildSeed() {\n const account: SocialAccount = {\n id: nextId('acc'),\n name: 'Conta demo',\n handle: '@clinica.demo',\n platforms: ['instagram'],\n isActive: true,\n }\n const plan: ContentPlan = {\n id: nextId('plan'),\n accountId: account.id,\n name: 'Plano de conteúdo — 8 semanas',\n status: 'active',\n weeksCount: 8,\n objective: 'Atrair pacientes qualificados para avaliação capilar',\n tone: 'Autoridade acessível — técnica, mas em linguagem simples',\n pillars: ['Educação', 'Autoridade', 'Prova social', 'Bastidores', 'Conversão'],\n formats: ['reel', 'static'],\n weeklyFrequency: 3,\n briefMd: '## Objetivo\\n\\nPosicionar a especialista como referência em saúde capilar e gerar agendamentos de avaliação.\\n\\n## Estratégia\\n\\n- 2 reels educativos/prova social por semana\\n- 1 post estático por semana\\n- CTA recorrente: agendar avaliação',\n }\n const posts: ContentPost[] = []\n WEEK_TITLES.forEach(([reel1, reel2], i) => {\n const week = i + 1\n posts.push(\n {\n id: nextId('post'), planId: plan.id, weekNumber: week, position: 0,\n title: reel1, format: 'reel', status: week === 1 ? 'script' : 'idea',\n platforms: [], checklist: [], contentMd: week === 1 ? SAMPLE_SCRIPT : '',\n },\n {\n id: nextId('post'), planId: plan.id, weekNumber: week, position: 1,\n title: reel2, format: 'reel', status: 'idea', platforms: [], checklist: [], contentMd: '',\n },\n {\n id: nextId('post'), planId: plan.id, weekNumber: week, position: 2,\n title: 'Estático', format: 'static', status: 'idea', platforms: [], checklist: [], contentMd: '',\n },\n )\n })\n return { accounts: [account], plans: [plan], posts }\n}\n\nexport function createMockContentPlannerProvider(): ContentPlannerProvider {\n const db = buildSeed()\n\n return {\n async listAccounts() {\n return [...db.accounts]\n },\n\n async saveAccount(input) {\n if (input.id) {\n const acc = db.accounts.find((a) => a.id === input.id)\n if (!acc) throw new Error('Account not found')\n Object.assign(acc, {\n name: input.name ?? acc.name,\n handle: input.handle ?? acc.handle,\n platforms: input.platforms ?? acc.platforms,\n isActive: input.isActive ?? acc.isActive,\n })\n return { ...acc }\n }\n const acc: SocialAccount = {\n id: nextId('acc'),\n name: input.name,\n handle: input.handle,\n platforms: input.platforms ?? ['instagram'],\n isActive: input.isActive ?? true,\n }\n db.accounts.push(acc)\n return { ...acc }\n },\n\n async deleteAccount(id) {\n db.accounts = db.accounts.filter((a) => a.id !== id)\n const planIds = new Set(db.plans.filter((p) => p.accountId === id).map((p) => p.id))\n db.plans = db.plans.filter((p) => p.accountId !== id)\n db.posts = db.posts.filter((p) => !planIds.has(p.planId))\n },\n\n async listPlans(accountId) {\n return db.plans.filter((p) => p.accountId === accountId).map((p) => ({ ...p }))\n },\n\n async getPlan(id) {\n const plan = db.plans.find((p) => p.id === id)\n return plan ? { ...plan } : null\n },\n\n async savePlan(input) {\n if (input.id) {\n const plan = db.plans.find((p) => p.id === input.id)\n if (!plan) throw new Error('Plan not found')\n Object.assign(plan, {\n ...(input.name !== undefined && { name: input.name }),\n ...(input.status !== undefined && { status: input.status }),\n ...(input.weeksCount !== undefined && { weeksCount: input.weeksCount }),\n ...(input.startDate !== undefined && { startDate: input.startDate ?? undefined }),\n ...(input.objective !== undefined && { objective: input.objective }),\n ...(input.tone !== undefined && { tone: input.tone }),\n ...(input.pillars !== undefined && { pillars: input.pillars }),\n ...(input.formats !== undefined && { formats: input.formats }),\n ...(input.weeklyFrequency !== undefined && { weeklyFrequency: input.weeklyFrequency }),\n ...(input.briefMd !== undefined && { briefMd: input.briefMd }),\n })\n return { ...plan }\n }\n if (!input.accountId) throw new Error('accountId is required')\n const plan: ContentPlan = {\n id: nextId('plan'),\n accountId: input.accountId,\n name: input.name ?? 'Novo plano',\n status: input.status ?? 'draft',\n weeksCount: input.weeksCount ?? 4,\n startDate: input.startDate ?? undefined,\n objective: input.objective,\n tone: input.tone,\n pillars: input.pillars ?? [],\n formats: input.formats ?? ['reel', 'static'],\n weeklyFrequency: input.weeklyFrequency ?? 3,\n briefMd: input.briefMd ?? '',\n }\n db.plans.push(plan)\n return { ...plan }\n },\n\n async deletePlan(id) {\n db.plans = db.plans.filter((p) => p.id !== id)\n db.posts = db.posts.filter((p) => p.planId !== id)\n },\n\n async listPosts(planId) {\n return db.posts\n .filter((p) => p.planId === planId)\n .sort((a, b) => a.weekNumber - b.weekNumber || a.position - b.position)\n .map((p) => ({ ...p }))\n },\n\n async getPost(id) {\n const post = db.posts.find((p) => p.id === id)\n return post ? { ...post } : null\n },\n\n async savePost(input) {\n if (input.id) {\n const post = db.posts.find((p) => p.id === input.id)\n if (!post) throw new Error('Post not found')\n Object.assign(post, {\n ...(input.weekNumber !== undefined && { weekNumber: input.weekNumber }),\n ...(input.position !== undefined && { position: input.position }),\n ...(input.title !== undefined && { title: input.title }),\n ...(input.format !== undefined && { format: input.format }),\n ...(input.status !== undefined && { status: input.status }),\n ...(input.scheduledDate !== undefined && { scheduledDate: input.scheduledDate ?? undefined }),\n ...(input.platforms !== undefined && { platforms: input.platforms }),\n ...(input.checklist !== undefined && { checklist: input.checklist }),\n ...(input.mediaUrl !== undefined && { mediaUrl: input.mediaUrl ?? undefined }),\n ...(input.hook !== undefined && { hook: input.hook }),\n ...(input.cta !== undefined && { cta: input.cta }),\n ...(input.contentMd !== undefined && { contentMd: input.contentMd }),\n })\n return { ...post }\n }\n if (!input.planId) throw new Error('planId is required')\n const week = input.weekNumber ?? 1\n const siblings = db.posts.filter((p) => p.planId === input.planId && p.weekNumber === week)\n const post: ContentPost = {\n id: nextId('post'),\n planId: input.planId,\n weekNumber: week,\n position: input.position ?? siblings.length,\n title: input.title ?? '',\n format: input.format ?? 'reel',\n status: input.status ?? 'idea',\n scheduledDate: input.scheduledDate ?? undefined,\n platforms: input.platforms ?? [],\n checklist: input.checklist ?? [],\n mediaUrl: input.mediaUrl ?? undefined,\n hook: input.hook,\n cta: input.cta,\n contentMd: input.contentMd ?? '',\n }\n db.posts.push(post)\n return { ...post }\n },\n\n async deletePost(id) {\n db.posts = db.posts.filter((p) => p.id !== id)\n },\n }\n}\n","import { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport type {\n ContentPlan,\n ContentPlannerProvider,\n ContentPost,\n SocialAccount,\n} from './contentTypes'\nimport { T } from './tables'\n\n// ---------------------------------------------------------------------------\n// Supabase content-planner provider. Tables: plg_marketing_social_accounts,\n// plg_marketing_content_plans, plg_marketing_content_posts (see src/migrations/001_content_planner.sql).\n// RLS scopes rows to the user's tenants; we still filter tenant_id explicitly\n// on reads so multi-tenant sessions see only the active tenant.\n// ---------------------------------------------------------------------------\n\nfunction getClient() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n return supabase\n}\n\nfunction requireTenantId(): string {\n const tenantId = getActiveTenantId()\n if (!tenantId) throw new Error('No active tenant')\n return tenantId\n}\n\nfunction snakeToCamel(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key.replace(/_([a-z])/g, (_, c) => c.toUpperCase())] = value ?? undefined\n }\n return result\n}\n\nfunction toAccount(row: Record<string, unknown>): SocialAccount {\n const account = snakeToCamel(row) as unknown as SocialAccount\n if (!Array.isArray(account.platforms)) account.platforms = []\n return account\n}\n\nfunction toPlan(row: Record<string, unknown>): ContentPlan {\n const plan = snakeToCamel(row) as unknown as ContentPlan\n if (!Array.isArray(plan.pillars)) plan.pillars = []\n if (!Array.isArray(plan.formats)) plan.formats = []\n plan.briefMd = plan.briefMd ?? ''\n return plan\n}\n\nfunction toPost(row: Record<string, unknown>): ContentPost {\n const post = snakeToCamel(row) as unknown as ContentPost\n post.contentMd = post.contentMd ?? ''\n if (!Array.isArray(post.platforms)) post.platforms = []\n if (!Array.isArray(post.checklist)) post.checklist = []\n return post\n}\n\nexport function createSupabaseContentPlannerProvider(): ContentPlannerProvider {\n return {\n async listAccounts() {\n const tenantId = getActiveTenantId()\n if (!tenantId) return []\n const { data } = await getClient()\n .from(T.socialAccounts)\n .select('*')\n .eq('tenant_id', tenantId)\n .eq('is_active', true)\n .order('created_at', { ascending: true })\n return (data ?? []).map(toAccount)\n },\n\n async saveAccount(input) {\n if (input.id) {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.handle !== undefined) payload.handle = input.handle\n if (input.platforms !== undefined) payload.platforms = input.platforms\n if (input.isActive !== undefined) payload.is_active = input.isActive\n const { data, error } = await getClient()\n .from(T.socialAccounts)\n .update(payload)\n .eq('id', input.id)\n .select('*')\n .single()\n if (error) throw error\n return toAccount(data)\n }\n const { data, error } = await getClient()\n .from(T.socialAccounts)\n .insert({\n tenant_id: requireTenantId(),\n name: input.name,\n handle: input.handle ?? null,\n platforms: input.platforms ?? ['instagram'],\n is_active: input.isActive ?? true,\n })\n .select('*')\n .single()\n if (error) throw error\n return toAccount(data)\n },\n\n async deleteAccount(id) {\n const { error } = await getClient().from(T.socialAccounts).delete().eq('id', id)\n if (error) throw error\n },\n\n async listPlans(accountId) {\n const tenantId = getActiveTenantId()\n if (!tenantId) return []\n const { data } = await getClient()\n .from(T.contentPlans)\n .select('*')\n .eq('tenant_id', tenantId)\n .eq('account_id', accountId)\n .order('created_at', { ascending: false })\n return (data ?? []).map(toPlan)\n },\n\n async getPlan(id) {\n const { data } = await getClient()\n .from(T.contentPlans)\n .select('*')\n .eq('id', id)\n .maybeSingle()\n return data ? toPlan(data) : null\n },\n\n async savePlan(input) {\n if (input.id) {\n const payload: Record<string, unknown> = { updated_at: new Date().toISOString() }\n if (input.name !== undefined) payload.name = input.name\n if (input.status !== undefined) payload.status = input.status\n if (input.weeksCount !== undefined) payload.weeks_count = input.weeksCount\n if (input.startDate !== undefined) payload.start_date = input.startDate\n if (input.objective !== undefined) payload.objective = input.objective\n if (input.tone !== undefined) payload.tone = input.tone\n if (input.pillars !== undefined) payload.pillars = input.pillars\n if (input.formats !== undefined) payload.formats = input.formats\n if (input.weeklyFrequency !== undefined) payload.weekly_frequency = input.weeklyFrequency\n if (input.briefMd !== undefined) payload.brief_md = input.briefMd\n const { data, error } = await getClient()\n .from(T.contentPlans)\n .update(payload)\n .eq('id', input.id)\n .select('*')\n .single()\n if (error) throw error\n return toPlan(data)\n }\n if (!input.accountId) throw new Error('accountId is required')\n const { data, error } = await getClient()\n .from(T.contentPlans)\n .insert({\n tenant_id: requireTenantId(),\n account_id: input.accountId,\n name: input.name ?? 'Novo plano',\n status: input.status ?? 'draft',\n weeks_count: input.weeksCount ?? 4,\n start_date: input.startDate ?? null,\n objective: input.objective ?? null,\n tone: input.tone ?? null,\n pillars: input.pillars ?? [],\n formats: input.formats ?? ['reel', 'static'],\n weekly_frequency: input.weeklyFrequency ?? 3,\n brief_md: input.briefMd ?? '',\n })\n .select('*')\n .single()\n if (error) throw error\n return toPlan(data)\n },\n\n async deletePlan(id) {\n await getClient().from(T.contentPlans).delete().eq('id', id)\n },\n\n async listPosts(planId) {\n const { data } = await getClient()\n .from(T.contentPosts)\n .select('*')\n .eq('plan_id', planId)\n .order('week_number', { ascending: true })\n .order('position', { ascending: true })\n return (data ?? []).map(toPost)\n },\n\n async getPost(id) {\n const { data } = await getClient()\n .from(T.contentPosts)\n .select('*')\n .eq('id', id)\n .maybeSingle()\n return data ? toPost(data) : null\n },\n\n async savePost(input) {\n if (input.id) {\n const payload: Record<string, unknown> = { updated_at: new Date().toISOString() }\n if (input.weekNumber !== undefined) payload.week_number = input.weekNumber\n if (input.position !== undefined) payload.position = input.position\n if (input.title !== undefined) payload.title = input.title\n if (input.format !== undefined) payload.format = input.format\n if (input.status !== undefined) payload.status = input.status\n if (input.scheduledDate !== undefined) payload.scheduled_date = input.scheduledDate\n if (input.platforms !== undefined) payload.platforms = input.platforms\n if (input.checklist !== undefined) payload.checklist = input.checklist\n if (input.mediaUrl !== undefined) payload.media_url = input.mediaUrl\n if (input.hook !== undefined) payload.hook = input.hook\n if (input.cta !== undefined) payload.cta = input.cta\n if (input.contentMd !== undefined) payload.content_md = input.contentMd\n const { data, error } = await getClient()\n .from(T.contentPosts)\n .update(payload)\n .eq('id', input.id)\n .select('*')\n .single()\n if (error) throw error\n return toPost(data)\n }\n if (!input.planId) throw new Error('planId is required')\n const week = input.weekNumber ?? 1\n\n // Next position within the (plan, week) group.\n const { data: maxData } = await getClient()\n .from(T.contentPosts)\n .select('position')\n .eq('plan_id', input.planId)\n .eq('week_number', week)\n .order('position', { ascending: false })\n .limit(1)\n const maxPos = maxData?.[0]?.position ?? -1\n\n const { data, error } = await getClient()\n .from(T.contentPosts)\n .insert({\n tenant_id: requireTenantId(),\n plan_id: input.planId,\n week_number: week,\n position: input.position ?? maxPos + 1,\n title: input.title ?? '',\n format: input.format ?? 'reel',\n status: input.status ?? 'idea',\n scheduled_date: input.scheduledDate ?? null,\n platforms: input.platforms ?? [],\n checklist: input.checklist ?? [],\n media_url: input.mediaUrl ?? null,\n hook: input.hook ?? null,\n cta: input.cta ?? null,\n content_md: input.contentMd ?? '',\n })\n .select('*')\n .single()\n if (error) throw error\n return toPost(data)\n },\n\n async deletePost(id) {\n await getClient().from(T.contentPosts).delete().eq('id', id)\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 /** Invalidate the provider cache and reload (external writes, e.g. agent RPCs). */\n refresh(): 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 try {\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 } catch (err) {\n // A failed load must never wedge the surface in `loading` forever.\n set({ loading: false })\n throw err\n }\n },\n\n async refresh() {\n provider.invalidateCache?.()\n await get().load()\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","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport { getActiveTenantId } from '@fayz-ai/core'\nimport type {\n ContentPlan,\n ContentPlannerProvider,\n ContentPost,\n SaveContentPlanInput,\n SaveContentPostInput,\n SaveSocialAccountInput,\n SocialAccount,\n} from '../../data/contentTypes'\n\n// ---------------------------------------------------------------------------\n// Content-planner UI state — separate from the analytics store on purpose:\n// the Conteúdo tab loads lazily on first visit and never gates (or is gated\n// by) the overview's five analytics fetches.\n// ---------------------------------------------------------------------------\n\nexport type BoardViewMode = 'board' | 'calendar' | 'list'\n\nexport interface ContentPlannerUIState {\n loaded: boolean\n loading: boolean\n /** Tenant the current data was loaded for. The tenant hydrates async after\n * login/refresh, so views re-load when this diverges from the active one. */\n loadedTenantId: string | null\n /** Board / calendar / list — survives opening a post and coming back. */\n viewMode: BoardViewMode\n setViewMode(mode: BoardViewMode): void\n accounts: SocialAccount[]\n activeAccountId: string | null\n plans: ContentPlan[]\n activePlan: ContentPlan | null\n posts: ContentPost[]\n\n load(): Promise<void>\n setAccount(accountId: string): Promise<void>\n selectPlan(planId: string): Promise<void>\n saveAccount(input: SaveSocialAccountInput): Promise<SocialAccount>\n deleteAccount(id: string): Promise<void>\n savePlan(input: SaveContentPlanInput): Promise<ContentPlan>\n savePost(input: SaveContentPostInput): Promise<ContentPost>\n deletePost(id: string): Promise<void>\n}\n\nexport function createContentPlannerStore(\n provider: ContentPlannerProvider,\n): StoreApi<ContentPlannerUIState> {\n async function loadPlansFor(accountId: string): Promise<{ plans: ContentPlan[]; activePlan: ContentPlan | null; posts: ContentPost[] }> {\n const plans = await provider.listPlans(accountId)\n const activePlan = plans.find((p) => p.status === 'active') ?? plans[0] ?? null\n const posts = activePlan ? await provider.listPosts(activePlan.id) : []\n return { plans, activePlan, posts }\n }\n\n return createStore<ContentPlannerUIState>((set, get) => ({\n loaded: false,\n loading: false,\n loadedTenantId: null,\n viewMode: 'board',\n setViewMode(mode) { set({ viewMode: mode }) },\n accounts: [],\n activeAccountId: null,\n plans: [],\n activePlan: null,\n posts: [],\n\n async load() {\n if (get().loading) return\n set({ loading: true })\n try {\n const accounts = await provider.listAccounts()\n const current = get().activeAccountId\n const activeAccountId = (current && accounts.some((a) => a.id === current) ? current : accounts[0]?.id) ?? null\n const { plans, activePlan, posts } = activeAccountId\n ? await loadPlansFor(activeAccountId)\n : { plans: [], activePlan: null, posts: [] }\n set({\n accounts, activeAccountId, plans, activePlan, posts,\n loaded: true, loading: false,\n loadedTenantId: getActiveTenantId() ?? null,\n })\n } catch (err) {\n set({ loading: false, loaded: true })\n throw err\n }\n },\n\n async setAccount(accountId) {\n set({ activeAccountId: accountId, loading: true })\n try {\n const { plans, activePlan, posts } = await loadPlansFor(accountId)\n set({ plans, activePlan, posts, loading: false })\n } catch (err) {\n set({ loading: false })\n throw err\n }\n },\n\n async selectPlan(planId) {\n const plan = get().plans.find((p) => p.id === planId) ?? null\n const posts = plan ? await provider.listPosts(plan.id) : []\n set({ activePlan: plan, posts })\n },\n\n async saveAccount(input) {\n const account = await provider.saveAccount(input)\n const accounts = await provider.listAccounts()\n set({ accounts })\n if (!get().activeAccountId) await get().setAccount(account.id)\n return account\n },\n\n async deleteAccount(id) {\n await provider.deleteAccount(id)\n const accounts = await provider.listAccounts()\n const wasActive = get().activeAccountId === id\n set({ accounts })\n if (wasActive) {\n const next = accounts[0]?.id ?? null\n if (next) {\n await get().setAccount(next)\n } else {\n set({ activeAccountId: null, plans: [], activePlan: null, posts: [] })\n }\n }\n },\n\n async savePlan(input) {\n const plan = await provider.savePlan(input)\n const accountId = get().activeAccountId\n if (accountId) {\n const plans = await provider.listPlans(accountId)\n const activePlan = plans.find((p) => p.id === plan.id) ?? get().activePlan\n const posts = activePlan ? await provider.listPosts(activePlan.id) : []\n set({ plans, activePlan, posts })\n }\n return plan\n },\n\n async savePost(input) {\n const post = await provider.savePost(input)\n const planId = get().activePlan?.id\n if (planId && post.planId === planId) {\n const posts = await provider.listPosts(planId)\n set({ posts })\n }\n return post\n },\n\n async deletePost(id) {\n await provider.deletePost(id)\n const planId = get().activePlan?.id\n if (planId) {\n const posts = await provider.listPosts(planId)\n set({ posts })\n }\n },\n }))\n}\n","// AUTO-GENERATED from 000_plg_rename.sql, 001_content_planner.sql, 002_multi_platform.sql, 003_recording_ops.sql, 004_ranklayer.sql, 005_analytics_base.sql, 006_analytics_views.sql, 007_agent_rpcs.sql — regenerate with scripts/embed-migrations.mjs\n// SQL files are the source of truth; this inline copy lets the manifest declare\n// migrations as data. Do not edit by hand — run the embed script instead.\n\nexport const MIGRATION_000_PLG_RENAME = `-- 000_plg_rename.sql — rename legacy marketing tables to plg_marketing_* for pools\n-- provisioned before the industry-pool rename. Guarded: fires only when legacy\n-- name exists and target does not, so fresh pools skip every branch.\nDO $$\nBEGIN\n IF to_regclass('public.mkt_social_accounts') IS NOT NULL AND to_regclass('public.plg_marketing_social_accounts') IS NULL THEN\n ALTER TABLE public.mkt_social_accounts RENAME TO plg_marketing_social_accounts;\n END IF;\n IF to_regclass('public.mkt_content_plans') IS NOT NULL AND to_regclass('public.plg_marketing_content_plans') IS NULL THEN\n ALTER TABLE public.mkt_content_plans RENAME TO plg_marketing_content_plans;\n END IF;\n IF to_regclass('public.mkt_content_posts') IS NOT NULL AND to_regclass('public.plg_marketing_content_posts') IS NULL THEN\n ALTER TABLE public.mkt_content_posts RENAME TO plg_marketing_content_posts;\n END IF;\nEND $$;\n`\n\nexport const MIGRATION_001_CONTENT_PLANNER = `-- Marketing Plugin: Content Planner\n-- Prefix: plg_marketing_\n-- Social accounts + content plans + posts (Notion-style markdown pages).\n\nCREATE TABLE IF NOT EXISTS public.plg_marketing_social_accounts (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n name text NOT NULL,\n handle text,\n platform text NOT NULL DEFAULT 'instagram'\n CHECK (platform IN ('instagram', 'tiktok', 'youtube', 'facebook', 'linkedin')),\n is_active boolean NOT NULL DEFAULT true,\n created_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_marketing_social_accounts ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_marketing_social_accounts_tenant ON public.plg_marketing_social_accounts(tenant_id);\n\nCREATE TABLE IF NOT EXISTS public.plg_marketing_content_plans (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n account_id uuid NOT NULL REFERENCES public.plg_marketing_social_accounts(id) ON DELETE CASCADE,\n name text NOT NULL,\n status text NOT NULL DEFAULT 'active'\n CHECK (status IN ('draft', 'active', 'archived')),\n weeks_count integer NOT NULL DEFAULT 8,\n start_date date,\n objective text,\n tone text,\n pillars jsonb NOT NULL DEFAULT '[]'::jsonb,\n formats jsonb NOT NULL DEFAULT '[]'::jsonb,\n weekly_frequency integer NOT NULL DEFAULT 3,\n brief_md text NOT NULL DEFAULT '',\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_marketing_content_plans ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_marketing_content_plans_tenant ON public.plg_marketing_content_plans(tenant_id);\nCREATE INDEX IF NOT EXISTS idx_plg_marketing_content_plans_account ON public.plg_marketing_content_plans(account_id);\n\nCREATE TABLE IF NOT EXISTS public.plg_marketing_content_posts (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n plan_id uuid NOT NULL REFERENCES public.plg_marketing_content_plans(id) ON DELETE CASCADE,\n week_number integer NOT NULL DEFAULT 1,\n position integer NOT NULL DEFAULT 0,\n title text NOT NULL,\n format text NOT NULL DEFAULT 'reel'\n CHECK (format IN ('reel', 'static', 'carousel', 'story')),\n status text NOT NULL DEFAULT 'idea'\n CHECK (status IN ('idea', 'script', 'recording', 'editing', 'scheduled', 'published')),\n scheduled_date date,\n hook text,\n cta text,\n content_md text NOT NULL DEFAULT '',\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_marketing_content_posts ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_marketing_content_posts_tenant ON public.plg_marketing_content_posts(tenant_id);\nCREATE INDEX IF NOT EXISTS idx_plg_marketing_content_posts_plan ON public.plg_marketing_content_posts(plan_id, week_number, position);\nCREATE INDEX IF NOT EXISTS idx_plg_marketing_content_posts_status ON public.plg_marketing_content_posts(tenant_id, status);\n\n-- RLS policies for plg_marketing_social_accounts\nDROP POLICY IF EXISTS plg_marketing_social_accounts_select ON public.plg_marketing_social_accounts;\nDROP POLICY IF EXISTS plg_marketing_social_accounts_insert ON public.plg_marketing_social_accounts;\nDROP POLICY IF EXISTS plg_marketing_social_accounts_update ON public.plg_marketing_social_accounts;\nDROP POLICY IF EXISTS plg_marketing_social_accounts_delete ON public.plg_marketing_social_accounts;\nCREATE POLICY plg_marketing_social_accounts_select ON public.plg_marketing_social_accounts FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_social_accounts_insert ON public.plg_marketing_social_accounts FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_social_accounts_update ON public.plg_marketing_social_accounts FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_social_accounts_delete ON public.plg_marketing_social_accounts FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nGRANT SELECT, INSERT, UPDATE, DELETE ON public.plg_marketing_social_accounts TO authenticated;\n\n-- RLS policies for plg_marketing_content_plans\nDROP POLICY IF EXISTS plg_marketing_content_plans_select ON public.plg_marketing_content_plans;\nDROP POLICY IF EXISTS plg_marketing_content_plans_insert ON public.plg_marketing_content_plans;\nDROP POLICY IF EXISTS plg_marketing_content_plans_update ON public.plg_marketing_content_plans;\nDROP POLICY IF EXISTS plg_marketing_content_plans_delete ON public.plg_marketing_content_plans;\nCREATE POLICY plg_marketing_content_plans_select ON public.plg_marketing_content_plans FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_content_plans_insert ON public.plg_marketing_content_plans FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_content_plans_update ON public.plg_marketing_content_plans FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_content_plans_delete ON public.plg_marketing_content_plans FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nGRANT SELECT, INSERT, UPDATE, DELETE ON public.plg_marketing_content_plans TO authenticated;\n\n-- RLS policies for plg_marketing_content_posts\nDROP POLICY IF EXISTS plg_marketing_content_posts_select ON public.plg_marketing_content_posts;\nDROP POLICY IF EXISTS plg_marketing_content_posts_insert ON public.plg_marketing_content_posts;\nDROP POLICY IF EXISTS plg_marketing_content_posts_update ON public.plg_marketing_content_posts;\nDROP POLICY IF EXISTS plg_marketing_content_posts_delete ON public.plg_marketing_content_posts;\nCREATE POLICY plg_marketing_content_posts_select ON public.plg_marketing_content_posts FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_content_posts_insert ON public.plg_marketing_content_posts FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_content_posts_update ON public.plg_marketing_content_posts FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_content_posts_delete ON public.plg_marketing_content_posts FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nGRANT SELECT, INSERT, UPDATE, DELETE ON public.plg_marketing_content_posts TO authenticated;\n`\n\nexport const MIGRATION_002_MULTI_PLATFORM = `-- Marketing Plugin: multi-platform accounts + per-post targets.\n-- An account is a brand/profile that publishes to MANY platforms (Instagram,\n-- YouTube, TikTok, ...). Posts optionally narrow the target platforms; an\n-- empty array means \"inherit the account's platforms\".\n\nALTER TABLE public.plg_marketing_social_accounts\n ADD COLUMN IF NOT EXISTS platforms text[] NOT NULL DEFAULT '{instagram}';\n\n-- Backfill from the legacy single-platform column, then drop it (also drops\n-- its CHECK constraint — the platform list is UI-driven from here on).\nDO $$\nBEGIN\n IF EXISTS (\n SELECT 1 FROM information_schema.columns\n WHERE table_schema = 'public' AND table_name = 'plg_marketing_social_accounts' AND column_name = 'platform'\n ) THEN\n UPDATE public.plg_marketing_social_accounts\n SET platforms = ARRAY[platform]\n WHERE platform IS NOT NULL AND platforms = '{instagram}';\n ALTER TABLE public.plg_marketing_social_accounts DROP COLUMN platform;\n END IF;\nEND $$;\n\nALTER TABLE public.plg_marketing_content_posts\n ADD COLUMN IF NOT EXISTS platforms text[] NOT NULL DEFAULT '{}';\n`\n\nexport const MIGRATION_003_RECORDING_OPS = `-- Marketing Plugin: recording-day ops on posts.\n-- checklist: shooting checklist items [{ id, text, done }] — the on-set\n-- companion for recording day. media_url: uploaded asset (static posts get a\n-- caption + final art instead of a script).\n\nALTER TABLE public.plg_marketing_content_posts\n ADD COLUMN IF NOT EXISTS checklist jsonb NOT NULL DEFAULT '[]';\n\nALTER TABLE public.plg_marketing_content_posts\n ADD COLUMN IF NOT EXISTS media_url text;\n\n-- Public media bucket for content assets (mirrors the avatars-bucket pattern:\n-- public read, authenticated write). Path convention: content/{tenantId}/{postId}-{ts}.{ext}\nINSERT INTO storage.buckets (id, name, public)\n VALUES ('mkt-media', 'mkt-media', true)\n ON CONFLICT (id) DO NOTHING;\n\nDROP POLICY IF EXISTS plg_marketing_media_read ON storage.objects;\nDROP POLICY IF EXISTS plg_marketing_media_insert ON storage.objects;\nDROP POLICY IF EXISTS plg_marketing_media_update ON storage.objects;\nDROP POLICY IF EXISTS plg_marketing_media_delete ON storage.objects;\nCREATE POLICY plg_marketing_media_read ON storage.objects FOR SELECT TO public USING (bucket_id = 'mkt-media');\nCREATE POLICY plg_marketing_media_insert ON storage.objects FOR INSERT TO authenticated WITH CHECK (bucket_id = 'mkt-media');\nCREATE POLICY plg_marketing_media_update ON storage.objects FOR UPDATE TO authenticated USING (bucket_id = 'mkt-media');\nCREATE POLICY plg_marketing_media_delete ON storage.objects FOR DELETE TO authenticated USING (bucket_id = 'mkt-media');\n`\n\nexport const MIGRATION_004_RANKLAYER = `-- Marketing Plugin: RankLayer integration (SEO content publishing).\n-- Control-plane state for the RankLayer connector rendered in Marketing →\n-- Integrações. Prefix: plg_marketing_ranklayer_. Scaffold: the real sync\n-- (edge function + RankLayer API calls) lands via an external PR — see\n-- src/integrations/ranklayer/RANKLAYER.md.\n\nCREATE TABLE IF NOT EXISTS public.plg_marketing_ranklayer_integrations (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n api_key text,\n site_domain text,\n active boolean NOT NULL DEFAULT true,\n last_sync_at timestamptz,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_marketing_ranklayer_integrations ENABLE ROW LEVEL SECURITY;\nCREATE UNIQUE INDEX IF NOT EXISTS uq_plg_marketing_ranklayer_integrations_tenant\n ON public.plg_marketing_ranklayer_integrations(tenant_id);\n\nCREATE TABLE IF NOT EXISTS public.plg_marketing_ranklayer_sync_log (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n integration_id uuid REFERENCES public.plg_marketing_ranklayer_integrations(id) ON DELETE CASCADE,\n status text NOT NULL DEFAULT 'success' CHECK (status IN ('success', 'partial', 'error')),\n message text,\n fetched integer NOT NULL DEFAULT 0,\n written integer NOT NULL DEFAULT 0,\n created_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_marketing_ranklayer_sync_log ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_marketing_ranklayer_sync_log_tenant\n ON public.plg_marketing_ranklayer_sync_log(tenant_id, created_at DESC);\n\n-- RLS: authenticated tenant CRUD\nDROP POLICY IF EXISTS plg_marketing_ranklayer_integrations_select ON public.plg_marketing_ranklayer_integrations;\nDROP POLICY IF EXISTS plg_marketing_ranklayer_integrations_insert ON public.plg_marketing_ranklayer_integrations;\nDROP POLICY IF EXISTS plg_marketing_ranklayer_integrations_update ON public.plg_marketing_ranklayer_integrations;\nDROP POLICY IF EXISTS plg_marketing_ranklayer_integrations_delete ON public.plg_marketing_ranklayer_integrations;\nCREATE POLICY plg_marketing_ranklayer_integrations_select ON public.plg_marketing_ranklayer_integrations FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_ranklayer_integrations_insert ON public.plg_marketing_ranklayer_integrations FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_ranklayer_integrations_update ON public.plg_marketing_ranklayer_integrations FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_ranklayer_integrations_delete ON public.plg_marketing_ranklayer_integrations FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nGRANT SELECT, INSERT, UPDATE, DELETE ON public.plg_marketing_ranklayer_integrations TO authenticated;\n\nDROP POLICY IF EXISTS plg_marketing_ranklayer_sync_log_select ON public.plg_marketing_ranklayer_sync_log;\nDROP POLICY IF EXISTS plg_marketing_ranklayer_sync_log_insert ON public.plg_marketing_ranklayer_sync_log;\nCREATE POLICY plg_marketing_ranklayer_sync_log_select ON public.plg_marketing_ranklayer_sync_log FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nCREATE POLICY plg_marketing_ranklayer_sync_log_insert ON public.plg_marketing_ranklayer_sync_log FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));\nGRANT SELECT, INSERT ON public.plg_marketing_ranklayer_sync_log TO authenticated;\n`\n\nexport const MIGRATION_005_ANALYTICS_BASE = `-- Marketing Plugin: analytics base tables (channels + campaigns).\n-- Prefix: plg_marketing_\n-- Channels are tenant-owned rows lazily seeded from the app's domain preset\n-- (channel_key = preset/config id). Campaign performance is DERIVED at read\n-- time from v_marketing_attribution (006); only spend is stored.\n-- Canonical RLS form: tenant_id IN (SELECT public.user_tenant_ids()).\n\nCREATE TABLE IF NOT EXISTS public.plg_marketing_channels (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n channel_key text NOT NULL,\n label text NOT NULL,\n icon text,\n kind text NOT NULL DEFAULT 'organic'\n CHECK (kind IN ('paid', 'organic', 'social', 'referral', 'direct', 'outbound')),\n is_active boolean NOT NULL DEFAULT true,\n monthly_spend numeric NOT NULL DEFAULT 0,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nCREATE INDEX IF NOT EXISTS idx_plg_marketing_channels_tenant ON public.plg_marketing_channels(tenant_id);\nCREATE UNIQUE INDEX IF NOT EXISTS u_plg_marketing_channels_tenant_key ON public.plg_marketing_channels(tenant_id, channel_key);\n\nCREATE TABLE IF NOT EXISTS public.plg_marketing_campaigns (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n name text NOT NULL,\n channel_key text NOT NULL,\n status text NOT NULL DEFAULT 'draft'\n CHECK (status IN ('active', 'paused', 'ended', 'draft')),\n starts_at timestamptz,\n ends_at timestamptz,\n spend numeric NOT NULL DEFAULT 0,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nCREATE INDEX IF NOT EXISTS idx_plg_marketing_campaigns_tenant ON public.plg_marketing_campaigns(tenant_id);\nCREATE INDEX IF NOT EXISTS idx_plg_marketing_campaigns_channel ON public.plg_marketing_campaigns(tenant_id, channel_key);\n\nDO $$\nDECLARE t text;\nBEGIN\n FOR t IN SELECT unnest(ARRAY['plg_marketing_channels','plg_marketing_campaigns'])\n LOOP\n EXECUTE format('ALTER TABLE public.%I ENABLE ROW LEVEL SECURITY', t);\n EXECUTE format('GRANT SELECT, INSERT, UPDATE, DELETE ON public.%I TO authenticated', t);\n IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE schemaname='public' AND tablename=t AND policyname=t||'_select') THEN\n EXECUTE format('CREATE POLICY %I ON public.%I FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()))', t||'_select', t);\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE schemaname='public' AND tablename=t AND policyname=t||'_insert') THEN\n EXECUTE format('CREATE POLICY %I ON public.%I FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()))', t||'_insert', t);\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE schemaname='public' AND tablename=t AND policyname=t||'_update') THEN\n EXECUTE format('CREATE POLICY %I ON public.%I FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()))', t||'_update', t);\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE schemaname='public' AND tablename=t AND policyname=t||'_delete') THEN\n EXECUTE format('CREATE POLICY %I ON public.%I FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()))', t||'_delete', t);\n END IF;\n END LOOP;\nEND $$;\n`\n\nexport const MIGRATION_006_ANALYTICS_VIEWS = `-- Marketing Plugin: analytics read views.\n-- v_marketing_channels / v_marketing_campaigns — bridge views for the surface\n-- and the agent's data primitives.\n-- v_marketing_attribution — GENERIC, spine-only attribution event stream\n-- (people/appointments/orders metadata). \\`channel_raw\\` is the unnormalized\n-- origin string; the provider matches it against the app's channel set\n-- (id or label, case/punctuation-insensitive).\n-- Apps whose origin lives in an app-local extension table (e.g. beauty's\n-- clients.origin) may CREATE OR REPLACE this view in their own incubator\n-- migration, KEEPING the column contract:\n-- (tenant_id uuid, kind text, source text, channel_raw text,\n-- occurred_at timestamptz, value numeric)\n\nCREATE OR REPLACE VIEW public.v_marketing_channels WITH (security_invoker=true) AS\nSELECT c.id, c.tenant_id, c.channel_key, c.label, c.icon, c.kind,\n c.is_active, c.monthly_spend, c.created_at, c.updated_at\nFROM public.plg_marketing_channels c;\nGRANT SELECT ON public.v_marketing_channels TO authenticated;\n\nCREATE OR REPLACE VIEW public.v_marketing_campaigns WITH (security_invoker=true) AS\nSELECT g.id, g.tenant_id, g.name, g.channel_key, ch.label AS channel_label,\n g.status, g.starts_at, g.ends_at, g.spend, g.created_at, g.updated_at\nFROM public.plg_marketing_campaigns g\nLEFT JOIN public.plg_marketing_channels ch\n ON ch.tenant_id = g.tenant_id AND ch.channel_key = g.channel_key;\nGRANT SELECT ON public.v_marketing_campaigns TO authenticated;\n\nCREATE OR REPLACE VIEW public.v_marketing_attribution WITH (security_invoker=true) AS\n-- lead events (CRM leads; sourceId aligns with lead-sources/channel ids)\nSELECT p.tenant_id,\n 'lead'::text AS kind,\n 'crm'::text AS source,\n COALESCE(p.metadata->>'sourceId', p.metadata->>'sourceName', p.metadata->>'origin') AS channel_raw,\n p.created_at AS occurred_at,\n NULLIF(p.metadata->>'value', '')::numeric AS value\nFROM public.people p\nWHERE p.kind = 'lead'\nUNION ALL\n-- booking conversions (agenda verticals)\nSELECT b.tenant_id, 'conversion', 'agenda',\n COALESCE(b.metadata->>'origin', pc.metadata->>'origin', pc.metadata->>'sourceId', pc.metadata->>'sourceName'),\n b.starts_at,\n o.total\nFROM public.appointments b\nLEFT JOIN public.people pc ON pc.id = b.party_id\nLEFT JOIN public.orders o ON o.id = b.order_id\nWHERE b.status NOT IN ('cancelled', 'no_show')\nUNION ALL\n-- order conversions (commerce verticals)\nSELECT o.tenant_id, 'conversion', 'orders',\n COALESCE(o.metadata->>'origin', pp.metadata->>'origin', pp.metadata->>'sourceId'),\n o.created_at,\n o.total\nFROM public.orders o\nLEFT JOIN public.people pp ON pp.id = o.party_id\nWHERE o.kind NOT IN ('appointment', 'deal')\n AND o.status NOT IN ('cancelled', 'draft')\nUNION ALL\n-- won-deal conversions (CRM verticals)\nSELECT o.tenant_id, 'conversion', 'crm',\n COALESCE(pp.metadata->>'sourceId', pp.metadata->>'sourceName', o.metadata->>'origin'),\n o.updated_at,\n o.total\nFROM public.orders o\nLEFT JOIN public.people pp ON pp.id = o.party_id\nWHERE o.kind = 'deal' AND o.status = 'won';\n\nGRANT SELECT ON public.v_marketing_attribution TO authenticated;\n`\n\nexport const MIGRATION_007_AGENT_RPCS = `-- ============================================================================\n-- plugin-marketing 007: server-plane agent write RPC.\n--\n-- public.agent_marketing_create_campaign — guarded campaign create for the\n-- assistant. Mirrors agent_agenda_create_appointment (agenda 005):\n-- * actor-authorized: public.agent_guard (spine 015) runs role→plan→limit\n-- BEFORE anything — denial comes back as structured jsonb;\n-- * channel is validated against the tenant's plg_marketing_channels rows\n-- (key or label, case/punctuation-insensitive); when the tenant has no\n-- channel rows yet (surface not opened → lazy seed not run) the raw key is\n-- accepted as-is;\n-- * audited: audit_logs row with the acting user.\n--\n-- Contract (all agent_* RPCs): (p_tenant_id, p_actor_user_id, p_payload jsonb)\n-- → jsonb {ok:true, id, record:{...}} | {ok:false, denial:{...}} | {ok:false,\n-- error text}. GRANT authenticated+service_role — NEVER anon.\n-- ============================================================================\n\nCREATE OR REPLACE FUNCTION public.agent_marketing_create_campaign(\n p_tenant_id uuid,\n p_actor_user_id uuid,\n p_payload jsonb\n) RETURNS jsonb\nLANGUAGE plpgsql SECURITY DEFINER\nSET search_path = public\nAS $$\nDECLARE\n v_denial jsonb;\n v_used int;\n v_name text;\n v_channel_raw text;\n v_channel_key text;\n v_status text;\n v_starts timestamptz;\n v_ends timestamptz;\n v_spend numeric;\n v_has_channels boolean;\n v_id uuid;\nBEGIN\n -- ── payload ──────────────────────────────────────────────────────────────\n v_name := left(trim(p_payload->>'name'), 200);\n v_channel_raw := trim(p_payload->>'channel_key');\n v_status := COALESCE(NULLIF(trim(p_payload->>'status'), ''), 'draft');\n v_spend := COALESCE(NULLIF(p_payload->>'spend', '')::numeric, 0);\n BEGIN\n v_starts := NULLIF(p_payload->>'starts_at', '')::timestamptz;\n v_ends := NULLIF(p_payload->>'ends_at', '')::timestamptz;\n EXCEPTION WHEN OTHERS THEN\n RETURN jsonb_build_object('ok', false, 'error', 'invalid payload: ' || SQLERRM);\n END;\n IF v_name IS NULL OR v_name = '' OR v_channel_raw IS NULL OR v_channel_raw = '' THEN\n RETURN jsonb_build_object('ok', false, 'error', 'name and channel_key are required');\n END IF;\n IF v_status NOT IN ('active', 'paused', 'ended', 'draft') THEN\n RETURN jsonb_build_object('ok', false, 'error', 'status must be one of active|paused|ended|draft');\n END IF;\n\n -- ── authorization: role → plan → campaigns_active cap ────────────────────\n SELECT count(*) INTO v_used FROM plg_marketing_campaigns c\n WHERE c.tenant_id = p_tenant_id AND c.status = 'active';\n v_denial := agent_guard(p_tenant_id, p_actor_user_id,\n 'marketing', 'create', 'campaigns_active', v_used,\n CASE WHEN v_status = 'active' THEN 1 ELSE 0 END);\n IF v_denial IS NOT NULL THEN\n RETURN jsonb_build_object('ok', false, 'denial', v_denial);\n END IF;\n\n -- ── channel resolution (key or label, normalized) ────────────────────────\n SELECT EXISTS (SELECT 1 FROM plg_marketing_channels ch WHERE ch.tenant_id = p_tenant_id)\n INTO v_has_channels;\n IF v_has_channels THEN\n SELECT ch.channel_key INTO v_channel_key\n FROM plg_marketing_channels ch\n WHERE ch.tenant_id = p_tenant_id\n AND (\n regexp_replace(lower(ch.channel_key), '[^a-z0-9]', '', 'g')\n = regexp_replace(lower(v_channel_raw), '[^a-z0-9]', '', 'g')\n OR regexp_replace(lower(ch.label), '[^a-z0-9]', '', 'g')\n = regexp_replace(lower(v_channel_raw), '[^a-z0-9]', '', 'g')\n )\n LIMIT 1;\n IF v_channel_key IS NULL THEN\n RETURN jsonb_build_object('ok', false, 'error',\n 'unknown channel \"' || v_channel_raw || '\" — valid channels: ' ||\n COALESCE((SELECT string_agg(ch.channel_key, ', ' ORDER BY ch.channel_key)\n FROM plg_marketing_channels ch WHERE ch.tenant_id = p_tenant_id), ''));\n END IF;\n ELSE\n v_channel_key := v_channel_raw;\n END IF;\n\n -- ── write + audit ────────────────────────────────────────────────────────\n INSERT INTO plg_marketing_campaigns (tenant_id, name, channel_key, status, starts_at, ends_at, spend)\n VALUES (p_tenant_id, v_name, v_channel_key, v_status, COALESCE(v_starts, now()), v_ends, v_spend)\n RETURNING id INTO v_id;\n\n INSERT INTO audit_logs (tenant_id, user_id, action, entity_type, entity_id, metadata)\n VALUES (p_tenant_id, p_actor_user_id, 'agent.createCampaign', 'marketing_campaign', v_id::text,\n jsonb_build_object('payload', p_payload));\n\n RETURN jsonb_build_object(\n 'ok', true,\n 'id', v_id,\n 'record', jsonb_build_object(\n 'id', v_id,\n 'name', v_name,\n 'channel_key', v_channel_key,\n 'status', v_status,\n 'starts_at', COALESCE(v_starts, now()),\n 'spend', v_spend\n )\n );\nEND;\n$$;\n\nREVOKE ALL ON FUNCTION public.agent_marketing_create_campaign(uuid, uuid, jsonb) FROM public;\nREVOKE EXECUTE ON FUNCTION public.agent_marketing_create_campaign(uuid, uuid, jsonb) FROM anon;\nGRANT EXECUTE ON FUNCTION public.agent_marketing_create_campaign(uuid, uuid, jsonb)\n TO authenticated, service_role;\n`\n\nexport const MIGRATIONS: Array<{ id: string; sql: string }> = [\n { id: \"000_plg_rename\", sql: MIGRATION_000_PLG_RENAME },\n { id: \"001_content_planner\", sql: MIGRATION_001_CONTENT_PLANNER },\n { id: \"002_multi_platform\", sql: MIGRATION_002_MULTI_PLATFORM },\n { id: \"003_recording_ops\", sql: MIGRATION_003_RECORDING_OPS },\n { id: \"004_ranklayer\", sql: MIGRATION_004_RANKLAYER },\n { id: \"005_analytics_base\", sql: MIGRATION_005_ANALYTICS_BASE },\n { id: \"006_analytics_views\", sql: MIGRATION_006_ANALYTICS_VIEWS },\n { id: \"007_agent_rpcs\", sql: MIGRATION_007_AGENT_RPCS },\n]\n","import { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport type { TestConnectionResult } from '@fayz-ai/core'\nimport type { RankLayerIntegration, RankLayerSyncLogEntry } from '../types'\n\n// ---------------------------------------------------------------------------\n// RankLayer connector — control-plane client (SCAFFOLD).\n//\n// Reads/writes the connection row (plg_marketing_ranklayer_integrations) and\n// reads the sync log. `testConnection` and `sync` are stubbed: RankLayer has no\n// public API wired yet, so the real work (an edge function calling RankLayer)\n// lands via an external PR — see ../RANKLAYER.md. Everything here is safe to\n// ship: it only persists the tenant's API key + domain and surfaces status.\n// ---------------------------------------------------------------------------\n\nconst INTEGRATIONS = 'plg_marketing_ranklayer_integrations'\nconst SYNC_LOG = 'plg_marketing_ranklayer_sync_log'\n\nfunction getClient() {\n const supabase = getSupabaseClientOptional() as { from: (t: string) => any } | null\n if (!supabase) throw new Error('[ranklayer] Supabase not initialized')\n return supabase\n}\n\nfunction requireTenantId(): string {\n const tenantId = getActiveTenantId()\n if (!tenantId) throw new Error('[ranklayer] No active tenant')\n return tenantId\n}\n\nfunction toIntegration(row: Record<string, any>): RankLayerIntegration {\n return {\n id: row.id,\n apiKey: row.api_key ?? undefined,\n siteDomain: row.site_domain ?? undefined,\n active: row.active ?? true,\n lastSyncAt: row.last_sync_at ?? undefined,\n }\n}\n\nexport function createRankLayerProvider() {\n return {\n async getIntegration(): Promise<RankLayerIntegration | null> {\n const tenantId = getActiveTenantId()\n if (!tenantId) return null\n const { data } = await getClient()\n .from(INTEGRATIONS)\n .select('*')\n .eq('tenant_id', tenantId)\n .maybeSingle()\n return data ? toIntegration(data) : null\n },\n\n async saveIntegration(values: { apiKey: string; siteDomain?: string }): Promise<RankLayerIntegration> {\n const tenantId = requireTenantId()\n const payload = {\n tenant_id: tenantId,\n api_key: values.apiKey,\n site_domain: values.siteDomain ?? null,\n active: true,\n updated_at: new Date().toISOString(),\n }\n // Upsert on the unique tenant_id.\n const { data, error } = await getClient()\n .from(INTEGRATIONS)\n .upsert(payload, { onConflict: 'tenant_id' })\n .select('*')\n .single()\n if (error) throw error\n return toIntegration(data)\n },\n\n async disconnect(): Promise<void> {\n const tenantId = getActiveTenantId()\n if (!tenantId) return\n await getClient().from(INTEGRATIONS).delete().eq('tenant_id', tenantId)\n },\n\n // SCAFFOLD: no RankLayer API yet — accept any non-empty key so the connect\n // flow can be exercised. Replace with a real credential check in the PR.\n async testConnection(values: { apiKey: string }): Promise<TestConnectionResult> {\n if (!values.apiKey || values.apiKey.trim().length < 8) {\n return { ok: false, message: 'Informe uma API Key válida da RankLayer.' }\n }\n return { ok: true, message: 'Chave aceita (validação real pendente — integração em preparação).' }\n },\n\n async getSyncLog(integrationId: string): Promise<RankLayerSyncLogEntry[]> {\n const { data } = await getClient()\n .from(SYNC_LOG)\n .select('*')\n .eq('integration_id', integrationId)\n .order('created_at', { ascending: false })\n .limit(20)\n return (data ?? []).map((r: Record<string, any>) => ({\n id: r.id,\n createdAt: r.created_at,\n status: r.status,\n message: r.message ?? undefined,\n fetched: r.fetched ?? 0,\n written: r.written ?? 0,\n }))\n },\n }\n}\n\nexport type RankLayerProvider = ReturnType<typeof createRankLayerProvider>\n","// RankLayer as a unified ConnectorDefinition, surfaced in Marketing → settings\n// → Integrações (rendered by the shared ConnectorsHub). SCAFFOLD: the hub gives\n// us the API-key form + Test/Save; the ExtraPanel below explains that automated\n// SEO content sync is being prepared. The real sync lands via an external PR —\n// see ./RANKLAYER.md.\nimport React, { useEffect, useState } from 'react'\nimport { Sparkles, History, CheckCircle2, AlertCircle } from 'lucide-react'\nimport type { ConnectorDefinition } from '@fayz-ai/core'\nimport { createRankLayerProvider } from './data/supabase'\nimport type { RankLayerIntegration, RankLayerSyncLogEntry } from './types'\n\nconst provider = createRankLayerProvider()\n\nfunction RankLayerExtraPanel() {\n const [integration, setIntegration] = useState<RankLayerIntegration | null>(null)\n const [log, setLog] = useState<RankLayerSyncLogEntry[]>([])\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n ;(async () => {\n try {\n const found = await provider.getIntegration()\n if (cancelled) return\n setIntegration(found)\n if (found) setLog(await provider.getSyncLog(found.id))\n } catch {\n /* not connected / no client — nothing to show */\n } finally {\n if (!cancelled) setLoaded(true)\n }\n })()\n return () => { cancelled = true }\n }, [])\n\n if (!loaded || !integration) return null // nothing until the connection is saved\n\n return (\n <div className=\"space-y-4 border-t pt-4\">\n <div className=\"flex items-start gap-3 rounded-md border border-dashed p-3\">\n <Sparkles className=\"mt-0.5 h-4 w-4 shrink-0 text-muted-foreground\" />\n <div className=\"space-y-1\">\n <h4 className=\"text-sm font-semibold\">Sincronização de conteúdo — em breve</h4>\n <p className=\"text-xs text-muted-foreground\">\n A publicação automática de páginas e artigos de SEO com a RankLayer está em preparação.\n {integration.siteDomain ? ` Domínio configurado: ${integration.siteDomain}.` : ''} Assim que a\n integração estiver ativa, o histórico de sincronizações aparece aqui.\n </p>\n </div>\n </div>\n\n {log.length > 0 && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <History className=\"h-4 w-4 text-muted-foreground\" />\n <h4 className=\"text-sm font-semibold\">Histórico</h4>\n </div>\n <div className=\"divide-y rounded-md border text-sm\">\n {log.map((r) => (\n <div key={r.id} className=\"flex items-center gap-3 px-3 py-2\">\n <span className=\"text-xs text-muted-foreground\">{new Date(r.createdAt).toLocaleString('pt-BR')}</span>\n <span className=\"ml-auto text-xs\">{r.written}/{r.fetched} publicadas</span>\n {r.status === 'success'\n ? <CheckCircle2 className=\"h-3.5 w-3.5 text-success\" />\n : <AlertCircle className=\"h-3.5 w-3.5 text-warning\" />}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport const ranklayerConnectorDef: ConnectorDefinition = {\n id: 'ranklayer',\n hostPluginId: 'marketing',\n name: 'RankLayer',\n description: 'Publicação de conteúdo e páginas de SEO por serviço/bairro para ser encontrado no Google e em assistentes de IA.',\n icon: 'Search',\n authKind: 'api-key',\n fields: [\n { key: 'apiKey', label: 'API Key', type: 'password', placeholder: '••••••••' },\n { key: 'siteDomain', label: 'Domínio do site', type: 'text', placeholder: 'exemplo.com.br' },\n ],\n async getStatus() {\n try {\n const found = await provider.getIntegration()\n return { connected: !!found?.apiKey, detail: found?.siteDomain }\n } catch {\n return { connected: false }\n }\n },\n testConnection: (values) => provider.testConnection({ apiKey: values.apiKey }),\n saveConnection: async (values) => { await provider.saveIntegration({ apiKey: values.apiKey, siteDomain: values.siteDomain }) },\n disconnect: () => provider.disconnect(),\n ExtraPanel: RankLayerExtraPanel,\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 // content planner\n 'marketing.content.title': 'Content',\n 'marketing.content.week': 'Week',\n 'marketing.content.month': 'Month',\n 'marketing.content.newPost': 'New post',\n 'marketing.content.untitled': 'Untitled',\n 'marketing.content.account': 'Account',\n 'marketing.content.addAccount': 'Add account',\n 'marketing.content.previewNow': 'Just now',\n 'marketing.content.previewLike': 'Like',\n 'marketing.content.previewComment': 'Comment',\n 'marketing.content.previewShare': 'Share',\n 'marketing.content.showLess': 'show less',\n 'marketing.content.checklistTitle': 'Recording checklist',\n 'marketing.content.checklistDescription': 'Shooting-day operations',\n 'marketing.content.checklistOpen': 'Checklist',\n 'marketing.content.checklistEmpty': 'No items yet — generate them from the script or add your own below.',\n 'marketing.content.checklistAddPlaceholder': 'New item…',\n 'marketing.content.checklistAdd': 'Add item',\n 'marketing.content.checklistGenerate': 'Generate from script',\n 'marketing.content.scriptLabel': 'Script',\n 'marketing.content.captionLabel': 'Caption',\n 'marketing.content.captionPlaceholder': 'Write the post caption…',\n 'marketing.content.mediaLabel': 'Media asset',\n 'marketing.content.mediaUpload': 'Upload media',\n 'marketing.content.mediaHint': 'Image or video for this post',\n 'marketing.content.mediaReplace': 'Replace',\n 'marketing.content.mediaRemove': 'Remove',\n 'marketing.content.mediaUnavailable': 'Media upload requires a connected Supabase project.',\n 'marketing.content.editAccountTitle': 'Account settings',\n 'marketing.content.accountSettings': 'Account settings',\n 'marketing.content.deleteAccount': 'Delete account',\n 'marketing.content.deleteAccountConfirm': 'The account and all of its content plans and posts will be permanently deleted.',\n 'marketing.content.noAccountsAvailable': 'No accounts available',\n 'marketing.content.addAccountTitle': 'New account',\n 'marketing.content.nameLabel': 'Name',\n 'marketing.content.handleLabel': 'Handle',\n 'marketing.content.handlePlaceholder': '@handle (optional)',\n 'marketing.content.viewBoard': 'Weekly',\n 'marketing.content.viewCalendar': 'Monthly',\n 'marketing.content.viewList': 'List',\n 'marketing.content.unscheduled': 'Unscheduled',\n 'marketing.content.noPosts': 'No posts yet — add your first one from any week.',\n 'marketing.content.listTitle': 'Title',\n 'marketing.content.listWeek': 'Week',\n 'marketing.content.listDate': 'Date',\n 'marketing.content.listFormat': 'Format',\n 'marketing.content.listStatus': 'Status',\n 'marketing.content.noAccountsHint': 'Create the account (e.g. your Instagram profile) to start planning content.',\n 'marketing.content.accountNamePlaceholder': 'e.g. @myclinic',\n 'marketing.content.createAccount': 'Create account',\n 'marketing.content.defaultPlanName': 'Content plan — 8 weeks',\n 'marketing.content.brief': 'Brief',\n 'marketing.content.planName': 'Plan name',\n 'marketing.content.objective': 'Objective',\n 'marketing.content.objectivePlaceholder': 'e.g. generate evaluation bookings',\n 'marketing.content.tone': 'Tone of voice',\n 'marketing.content.tonePlaceholder': 'e.g. approachable authority, plain language',\n 'marketing.content.pillars': 'Content pillars',\n 'marketing.content.pillarPlaceholder': 'Add pillar…',\n 'marketing.content.formatsLabel': 'Formats',\n 'marketing.content.weeklyFrequency': 'Posts per week',\n 'marketing.content.weeksCount': 'Weeks',\n 'marketing.content.briefBody': 'Brief (markdown)',\n 'marketing.content.briefPlaceholder': 'Describe the strategy, references and what the content should achieve…',\n 'marketing.content.formatLabel': 'Format',\n 'marketing.content.statusLabel': 'Status',\n 'marketing.content.scheduledDate': 'Planned date',\n 'marketing.content.hook': 'Hook',\n 'marketing.content.hookPlaceholder': 'The first line that grabs attention…',\n 'marketing.content.cta': 'CTA',\n 'marketing.content.ctaPlaceholder': 'e.g. Book your evaluation',\n 'marketing.content.titlePlaceholder': 'Post title…',\n 'marketing.content.bodyPlaceholder': 'Post script / plan in markdown…',\n 'marketing.content.insertTemplate': 'Insert script template',\n 'marketing.content.save': 'Save',\n 'marketing.content.cancel': 'Cancel',\n 'marketing.content.edit': 'Edit',\n 'marketing.content.preview': 'Preview',\n 'marketing.content.deletePost': 'Delete post',\n 'marketing.content.deletePostConfirm': 'This post and its script will be permanently removed.',\n 'marketing.content.format.reel': 'Reel',\n 'marketing.content.format.static': 'Static',\n 'marketing.content.format.carousel': 'Carousel',\n 'marketing.content.format.story': 'Story',\n 'marketing.content.format.video': 'Video',\n 'marketing.content.format.live': 'Live',\n 'marketing.content.format.article': 'Article',\n 'marketing.content.platformsLabel': 'Platforms',\n 'marketing.content.status.idea': 'idea',\n 'marketing.content.status.script': 'script',\n 'marketing.content.status.recording': 'recording',\n 'marketing.content.status.editing': 'editing',\n 'marketing.content.status.scheduled': 'scheduled',\n 'marketing.content.status.published': 'published',\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 // content planner\n 'marketing.content.title': 'Conteúdo',\n 'marketing.content.week': 'Semana',\n 'marketing.content.month': 'Mês',\n 'marketing.content.newPost': 'Novo post',\n 'marketing.content.untitled': 'Sem título',\n 'marketing.content.account': 'Conta',\n 'marketing.content.addAccount': 'Adicionar conta',\n 'marketing.content.previewNow': 'Agora',\n 'marketing.content.previewLike': 'Curtir',\n 'marketing.content.previewComment': 'Comentar',\n 'marketing.content.previewShare': 'Compartilhar',\n 'marketing.content.showLess': 'mostrar menos',\n 'marketing.content.checklistTitle': 'Checklist de gravação',\n 'marketing.content.checklistDescription': 'Operação do dia de gravação',\n 'marketing.content.checklistOpen': 'Checklist',\n 'marketing.content.checklistEmpty': 'Nenhum item ainda — gere a partir do roteiro ou adicione o seu abaixo.',\n 'marketing.content.checklistAddPlaceholder': 'Novo item…',\n 'marketing.content.checklistAdd': 'Adicionar item',\n 'marketing.content.checklistGenerate': 'Gerar do roteiro',\n 'marketing.content.scriptLabel': 'Roteiro',\n 'marketing.content.captionLabel': 'Legenda',\n 'marketing.content.captionPlaceholder': 'Escreva a legenda do post…',\n 'marketing.content.mediaLabel': 'Arte / mídia',\n 'marketing.content.mediaUpload': 'Enviar mídia',\n 'marketing.content.mediaHint': 'Imagem ou vídeo deste post',\n 'marketing.content.mediaReplace': 'Substituir',\n 'marketing.content.mediaRemove': 'Remover',\n 'marketing.content.mediaUnavailable': 'O upload de mídia requer um projeto Supabase conectado.',\n 'marketing.content.editAccountTitle': 'Configurações da conta',\n 'marketing.content.accountSettings': 'Configurações da conta',\n 'marketing.content.deleteAccount': 'Excluir conta',\n 'marketing.content.deleteAccountConfirm': 'A conta e todos os planos e posts de conteúdo dela serão excluídos permanentemente.',\n 'marketing.content.noAccountsAvailable': 'Nenhuma conta disponível',\n 'marketing.content.addAccountTitle': 'Nova conta',\n 'marketing.content.nameLabel': 'Nome',\n 'marketing.content.handleLabel': 'Usuário',\n 'marketing.content.handlePlaceholder': '@usuario (opcional)',\n 'marketing.content.viewBoard': 'Semanal',\n 'marketing.content.viewCalendar': 'Mensal',\n 'marketing.content.viewList': 'Lista',\n 'marketing.content.unscheduled': 'Sem data',\n 'marketing.content.noPosts': 'Nenhum post ainda — adicione o primeiro em qualquer semana.',\n 'marketing.content.listTitle': 'Título',\n 'marketing.content.listWeek': 'Semana',\n 'marketing.content.listDate': 'Data',\n 'marketing.content.listFormat': 'Formato',\n 'marketing.content.listStatus': 'Status',\n 'marketing.content.noAccountsHint': 'Crie a conta (ex.: o perfil do Instagram) para começar a planejar o conteúdo.',\n 'marketing.content.accountNamePlaceholder': 'ex.: @minhaclinica',\n 'marketing.content.createAccount': 'Criar conta',\n 'marketing.content.defaultPlanName': 'Plano de conteúdo — 8 semanas',\n 'marketing.content.brief': 'Briefing',\n 'marketing.content.planName': 'Nome do plano',\n 'marketing.content.objective': 'Objetivo',\n 'marketing.content.objectivePlaceholder': 'ex.: gerar agendamentos de avaliação',\n 'marketing.content.tone': 'Tom de voz',\n 'marketing.content.tonePlaceholder': 'ex.: autoridade acessível, linguagem simples',\n 'marketing.content.pillars': 'Pilares de conteúdo',\n 'marketing.content.pillarPlaceholder': 'Adicionar pilar…',\n 'marketing.content.formatsLabel': 'Formatos',\n 'marketing.content.weeklyFrequency': 'Posts por semana',\n 'marketing.content.weeksCount': 'Semanas',\n 'marketing.content.briefBody': 'Briefing (markdown)',\n 'marketing.content.briefPlaceholder': 'Descreva a estratégia, referências e o que se quer com o conteúdo…',\n 'marketing.content.formatLabel': 'Formato',\n 'marketing.content.statusLabel': 'Status',\n 'marketing.content.scheduledDate': 'Data prevista',\n 'marketing.content.hook': 'Gancho',\n 'marketing.content.hookPlaceholder': 'A primeira frase que segura a atenção…',\n 'marketing.content.cta': 'CTA',\n 'marketing.content.ctaPlaceholder': 'ex.: Agende sua avaliação',\n 'marketing.content.titlePlaceholder': 'Título do post…',\n 'marketing.content.bodyPlaceholder': 'Roteiro / plano do post em markdown…',\n 'marketing.content.insertTemplate': 'Inserir modelo de roteiro',\n 'marketing.content.save': 'Salvar',\n 'marketing.content.cancel': 'Cancelar',\n 'marketing.content.edit': 'Editar',\n 'marketing.content.preview': 'Visualizar',\n 'marketing.content.deletePost': 'Excluir post',\n 'marketing.content.deletePostConfirm': 'Este post e seu roteiro serão removidos permanentemente.',\n 'marketing.content.format.reel': 'Reel',\n 'marketing.content.format.static': 'Estático',\n 'marketing.content.format.carousel': 'Carrossel',\n 'marketing.content.format.story': 'Story',\n 'marketing.content.format.video': 'Vídeo',\n 'marketing.content.format.live': 'Live',\n 'marketing.content.format.article': 'Artigo',\n 'marketing.content.platformsLabel': 'Plataformas',\n 'marketing.content.status.idea': 'ideia',\n 'marketing.content.status.script': 'roteiro',\n 'marketing.content.status.recording': 'gravação',\n 'marketing.content.status.editing': 'edição',\n 'marketing.content.status.scheduled': 'agendado',\n 'marketing.content.status.published': 'publicado',\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, PluginRegistryDef, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { createSafeDataProvider, registerTranslations } from '@fayz-ai/core'\nimport { PluginSettingsPanel } from '@fayz-ai/saas'\nimport { MarketingPage } from './MarketingPage'\nimport { SettingsView } from './views/SettingsView'\nimport { buildMarketingRegistries } from './registries'\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 { createSupabaseMarketingProvider } from './data/supabase'\nimport { T } from './data/tables'\nimport type { ContentPlannerProvider } from './data/contentTypes'\nimport { createMockContentPlannerProvider } from './data/contentMock'\nimport { createSupabaseContentPlannerProvider } from './data/contentSupabase'\nimport { createMarketingStore } from './store'\nimport { createContentPlannerStore } from './views/content/contentStore'\nimport { MIGRATION_000_PLG_RENAME, MIGRATION_001_CONTENT_PLANNER, MIGRATION_002_MULTI_PLATFORM, MIGRATION_003_RECORDING_OPS, MIGRATION_004_RANKLAYER, MIGRATION_005_ANALYTICS_BASE, MIGRATION_006_ANALYTICS_VIEWS, MIGRATION_007_AGENT_RPCS } from './migrations'\nimport { ranklayerConnectorDef } from './integrations/ranklayer/connectorDef'\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 /** Content planner options (module toggled via `modules.contentPlanner`). */\n contentPlanner?: { dataProvider?: ContentPlannerProvider }\n /** App/vertical-owned settings registries rendered inside Marketing settings. */\n settingsRegistries?: PluginRegistryDef[]\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 content: 'Content',\n blog: 'Blog',\n blogCategories: 'Categorias',\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(\n config: ResolvedMarketingConfig,\n domain: MarketingDomain,\n options?: MarketingPluginOptions,\n): MarketingDataProvider {\n return createSafeDataProvider(\n () => createSupabaseMarketingProvider({\n channels: config.channels,\n conversion: config.conversion,\n attributionBridge: options?.attributionBridge,\n sitesBridge: options?.sitesBridge,\n }),\n () => createMockMarketingProvider({ channels: config.channels, conversion: config.conversion, domain }),\n )\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, options)\n const store = createMarketingStore(provider)\n const dashboardWidgets = createMarketingDashboardWidgets({ config, provider, store })\n\n // Content planner has its own provider seam: real Supabase CRUD (with mock\n // fallback) while the analytics provider stays mock-until-bridges.\n const contentProvider = options?.contentPlanner?.dataProvider ?? createSafeDataProvider(\n () => createSupabaseContentPlannerProvider(),\n () => createMockContentPlannerProvider(),\n )\n const contentStore = createContentPlannerStore(contentProvider)\n\n const PageComponent: React.ComponentType<unknown> = () =>\n React.createElement(MarketingContextProvider, { config, provider, store },\n React.createElement(MarketingPage, { config, provider, store, contentProvider, contentStore }))\n PageComponent.displayName = 'MarketingPage'\n\n // Settings lives in the SDK-core central Settings area (not a module tab).\n // General preferences (channel tracking toggles) + a Channels registry tab,\n // mirroring how plugin-menu surfaces Allergens.\n const marketingRegistries = [\n ...buildMarketingRegistries(config.channels),\n ...(options?.settingsRegistries ?? []),\n ]\n const SettingsComponent: React.ComponentType<unknown> = () =>\n React.createElement(MarketingContextProvider, { config, provider, store },\n React.createElement(PluginSettingsPanel, {\n title: config.labels.settings ?? config.labels.pageTitle,\n subtitle: config.labels.pageSubtitle,\n generalSettings: React.createElement(SettingsView),\n registries: marketingRegistries,\n // Enables the \"Integrações\" tab (renders manifest connectors for this host).\n hostPluginId: 'marketing',\n routeBase: '/settings/marketing',\n }))\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 // Admin content-planning surface (campaigns, content calendar) — targets the\n // saas/admin Panel world, not the ecommerce storefront/operator console.\n scaffolds: ['saas'],\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 ...(config.modules.contentPlanner ? [{ id: 'marketing.content', label: config.labels.content, group: 'Engage' }] : []),\n ...(config.modules.blog ? [{ id: 'marketing.blog', label: config.labels.blog, group: 'Engage' }] : []),\n ],\n declaredLimits: [\n ...(config.modules.campaigns ? [{ key: 'campaigns_active', label: 'Active campaigns', table: T.campaigns }] : []),\n ...(config.modules.contentPlanner ? [{ key: 'content_posts_month', label: 'Content posts / month', table: 'plg_marketing_content_posts', period: 'month' as const }] : []),\n ...(config.modules.blog ? [{ key: 'blog_posts', label: 'Blog posts', table: 'plg_blog_posts' }] : []),\n ],\n // Read-models for the agent's data primitives (searchRecords/queryData) —\n // mirrors agenda's `agenda:appointments`. Keys are stable ASCII; fields are\n // the provider's camelCase output shape.\n queryEntities: [\n ...(config.modules.campaigns ? [{\n key: 'marketing:campaigns',\n writable: false,\n entity: {\n name: 'Campaign',\n namePlural: 'Campaigns',\n icon: 'Megaphone',\n permission: { feature: 'marketing', action: 'read' as const },\n fields: [\n { key: 'name', label: 'Name', type: 'text' as const, searchable: true },\n { key: 'channelKey', label: 'Channel', type: 'text' as const, searchable: true },\n { key: 'channelLabel', label: 'Channel label', type: 'text' as const },\n { key: 'status', label: 'Status', type: 'text' as const },\n { key: 'startsAt', label: 'Starts at', type: 'text' as const },\n { key: 'endsAt', label: 'Ends at', type: 'text' as const },\n { key: 'spend', label: 'Spend', type: 'number' as const },\n { key: 'createdAt', label: 'Created at', type: 'text' as const },\n ],\n data: {\n table: 'v_marketing_campaigns',\n tenantScoped: true,\n searchColumns: ['name', 'channel_key'],\n },\n },\n }] : []),\n ...(config.modules.channels ? [{\n key: 'marketing:channels',\n writable: false,\n entity: {\n name: 'Marketing channel',\n namePlural: 'Marketing channels',\n icon: 'Radio',\n permission: { feature: 'marketing', action: 'read' as const },\n fields: [\n { key: 'channelKey', label: 'Key', type: 'text' as const, searchable: true },\n { key: 'label', label: 'Channel', type: 'text' as const, searchable: true },\n { key: 'kind', label: 'Type', type: 'text' as const },\n { key: 'isActive', label: 'Active', type: 'boolean' as const },\n { key: 'monthlySpend', label: 'Monthly spend', type: 'number' as const },\n ],\n data: {\n table: 'v_marketing_channels',\n tenantScoped: true,\n searchColumns: ['label', 'channel_key'],\n },\n },\n }] : []),\n ...(config.modules.contentPlanner ? [{\n key: 'marketing:contentPosts',\n writable: false,\n entity: {\n name: 'Content post',\n namePlural: 'Content posts',\n icon: 'FileText',\n permission: { feature: 'marketing.content', action: 'read' as const },\n fields: [\n { key: 'title', label: 'Title', type: 'text' as const, searchable: true },\n { key: 'format', label: 'Format', type: 'text' as const },\n { key: 'status', label: 'Status', type: 'text' as const },\n { key: 'weekNumber', label: 'Week', type: 'number' as const },\n { key: 'scheduledDate', label: 'Scheduled date', type: 'text' as const },\n { key: 'hook', label: 'Hook', type: 'text' as const, searchable: true },\n ],\n data: {\n table: T.contentPosts,\n tenantScoped: true,\n searchColumns: ['title', 'hook'],\n },\n },\n }] : []),\n ],\n declaredRpcs: [\n ...(config.modules.campaigns ? [{\n name: 'agent_marketing_create_campaign',\n kind: 'write' as const,\n description:\n 'Guarded campaign create: agent_guard (role→plan→campaigns_active cap), channel validated against the tenant channel set, audited.',\n audits: true,\n }] : []),\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 { name: 'marketing.content.plan.updated', description: 'A content plan (brief/config) was updated' },\n { name: 'marketing.content.post.created', description: 'A content post was created' },\n { name: 'marketing.content.post.updated', description: 'A content post was updated' },\n ],\n migrations: [\n {\n id: 'marketing-000-plg-rename',\n version: '1.0.0',\n sql: MIGRATION_000_PLG_RENAME,\n description: 'Rename legacy mkt_* tables to plg_marketing_* in-place for pools provisioned before the industry-pool rename (guarded no-op on fresh pools)',\n },\n {\n id: 'marketing-001-content-planner',\n version: '1.0.0',\n sql: MIGRATION_001_CONTENT_PLANNER,\n description: 'Create plg_marketing_social_accounts, plg_marketing_content_plans and plg_marketing_content_posts',\n },\n {\n id: 'marketing-002-multi-platform',\n version: '1.1.0',\n sql: MIGRATION_002_MULTI_PLATFORM,\n description: 'Accounts publish to many platforms (platforms[]); posts gain optional platform targets',\n },\n {\n id: 'marketing-003-recording-ops',\n version: '1.2.0',\n sql: MIGRATION_003_RECORDING_OPS,\n description: 'Recording-day checklist + media asset URL on posts; content-media storage bucket',\n },\n {\n id: 'marketing-004-ranklayer',\n version: '1.3.0',\n sql: MIGRATION_004_RANKLAYER,\n description: 'RankLayer connector state: plg_marketing_ranklayer_integrations + _sync_log (tenant RLS)',\n },\n {\n id: 'marketing-005-analytics-base',\n version: '1.4.0',\n sql: MIGRATION_005_ANALYTICS_BASE,\n description: 'Analytics base: plg_marketing_channels + plg_marketing_campaigns with canonical tenant RLS',\n },\n {\n id: 'marketing-006-analytics-views',\n version: '1.4.0',\n sql: MIGRATION_006_ANALYTICS_VIEWS,\n description: 'Read views v_marketing_channels/_campaigns + generic spine-only v_marketing_attribution',\n },\n {\n id: 'marketing-007-agent-rpcs',\n version: '1.4.0',\n sql: MIGRATION_007_AGENT_RPCS,\n description: 'agent_marketing_create_campaign — guarded, audited server-plane campaign create',\n },\n ],\n // RankLayer SEO connector — renders in the Integrações settings tab. Scaffold\n // (control plane only); the real sync lands via an external PR (RANKLAYER.md).\n connectors: [ranklayerConnectorDef],\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:\n 'Creates an acquisition campaign on a channel. Resolve the channel first via queryData/searchRecords on marketing channels (use its channel key). The user confirms before creating.',\n icon: 'Plus',\n mode: 'persist' as const,\n limitKey: 'campaigns_active',\n execution: { plane: 'server' as const, kind: 'rpc' as const, rpc: 'agent_marketing_create_campaign' },\n category: 'Marketing',\n parameters: {\n type: 'object' as const,\n properties: {\n name: { type: 'string' as const, description: 'Campaign name' },\n channel_key: { type: 'string' as const, description: \"Acquisition channel key (e.g. 'instagram') or its label\" },\n status: { type: 'string' as const, enum: ['draft', 'active', 'paused'], description: 'Defaults to draft' },\n starts_at: { type: 'string' as const, description: 'ISO start date-time (defaults to now)' },\n ends_at: { type: 'string' as const, description: 'ISO end date-time (optional)' },\n spend: { type: 'number' as const, description: 'Planned/committed spend (optional)' },\n },\n required: ['name', 'channel_key'],\n },\n suggestions: [{ label: 'Create an Instagram campaign for this month' }],\n permission: { feature: 'marketing', action: 'create' as const },\n },\n ],\n registries: marketingRegistries,\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'\nexport { createSupabaseMarketingProvider } from './data/supabase'\nexport type {\n ContentPlannerProvider,\n ContentPlan,\n ContentPost,\n SocialAccount,\n PostFormat,\n PostStatus,\n SaveContentPlanInput,\n SaveContentPostInput,\n SaveSocialAccountInput,\n} from './data/contentTypes'\nexport { createMockContentPlannerProvider } from './data/contentMock'\nexport { createSupabaseContentPlannerProvider } from './data/contentSupabase'\n"]}