@fayz-ai/plugin-marketing 0.13.33 → 0.13.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context.tsx","../src/views/OverviewView.tsx","../src/views/GapScreens.tsx","../src/lib/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/CadencesView.tsx","../src/types.ts","../src/views/LandingPageComposer.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/data/contentMedia.ts","../src/views/content/RecordingChecklist.tsx","../src/views/content/PostSocialPreview.tsx","../src/views/content/templates.ts","../src/views/content/PostPage.tsx","../src/views/content/ContentView.tsx","../src/data/blogEntities.tsx","../src/views/blog/useEntityCrud.ts","../src/views/blog/BlogAdminView.tsx","../src/views/blog/BlogEntityForm.tsx","../src/views/MarketingPage.tsx","../src/views/SettingsView.tsx","../src/data/tables.ts","../src/data/registries.ts","../src/lib/onboarding.ts","../src/views/dashboardWidgets.tsx","../src/lib/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/settings.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","Megaphone","PageToolbar","SubpageHeader","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Input","SegmentedControl","Button","RowActions","Sparkles","Trash2","Plus","PageHeaderActions","PageActions","MousePointerClick","ctx","createPluginContext","cn","STATUS_STYLE","Modal","ModalContent","ModalHeader","ModalTitle","ModalBody","ModalFooter","Checkbox","X","ImageIcon","MessageCircle","Send","Globe","isVideo","toDraft","Fragment","MarkdownEditor","Skeleton","ListIcon","ChevronRight","useMemo","useState","useLimitGuard","invalidateLimit","store","useEffect","KpiCard","Target","Percent","DollarSign","counter","getSupabaseClientOptional","getActiveTenantId","normalizeRoute","data","error","acc","plan","post","getClient","requireTenantId","createStore"],"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;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;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;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;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;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;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;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;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;AA0mC/B,IAAM,6CAAA,GAAgD,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,CAAA;AA+CtD,IAAM,wCAAA,GAA2C,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;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;AA4LjD,IAAM,+CAAA,GAAkD,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;A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","file":"index.js","sourcesContent":["import React from 'react'\nimport { createPluginContext } from '@fayz-ai/admin'\nimport type { AcquisitionChannel, ConversionModel } from './types'\nimport type { MarketingCurrency } from './lib/format'\nimport type { MarketingDomainModules } from './lib/presets'\nimport type { MarketingDataProvider } from './data/types'\nimport type { MarketingUIState } from './store'\n\n/**\n * Só `pageTitle`/`pageSubtitle` têm padrão: eles são como ESTE produto chama o\n * módulo. Os rótulos de navegação são opcionais e, sem override, saem do i18n\n * do plugin — um padrão em inglês fazia a faixa de abas aparecer escrita\n * \"Overview · Channels · Campaigns\" num app inteiro em português.\n */\nexport interface MarketingLabels {\n pageTitle: string\n pageSubtitle: string\n overview?: string\n channels?: string\n campaigns?: string\n funnel?: string\n cadences?: 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 /** Ver MarketingPluginOptions.moduleNav. */\n moduleNav?: 'rail' | 'tabs' | 'sidebar'\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 '../context'\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","// ---------------------------------------------------------------------------\n// O que o Marketing do V1 tem e este ainda não.\n// ---------------------------------------------------------------------------\n// Lido no `CRMSidebar` do beautyplace — onde as views de marketing moram junto\n// com as de venda, com o prefixo `mkt-` — e medido no banco de produção do V1.\n// ---------------------------------------------------------------------------\nimport React from 'react'\nimport { ComingSoon } from '@fayz-ai/ui'\n\n/** Segmentos de clientes. */\nexport function SegmentsView() {\n return (\n <ComingSoon\n title=\"Segmentos\"\n summary=\"Recortes salvos da base — «quem comprou nos últimos 90 dias», «quem nunca voltou», «quem gasta acima de X» — para a campanha falar com um grupo e não com todo mundo.\"\n v1Path=\"Marketing → Segmentação → Segmentos de Clientes\"\n measured=\"65 segmentos no V1 e 8 da Artorius. É o que ela mais tem de marketing — e o que mais falta aqui.\"\n missing={[\n 'O construtor de recorte: campo, operador, valor — e a contagem ao vivo de quantos caem nele',\n 'O segmento tem de ser DINÂMICO (recalcula ao usar) ou congelado por escolha, e a diferença precisa ficar clara na tela',\n 'Ligar o segmento à campanha é o que dá sentido aos dois',\n ]}\n />\n )\n}\n\n/** Modelos de mensagem. */\nexport function MessageTemplatesView() {\n return (\n <ComingSoon\n title=\"Modelos de mensagem\"\n summary=\"O texto pronto que a campanha usa, com os campos que se trocam por nome, data ou valor na hora do envio.\"\n v1Path=\"Marketing → Campanhas → Modelos de Mensagem\"\n measured=\"43 modelos no V1, nenhum da Artorius. Existe também `whatsapp_templates`, que é outra coisa: o modelo APROVADO pela Meta.\"\n missing={[\n 'As variáveis e a pré-visualização com dado real — modelo sem prévia erra em produção',\n 'Separar o modelo livre (e-mail, SMS) do modelo aprovado pela Meta (WhatsApp): as regras são outras',\n ]}\n />\n )\n}\n\n/** Histórico de envios. */\nexport function SendHistoryView() {\n return (\n <ComingSoon\n title=\"Histórico de envios\"\n summary=\"O que saiu, para quem, quando, e o que aconteceu depois — entregue, lido, respondido, recusado.\"\n v1Path=\"Marketing → Histórico de Envios\"\n measured=\"Vista de leitura no V1 sobre a fila de mensagens.\"\n missing={[\n 'O evento por destinatário, e não só o total da campanha — é onde se descobre que metade da lista tem número errado',\n 'O recusado tem de virar regra: quem pediu para não receber não pode entrar na próxima',\n ]}\n />\n )\n}\n\n/** Gatilhos rápidos. */\nexport function QuickTriggersView() {\n return (\n <ComingSoon\n title=\"Gatilhos rápidos\"\n summary=\"O disparo de uma mensagem quando algo acontece — aniversário, primeira compra, sumiço — sem montar uma campanha inteira para isso.\"\n v1Path=\"Marketing → Gatilhos Rápidos\"\n measured=\"No V1 é um atalho para automações já prontas, e não um cadastro próprio.\"\n missing={[\n 'As Cadências daqui já fazem a parte difícil; falta a porta de um clique',\n 'Os aniversariantes do CRM são o primeiro gatilho óbvio, e os dois agora estão no mesmo menu',\n ]}\n />\n )\n}\n\n/** Marca. */\nexport function BrandView() {\n return (\n <ComingSoon\n title=\"Marca\"\n summary=\"As cores, as fontes e o logotipo da casa num lugar só — para a peça sair com a cara certa sem ninguém procurar o arquivo.\"\n v1Path=\"Marketing → Marca\"\n measured=\"6 kits de marca no V1 e UM da Artorius. Ela já tem a identidade cadastrada lá.\"\n missing={[\n 'O kit tem cores, gradientes, fontes e arquivos: são quatro tabelas no V1, não um formulário',\n 'As Configurações daqui já guardam a cor e o logotipo do tenant — decidir se este é o mesmo lugar antes de criar o segundo',\n ]}\n />\n )\n}\n\n/** Imagens autorizadas. */\nexport function AuthorizedImagesView() {\n return (\n <ComingSoon\n title=\"Imagens autorizadas\"\n summary=\"As fotos que a casa PODE usar: quem aparece nelas assinou a autorização, e o prazo dela ainda não venceu.\"\n v1Path=\"Marketing → Imagens autorizadas\"\n measured=\"No V1 vive junto do cadastro do cliente, onde a autorização é dada.\"\n missing={[\n 'A autorização é jurídica e tem prazo — o que falta não é a galeria, é a data de validade e o pedido',\n 'Usar foto de cliente sem isso é risco real, e é por isso que a tela existe',\n ]}\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, RangeControl } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { CampaignStatus, DateRangeKey } from '../types'\nimport { trendDelta } from '../lib/format'\nimport { useMarketingStore } from '../context'\nimport { ChannelIcon } from './icons'\nimport { useChannelLookup } from '../context'\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// Seletor de período. Lê/escreve o range compartilhado do módulo.\n//\n// É o MESMO controle das Análises e do painel (RangeControl): era um segmentado\n// de 7d/30d/90d, que é a gramática de uma alternância dentro de um cartão — não\n// da pergunta que a página inteira responde. Trocar de tela trocava o desenho\n// sem trocar o que se faz.\n// ---------------------------------------------------------------------------\n\nconst RANGES: DateRangeKey[] = ['7d', '30d', '90d']\nconst RANGE_LABEL: Record<DateRangeKey, string> = {\n '7d': 'last_7_days', '30d': 'last_30_days', '90d': 'last_90_days',\n}\n\nexport function RangeTabs() {\n const t = useTranslation()\n const range = useMarketingStore((s) => s.range)\n const setRange = useMarketingStore((s) => s.setRange)\n return (\n <RangeControl\n // O rótulo do dicionário, não a chave: \"30d\" no botão era a única tela\n // do produto que escrevia um período em código.\n options={RANGES.map((r) => ({ value: r, label: t(`analytics.range.${RANGE_LABEL[r]}`) }))}\n value={range}\n onChange={(r) => void setRange(r as DateRangeKey)}\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, PageToolbar } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useMarketingConfig, useMarketingStore } from '../context'\nimport { formatCurrency, formatNumber, formatPercent } from '../lib/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 {/* Período na barra flutuante — ver CampaignsView. */}\n <PageToolbar range={<RangeTabs />} />\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 '../context'\nimport { formatCurrency, formatNumber, formatPercent } from '../lib/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 { Megaphone, Send, Users } from 'lucide-react'\nimport {\n Modal, ModalContent, ModalHeader, ModalTitle, ModalBody, ModalFooter,\n Button, Input, SegmentedControl,\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useMarketingConfig, useMarketingProvider, useMarketingStore } from '../context'\nimport type { AudienceSegment } from '../data/types'\nimport type { CampaignKind, CampaignPurpose, CampaignStatus } from '../types'\n\n// ---------------------------------------------------------------------------\n// Nova campanha — e \"campanha\" são DUAS coisas diferentes.\n//\n// Investimento (`ad_spend`) — verba num canal. Não dispara nada; é o\n// denominador do custo por aquisição.\n// Disparo (`outbound`) — uma mensagem para um RECORTE de gente, com\n// uma FINALIDADE. Esta roda sozinha.\n//\n// Eram a mesma tela, e só a primeira existia: dava para registrar quanto se\n// gastou no Instagram e não dava para mandar nada para ninguém.\n//\n// A FINALIDADE NÃO É RÓTULO. `marketing_has_consent` lê exatamente este campo:\n// `transactional` passa sempre (falar de algo que a pessoa já comprou não é\n// marketing), o resto exige opt-in registrado. Escolher \"Promoção\" e escolher\n// \"Aviso sobre o pedido\" muda QUEM recebe — por isso ela é um campo obrigatório\n// do disparo, e não uma etiqueta no fim do formulário.\n// ---------------------------------------------------------------------------\n\nconst STATUSES: CampaignStatus[] = ['draft', 'active', 'paused']\nconst PURPOSES: CampaignPurpose[] = ['promotion', 'newsletter', 'survey', 'transactional']\n\nexport function CampaignComposer({ open, onClose, initialSegmentId }: {\n open: boolean\n onClose: () => void\n /** Pré-selecionado quando a campanha nasce de um recorte (\"criar campanha\n * para este segmento\"), que é o caminho mais curto até ela existir. */\n initialSegmentId?: string\n}) {\n const t = useTranslation()\n const { channels } = useMarketingConfig()\n const provider = useMarketingProvider()\n const saveCampaign = useMarketingStore((s) => s.saveCampaign)\n\n const [kind, setKind] = React.useState<CampaignKind>('ad_spend')\n const [name, setName] = React.useState('')\n const [channelId, setChannelId] = React.useState(channels[0]?.id ?? '')\n const [status, setStatus] = React.useState<CampaignStatus>('draft')\n const [spend, setSpend] = React.useState('')\n const [purpose, setPurpose] = React.useState<CampaignPurpose>('promotion')\n const [segmentId, setSegmentId] = React.useState('')\n const [templateKey, setTemplateKey] = React.useState('')\n const [segments, setSegments] = React.useState<AudienceSegment[]>([])\n const [saving, setSaving] = React.useState(false)\n\n React.useEffect(() => {\n if (!open) return\n setName(''); setChannelId(channels[0]?.id ?? ''); setSpend('')\n setPurpose('promotion'); setTemplateKey('')\n // Um disparo nasce RASCUNHO. Uma campanha que começa a enviar no instante\n // em que alguém aperta \"criar\" é uma campanha que envia um rascunho.\n setStatus('draft')\n setSegmentId(initialSegmentId ?? '')\n setKind(initialSegmentId ? 'outbound' : 'ad_spend')\n void provider.listAudienceSegments().then(setSegments).catch(() => setSegments([]))\n }, [open, channels, initialSegmentId, provider])\n\n const isOutbound = kind === 'outbound'\n // O disparo precisa de para QUEM e de O QUÊ. Sem os dois ele seria gravado e\n // nunca sairia — e a tela não diria por quê.\n const canSave = name.trim().length > 0\n && (isOutbound ? Boolean(segmentId && templateKey.trim()) : Boolean(channelId))\n\n async function handleSave() {\n if (!canSave) return\n setSaving(true)\n try {\n await saveCampaign({\n name: name.trim(),\n // Um disparo também tem canal: é por ele que o relatório soma o que\n // saiu por WhatsApp e o que saiu por e-mail.\n channelId: channelId || channels[0]?.id || 'email',\n status,\n kind,\n purpose: isOutbound ? purpose : 'promotion',\n segmentId: isOutbound ? segmentId : undefined,\n templateKey: isOutbound ? templateKey.trim() : undefined,\n start: new Date().toISOString(),\n spend: isOutbound ? 0 : Number(spend) || 0,\n })\n onClose()\n } finally {\n setSaving(false)\n }\n }\n\n const selectedSegment = segments.find((s) => s.id === segmentId)\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 {/* O que esta campanha É. Primeiro campo porque muda o resto da tela. */}\n <SegmentedControl<CampaignKind>\n className=\"w-full\"\n value={kind}\n onChange={setKind}\n aria-label={t('marketing.composer.kind')}\n options={[\n { value: 'ad_spend', label: t('marketing.composer.kindSpend') },\n { value: 'outbound', label: t('marketing.composer.kindOutbound') },\n ]}\n />\n <p className=\"-mt-2 flex items-start gap-1.5 text-[11px] text-muted-foreground\">\n {isOutbound ? <Send className=\"mt-0.5 h-3 w-3 shrink-0\" /> : <Megaphone className=\"mt-0.5 h-3 w-3 shrink-0\" />}\n {isOutbound ? t('marketing.composer.kindOutboundHint') : t('marketing.composer.kindSpendHint')}\n </p>\n\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 {isOutbound ? (\n <>\n <label className=\"block space-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">{t('marketing.composer.audience')}</span>\n {segments.length > 0 ? (\n <Select value={segmentId} onValueChange={setSegmentId}>\n <SelectTrigger><SelectValue placeholder={t('marketing.composer.audiencePlaceholder')} /></SelectTrigger>\n <SelectContent>\n {segments.map((s) => <SelectItem key={s.id} value={s.id}>{s.name}</SelectItem>)}\n </SelectContent>\n </Select>\n ) : (\n <p className=\"rounded-lg border border-dashed px-3 py-2 text-xs text-muted-foreground\">\n {t('marketing.composer.noSegments')}\n </p>\n )}\n {selectedSegment?.description && (\n <span className=\"flex items-center gap-1.5 text-[11px] text-muted-foreground\">\n <Users className=\"h-3 w-3\" />{selectedSegment.description}\n </span>\n )}\n </label>\n\n <label className=\"block space-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">{t('marketing.composer.purpose')}</span>\n <Select value={purpose} onValueChange={(v) => setPurpose(v as CampaignPurpose)}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {PURPOSES.map((p) => <SelectItem key={p} value={p}>{t(`marketing.purpose.${p}`)}</SelectItem>)}\n </SelectContent>\n </Select>\n {/* A frase que explica por que este campo existe. */}\n <span className=\"text-[11px] text-muted-foreground\">{t(`marketing.purpose.${purpose}.hint`)}</span>\n </label>\n\n <label className=\"block space-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">{t('marketing.composer.template')}</span>\n <Input value={templateKey} onChange={(e) => setTemplateKey(e.target.value)} placeholder=\"ex.: campanha_reativacao\" />\n <span className=\"text-[11px] text-muted-foreground\">{t('marketing.composer.templateHint')}</span>\n </label>\n </>\n ) : (\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 )}\n\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 </ModalBody>\n <ModalFooter>\n <Button variant=\"outline\" onClick={onClose}>{t('marketing.composer.cancel')}</Button>\n <Button onClick={handleSave} disabled={saving || !canSave}>{t('marketing.composer.create')}</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","import React from 'react'\nimport { Plus, Trash2, WandSparkles, SlidersHorizontal } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Button, DataTable, PageHeaderActions, PageToolbar, RowActions } from '@fayz-ai/ui'\nimport { PermissionGate, QuickActionsButton, askAI, PageActions, type PageAction } from '@fayz-ai/admin'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { PluginQuickAction } from '@fayz-ai/core'\nimport { useMarketingConfig, useMarketingStore } from '../context'\nimport { formatCurrency, formatNumber, formatPercent } from '../lib/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 <RowActions\n actions={[{\n id: 'delete',\n label: t('marketing.campaigns.delete'),\n icon: Trash2,\n intent: 'danger',\n onSelect: () => { void deleteCampaign(row.original.id) },\n }]}\n />\n ),\n },\n ], [t, conversion.labelPlural, currency, deleteCampaign])\n\n const createActions = React.useMemo<PageAction[]>(() => [\n {\n id: 'with-ai',\n label: t('assistant.askAI'),\n description: t('marketing.campaigns.aiHint'),\n icon: WandSparkles,\n ai: true,\n intent: 'secondary',\n // Both entries end in a new campaign, so the circle is a \"+\" even though\n // neither icon is one — a menu of ways to create is still a create.\n creates: true,\n permission: { feature: 'marketing', action: 'create' },\n onSelect: () => askAI({\n hint: t('marketing.campaigns.askPlaceholder'),\n intro: {\n role: 'growth',\n persona: t('marketing.campaigns.askPersona'),\n pitch: t('marketing.campaigns.askPitch'),\n description: t('marketing.campaigns.askDescription'),\n suggestions: [0, 1, 2].map((i) => ({ label: t(`marketing.campaigns.askSuggestion.${i}`) })),\n },\n }),\n },\n {\n id: 'by-hand',\n label: t('marketing.campaigns.newByHand'),\n description: t('marketing.campaigns.newByHandHint'),\n icon: SlidersHorizontal,\n intent: 'primary',\n creates: true,\n permission: { feature: 'marketing', action: 'create' },\n onSelect: () => setComposerOpen(true),\n },\n ], [t])\n\n return (\n <div className=\"mx-auto max-w-6xl space-y-4\">\n {/* Período e criar vão para a direita da barra, como em toda tela do\n produto; aqui embaixo fica só a frase que explica a tela. */}\n {/* Criar é ação da tela: barra da shell. Período é a pergunta que a tela\n responde: barra flutuante, como no painel e nas análises. */}\n {/* A porta de IA abre `agent_marketing_create_campaign`, server-plane e já\n existente — aqui só se abre a porta, com a copy da ação. O gate viaja\n com a declaração, em vez de a tela embrulhar o botão no seu próprio. */}\n <PageHeaderActions>\n <PageActions actions={createActions} />\n </PageHeaderActions>\n <PageToolbar range={<RangeTabs />} />\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 { PageToolbar } from '@fayz-ai/ui'\nimport { useMarketingConfig, useMarketingStore } from '../context'\nimport { formatNumber, formatPercent } from '../lib/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 {/* Ver CampaignsView: período na barra flutuante. */}\n <PageToolbar range={<RangeTabs />} />\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 { Workflow } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { SubpageHeader } from '@fayz-ai/ui'\n\n// ---------------------------------------------------------------------------\n// Cadências — a régua de relacionamento, dentro do Marketing.\n//\n// A tela é INJETADA (`cadenceSurface`), não importada: quem é dono da cadência\n// é o plugin-automations, que tem o motor no banco. Este módulo só diz ONDE ela\n// mora — e mora aqui porque \"como a casa fala com quem ainda não comprou\" é uma\n// decisão de marketing, não de infraestrutura de automação.\n//\n// Sem a superfície injetada, a tela não finge: explica o que falta e para de\n// prometer. Um item de menu que abre um quadro vazio custa mais que o silêncio.\n// ---------------------------------------------------------------------------\n\nexport function CadencesView({ surface: Surface }: { surface?: React.ComponentType }) {\n const t = useTranslation()\n\n return (\n <div className=\"space-y-4\">\n <SubpageHeader title={t('marketing.cadences.title')} subtitle={t('marketing.cadences.subtitle')} />\n {Surface ? (\n <Surface />\n ) : (\n <div className=\"flex flex-col items-center gap-1 rounded-lg border border-dashed py-12 text-center\">\n <Workflow className=\"mb-2 h-9 w-9 text-muted-foreground/40\" strokeWidth={1.5} />\n <p className=\"text-sm font-medium\">{t('marketing.cadences.missingTitle')}</p>\n <p className=\"max-w-md text-xs text-muted-foreground\">{t('marketing.cadences.missingHint')}</p>\n </div>\n )}\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// @fayz-ai/plugin-marketing — domain model for ACQUISITION & CONVERSION\n// analytics. The plugin is vertical-agnostic: each app supplies a\n// `ConversionModel` (what a conversion is + where it's read from) and a set of\n// `AcquisitionChannel`s, and the same analytics engine adapts.\n// ---------------------------------------------------------------------------\n\nexport type AcquisitionChannelKind =\n | 'paid'\n | 'organic'\n | 'social'\n | 'referral'\n | 'direct'\n | 'outbound'\n\nexport interface AcquisitionChannel {\n id: string\n label: string\n /** lucide-react icon name (resolved in components/icons.ts) */\n icon: string\n kind: AcquisitionChannelKind\n}\n\n/** Where attribution reads conversions from (per vertical). */\nexport type ConversionSource = 'crm' | 'agenda' | 'orders' | 'custom'\n\nexport interface ConversionModel {\n id: string\n /** singular noun for one conversion, e.g. 'Won deal' | 'Booking' | 'Order' */\n label: string\n labelPlural: string\n /** label for the monetary value, e.g. 'Pipeline value' | 'Revenue' */\n valueLabel: string\n source: ConversionSource\n /** average monetary value of a single conversion (mock + estimates) */\n avgValue: number\n}\n\nexport type CampaignStatus = 'active' | 'paused' | 'ended' | 'draft'\n\n/** An acquisition campaign running on a channel, with attributed performance. */\n/** Para que a mensagem existe — e, por consequência, QUEM pode recebê-la:\n * `marketing_has_consent` libera `transactional` sempre e exige opt-in para o\n * resto. Não é rótulo, é a regra de quem entra no público. */\nexport type CampaignPurpose = 'promotion' | 'survey' | 'newsletter' | 'transactional'\n\n/** `ad_spend` é verba num canal (o que a tela de canais soma). `outbound` é\n * disparo para um público — e só este roda sozinho no tick do minuto. */\nexport type CampaignKind = 'ad_spend' | 'outbound'\n\nexport interface Campaign {\n id: string\n name: string\n channelId: string\n status: CampaignStatus\n kind: CampaignKind\n purpose: CampaignPurpose\n /** O recorte de gente para quem ela vai (campanha `outbound`). */\n segmentId?: string\n /** O modelo de mensagem que sai, no cadastro de Comunicação. */\n templateKey?: string\n start: string\n end?: string\n spend: number\n /** visits / sessions / sends reached (NOT raw impressions) */\n reach: number\n leads: number\n conversions: number\n /** attributed monetary value */\n value: number\n}\n\n/** Per-channel rollup used by the Channels view + Overview. */\nexport interface ChannelPerformance {\n channelId: string\n reach: number\n leads: number\n conversions: number\n spend: number\n value: number\n /** conversions / reach * 100 */\n cvr: number\n /** spend / conversions (0 when no spend) */\n cpa: number\n}\n\nexport interface FunnelStage {\n id: string\n label: string\n count: number\n color: string\n}\n\n/** A site the tenant owns — a row of public.fayz_projects, managed in\n * Settings → Sites. `appId`/`fayzProjectId` are the deploy's ids on the\n * hosting platform: the keys the visit-analytics call needs (app + route +\n * period). Marketing reads these; it does not own them. */\nexport interface MarketingSite {\n id: string\n name: string\n /** live site URL, e.g. 'https://espacorenovario.com.br' */\n url?: string\n appId?: string\n fayzProjectId?: string\n /** Fayz editor for this project — where a planned page gets built. */\n editorUrl?: string\n}\n\n/** 'live' = the route already exists on the site. 'planned' = it does not yet;\n * `prompt` is the brief for building it with Fayz. */\nexport type LandingPageStatus = 'live' | 'planned'\n\n/** A landing page IS a site + a route. `leadTags` is the CRM cross: leads that\n * come in through the page carry those tag slugs. */\nexport interface LandingPage {\n id: string\n siteId: string\n name: string\n /** path within the site, always leading-slashed, e.g. '/lp-capilar' */\n route: string\n leadTags: string[]\n status: LandingPageStatus\n /** what the page should be — only meaningful while status is 'planned' */\n prompt?: string\n isActive: boolean\n\n // ── A porta, que antes era uma tela à parte ──────────────────────────────\n //\n // Uma landing page e uma \"página de captura\" eram duas portas públicas para a\n // mesma coisa. A distinção que existia na minha cabeça — uma é conteúdo, a\n // outra é regra — não é uma distinção que o lojista faz: ele quer UMA porta,\n // com o texto e as regras dela no mesmo lugar.\n\n /** A chave PÚBLICA e opaca da página. Um slug adivinhável deixaria achar a\n * página de outra casa escrevendo o nome dela. */\n captureKey?: string\n /** Em que sala a porta dá. \"Agendamento\" é palavra de salão; num restaurante\n * a mesma página marca MESA, e numa loja só captura contato. */\n captureDestination: CaptureDestination\n captureRequiredFields: CaptureField[]\n /** A janela é dupla: piso em horas contra \"daqui a dez minutos\", teto em dias\n * contra \"o ano que vem\". Nulas quando o destino não marca nada. */\n minAdvanceHours?: number\n maxAdvanceDays?: number\n}\n\nexport type CaptureDestination = 'lead' | 'booking' | 'reservation'\nexport type CaptureField = 'name' | 'phone' | 'email' | 'document' | 'notes'\nexport const CAPTURE_FIELDS: CaptureField[] = ['name', 'phone', 'email', 'document', 'notes']\n\nexport interface LandingPagePerf extends LandingPage {\n siteName: string\n siteUrl?: string\n appId?: string\n editorUrl?: string\n /** full public URL (site + route); the bare route when the site has no URL */\n url: string\n /** null while no visit source is connected — renders as \"—\", not as zero. */\n visits: number | null\n /** leads carrying `leadTag` within the queried period */\n conversions: number\n /** conversions / visits * 100 — null when visits are unknown */\n cvr: number | null\n}\n\nexport interface MarketingOverview {\n conversions: number\n conversionsPrev: number\n cvr: number\n cvrPrev: number\n spend: number\n cpa: number\n value: number\n topChannelId: string | null\n /** conversions per channel for the mix bars */\n channelMix: Array<{ channelId: string; conversions: number }>\n}\n\nexport type DateRangeKey = '7d' | '30d' | '90d'\n\nexport interface MarketingQuery {\n range: DateRangeKey\n /** optionally scope to a single channel (channel detail) */\n channelId?: string\n}\n\nexport const DATE_RANGE_LABELS: Record<DateRangeKey, string> = {\n '7d': 'Last 7 days',\n '30d': 'Last 30 days',\n '90d': 'Last 90 days',\n}\n\n","import React from 'react'\nimport { Sparkles } from 'lucide-react'\nimport {\n SheetBody, SheetFooter,\n Button, Input, Badge, SegmentedControl,\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Textarea,\n} from '@fayz-ai/ui'\nimport { RightRailPage } from '@fayz-ai/admin'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useMarketingStore } from '../context'\nimport type { LandingPage, LandingPageStatus, CaptureDestination, CaptureField } from '../types'\nimport { CAPTURE_FIELDS } from '../types'\n\n/** 'Consulta capilar' → 'consulta-capilar' — the shape CRM tag slugs take. */\nfunction slugify(value: string): string {\n return value\n .normalize('NFD').replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase().trim()\n .replace(/[^a-z0-9:]+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\nexport function LandingPageComposer({\n open, page, onClose,\n}: { open: boolean; page?: LandingPage | null; onClose: () => void }) {\n const t = useTranslation()\n const sites = useMarketingStore((s) => s.sites)\n const leadTags = useMarketingStore((s) => s.leadTags)\n const saveLandingPage = useMarketingStore((s) => s.saveLandingPage)\n\n const [siteId, setSiteId] = React.useState('')\n const [name, setName] = React.useState('')\n const [route, setRoute] = React.useState('')\n const [status, setStatus] = React.useState<LandingPageStatus>('live')\n const [prompt, setPrompt] = React.useState('')\n const [tags, setTags] = React.useState<string[]>([])\n const [newTag, setNewTag] = React.useState('')\n // A porta. Antes isto era uma TELA à parte (`/sales/capture`) e uma segunda\n // tabela: duas portas públicas para a mesma coisa. O lojista quer uma só,\n // com o texto e a regra no mesmo lugar.\n const [destination, setDestination] = React.useState<CaptureDestination>('lead')\n const [required, setRequired] = React.useState<CaptureField[]>(['name'])\n const [minH, setMinH] = React.useState('')\n const [maxD, setMaxD] = React.useState('')\n const [saving, setSaving] = React.useState(false)\n\n React.useEffect(() => {\n if (!open) return\n setSiteId(page?.siteId ?? sites[0]?.id ?? '')\n setName(page?.name ?? '')\n setRoute(page?.route ?? '')\n setStatus(page?.status ?? 'live')\n setPrompt(page?.prompt ?? '')\n setTags(page?.leadTags ?? [])\n setNewTag('')\n setDestination(page?.captureDestination ?? 'lead')\n setRequired(page?.captureRequiredFields?.length ? page.captureRequiredFields : ['name'])\n setMinH(page?.minAdvanceHours != null ? String(page.minAdvanceHours) : '')\n setMaxD(page?.maxAdvanceDays != null ? String(page.maxAdvanceDays) : '')\n }, [open, page, sites])\n\n const site = sites.find((s) => s.id === siteId)\n const previewPath = route.trim() ? (route.trim().startsWith('/') ? route.trim() : `/${route.trim()}`) : ''\n\n // The catalog plus whatever this page already carries: a slug used by a\n // campaign before anyone curated the vocabulary is still a real tag.\n const options = React.useMemo(() => {\n const byslug = new Map(leadTags.map((tag) => [tag.slug, tag.name]))\n for (const slug of tags) if (!byslug.has(slug)) byslug.set(slug, slug)\n return [...byslug].map(([slug, label]) => ({ slug, label }))\n }, [leadTags, tags])\n\n function toggleTag(slug: string) {\n setTags((current) => (current.includes(slug) ? current.filter((s) => s !== slug) : [...current, slug]))\n }\n\n function addTag() {\n const slug = slugify(newTag)\n if (!slug) return\n setTags((current) => (current.includes(slug) ? current : [...current, slug]))\n setNewTag('')\n }\n\n async function handleSave() {\n if (!siteId || !name.trim() || !route.trim()) return\n setSaving(true)\n try {\n await saveLandingPage({\n id: page?.id,\n siteId,\n name: name.trim(),\n route: route.trim(),\n leadTags: tags,\n status,\n prompt: status === 'planned' ? prompt.trim() || undefined : undefined,\n captureDestination: destination,\n captureRequiredFields: required,\n minAdvanceHours: destination !== 'lead' && minH ? Number(minH) : null,\n maxAdvanceDays: destination !== 'lead' && maxD ? Number(maxD) : null,\n })\n onClose()\n } finally {\n setSaving(false)\n }\n }\n\n return (\n // Beside the list, not over it: the routes already taken are what you check\n // a new one against, and the dialog covered them.\n <RightRailPage\n title={page ? (page.name || t('marketing.landing.edit')) : t('marketing.landing.new')}\n open={open}\n onClose={onClose}\n width=\"max-w-md\"\n >\n <SheetBody className=\"space-y-4\">\n <label className=\"block space-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">{t('marketing.landing.site')}</span>\n <Select value={siteId} onValueChange={setSiteId}>\n <SelectTrigger><SelectValue placeholder={t('marketing.landing.sitePlaceholder')} /></SelectTrigger>\n <SelectContent>\n {sites.map((s) => (\n <SelectItem key={s.id} value={s.id}>\n {s.url ? `${s.name} · ${s.url.replace(/^https?:\\/\\//, '')}` : s.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n\n <label className=\"block space-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">{t('marketing.landing.name')}</span>\n <Input value={name} onChange={(e) => setName(e.target.value)} placeholder={t('marketing.landing.namePlaceholder')} />\n </label>\n\n <label className=\"block space-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">{t('marketing.landing.route')}</span>\n <Input value={route} onChange={(e) => setRoute(e.target.value)} placeholder=\"/lp-capilar\" />\n {site?.url && previewPath ? (\n <span className=\"block text-xs text-muted-foreground\">\n {site.url.replace(/\\/+$/, '')}{previewPath}\n </span>\n ) : null}\n </label>\n\n <div className=\"space-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">{t('marketing.landing.status')}</span>\n <SegmentedControl\n value={status}\n onChange={(v) => setStatus(v as LandingPageStatus)}\n options={[\n { value: 'live', label: t('marketing.landing.statusLive') },\n { value: 'planned', label: t('marketing.landing.statusPlanned') },\n ]}\n />\n </div>\n\n {status === 'planned' ? (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm font-medium text-foreground\">{t('marketing.landing.prompt')}</span>\n {site?.editorUrl ? (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => window.open(site.editorUrl!, '_blank', 'noopener,noreferrer')}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-primary hover:underline\"\n >\n <Sparkles className=\"h-3.5 w-3.5\" /> {t('marketing.landing.buildWithFayz')}\n </Button>\n ) : null}\n </div>\n <Textarea\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n rows={3}\n placeholder={t('marketing.landing.promptPlaceholder')}\n className=\"rounded-md border-border bg-background shadow-none focus-visible:ring-offset-0\"\n />\n </div>\n ) : null}\n\n {/* One field, not a chip list plus a form: the catalog and the free\n slug live in the same box, like any tag picker. */}\n <div className=\"space-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">{t('marketing.landing.leadTag')}</span>\n <div className=\"flex flex-wrap items-center gap-1.5 rounded-md border border-border bg-background px-2 py-2 focus-within:ring-2 focus-within:ring-ring\">\n {options.map((opt) => {\n const active = tags.includes(opt.slug)\n return (\n <Badge\n key={opt.slug}\n variant={active ? 'default' : 'outline'}\n className=\"cursor-pointer text-xs\"\n onClick={() => toggleTag(opt.slug)}\n >\n {opt.label}\n </Badge>\n )\n })}\n <div className=\"min-w-[8rem] flex-1\">\n <Input\n value={newTag}\n onChange={(e) => setNewTag(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); addTag() } }}\n onBlur={addTag}\n placeholder={t('marketing.landing.leadTagPlaceholder')}\n className=\"h-auto rounded-none border-0 bg-transparent px-1 py-0 text-xs shadow-none focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n </div>\n </div>\n <span className=\"block text-xs text-muted-foreground\">{t('marketing.landing.leadTagHint')}</span>\n </div>\n\n {/* ── O formulário da página ─────────────────────────────────────\n A página é o conteúdo; isto é a regra da porta. Ficavam em telas\n separadas, e a separação era minha, não do lojista. */}\n <div className=\"space-y-3 rounded-card border bg-muted/20 p-3\" data-testid=\"landing-capture\">\n <div>\n <p className=\"text-sm font-medium\">{t('marketing.landing.formTitle')}</p>\n <p className=\"text-xs text-muted-foreground\">{t('marketing.landing.formHint')}</p>\n </div>\n\n <div>\n <label className=\"text-xs font-medium\">{t('marketing.landing.destination')}</label>\n <Select value={destination} onValueChange={(v) => setDestination(v as CaptureDestination)}>\n <SelectTrigger className=\"h-9 text-sm\"><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"lead\">{t('marketing.landing.dest.lead')}</SelectItem>\n <SelectItem value=\"booking\">{t('marketing.landing.dest.booking')}</SelectItem>\n <SelectItem value=\"reservation\">{t('marketing.landing.dest.reservation')}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n <div>\n <label className=\"text-xs font-medium\">{t('marketing.landing.required')}</label>\n <p className=\"text-[10px] text-muted-foreground\">{t('marketing.landing.requiredHint')}</p>\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {CAPTURE_FIELDS.map((f) => {\n const on = required.includes(f)\n return (\n <Button variant=\"bare\" size=\"bare\" key={f} type=\"button\"\n className={`font-normal rounded-full border px-2.5 py-1 text-xs ${on ? 'border-primary bg-primary/10 text-primary' : 'text-muted-foreground'}`}\n onClick={() => setRequired((prev) => on ? prev.filter((x) => x !== f) : [...prev, f])}>\n {t(`marketing.landing.field.${f}`)}\n </Button>\n )\n })}\n </div>\n </div>\n\n {/* A janela só aparece onde há horário para marcar. */}\n {destination !== 'lead' && (\n <div className=\"grid gap-3 sm:grid-cols-2\" data-testid=\"landing-window\">\n <div>\n <label className=\"text-xs font-medium\">{t('marketing.landing.minAdvance')}</label>\n <Input type=\"number\" min={0} value={minH} onChange={(e) => setMinH(e.target.value)} placeholder=\"2\" />\n <p className=\"mt-1 text-[10px] text-muted-foreground\">{t('marketing.landing.minAdvanceHint')}</p>\n </div>\n <div>\n <label className=\"text-xs font-medium\">{t('marketing.landing.maxAdvance')}</label>\n <Input type=\"number\" min={1} value={maxD} onChange={(e) => setMaxD(e.target.value)} placeholder=\"60\" />\n <p className=\"mt-1 text-[10px] text-muted-foreground\">{t('marketing.landing.maxAdvanceHint')}</p>\n </div>\n </div>\n )}\n\n {page?.captureKey && (\n <p className=\"text-[10px] text-muted-foreground\">\n {t('marketing.landing.publicKey', { key: page.captureKey })}\n </p>\n )}\n </div>\n </SheetBody>\n {/* No Cancel: the column header holds the way out. */}\n <SheetFooter>\n <Button\n className=\"flex-1\"\n onClick={handleSave}\n disabled={saving || !siteId || !name.trim() || !route.trim()}\n >\n {page ? t('marketing.landing.save') : t('marketing.landing.create')}\n </Button>\n </SheetFooter>\n </RightRailPage>\n )\n}\n","import React from 'react'\nimport { MousePointerClick, Layers, Users, Plus, Pencil, Trash2, ExternalLink, Sparkles } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { DataTable, PageHeaderActions, PageToolbar, RowActions } from '@fayz-ai/ui'\nimport { PageActions, type PageAction } from '@fayz-ai/admin'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useMarketingStore } from '../context'\nimport { formatNumber, formatPercent } from '../lib/format'\nimport { KpiCard, RangeTabs } from '../components/MarketingBits'\nimport { LandingPageComposer } from './LandingPageComposer'\nimport type { LandingPagePerf } from '../types'\n\nexport function LandingPagesView() {\n const t = useTranslation()\n const pages = useMarketingStore((s) => s.landingPages)\n const deleteLandingPage = useMarketingStore((s) => s.deleteLandingPage)\n const [editing, setEditing] = React.useState<LandingPagePerf | null>(null)\n const [composerOpen, setComposerOpen] = React.useState(false)\n\n // Visits are only known for pages whose host reports them; a page with an\n // unknown count must not drag the total down to a wrong number.\n const measured = pages.filter((p) => p.visits !== null)\n const totalVisits = measured.reduce((s, p) => s + (p.visits ?? 0), 0)\n const totalLeads = pages.reduce((s, p) => s + p.conversions, 0)\n\n function openNew() {\n setEditing(null)\n setComposerOpen(true)\n }\n\n function openEdit(page: LandingPagePerf) {\n setEditing(page)\n setComposerOpen(true)\n }\n\n const columns = React.useMemo<ColumnDef<LandingPagePerf, any>[]>(() => [\n {\n accessorKey: 'name',\n header: t('marketing.col.page'),\n cell: ({ row }) => (\n <div className=\"min-w-0\">\n <span className=\"flex items-center gap-1.5 truncate font-medium text-foreground\">\n {row.original.name}\n {row.original.status === 'planned' ? (\n <span className=\"rounded-full bg-amber-100 px-2 py-0.5 text-[10px] font-semibold text-amber-800\">\n {t('marketing.landing.statusPlanned')}\n </span>\n ) : null}\n </span>\n <span className=\"block truncate text-xs text-muted-foreground\">{row.original.siteName}</span>\n </div>\n ),\n },\n {\n accessorKey: 'route',\n header: t('marketing.col.route'),\n cell: ({ row }) => (\n <a\n href={row.original.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n onClick={(e) => e.stopPropagation()}\n className=\"inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground hover:underline\"\n >\n {row.original.route}\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n ),\n },\n {\n accessorKey: 'leadTags',\n header: t('marketing.col.leadTag'),\n cell: ({ getValue }) => {\n const tags = (getValue() as string[]) ?? []\n if (!tags.length) return <span className=\"text-muted-foreground\">—</span>\n return (\n <div className=\"flex flex-wrap gap-1\">\n {tags.map((tag) => (\n <span key={tag} className=\"rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground\">{tag}</span>\n ))}\n </div>\n )\n },\n },\n {\n accessorKey: 'visits',\n header: t('marketing.col.visits'),\n cell: ({ getValue }) => {\n const visits = getValue() as number | null\n return visits === null\n ? <span className=\"text-muted-foreground\" title={t('marketing.landing.visitsPending')}>—</span>\n : <span className=\"text-muted-foreground\">{formatNumber(visits)}</span>\n },\n },\n {\n accessorKey: 'conversions',\n header: t('marketing.col.leads'),\n cell: ({ getValue }) => <span className=\"font-medium text-foreground\">{formatNumber(getValue() as number)}</span>,\n },\n {\n accessorKey: 'cvr',\n header: t('marketing.col.cvr'),\n cell: ({ getValue }) => {\n const cvr = getValue() as number | null\n return cvr === null\n ? <span className=\"text-muted-foreground\">—</span>\n : <span className=\"text-muted-foreground\">{formatPercent(cvr)}</span>\n },\n },\n {\n id: 'actions', header: '', enableSorting: false,\n cell: ({ row }) => (\n <RowActions\n actions={[\n ...(row.original.status === 'planned' && row.original.editorUrl ? [{\n id: 'build',\n label: t('marketing.landing.buildWithFayz'),\n icon: Sparkles,\n onSelect: () => window.open(row.original.editorUrl!, '_blank', 'noopener,noreferrer'),\n }] : []),\n { id: 'edit', label: t('marketing.landing.edit'), icon: Pencil, onSelect: () => openEdit(row.original) },\n {\n id: 'delete',\n label: t('marketing.landing.delete'),\n icon: Trash2,\n intent: 'danger' as const,\n onSelect: () => { void deleteLandingPage(row.original.id) },\n },\n ]}\n />\n ),\n },\n ], [t, deleteLandingPage])\n\n const createActions = React.useMemo<PageAction[]>(() => [{\n id: 'new-page',\n label: t('marketing.landing.new'),\n icon: Plus,\n intent: 'primary',\n creates: true,\n permission: { feature: 'marketing', action: 'create' },\n onSelect: openNew,\n }], [t])\n\n return (\n <div className=\"mx-auto max-w-6xl space-y-4\">\n {/* Criar na barra da shell, período na flutuante — ver CampaignsView.\n Declarado, não desenhado: era o último botão do módulo montado à mão,\n e por isso o único que no celular ficava no cabeçalho em vez de virar\n o \"+\" do polegar. O gate viaja na declaração. */}\n <PageHeaderActions>\n <PageActions actions={createActions} />\n </PageHeaderActions>\n <PageToolbar range={<RangeTabs />} />\n\n <div className=\"grid grid-cols-3 gap-4\">\n <KpiCard icon={Layers} label={t('marketing.metric.pages')} value={String(pages.length)} />\n <KpiCard\n icon={MousePointerClick}\n label={t('marketing.metric.totalVisits')}\n value={measured.length > 0 ? formatNumber(totalVisits) : '—'}\n />\n <KpiCard icon={Users} label={t('marketing.metric.leads')} value={formatNumber(totalLeads)} />\n </div>\n\n <DataTable columns={columns} data={pages} emptyMessage={t('marketing.landing.empty')} />\n\n {measured.length < pages.length ? (\n <p className=\"text-xs text-muted-foreground\">{t('marketing.landing.visitsPending')}</p>\n ) : null}\n\n <LandingPageComposer open={composerOpen} page={editing} onClose={() => { setComposerOpen(false); setEditing(null) }} />\n </div>\n )\n}\n","import { createPluginContext } from '@fayz-ai/admin'\nimport type { ResolvedMarketingConfig } from '../../context'\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 { Button, 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 variant=\"bare\" size=\"bare\"\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 Modal, ModalContent, ModalHeader, ModalTitle, ModalBody, ModalFooter,\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 variant=\"bare\" size=\"bare\"\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/** The brief in the shell's right column — the board stays in sight while the\n * 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 <Modal open={open} onOpenChange={(o) => { if (!o) onClose() }}>\n <ModalContent size=\"4xl\">\n <ModalHeader>\n <ModalTitle>{plan?.name ?? t('marketing.content.brief')}</ModalTitle>\n </ModalHeader>\n <ModalBody>\n {draft ? (\n <BriefFields draft={draft} patch={patch} />\n ) : (\n <p className=\"text-sm text-muted-foreground\">…</p>\n )}\n </ModalBody>\n <ModalFooter>\n <Button variant=\"outline\" onClick={onClose}>{t('common.cancel')}</Button>\n <Button onClick={() => void save().then(onClose)} disabled={!dirty || saving}>\n {t('marketing.content.save')}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\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 variant=\"bare\" size=\"bare\"\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 variant=\"bare\" size=\"bare\"\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 { Button, 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 variant=\"bare\" size=\"bare\"\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, Skeleton,\n Modal, ModalContent, ModalHeader, ModalTitle, ModalBody, ModalFooter,\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 modal — opens over the board: title, a compact meta row\n// (format / status / date / hook / CTA), the markdown script body and the\n// recording checklist beside it.\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 variant=\"bare\" size=\"bare\"\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 font-normal disabled:opacity-100\"\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 PostModal({ postId, onClose }: { postId: string | null; onClose: () => void }) {\n return (\n <Modal open={!!postId} onOpenChange={(o) => { if (!o) onClose() }}>\n <ModalContent size=\"5xl\">\n {postId && <PostEditor postId={postId} onClose={onClose} />}\n </ModalContent>\n </Modal>\n )\n}\n\nfunction PostEditor({ postId, onClose }: { postId: string; onClose: () => 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 <ModalBody className=\"space-y-5\">\n <Skeleton className=\"h-8 w-56\" />\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 </ModalBody>\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\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 <>\n <ModalHeader>\n <ModalTitle>{draft.title || t('marketing.content.untitled')}</ModalTitle>\n </ModalHeader>\n <ModalBody>\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-[minmax(0,1fr)_18rem]\">\n <div className=\"min-w-0 space-y-5\">\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 </div>\n <aside className=\"space-y-2 lg:border-l lg:border-border lg:pl-6\">\n <p className=\"text-sm font-medium text-foreground\">{t('marketing.content.checklistTitle')}</p>\n <p className=\"text-xs text-muted-foreground\">{t('marketing.content.checklistDescription')}</p>\n <RecordingChecklist post={post} />\n </aside>\n </div>\n </ModalBody>\n {/* Delete confirms inline in the footer: no modal stacked on a modal. */}\n <ModalFooter className=\"sm:justify-between\">\n {confirmDelete ? (\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm text-muted-foreground\">{t('marketing.content.deletePostConfirm')}</span>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setConfirmDelete(false)}>\n {t('marketing.content.cancel')}\n </Button>\n <Button variant=\"destructive\" size=\"sm\" onClick={() => void deletePost(post.id).then(onClose)}>\n {t('marketing.content.deletePost')}\n </Button>\n </div>\n ) : (\n <Button variant=\"ghost\" className=\"text-destructive\" onClick={() => setConfirmDelete(true)}>\n {t('marketing.content.deletePost')}\n </Button>\n )}\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" onClick={onClose}>{t('marketing.content.cancel')}</Button>\n <Button onClick={() => void save().then(onClose)} disabled={!dirty || saving}>\n {t('marketing.content.save')}\n </Button>\n </div>\n </ModalFooter>\n </>\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 { ColumnDef } from '@tanstack/react-table'\nimport type { SocialAccount } from '../../data/contentTypes'\nimport {\n Button, DataTable, Input, Skeleton, cn, ConfirmDialog, SegmentedControl, PageHeaderActions,\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem, SelectSeparator,\n Modal, ModalContent, ModalHeader, ModalTitle, ModalBody, ModalFooter,\n} from '@fayz-ai/ui'\nimport { useTranslation, getCurrentLocale } from '@fayz-ai/core'\nimport { useOrganizationStore, useLimitGuard, invalidateLimit } from '@fayz-ai/admin'\nimport { PlanBriefSheet } from './PlanBriefView'\nimport { PostModal } from './PostPage'\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 variant=\"bare\" size=\"bare\"\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\">{shortDay(new Date(`${post.scheduledDate}T00:00:00`))}</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 flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5 px-1\">\n <p className=\"whitespace-nowrap text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {t('marketing.content.week')} {week}\n </p>\n <p className=\"whitespace-nowrap 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 variant=\"bare\" size=\"bare\"\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 variant=\"bare\" size=\"bare\"\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(getCurrentLocale(), { 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(getCurrentLocale(), { 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(getCurrentLocale(), { month: 'long', year: 'numeric' })\n const weekdayLabels = days.slice(0, 7).map((d) =>\n d.toLocaleDateString(getCurrentLocale(), { 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 variant=\"bare\" size=\"bare\"\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 variant=\"bare\" size=\"bare\"\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 variant=\"bare\" size=\"bare\"\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 font-normal\"\n >\n {post.title || t('marketing.content.untitled')}\n </Button>\n ))}\n {dayPosts.length > MAX_VISIBLE && (\n <Button variant=\"bare\" size=\"bare\"\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 const columns = React.useMemo<ColumnDef<ContentPost>[]>(() => {\n const head = (key: string) => () => <span className=\"text-xs uppercase tracking-wide\">{t(key)}</span>\n return [\n { id: 'week', header: head('marketing.content.listWeek'), cell: ({ row }) => <span className=\"text-muted-foreground\">{row.original.weekNumber}</span> },\n {\n id: 'title', header: head('marketing.content.listTitle'),\n cell: ({ row: { original: post } }) => (\n <span className=\"flex items-center gap-2 font-medium text-foreground\">\n {post.title || t('marketing.content.untitled')}\n <PlatformBadges platforms={post.platforms} />\n </span>\n ),\n },\n { id: 'format', header: head('marketing.content.listFormat'), cell: ({ row }) => <FormatBadge format={row.original.format} /> },\n { id: 'status', header: head('marketing.content.listStatus'), cell: ({ row }) => <PostStatusBadge status={row.original.status} /> },\n { id: 'date', header: head('marketing.content.listDate'), cell: ({ row }) => <span className=\"text-muted-foreground\">{row.original.scheduledDate ?? '—'}</span> },\n ]\n }, [t])\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 <DataTable variant=\"bare\" columns={columns} data={posts} onRowClick={(post) => onOpenPost(post.id)} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n\nexport function ContentView({ initialPostId = null }: {\n /** Deep link (`#/marketing/content/post/<id>`) opens the board with this post's modal up. */\n initialPostId?: string | null\n}) {\n const t = useTranslation()\n const [openPostId, setOpenPostId] = React.useState<string | null>(initialPostId)\n // replaceState, not navigate: a hash change re-routes the module and remounts\n // the board under the modal (scroll and filters lost).\n const onOpenPost = React.useCallback((id: string | null) => {\n setOpenPostId(id)\n window.history.replaceState(window.history.state, '', id ? `#/marketing/content/post/${id}` : '#/marketing/content')\n }, [])\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 {plan && (\n <PageHeaderActions>\n <Button onClick={() => setBriefOpen(true)}>\n <NotebookPen className=\"mr-1.5 h-4 w-4\" />\n {t('marketing.content.brief')}\n </Button>\n </PageHeaderActions>\n )}\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 </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 <PostModal postId={openPostId} onClose={() => onOpenPost(null)} />\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 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, type CrudNavTab } from '@fayz-ai/admin'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useMarketingConfig } from '../../context'\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, navTabs }: { navigate: (view: string) => void; navTabs: CrudNavTab[] }) {\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 navTabs={navTabs}\n activeNavTab=\"posts\"\n onNew={() => navigate('blog-new')}\n // O post é escrevível pelo agente (marketing publica a entidade em\n // `queryEntities` com writable), então a porta leva a algum lugar.\n aiCreate={{\n hint: 'Descreva o post…',\n description: 'Descreva o assunto e eu escrevo o rascunho.',\n intro: {\n role: 'growth',\n persona: 'Redator do blog',\n pitch: 'Diga sobre o que é o post.',\n description:\n 'Escrevo título, resumo e corpo em markdown, com slug e tempo de leitura. Nasce como rascunho — você lê, ajusta e publica quando quiser.',\n suggestions: [\n { label: 'Um post sobre cuidados pós-procedimento' },\n { label: 'Cinco dúvidas frequentes dos clientes, respondidas' },\n { label: 'Um post curto para divulgar a promoção do mês' },\n ],\n },\n }}\n addLabel=\"New post\"\n onRowClick={(row) => navigate(`blog-post:${(row as { id: string }).id}`)}\n />\n )\n}\n\nfunction CategoriesList({ navigate, navTabs }: { navigate: (view: string) => void; navTabs: CrudNavTab[] }) {\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 navTabs={navTabs}\n activeNavTab=\"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 t = useTranslation()\n const [lens, setLens] = useState<'posts' | 'categories'>('posts')\n\n // Posts e Categorias são listas IRMÃS, e a régua para isso já existe: a faixa\n // de abas do cabeçalho da lista (`navTabs`), a mesma de qualquer CRUD. Um\n // SegmentedControl solto acima da lista era um terceiro jeito de trocar de\n // visão na mesma tela — e ficava fora do cabeçalho, longe das ações.\n const navTabs: CrudNavTab[] = useMemo(() => [\n { id: 'posts', label: labels.blog ?? t('marketing.nav.blog'), onSelect: () => setLens('posts') },\n { id: 'categories', label: labels.blogCategories ?? t('marketing.nav.blogCategories'), onSelect: () => setLens('categories') },\n ], [labels.blog, labels.blogCategories, t])\n\n return lens === 'posts'\n ? <PostsList navigate={navigate} navTabs={navTabs} />\n : <CategoriesList navigate={navigate} navTabs={navTabs} />\n}\n","import React from 'react'\nimport { SubpageHeader, Button, toast } from '@fayz-ai/ui'\nimport { CrudFormPage, useLimitGuard, invalidateLimit } from '@fayz-ai/admin'\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/admin'\nimport { MarketingContextProvider, type ResolvedMarketingConfig } from '../context'\nimport type { MarketingDataProvider } from '../data/types'\nimport type { ContentPlannerProvider } from '../data/contentTypes'\nimport type { MarketingUIState } from '../store'\nimport { OverviewView } from './OverviewView'\nimport {\n SegmentsView, MessageTemplatesView, SendHistoryView,\n QuickTriggersView, BrandView, AuthorizedImagesView,\n} from './GapScreens'\nimport { ChannelsView } from './ChannelsView'\nimport { ChannelDetailView } from './ChannelDetailView'\nimport { CampaignsView } from './CampaignsView'\nimport { FunnelView } from './FunnelView'\nimport { CadencesView } from './CadencesView'\nimport { LandingPagesView } from './LandingPagesView'\nimport { ContentPlannerContextProvider } from './content/ContentPlannerContext'\nimport type { ContentPlannerUIState } from './content/contentStore'\nimport { ContentView } from './content/ContentView'\nimport { PlanBriefView } from './content/PlanBriefView'\nimport { BlogAdminView } from './blog/BlogAdminView'\nimport { BlogEntityForm } from './blog/BlogEntityForm'\nimport { buildBlogPostEntity, buildBlogCategoryEntity } from '../data/blogEntities'\n\nfunction buildNav(\n config: ResolvedMarketingConfig,\n view: string,\n navigate: (v: string) => void,\n hasCadenceSurface: boolean,\n /** Sem override do app, cada aba se nomeia pelo i18n do plugin. */\n t: (key: string, params?: Record<string, string | number>) => string,\n): ModuleNavItem[] {\n const items: ModuleNavItem[] = [\n { id: 'overview', label: config.labels.overview ?? t('marketing.nav.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 ?? t('marketing.nav.channels'), icon: 'Radio',\n active: view === 'channels' || view.startsWith('channel-detail:'),\n onClick: () => navigate('channels'),\n })\n }\n // A campanha e o que ela usa moram juntos: o modelo é o texto que ela manda e\n // o histórico é o que aconteceu depois de mandar. No V1 são três linhas\n // soltas em pontos diferentes da barra. Ver ./GapScreens.\n if (config.modules.campaigns) {\n items.push({\n id: 'campaigns', label: config.labels.campaigns ?? t('marketing.nav.campaigns'), icon: 'Megaphone',\n active: ['campaigns', 'message-templates', 'send-history'].includes(view),\n children: [\n { id: 'campaigns', label: config.labels.campaigns ?? t('marketing.nav.campaigns'), defaultChild: true, active: view === 'campaigns', onClick: () => navigate('campaigns') },\n { id: 'message-templates', label: t('marketing.nav.messageTemplates'), active: view === 'message-templates', onClick: () => navigate('message-templates') },\n { id: 'send-history', label: t('marketing.nav.sendHistory'), active: view === 'send-history', onClick: () => navigate('send-history') },\n ],\n })\n // Para quem a campanha fala. É a tela que a Artorius mais usa no V1 (8 dos\n // 65 segmentos são dela) e a que mais falta aqui.\n items.push({ id: 'segments', label: t('marketing.nav.segments'), icon: 'Users', active: view === 'segments', onClick: () => navigate('segments') })\n }\n if (config.modules.funnel) {\n items.push({ id: 'funnel', label: config.labels.funnel ?? t('marketing.nav.funnel'), icon: 'Filter', active: view === 'funnel', onClick: () => navigate('funnel') })\n }\n // Vizinha das Campanhas de propósito: a campanha é o disparo único, a\n // cadência é a sequência. São a mesma decisão vista em dois prazos.\n if (config.modules.cadences && hasCadenceSurface) {\n items.push({\n id: 'cadences', label: config.labels.cadences ?? t('marketing.cadences.title'), icon: 'Workflow',\n active: view === 'cadences' || view === 'quick-triggers',\n children: [\n { id: 'cadences', label: config.labels.cadences ?? t('marketing.cadences.title'), defaultChild: true, active: view === 'cadences', onClick: () => navigate('cadences') },\n // O gatilho é a cadência de um passo só, com a porta de um clique.\n { id: 'quick-triggers', label: t('marketing.nav.quickTriggers'), active: view === 'quick-triggers', onClick: () => navigate('quick-triggers') },\n ],\n })\n }\n if (config.modules.landingPages) {\n items.push({ id: 'landing-pages', label: config.labels.landingPages ?? t('marketing.nav.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 ?? t('marketing.nav.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 ?? t('marketing.nav.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\n // A identidade da casa e o que se pode publicar com ela. Última do menu\n // porque se mexe uma vez e se consulta sempre — ver ./GapScreens.\n {\n items.push({\n id: 'brand', label: t('marketing.nav.brand'), icon: 'Palette',\n active: view === 'brand' || view === 'authorized-images',\n children: [\n { id: 'brand', label: t('marketing.nav.brand'), defaultChild: true, active: view === 'brand', onClick: () => navigate('brand') },\n { id: 'authorized-images', label: t('marketing.nav.authorizedImages'), active: view === 'authorized-images', onClick: () => navigate('authorized-images') },\n ],\n })\n }\n return items\n}\n\nexport function MarketingPage({ config, provider, store, contentProvider, contentStore, cadenceSurface }: {\n config: ResolvedMarketingConfig\n provider: MarketingDataProvider\n store: StoreApi<MarketingUIState>\n contentProvider: ContentPlannerProvider\n contentStore: StoreApi<ContentPlannerUIState>\n /** A tela de cadências do plugin-automations, injetada pelo app. */\n cadenceSurface?: React.ComponentType\n}) {\n const t = useTranslation()\n const { view, direction, navigate } = useModuleNavigation('/marketing', {\n overview: 0, channels: 0, campaigns: 0, funnel: 0, cadences: 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, Boolean(cadenceSurface), t)\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: 'cadences', render: () => <CadencesView surface={cadenceSurface} /> },\n { id: 'landing-pages', render: () => <LandingPagesView /> },\n { id: 'content', render: () => <ContentView /> },\n { id: 'content-post', render: ({ id }) => <ContentView initialPostId={id!} /> },\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 ?? t('marketing.nav.blog')} onDone={() => navigate('blog')} /> },\n { id: 'blog-post', render: ({ id }) => <BlogEntityForm entity={blogPostEntity} editId={id!} parentLabel={config.labels.blog ?? t('marketing.nav.blog')} onDone={() => navigate('blog')} /> },\n { id: 'blog-cat-new', render: () => <BlogEntityForm entity={blogCategoryEntity} parentLabel={config.labels.blogCategories ?? t('marketing.nav.blogCategories')} onDone={() => navigate('blog')} /> },\n { id: 'blog-cat', render: ({ id }) => <BlogEntityForm entity={blogCategoryEntity} editId={id!} parentLabel={config.labels.blogCategories ?? t('marketing.nav.blogCategories')} onDone={() => navigate('blog')} /> },\n // As telas que ainda não existem — ver ./GapScreens.\n { id: 'segments', render: () => <SegmentsView /> },\n { id: 'message-templates', render: () => <MessageTemplatesView /> },\n { id: 'send-history', render: () => <SendHistoryView /> },\n { id: 'quick-triggers', render: () => <QuickTriggersView /> },\n { id: 'brand', render: () => <BrandView /> },\n { id: 'authorized-images', render: () => <AuthorizedImagesView /> },\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 navVariant={config.moduleNav}\n showHeader={isOverview}\n viewKey={view}\n direction={direction}\n headerAction={\n <ModuleActionBar\n quickActions={quickActions}\n settingsPath=\"/settings/marketing\"\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/admin'\nimport { useMarketingConfig } from '../context'\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 landingPages: 'plg_marketing_landing_pages',\n} as const\n\n/** The tenant's sites are its fayz projects (@fayz-ai/db 020) — the same rows\n * Settings → Sites manages. Marketing only READS them: a landing page points\n * at one and adds a route. */\nexport const SITES_TABLE = 'published_sites'\n\n/** Where the lead-tag catalog lives. Marketing only READS it (to offer the\n * tags in the landing-page form); plugin-crm owns the table. Overridable via\n * the plugin's `leadTags` option for apps that keep tags somewhere else. */\nexport const LEAD_TAGS_SOURCE = {\n table: 'plg_crm_tags',\n valueField: 'slug',\n labelField: 'name',\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 landingPages: 'v_marketing_landing_pages',\n leadTagEvents: 'v_marketing_lead_tag_events',\n} as const\n","import type { PluginRegistryDef, EntityDef } from '@fayz-ai/core'\nimport type { AcquisitionChannel } from '../types'\nimport { T } from './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). Sites are\n * NOT here on purpose: they are the tenant's fayz projects, managed by the\n * shell in Settings → Sites, and marketing only points a page at one. */\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 { countByTenant, type OnboardingProgramDef } from '@fayz-ai/core'\nimport { T } from '../data/tables'\n\n/**\n * Implantação do marketing — dois cadastros e a conta que fecha.\n *\n * Ordem 90, DEPOIS do CRM (80), e a razão é a métrica: neste plugin a conversão\n * do funil é lida da venda — negócio ganho, pedido, agendamento, conforme o\n * domínio. Sem funil com etapa de ganho do lado do CRM, cada painel daqui\n * mostra zero e a pessoa conclui que a ferramenta não funciona, quando o que\n * falta é o outro lado da conta.\n *\n * O programa é curto porque o módulo é curto de verdade: canais e campanhas são\n * dois cadastros. O que ele NÃO consegue fazer sozinho é o terceiro passo —\n * fechar o circuito da origem, que depende de um hábito do atendimento e mora\n * no CRM. Ele está aqui mesmo assim, dito com todas as letras, porque é onde a\n * atribuição morre e o passo que ninguém dá é o que ninguém escreveu.\n */\nexport function buildMarketingOnboarding(): OnboardingProgramDef {\n return {\n id: 'marketing',\n title: 'De onde vem o movimento',\n order: 90,\n role: 'growth',\n instructions: `Você está implantando o marketing. O risco aqui não é a pessoa não achar a tela — é ela olhar um painel de zeros e achar que a ferramenta está quebrada.\n\n- Diga logo de cara de onde vêm os números: a conversão deste módulo é a VENDA (negócio ganho, pedido, agendamento — depende do ramo), lida do outro módulo. Painel zerado quase sempre quer dizer que ninguém está preenchendo origem, e não que o marketing não funcionou.\n- Comece pelos CANAIS. A lista já vem com os do ramo: o trabalho é desativar o que a casa não usa e acrescentar o que ela usa de verdade. Lista curta é lista preenchida.\n- Só depois CAMPANHA, e só se ela investe em alguma. Quem não anuncia não precisa de campanha para ver de onde vem gente — os canais já respondem isso.\n- O último passo não é uma tela e não é seu: sem origem preenchida no lead, nada aqui tem o que somar. Diga isso explicitamente e ofereça combinar com quem atende.`,\n steps: [\n {\n key: 'channels',\n title: 'Marque por onde as pessoas chegam',\n description: 'Anúncio, busca, indicação, boca a boca — a lista que responde onde investir.',\n icon: 'Radio',\n route: '/marketing/channels',\n priority: 'high',\n requiresRoute: true,\n agentHint:\n 'A lista já vem com os canais do ramo. Conduza como PODA: mostre o que existe, pergunte o que não é o caso e acrescente o que a casa usa de verdade.',\n howTo:\n 'Marketing › Canais. Já vêm os canais típicos do seu ramo — desative o que a casa não usa e acrescente os seus. Se você investe em algum, preencha o gasto do mês: é o que transforma \"veio bastante gente do Instagram\" em \"cada cliente do Instagram custou tanto\".',\n celebrate: 'Dá para saber por onde chega gente 📡',\n script: [\n { kind: 'goto', route: '/marketing/channels' },\n {\n kind: 'ask',\n text: 'Estamos nos Canais, que já vêm preenchidos pelo ramo. Mostre a lista, pergunte quais não são o caso desta casa e quais faltam, e ajuste com a pessoa.',\n },\n ],\n check: async () => (await countByTenant(T.channels)) > 0,\n },\n {\n key: 'campaign',\n title: 'Registre a primeira campanha',\n description: 'Só se você investe em alguma — quem não anuncia não precisa deste passo.',\n icon: 'Megaphone',\n route: '/marketing/campaigns',\n requiresRoute: true,\n agentHint:\n 'Pergunte ANTES se a casa investe em anúncio. Se não investe, diga que este passo não é para ela e siga — uma campanha inventada para fechar a checklist polui o painel para sempre.',\n howTo:\n 'Marketing › Campanhas › Nova campanha. Amarre a campanha ao canal onde ela roda e ao período em que rodou. O resultado que aparece aqui não é clique: é venda fechada que veio daquele canal, com o valor junto.',\n celebrate: 'Campanha registrada 📣',\n check: async () => (await countByTenant(T.campaigns)) > 0,\n },\n {\n key: 'attribution',\n title: 'Combine que todo lead sai com origem',\n description: 'É aqui que a atribuição morre. O campo já existe; o hábito é o que falta.',\n icon: 'Compass',\n // Aponta para o CRM de propósito: o passo é deste programa porque é\n // este painel que fica zerado sem ele, e a tela é de lá porque é lá\n // que o campo mora. Um passo honesto sobre onde a coisa falha vale\n // mais que um passo dentro do próprio módulo.\n route: '/sales/leads/new',\n agentHint:\n 'Não é passo de tela. Mostre onde o campo de origem está no formulário do lead, diga em uma linha o que se perde sem ele — todo painel deste módulo — e ofereça criar uma tarefa para combinar isso com a equipe.',\n howTo:\n 'A origem é preenchida no cadastro do lead, não aqui. Sem ela, os painéis de Canais e Campanhas somam zero: não existe outro jeito de o sistema saber que aquele cliente veio do anúncio. Combine com quem atende que nenhum lead sai sem origem — é uma pergunta a mais no atendimento e é a única coisa que faz o resto valer.',\n celebrate: 'Agora dá para saber o que valeu a pena 🧭',\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 '../context'\nimport type { MarketingDataProvider } from '../data/types'\nimport type { MarketingUIState } from '../store'\nimport { formatCurrency, formatNumber, formatPercent, formatCompact } from '../lib/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 /**\n * Cadências: a régua de relacionamento — dia 0 mensagem, dia 2 ligação, dia 5\n * mensagem, e o que faz alguém SAIR da régua.\n *\n * A tela é do plugin-automations (o motor roda no banco, num tick de minuto);\n * o Marketing só a hospeda, porque é aqui que se decide como a casa fala com\n * quem ainda não comprou. Sem `cadenceSurface` injetado, o item não aparece —\n * um menu que abre uma tela vazia é pior que a ausência dele.\n */\n cadences: 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, cadences: true, broadcasts: false, journeys: false },\n}\n\nconst BEAUTY: MarketingDomainPreset = {\n conversion: {\n id: 'booking',\n label: 'Booking',\n labelPlural: 'Bookings',\n valueLabel: 'Booking revenue',\n source: 'agenda',\n avgValue: 85,\n },\n channels: [\n { id: 'instagram', label: 'Instagram', icon: 'Instagram', kind: 'social' },\n { id: 'google', label: 'Google', icon: 'Globe', kind: 'organic' },\n { id: 'referral', label: 'Referral', icon: 'Users', kind: 'referral' },\n { id: 'whatsapp', label: 'WhatsApp', icon: 'MessageCircle', kind: 'social' },\n { id: 'walkin', label: 'Walk-in', icon: 'DoorOpen', kind: 'direct' },\n ],\n modules: { channels: true, campaigns: true, funnel: true, landingPages: false, contentPlanner: true, blog: false, cadences: true, 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, cadences: true, 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, SaveLandingPageInput } from './types'\nimport type {\n AcquisitionChannel,\n AcquisitionChannelKind,\n Campaign,\n ChannelPerformance,\n ConversionModel,\n DateRangeKey,\n FunnelStage,\n LandingPage,\n LandingPagePerf,\n MarketingOverview,\n MarketingQuery,\n MarketingSite,\n} from '../types'\nimport { CAMPAIGN_NAME_SEEDS, type MarketingDomain } from '../lib/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 kind: 'ad_spend' as const,\n purpose: 'promotion' as const,\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\nconst MOCK_SITE: MarketingSite = {\n id: 'site-1',\n name: 'Site principal',\n url: 'https://exemplo.com.br',\n appId: 'app-demo',\n}\n\nconst MOCK_LEAD_TAGS = [\n { slug: 'lp-consulta', name: 'LP Consulta' },\n { slug: 'lp-promo', name: 'LP Promo' },\n]\n\ninterface MockLandingPage extends LandingPage {\n /** 30d baseline; scaled per range at read time. */\n visits: number\n conversions: number\n}\n\nfunction seedLandingPages(): MockLandingPage[] {\n return [\n // Duas portas com destinos DIFERENTES, porque é o que a tela precisa\n // provar: a de agendamento mostra a janela de antecedência, a de contato\n // não — oferecer \"mínimo 2h\" num formulário de contato prometeria uma regra\n // sem sobre o que valer.\n { id: 'lp-1', siteId: MOCK_SITE.id, name: 'Consulta gratuita', route: '/consulta', leadTags: ['lp-consulta'], status: 'live', isActive: true,\n captureKey: 'Kx7mQp2rTn9vBw4sYd6h', captureDestination: 'booking', captureRequiredFields: ['name', 'phone'],\n minAdvanceHours: 2, maxAdvanceDays: 60, visits: 3820, conversions: 474 },\n { id: 'lp-2', siteId: MOCK_SITE.id, name: 'Promo da estação', route: '/promo', leadTags: ['lp-promo'], status: 'live', isActive: true,\n captureKey: 'Lp3nRt8wZc5vMq1xJh7k', captureDestination: 'lead', captureRequiredFields: ['name', 'email'],\n visits: 1560, conversions: 126 },\n ]\n}\n\nfunction normalizeRoute(route: string): string {\n const trimmed = route.trim().replace(/\\/+$/, '')\n if (!trimmed || trimmed === '/') return '/'\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`\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 kind: input.kind ?? existing.kind, purpose: input.purpose ?? existing.purpose,\n segmentId: input.segmentId, templateKey: input.templateKey,\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 kind: input.kind ?? 'ad_spend',\n purpose: input.purpose ?? 'promotion',\n segmentId: input.segmentId,\n templateKey: input.templateKey,\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 // Sem cluster não há recorte para apontar: a tela cai no público por regra\n // própria em vez de mostrar um seletor vazio.\n async listAudienceSegments() { return [] },\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 {\n ...p,\n siteName: MOCK_SITE.name,\n siteUrl: MOCK_SITE.url,\n appId: MOCK_SITE.appId,\n editorUrl: MOCK_SITE.editorUrl,\n url: `${MOCK_SITE.url}${p.route}`,\n visits,\n conversions,\n cvr: visits > 0 ? (conversions / visits) * 100 : null,\n }\n })\n },\n\n async saveLandingPage(input: SaveLandingPageInput): Promise<LandingPage> {\n const route = normalizeRoute(input.route)\n const existing = input.id ? landing.find((p) => p.id === input.id) : undefined\n if (existing) {\n Object.assign(existing, {\n siteId: input.siteId, name: input.name, route,\n leadTags: input.leadTags ?? existing.leadTags,\n status: input.status ?? existing.status,\n prompt: input.prompt,\n isActive: input.isActive ?? existing.isActive,\n captureDestination: input.captureDestination ?? existing.captureDestination,\n captureRequiredFields: input.captureRequiredFields ?? existing.captureRequiredFields,\n minAdvanceHours: input.captureDestination === 'lead' ? undefined : (input.minAdvanceHours ?? existing.minAdvanceHours) ?? undefined,\n maxAdvanceDays: input.captureDestination === 'lead' ? undefined : (input.maxAdvanceDays ?? existing.maxAdvanceDays) ?? undefined,\n })\n return existing\n }\n const created: MockLandingPage = {\n id: `lp-${++counter}`,\n siteId: input.siteId,\n name: input.name,\n route,\n leadTags: input.leadTags ?? [],\n status: input.status ?? 'live',\n prompt: input.prompt,\n isActive: input.isActive ?? true,\n captureKey: `mock-${Math.abs(input.name.length * 7919).toString(36)}`,\n captureDestination: input.captureDestination ?? 'lead',\n captureRequiredFields: input.captureRequiredFields ?? [],\n minAdvanceHours: input.captureDestination === 'lead' ? undefined : (input.minAdvanceHours ?? undefined),\n maxAdvanceDays: input.captureDestination === 'lead' ? undefined : (input.maxAdvanceDays ?? undefined),\n visits: 0,\n conversions: 0,\n }\n landing.push(created)\n return created\n },\n\n async deleteLandingPage(id: string): Promise<void> {\n const idx = landing.findIndex((p) => p.id === id)\n if (idx >= 0) landing.splice(idx, 1)\n },\n\n async listSites(): Promise<MarketingSite[]> {\n return [MOCK_SITE]\n },\n\n async listLeadTags(): Promise<Array<{ slug: string; name: string }>> {\n return MOCK_LEAD_TAGS\n },\n }\n}\n","import { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport type {\n AttributionBridge,\n AudienceSegment,\n MarketingDataProvider,\n SaveCampaignInput,\n SaveLandingPageInput,\n SitesPerformanceBridge,\n} from './types'\nimport type {\n AcquisitionChannel,\n Campaign,\n ChannelPerformance,\n ConversionModel,\n DateRangeKey,\n FunnelStage,\n LandingPage,\n LandingPagePerf,\n MarketingOverview,\n MarketingQuery,\n MarketingSite,\n} from '../types'\nimport { LEAD_TAGS_SOURCE, SITES_TABLE, 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 /** Where the lead-tag catalog is read from (defaults to plugin-crm's). */\n leadTags?: { table?: string; valueField?: string; labelField?: string }\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\n/** Fallback editor link when the project row has no explicit editor_url —\n * same convention the shell's \"Seu site\" widget uses. */\nconst FAYZ_EDITOR_BASE = 'https://fayz.ai/editor'\n\n/** '/lp-capilar' ← 'lp-capilar' | 'lp-capilar/' | '' */\nfunction normalizeRoute(route: string): string {\n const trimmed = route.trim().replace(/\\/+$/, '')\n if (!trimmed || trimmed === '/') return '/'\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`\n}\n\n/** The site's URL is whatever the fayz project recorded (may be missing while\n * the deploy has no public URL yet) — then the page shows just its route. */\nfunction pageUrl(siteUrl: string | null | undefined, route: string): string {\n const path = normalizeRoute(route)\n if (!siteUrl) return path\n const base = siteUrl.trim().replace(/\\/+$/, '')\n const withScheme = /^https?:\\/\\//.test(base) ? base : `https://${base}`\n return `${withScheme}${path === '/' ? '' : path}`\n}\n\nfunction landingPageFromRow(row: Record<string, any>): LandingPage {\n return {\n id: row.id,\n siteId: row.site_id,\n name: row.name,\n route: row.route,\n leadTags: row.lead_tags ?? [],\n status: row.status === 'planned' ? 'planned' : 'live',\n prompt: row.prompt ?? undefined,\n isActive: row.is_active !== false,\n captureKey: row.capture_key ?? undefined,\n captureDestination: (row.capture_destination ?? 'lead') as LandingPage['captureDestination'],\n captureRequiredFields: (row.capture_required_fields ?? []) as LandingPage['captureRequiredFields'],\n minAdvanceHours: row.min_advance_hours ?? undefined,\n maxAdvanceDays: row.max_advance_days ?? undefined,\n }\n}\n\ninterface LandingPageRow {\n id: string\n site_id: string\n name: string\n route: string\n lead_tags: string[] | null\n status: string\n prompt: string | null\n is_active: boolean\n site_name: string\n site_url: string | null\n app_id: string | null\n provider_site_id: string | null\n editor_url: string | null\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 const leadTagsSource = { ...LEAD_TAGS_SOURCE, ...options.leadTags }\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 fetchLandingPages(tenantId: string): Promise<LandingPageRow[]> {\n return memo(`lp:${tenantId}`, async () => {\n const { data, error } = await getClient()\n .from(V.landingPages)\n .select('id, site_id, name, route, lead_tags, status, prompt, is_active, site_name, site_url, app_id, provider_site_id, editor_url')\n .eq('tenant_id', tenantId)\n .order('name')\n // A pool that hasn't run migration 008 has no view — that must cost the\n // page its rows, not take the whole Marketing surface down with it.\n if (error) return []\n return (data ?? []) as LandingPageRow[]\n })\n }\n\n /** Leads carrying each page's tags within the window — the CRM cross. Keyed\n * by tag → lead ids so a page with several tags counts each lead once. */\n function fetchLeadsByTag(\n tenantId: string,\n tags: string[],\n since: Date,\n ): Promise<Map<string, Set<string>>> {\n const key = `lptags:${tenantId}:${since.getTime()}:${tags.join(',')}`\n return memo(key, async () => {\n const { data, error } = await getClient()\n .from(V.leadTagEvents)\n .select('tag, person_id')\n .eq('tenant_id', tenantId)\n .in('tag', tags)\n .gte('occurred_at', since.toISOString())\n if (error) return new Map<string, Set<string>>()\n const byTag = new Map<string, Set<string>>()\n for (const row of data ?? []) {\n const set = byTag.get(row.tag) ?? new Set<string>()\n set.add(row.person_id)\n byTag.set(row.tag, set)\n }\n return byTag\n })\n }\n\n /** Visits come from wherever the site is deployed. No bridge ⇒ unknown, and\n * the surface says so instead of showing zeros. */\n async function fetchVisits(\n range: DateRangeKey,\n rows: LandingPageRow[],\n ): Promise<Map<string, number>> {\n if (!sitesBridge) return new Map()\n const result = await sitesBridge.visitsByRoute({\n range,\n pages: rows.map((r) => ({\n id: r.id,\n appId: r.app_id ?? undefined,\n fayzProjectId: r.provider_site_id ?? undefined,\n siteUrl: r.site_url ?? undefined,\n route: r.route,\n })),\n })\n return new Map(result.map((r) => [r.id, r.visits]))\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 kind: row.kind ?? 'ad_spend',\n purpose: row.purpose ?? 'promotion',\n segmentId: (row.audience_query ?? {}).segment_id ?? undefined,\n templateKey: row.template_key ?? undefined,\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 kind = input.kind ?? 'ad_spend'\n const payload: Record<string, unknown> = {\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 kind,\n purpose: input.purpose ?? 'promotion',\n }\n if (kind === 'outbound') {\n // O público vai como PONTEIRO para o recorte, não como cópia da regra:\n // editar o segmento muda para quem a campanha vai, que é o que quem\n // acabou de editá-lo espera. A resolução (e o consentimento) é do\n // `marketing_resolve_audience` (004).\n payload.audience_query = input.segmentId ? { segment_id: input.segmentId } : {}\n payload.template_key = input.templateKey ?? null\n // `key` é exigido pelo CHECK de forma do outbound e é o identificador\n // estável por onde a fila deduplica.\n payload.key = input.id\n ? undefined\n : `camp-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`\n if (payload.key === undefined) delete payload.key\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 /**\n * Os recortes do CRM. Leitura direta de `plg_crm_segments` — a mesma\n * licença que este plugin já usa para o catálogo de tags: quem é DONO da\n * tabela é o CRM, o Marketing só lê. Sem o CRM montado a tabela não\n * existe, e a resposta é uma lista vazia em vez de um erro na tela.\n */\n async listAudienceSegments(): Promise<AudienceSegment[]> {\n const tenantId = requireTenantId()\n const { data, error } = await getClient()\n .from('plg_crm_segments')\n .select('id, name, description')\n .eq('tenant_id', tenantId)\n .eq('is_active', true)\n .order('sort_order')\n if (error) return []\n return (data ?? []).map((r: any) => ({ id: r.id, name: r.name, description: r.description ?? undefined }))\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 const tenantId = requireTenantId()\n const { since } = windowFor(query.range)\n const rows = await fetchLandingPages(tenantId)\n if (!rows.length) return []\n\n const tags = [...new Set(rows.flatMap((r) => r.lead_tags ?? []))]\n const [leadsByTag, visitsById] = await Promise.all([\n tags.length ? fetchLeadsByTag(tenantId, tags, since) : Promise.resolve(new Map<string, Set<string>>()),\n fetchVisits(query.range, rows),\n ])\n\n return rows.map((r) => {\n const visits = visitsById.get(r.id) ?? null\n const leads = new Set<string>()\n for (const tag of r.lead_tags ?? []) {\n for (const personId of leadsByTag.get(tag) ?? []) leads.add(personId)\n }\n const conversions = leads.size\n return {\n ...landingPageFromRow(r),\n siteName: r.site_name,\n siteUrl: r.site_url ?? undefined,\n appId: r.app_id ?? undefined,\n editorUrl: r.editor_url ?? (r.provider_site_id ? `${FAYZ_EDITOR_BASE}/${r.provider_site_id}` : undefined),\n url: pageUrl(r.site_url, r.route),\n visits,\n conversions,\n cvr: visits && visits > 0 ? (conversions / visits) * 100 : null,\n }\n })\n },\n\n async saveLandingPage(input: SaveLandingPageInput): Promise<LandingPage> {\n const tenantId = requireTenantId()\n const payload = {\n tenant_id: tenantId,\n site_id: input.siteId,\n name: input.name,\n route: normalizeRoute(input.route),\n lead_tags: input.leadTags ?? [],\n status: input.status ?? 'live',\n prompt: input.prompt?.trim() || null,\n is_active: input.isActive ?? true,\n capture_destination: input.captureDestination ?? 'lead',\n capture_required_fields: input.captureRequiredFields ?? [],\n // A janela só faz sentido onde há horário para marcar. Num destino\n // 'lead' ela é nula de propósito: exigir \"no mínimo 2h de antecedência\"\n // de um formulário de contato não quer dizer nada.\n min_advance_hours: input.captureDestination === 'lead' ? null : (input.minAdvanceHours ?? null),\n max_advance_days: input.captureDestination === 'lead' ? null : (input.maxAdvanceDays ?? null),\n updated_at: new Date().toISOString(),\n }\n const query = input.id\n ? getClient().from(T.landingPages).update(payload).eq('id', input.id)\n : getClient().from(T.landingPages).insert(payload)\n const { data, error } = await query.select('*').single()\n if (error) throw error\n cache.clear()\n return landingPageFromRow(data)\n },\n\n async deleteLandingPage(id: string): Promise<void> {\n const { error } = await getClient().from(T.landingPages).delete().eq('id', id)\n if (error) throw error\n cache.clear()\n },\n\n async listSites(): Promise<MarketingSite[]> {\n const tenantId = requireTenantId()\n return memo(`sites:${tenantId}`, async () => {\n // Owned by the shell (Settings → Sites); marketing just picks one.\n const { data, error } = await getClient()\n .from(SITES_TABLE)\n .select('id, name, preview_url, app_id, provider_site_id, editor_url')\n .eq('tenant_id', tenantId)\n .order('is_default', { ascending: false })\n .order('name')\n if (error) return []\n return (data ?? []).map((r: any) => ({\n id: r.id,\n name: r.name,\n url: r.preview_url ?? undefined,\n appId: r.app_id ?? undefined,\n fayzProjectId: r.provider_site_id ?? undefined,\n editorUrl: r.editor_url ?? (r.provider_site_id ? `${FAYZ_EDITOR_BASE}/${r.provider_site_id}` : undefined),\n }))\n })\n },\n\n async listLeadTags(): Promise<Array<{ slug: string; name: string }>> {\n const tenantId = requireTenantId()\n const { table, valueField, labelField } = leadTagsSource\n return memo(`leadtags:${tenantId}`, async () => {\n // The catalog belongs to another plugin — an app without it (or with a\n // different tag store) must not break the landing-page form.\n const { data, error } = await getClient()\n .from(table)\n .select(`${valueField}, ${labelField}`)\n .eq('tenant_id', tenantId)\n .order(labelField)\n if (error) return []\n return (data ?? [])\n .map((r: any) => ({ slug: r[valueField] as string, name: (r[labelField] as string) ?? r[valueField] }))\n .filter((tag: { slug: string }) => Boolean(tag.slug))\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","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, SaveLandingPageInput } from './data/types'\nimport type {\n Campaign,\n ChannelPerformance,\n DateRangeKey,\n FunnelStage,\n LandingPage,\n LandingPagePerf,\n MarketingOverview,\n MarketingSite,\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 sites: MarketingSite[]\n leadTags: Array<{ slug: string; name: string }>\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 saveLandingPage(input: SaveLandingPageInput): Promise<LandingPage>\n deleteLandingPage(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 sites: [],\n leadTags: [],\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, sites, leadTags] = await Promise.all([\n provider.overview({ range }),\n provider.channelPerformance({ range }),\n provider.listCampaigns({ range }),\n provider.funnel({ range }),\n provider.landingPages({ range }),\n provider.listSites(),\n provider.listLeadTags(),\n ])\n set({ overview, channels, campaigns, funnel, landingPages, sites, leadTags, 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 async saveLandingPage(input) {\n const saved = await provider.saveLandingPage(input)\n provider.invalidateCache?.()\n await get().load()\n return saved\n },\n\n async deleteLandingPage(id) {\n await provider.deleteLandingPage(id)\n provider.invalidateCache?.()\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_baseline.sql, 001_the_landing_page_names_the_site.sql, 003_a_porta_publica_e_a_pagina.sql, 004_a_campanha_aponta_para_um_recorte.sql, 005_a_atribuicao_do_lead_atravessa_a_origem_ate_o_canal.sql, 006_the_campaign_engine_is_server_only.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_BASELINE = `-- ============================================================================\n-- plugins/plugin-marketing/src/migrations/000_baseline.sql — what installing this provisions, as one file.\n--\n-- GENERATED by scripts/emit-unit-baselines.mjs (#338). Do not edit by hand:\n-- change the schema, regenerate, and let scripts/check-chain-equivalence.mjs\n-- prove the result still matches.\n--\n-- This replaced 12 migration files. They are kept, unapplied, in\n-- migrations.archive/ — a year of decisions is worth reading even when it is no\n-- longer worth replaying.\n--\n-- Object order is fixed rather than dependency-sorted: schemas, types,\n-- sequences, tables, defaults, functions, constraints, views, indexes, foreign\n-- keys, triggers, row security, policies, grants. Dependencies BETWEEN units\n-- are carried by the order packages/db/chain.json declares.\n-- ============================================================================\n\n-- A LANGUAGE sql function binds its body at CREATE time, and 570 functions\n-- sorted by name are not sorted by who calls whom. This is what lets them load\n-- in any order; every body is still compiled on first call, so a genuinely\n-- broken reference surfaces then rather than never. Session-scoped.\nSET check_function_bodies = false;\n\n\n\n-- ── default privileges: reset ───────────────────────────────────────────\n-- Cleared BEFORE anything is created, so every object below gets the ACL the\n-- dump describes rather than the image's defaults on top of it. Restored at\n-- the end of this file.\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\n\n-- ── table ───────────────────────────────────────────────────────────────\n\nCREATE TABLE public.plg_marketing_audiences (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n unit_id uuid,\n campaign_id uuid NOT NULL,\n person_id uuid NOT NULL,\n state text DEFAULT 'entered'::text NOT NULL,\n entered_at timestamp with time zone DEFAULT now() NOT NULL,\n queued_at timestamp with time zone,\n converted_at timestamp with time zone,\n left_at timestamp with time zone,\n reason text,\n queue_id uuid,\n owner_id uuid,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL,\n CONSTRAINT plg_marketing_audiences_state_check CHECK ((state = ANY (ARRAY['entered'::text, 'queued'::text, 'sent'::text, 'converted'::text, 'left'::text, 'blocked'::text])))\n);\n\nALTER TABLE ONLY public.plg_marketing_audiences FORCE ROW LEVEL SECURITY;\n\nCREATE TABLE public.plg_marketing_campaigns (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n name text NOT NULL,\n channel_key text NOT NULL,\n status text DEFAULT 'draft'::text NOT NULL,\n starts_at timestamp with time zone,\n ends_at timestamp with time zone,\n spend numeric DEFAULT 0 NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL,\n unit_id uuid,\n owner_id uuid,\n kind text DEFAULT 'ad_spend'::text NOT NULL,\n key text,\n template_key text,\n audience_query jsonb DEFAULT '{}'::jsonb NOT NULL,\n purpose text DEFAULT 'promotion'::text NOT NULL,\n schedule text,\n last_run_at timestamp with time zone,\n next_run_at timestamp with time zone,\n metadata jsonb DEFAULT '{}'::jsonb NOT NULL,\n CONSTRAINT plg_marketing_campaigns_kind_check CHECK ((kind = ANY (ARRAY['ad_spend'::text, 'outbound'::text]))),\n CONSTRAINT plg_marketing_campaigns_outbound_shape CHECK (((kind <> 'outbound'::text) OR ((template_key IS NOT NULL) AND (key IS NOT NULL)))),\n CONSTRAINT plg_marketing_campaigns_purpose_check CHECK ((purpose = ANY (ARRAY['promotion'::text, 'survey'::text, 'newsletter'::text, 'transactional'::text]))),\n CONSTRAINT plg_marketing_campaigns_status_check CHECK ((status = ANY (ARRAY['active'::text, 'paused'::text, 'ended'::text, 'draft'::text])))\n);\n\nALTER TABLE ONLY public.plg_marketing_campaigns FORCE ROW LEVEL SECURITY;\n\nCREATE TABLE public.plg_marketing_channels (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n channel_key text NOT NULL,\n label text NOT NULL,\n icon text,\n kind text DEFAULT 'organic'::text NOT NULL,\n is_active boolean DEFAULT true NOT NULL,\n monthly_spend numeric DEFAULT 0 NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL,\n unit_id uuid,\n owner_id uuid,\n CONSTRAINT plg_marketing_channels_kind_check CHECK ((kind = ANY (ARRAY['paid'::text, 'organic'::text, 'social'::text, 'referral'::text, 'direct'::text, 'outbound'::text])))\n);\n\nALTER TABLE ONLY public.plg_marketing_channels FORCE ROW LEVEL SECURITY;\n\nCREATE TABLE public.plg_marketing_consents (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n unit_id uuid,\n person_id uuid NOT NULL,\n purpose text NOT NULL,\n granted_at timestamp with time zone,\n revoked_at timestamp with time zone,\n source text,\n evidence jsonb DEFAULT '{}'::jsonb NOT NULL,\n owner_id uuid,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL,\n CONSTRAINT plg_marketing_consents_purpose_check CHECK ((purpose = ANY (ARRAY['promotion'::text, 'survey'::text, 'newsletter'::text, 'transactional'::text])))\n);\n\nALTER TABLE ONLY public.plg_marketing_consents FORCE ROW LEVEL SECURITY;\n\nCREATE TABLE public.plg_marketing_content_plans (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n account_id uuid NOT NULL,\n name text NOT NULL,\n status text DEFAULT 'active'::text NOT NULL,\n weeks_count integer DEFAULT 8 NOT NULL,\n start_date date,\n objective text,\n tone text,\n pillars jsonb DEFAULT '[]'::jsonb NOT NULL,\n formats jsonb DEFAULT '[]'::jsonb NOT NULL,\n weekly_frequency integer DEFAULT 3 NOT NULL,\n brief_md text DEFAULT ''::text NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL,\n CONSTRAINT plg_marketing_content_plans_status_check CHECK ((status = ANY (ARRAY['draft'::text, 'active'::text, 'archived'::text])))\n);\n\nCREATE TABLE public.plg_marketing_content_posts (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n plan_id uuid NOT NULL,\n week_number integer DEFAULT 1 NOT NULL,\n \"position\" integer DEFAULT 0 NOT NULL,\n title text NOT NULL,\n format text DEFAULT 'reel'::text NOT NULL,\n status text DEFAULT 'idea'::text NOT NULL,\n scheduled_date date,\n hook text,\n cta text,\n content_md text DEFAULT ''::text NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL,\n platforms text[] DEFAULT '{}'::text[] NOT NULL,\n checklist jsonb DEFAULT '[]'::jsonb NOT NULL,\n media_url text,\n CONSTRAINT plg_marketing_content_posts_format_check CHECK ((format = ANY (ARRAY['reel'::text, 'static'::text, 'carousel'::text, 'story'::text]))),\n CONSTRAINT plg_marketing_content_posts_status_check CHECK ((status = ANY (ARRAY['idea'::text, 'script'::text, 'recording'::text, 'editing'::text, 'scheduled'::text, 'published'::text])))\n);\n\nCREATE TABLE public.plg_marketing_landing_pages (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n site_id uuid NOT NULL,\n name text NOT NULL,\n route text NOT NULL,\n lead_tags text[] DEFAULT '{}'::text[] NOT NULL,\n status text DEFAULT 'live'::text NOT NULL,\n prompt text,\n is_active boolean DEFAULT true NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL,\n unit_id uuid,\n owner_id uuid,\n CONSTRAINT plg_marketing_landing_pages_status_check CHECK ((status = ANY (ARRAY['live'::text, 'planned'::text])))\n);\n\nALTER TABLE ONLY public.plg_marketing_landing_pages FORCE ROW LEVEL SECURITY;\n\nCREATE TABLE public.plg_marketing_social_accounts (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n name text NOT NULL,\n handle text,\n is_active boolean DEFAULT true NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n platforms text[] DEFAULT '{instagram}'::text[] NOT NULL\n);\n\n\n-- ── function ────────────────────────────────────────────────────────────\n\nCREATE FUNCTION public.agent_marketing_create_campaign(p_tenant_id uuid, p_actor_user_id uuid, p_payload jsonb) RETURNS jsonb\n LANGUAGE plpgsql SECURITY DEFINER\n SET search_path TO 'public'\n AS $$\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\nCREATE FUNCTION public.marketing_campaign_run(p_campaign_id uuid, p_limit integer DEFAULT 1000) RETURNS jsonb\n LANGUAGE plpgsql SECURITY DEFINER\n SET search_path TO ''\n AS $$\nDECLARE\n c public.plg_marketing_campaigns%ROWTYPE;\n v_person uuid;\n v_queue uuid;\n v_entered integer := 0;\n v_queued integer := 0;\n v_left integer := 0;\nBEGIN\n SELECT * INTO c FROM public.plg_marketing_campaigns WHERE id = p_campaign_id;\n IF c.id IS NULL THEN\n RAISE EXCEPTION 'marketing_campaign_run: campaign % not found', p_campaign_id USING ERRCODE = 'P0002';\n END IF;\n IF c.kind <> 'outbound' THEN\n RETURN jsonb_build_object('skipped', 'not an outbound campaign');\n END IF;\n IF to_regprocedure('public.notifications_enqueue(uuid, text, uuid, jsonb, text, timestamptz, text, text, uuid, uuid)') IS NULL THEN\n RAISE EXCEPTION 'marketing_campaign_run: plugin-notifications is not installed' USING ERRCODE = '0A000';\n END IF;\n\n -- Whoever no longer qualifies LEAVES, and the moment is recorded. Revoking\n -- consent has to show up as an act, not as an absence.\n UPDATE public.plg_marketing_audiences a\n SET state = 'left', left_at = now(), reason = 'no longer in the audience'\n WHERE a.campaign_id = c.id\n AND a.state IN ('entered', 'queued')\n AND NOT EXISTS (SELECT 1 FROM public.marketing_resolve_audience(c.id) r WHERE r.person_id = a.person_id);\n GET DIAGNOSTICS v_left = ROW_COUNT;\n\n FOR v_person IN\n SELECT r.person_id FROM public.marketing_resolve_audience(c.id) r\n LIMIT greatest(p_limit, 0)\n LOOP\n INSERT INTO public.plg_marketing_audiences (tenant_id, unit_id, campaign_id, person_id, state)\n VALUES (c.tenant_id, c.unit_id, c.id, v_person, 'entered')\n ON CONFLICT (campaign_id, person_id) DO NOTHING;\n IF FOUND THEN v_entered := v_entered + 1; END IF;\n\n -- Enqueue once per (campaign, person). The dedupe key is what makes a second\n -- run of the same campaign harmless, exactly as a redelivered event is.\n IF EXISTS (SELECT 1 FROM public.plg_marketing_audiences a\n WHERE a.campaign_id = c.id AND a.person_id = v_person AND a.state = 'entered') THEN\n v_queue := public.notifications_enqueue(\n p_tenant_id => c.tenant_id,\n p_template_key => c.template_key,\n p_person_id => v_person,\n p_payload => jsonb_build_object('campaign', c.name, 'campaign_key', c.key),\n p_dedupe_key => 'campaign:' || c.id::text || ':' || v_person::text,\n p_unit_id => c.unit_id);\n\n UPDATE public.plg_marketing_audiences\n SET state = 'queued', queued_at = now(), queue_id = v_queue\n WHERE campaign_id = c.id AND person_id = v_person;\n v_queued := v_queued + 1;\n END IF;\n END LOOP;\n\n UPDATE public.plg_marketing_campaigns\n SET last_run_at = now(), next_run_at = now() + interval '1 day'\n WHERE id = c.id;\n\n RETURN jsonb_build_object('campaign_id', c.id, 'entered', v_entered, 'queued', v_queued, 'left', v_left);\nEND $$;\n\nCREATE FUNCTION public.marketing_has_consent(p_tenant uuid, p_person uuid, p_purpose text) RETURNS boolean\n LANGUAGE sql STABLE SECURITY DEFINER\n SET search_path TO ''\n AS $$\n SELECT CASE\n -- The carve-out, named rather than assumed: a message about something the\n -- person already bought is not marketing. It is still subject to the channel\n -- opt-out, which the notification engine applies on its own.\n WHEN p_purpose = 'transactional' THEN true\n ELSE EXISTS (\n SELECT 1 FROM public.plg_marketing_consents c\n WHERE c.tenant_id = p_tenant AND c.person_id = p_person AND c.purpose = p_purpose\n AND c.granted_at IS NOT NULL AND c.revoked_at IS NULL)\n END\n$$;\n\nCREATE FUNCTION public.marketing_resolve_audience(p_campaign_id uuid) RETURNS TABLE(person_id uuid)\n LANGUAGE plpgsql STABLE SECURITY DEFINER\n SET search_path TO ''\n AS $_$\nDECLARE\n c public.plg_marketing_campaigns%ROWTYPE;\n v_source text;\n v_where text := '';\n v_clause jsonb;\n v_kind char;\nBEGIN\n SELECT * INTO c FROM public.plg_marketing_campaigns WHERE id = p_campaign_id;\n IF c.id IS NULL THEN\n RAISE EXCEPTION 'marketing_resolve_audience: campaign % not found', p_campaign_id USING ERRCODE = 'P0002';\n END IF;\n\n v_source := coalesce(c.audience_query ->> 'source_view', 'people');\n IF v_source !~ '^[a-z_][a-z0-9_]*$' THEN\n RAISE EXCEPTION 'marketing_resolve_audience: % is not a bare relation name', v_source USING ERRCODE = '22023';\n END IF;\n SELECT cl.relkind INTO v_kind FROM pg_class cl JOIN pg_namespace n ON n.oid = cl.relnamespace\n WHERE n.nspname = 'public' AND cl.relname = v_source;\n IF v_kind IS NULL THEN\n RAISE EXCEPTION 'marketing_resolve_audience: public.% does not exist', v_source USING ERRCODE = '42P01';\n END IF;\n\n v_where := format('tenant_id = %L', c.tenant_id);\n\n FOR v_clause IN SELECT * FROM jsonb_array_elements(coalesce(c.audience_query -> 'where', '[]'::jsonb)) LOOP\n IF NOT EXISTS (SELECT 1 FROM information_schema.columns\n WHERE table_schema = 'public' AND table_name = v_source\n AND column_name = v_clause ->> 'column') THEN\n RAISE EXCEPTION 'marketing_resolve_audience: public.% has no column %', v_source, v_clause ->> 'column'\n USING ERRCODE = '42703';\n END IF;\n -- The operator comes from a fixed set and the value is quoted as a literal:\n -- the audience is declarative on purpose, so a campaign can never become a\n -- way to run arbitrary SQL.\n v_where := v_where || format(' AND %I %s %L',\n v_clause ->> 'column',\n CASE v_clause ->> 'op' WHEN '>=' THEN '>=' WHEN '<=' THEN '<=' WHEN '>' THEN '>' WHEN '<' THEN '<'\n WHEN '<>' THEN '<>' WHEN 'ilike' THEN 'ILIKE' ELSE '=' END,\n v_clause ->> 'value');\n END LOOP;\n\n RETURN QUERY EXECUTE format(\n 'SELECT s.id FROM public.%I s WHERE %s AND public.marketing_has_consent(%L, s.id, %L)',\n v_source, v_where, c.tenant_id, c.purpose);\nEND $_$;\n\nCREATE FUNCTION public.marketing_run_due(p_limit integer DEFAULT 20) RETURNS jsonb\n LANGUAGE plpgsql SECURITY DEFINER\n SET search_path TO ''\n AS $$\nDECLARE c record; v_n integer := 0; v_out jsonb := '[]'::jsonb;\nBEGIN\n FOR c IN\n SELECT id FROM public.plg_marketing_campaigns\n WHERE kind = 'outbound' AND status = 'active'\n AND (next_run_at IS NULL OR next_run_at <= now())\n AND (starts_at IS NULL OR starts_at <= now())\n AND (ends_at IS NULL OR ends_at >= now())\n ORDER BY next_run_at NULLS FIRST\n LIMIT greatest(p_limit, 0)\n FOR UPDATE SKIP LOCKED\n LOOP\n v_out := v_out || public.marketing_campaign_run(c.id);\n v_n := v_n + 1;\n END LOOP;\n RETURN jsonb_build_object('campaigns', v_n, 'results', v_out);\nEND $$;\n\n\n-- ── constraint ──────────────────────────────────────────────────────────\n\nALTER TABLE ONLY public.plg_marketing_audiences\n ADD CONSTRAINT plg_marketing_audiences_campaign_id_person_id_key UNIQUE (campaign_id, person_id);\n\nALTER TABLE ONLY public.plg_marketing_audiences\n ADD CONSTRAINT plg_marketing_audiences_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_marketing_audiences\n ADD CONSTRAINT plg_marketing_audiences_tenant_id_id_key UNIQUE (tenant_id, id);\n\nALTER TABLE ONLY public.plg_marketing_campaigns\n ADD CONSTRAINT plg_marketing_campaigns_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_marketing_campaigns\n ADD CONSTRAINT plg_marketing_campaigns_tenant_id_id_key UNIQUE (tenant_id, id);\n\nALTER TABLE ONLY public.plg_marketing_channels\n ADD CONSTRAINT plg_marketing_channels_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_marketing_channels\n ADD CONSTRAINT plg_marketing_channels_tenant_id_id_key UNIQUE (tenant_id, id);\n\nALTER TABLE ONLY public.plg_marketing_consents\n ADD CONSTRAINT plg_marketing_consents_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_marketing_consents\n ADD CONSTRAINT plg_marketing_consents_tenant_id_id_key UNIQUE (tenant_id, id);\n\nALTER TABLE ONLY public.plg_marketing_consents\n ADD CONSTRAINT plg_marketing_consents_tenant_id_person_id_purpose_key UNIQUE (tenant_id, person_id, purpose);\n\nALTER TABLE ONLY public.plg_marketing_content_plans\n ADD CONSTRAINT plg_marketing_content_plans_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_marketing_content_posts\n ADD CONSTRAINT plg_marketing_content_posts_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_marketing_landing_pages\n ADD CONSTRAINT plg_marketing_landing_pages_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_marketing_landing_pages\n ADD CONSTRAINT plg_marketing_landing_pages_tenant_id_id_key UNIQUE (tenant_id, id);\n\nALTER TABLE ONLY public.plg_marketing_social_accounts\n ADD CONSTRAINT plg_marketing_social_accounts_pkey PRIMARY KEY (id);\n\n\n-- ── view ────────────────────────────────────────────────────────────────\n\nCREATE VIEW public.v_marketing_attribution WITH (security_invoker='true') AS\n SELECT p.tenant_id,\n 'lead'::text AS kind,\n 'crm'::text AS source,\n COALESCE((p.metadata ->> 'sourceId'::text), (p.metadata ->> 'sourceName'::text), (p.metadata ->> 'origin'::text)) AS channel_raw,\n p.created_at AS occurred_at,\n (NULLIF((p.metadata ->> 'value'::text), ''::text))::numeric AS value\n FROM public.people p\n WHERE (p.kind = 'lead'::text)\nUNION ALL\n SELECT b.tenant_id,\n 'conversion'::text AS kind,\n 'agenda'::text AS source,\n COALESCE((b.metadata ->> 'origin'::text), (pc.metadata ->> 'origin'::text), (pc.metadata ->> 'sourceId'::text), (pc.metadata ->> 'sourceName'::text)) AS channel_raw,\n b.starts_at AS occurred_at,\n o.total AS value\n FROM ((public.appointments b\n LEFT JOIN public.people pc ON ((pc.id = b.party_id)))\n LEFT JOIN public.orders o ON ((o.id = b.order_id)))\n WHERE (b.status <> ALL (ARRAY['cancelled'::text, 'no_show'::text]))\nUNION ALL\n SELECT o.tenant_id,\n 'conversion'::text AS kind,\n 'orders'::text AS source,\n COALESCE((o.metadata ->> 'origin'::text), (pp.metadata ->> 'origin'::text), (pp.metadata ->> 'sourceId'::text)) AS channel_raw,\n o.created_at AS occurred_at,\n o.total AS value\n FROM (public.orders o\n LEFT JOIN public.people pp ON ((pp.id = o.party_id)))\n WHERE ((o.kind <> ALL (ARRAY['appointment'::text, 'deal'::text])) AND (o.status <> ALL (ARRAY['cancelled'::text, 'draft'::text])))\nUNION ALL\n SELECT o.tenant_id,\n 'conversion'::text AS kind,\n 'crm'::text AS source,\n COALESCE((pp.metadata ->> 'sourceId'::text), (pp.metadata ->> 'sourceName'::text), (o.metadata ->> 'origin'::text)) AS channel_raw,\n o.updated_at AS occurred_at,\n o.total AS value\n FROM (public.orders o\n LEFT JOIN public.people pp ON ((pp.id = o.party_id)))\n WHERE ((o.kind = 'deal'::text) AND (o.status = 'won'::text));\n\nCREATE VIEW public.v_marketing_campaign_metrics WITH (security_invoker='true') AS\n SELECT c.id AS campaign_id,\n c.tenant_id,\n c.unit_id,\n c.key,\n c.name,\n c.status,\n c.purpose,\n c.template_key,\n c.last_run_at,\n count(a.id) AS audience,\n count(a.id) FILTER (WHERE (a.state = 'queued'::text)) AS queued,\n count(a.id) FILTER (WHERE (a.state = 'sent'::text)) AS sent,\n count(a.id) FILTER (WHERE (a.state = 'converted'::text)) AS converted,\n count(a.id) FILTER (WHERE (a.state = 'left'::text)) AS left_audience,\n count(a.id) FILTER (WHERE (a.state = 'blocked'::text)) AS blocked,\n count(q.id) FILTER (WHERE (q.status = 'sent'::text)) AS delivered,\n count(q.id) FILTER (WHERE (q.status = 'blocked'::text)) AS refused\n FROM ((public.plg_marketing_campaigns c\n LEFT JOIN public.plg_marketing_audiences a ON ((a.campaign_id = c.id)))\n LEFT JOIN public.plg_notifications_queue q ON ((q.id = a.queue_id)))\n WHERE (c.kind = 'outbound'::text)\n GROUP BY c.id, c.tenant_id, c.unit_id, c.key, c.name, c.status, c.purpose, c.template_key, c.last_run_at;\n\nCREATE VIEW public.v_marketing_campaigns WITH (security_invoker='true') AS\n SELECT g.id,\n g.tenant_id,\n g.name,\n g.channel_key,\n ch.label AS channel_label,\n g.status,\n g.starts_at,\n g.ends_at,\n g.spend,\n g.created_at,\n g.updated_at\n FROM (public.plg_marketing_campaigns g\n LEFT JOIN public.plg_marketing_channels ch ON (((ch.tenant_id = g.tenant_id) AND (ch.channel_key = g.channel_key))));\n\nCREATE VIEW public.v_marketing_channels WITH (security_invoker='true') AS\n SELECT id,\n tenant_id,\n channel_key,\n label,\n icon,\n kind,\n is_active,\n monthly_spend,\n created_at,\n updated_at\n FROM public.plg_marketing_channels c;\n\nCREATE VIEW public.v_marketing_landing_pages WITH (security_invoker='true') AS\n SELECT lp.id,\n lp.tenant_id,\n lp.site_id,\n lp.name,\n lp.route,\n lp.lead_tags,\n lp.status,\n lp.prompt,\n lp.is_active,\n s.name AS site_name,\n s.preview_url AS site_url,\n s.app_id,\n s.fayz_project_id,\n s.editor_url,\n lp.created_at,\n lp.updated_at\n FROM (public.plg_marketing_landing_pages lp\n JOIN public.fayz_projects s ON ((s.id = lp.site_id)));\n\nCREATE VIEW public.v_marketing_lead_tag_events WITH (security_invoker='true') AS\n SELECT p.tenant_id,\n tag.tag,\n p.id AS person_id,\n p.created_at AS occurred_at,\n (NULLIF((p.metadata ->> 'value'::text), ''::text))::numeric AS value\n FROM (public.people p\n CROSS JOIN LATERAL unnest(COALESCE(p.tags, '{}'::text[])) tag(tag))\n WHERE ((p.kind = 'lead'::text) AND COALESCE(p.is_active, true));\n\n\n-- ── index ───────────────────────────────────────────────────────────────\n\nCREATE INDEX idx_plg_marketing_campaigns_channel ON public.plg_marketing_campaigns USING btree (tenant_id, channel_key);\n\nCREATE INDEX idx_plg_marketing_campaigns_tenant ON public.plg_marketing_campaigns USING btree (tenant_id);\n\nCREATE INDEX idx_plg_marketing_channels_tenant ON public.plg_marketing_channels USING btree (tenant_id);\n\nCREATE INDEX idx_plg_marketing_content_plans_account ON public.plg_marketing_content_plans USING btree (account_id);\n\nCREATE INDEX idx_plg_marketing_content_plans_tenant ON public.plg_marketing_content_plans USING btree (tenant_id);\n\nCREATE INDEX idx_plg_marketing_content_posts_plan ON public.plg_marketing_content_posts USING btree (plan_id, week_number, \"position\");\n\nCREATE INDEX idx_plg_marketing_content_posts_status ON public.plg_marketing_content_posts USING btree (tenant_id, status);\n\nCREATE INDEX idx_plg_marketing_content_posts_tenant ON public.plg_marketing_content_posts USING btree (tenant_id);\n\nCREATE INDEX idx_plg_marketing_landing_pages_site ON public.plg_marketing_landing_pages USING btree (site_id);\n\nCREATE INDEX idx_plg_marketing_landing_pages_tenant ON public.plg_marketing_landing_pages USING btree (tenant_id);\n\nCREATE INDEX idx_plg_marketing_social_accounts_tenant ON public.plg_marketing_social_accounts USING btree (tenant_id);\n\nCREATE INDEX plg_marketing_audiences_state_idx ON public.plg_marketing_audiences USING btree (campaign_id, state);\n\nCREATE INDEX plg_marketing_audiences_tenant_owner_idx ON public.plg_marketing_audiences USING btree (tenant_id, owner_id) WHERE (owner_id IS NOT NULL);\n\nCREATE INDEX plg_marketing_audiences_tenant_unit_idx ON public.plg_marketing_audiences USING btree (tenant_id, unit_id);\n\nCREATE INDEX plg_marketing_campaigns_due_idx ON public.plg_marketing_campaigns USING btree (next_run_at) WHERE ((kind = 'outbound'::text) AND (status = 'active'::text));\n\nCREATE UNIQUE INDEX plg_marketing_campaigns_key_uq ON public.plg_marketing_campaigns USING btree (tenant_id, key) WHERE (key IS NOT NULL);\n\nCREATE INDEX plg_marketing_campaigns_tenant_owner_idx ON public.plg_marketing_campaigns USING btree (tenant_id, owner_id) WHERE (owner_id IS NOT NULL);\n\nCREATE INDEX plg_marketing_campaigns_tenant_unit_idx ON public.plg_marketing_campaigns USING btree (tenant_id, unit_id);\n\nCREATE INDEX plg_marketing_channels_tenant_owner_idx ON public.plg_marketing_channels USING btree (tenant_id, owner_id) WHERE (owner_id IS NOT NULL);\n\nCREATE INDEX plg_marketing_channels_tenant_unit_idx ON public.plg_marketing_channels USING btree (tenant_id, unit_id);\n\nCREATE INDEX plg_marketing_consents_person_idx ON public.plg_marketing_consents USING btree (tenant_id, person_id);\n\nCREATE INDEX plg_marketing_consents_tenant_owner_idx ON public.plg_marketing_consents USING btree (tenant_id, owner_id) WHERE (owner_id IS NOT NULL);\n\nCREATE INDEX plg_marketing_consents_tenant_unit_idx ON public.plg_marketing_consents USING btree (tenant_id, unit_id);\n\nCREATE INDEX plg_marketing_landing_pages_tenant_owner_idx ON public.plg_marketing_landing_pages USING btree (tenant_id, owner_id) WHERE (owner_id IS NOT NULL);\n\nCREATE INDEX plg_marketing_landing_pages_tenant_unit_idx ON public.plg_marketing_landing_pages USING btree (tenant_id, unit_id);\n\nCREATE UNIQUE INDEX u_plg_marketing_channels_tenant_key ON public.plg_marketing_channels USING btree (tenant_id, channel_key);\n\nCREATE UNIQUE INDEX u_plg_marketing_landing_pages_site_route ON public.plg_marketing_landing_pages USING btree (site_id, route);\n\n\n-- ── fk constraint ───────────────────────────────────────────────────────\n\nALTER TABLE ONLY public.plg_marketing_audiences\n ADD CONSTRAINT plg_marketing_audiences_campaign_id_fkey FOREIGN KEY (campaign_id) REFERENCES public.plg_marketing_campaigns(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_marketing_audiences\n ADD CONSTRAINT plg_marketing_audiences_owner_fk FOREIGN KEY (tenant_id, owner_id) REFERENCES app.memberships(tenant_id, user_id) ON DELETE SET NULL;\n\nALTER TABLE ONLY public.plg_marketing_audiences\n ADD CONSTRAINT plg_marketing_audiences_person_id_fkey FOREIGN KEY (person_id) REFERENCES public.people(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_marketing_audiences\n ADD CONSTRAINT plg_marketing_audiences_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_marketing_audiences\n ADD CONSTRAINT plg_marketing_audiences_unit_fk FOREIGN KEY (tenant_id, unit_id) REFERENCES app.units(tenant_id, id) ON DELETE SET NULL;\n\nALTER TABLE ONLY public.plg_marketing_campaigns\n ADD CONSTRAINT plg_marketing_campaigns_owner_fk FOREIGN KEY (tenant_id, owner_id) REFERENCES app.memberships(tenant_id, user_id) ON DELETE SET NULL;\n\nALTER TABLE ONLY public.plg_marketing_campaigns\n ADD CONSTRAINT plg_marketing_campaigns_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_marketing_campaigns\n ADD CONSTRAINT plg_marketing_campaigns_unit_fk FOREIGN KEY (tenant_id, unit_id) REFERENCES app.units(tenant_id, id) ON DELETE SET NULL;\n\nALTER TABLE ONLY public.plg_marketing_channels\n ADD CONSTRAINT plg_marketing_channels_owner_fk FOREIGN KEY (tenant_id, owner_id) REFERENCES app.memberships(tenant_id, user_id) ON DELETE SET NULL;\n\nALTER TABLE ONLY public.plg_marketing_channels\n ADD CONSTRAINT plg_marketing_channels_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_marketing_channels\n ADD CONSTRAINT plg_marketing_channels_unit_fk FOREIGN KEY (tenant_id, unit_id) REFERENCES app.units(tenant_id, id) ON DELETE SET NULL;\n\nALTER TABLE ONLY public.plg_marketing_consents\n ADD CONSTRAINT plg_marketing_consents_owner_fk FOREIGN KEY (tenant_id, owner_id) REFERENCES app.memberships(tenant_id, user_id) ON DELETE SET NULL;\n\nALTER TABLE ONLY public.plg_marketing_consents\n ADD CONSTRAINT plg_marketing_consents_person_id_fkey FOREIGN KEY (person_id) REFERENCES public.people(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_marketing_consents\n ADD CONSTRAINT plg_marketing_consents_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_marketing_consents\n ADD CONSTRAINT plg_marketing_consents_unit_fk FOREIGN KEY (tenant_id, unit_id) REFERENCES app.units(tenant_id, id) ON DELETE SET NULL;\n\nALTER TABLE ONLY public.plg_marketing_content_plans\n ADD CONSTRAINT plg_marketing_content_plans_account_id_fkey FOREIGN KEY (account_id) REFERENCES public.plg_marketing_social_accounts(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_marketing_content_plans\n ADD CONSTRAINT plg_marketing_content_plans_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_marketing_content_posts\n ADD CONSTRAINT plg_marketing_content_posts_plan_id_fkey FOREIGN KEY (plan_id) REFERENCES public.plg_marketing_content_plans(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_marketing_content_posts\n ADD CONSTRAINT plg_marketing_content_posts_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_marketing_landing_pages\n ADD CONSTRAINT plg_marketing_landing_pages_owner_fk FOREIGN KEY (tenant_id, owner_id) REFERENCES app.memberships(tenant_id, user_id) ON DELETE SET NULL;\n\nALTER TABLE ONLY public.plg_marketing_landing_pages\n ADD CONSTRAINT plg_marketing_landing_pages_site_fk FOREIGN KEY (site_id) REFERENCES public.published_sites(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_marketing_landing_pages\n ADD CONSTRAINT plg_marketing_landing_pages_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_marketing_landing_pages\n ADD CONSTRAINT plg_marketing_landing_pages_unit_fk FOREIGN KEY (tenant_id, unit_id) REFERENCES app.units(tenant_id, id) ON DELETE SET NULL;\n\nALTER TABLE ONLY public.plg_marketing_social_accounts\n ADD CONSTRAINT plg_marketing_social_accounts_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\n\n-- ── trigger ─────────────────────────────────────────────────────────────\n\nCREATE TRIGGER plg_marketing_audiences_updated_at BEFORE UPDATE ON public.plg_marketing_audiences FOR EACH ROW EXECUTE FUNCTION public.handle_updated_at();\n\nCREATE TRIGGER plg_marketing_campaigns_updated_at BEFORE UPDATE ON public.plg_marketing_campaigns FOR EACH ROW EXECUTE FUNCTION public.handle_updated_at();\n\nCREATE TRIGGER plg_marketing_channels_updated_at BEFORE UPDATE ON public.plg_marketing_channels FOR EACH ROW EXECUTE FUNCTION public.handle_updated_at();\n\nCREATE TRIGGER plg_marketing_consents_updated_at BEFORE UPDATE ON public.plg_marketing_consents FOR EACH ROW EXECUTE FUNCTION public.handle_updated_at();\n\nCREATE TRIGGER plg_marketing_landing_pages_updated_at BEFORE UPDATE ON public.plg_marketing_landing_pages FOR EACH ROW EXECUTE FUNCTION public.handle_updated_at();\n\n\n-- ── row security ────────────────────────────────────────────────────────\n\nALTER TABLE public.plg_marketing_audiences ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_marketing_campaigns ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_marketing_channels ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_marketing_consents ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_marketing_content_plans ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_marketing_content_posts ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_marketing_landing_pages ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_marketing_social_accounts ENABLE ROW LEVEL SECURITY;\n\n\n-- ── policy ──────────────────────────────────────────────────────────────\n\nCREATE POLICY plg_marketing_audiences_authz_delete ON public.plg_marketing_audiences FOR DELETE TO authenticated USING (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_audiences.unit_id) AS has_unit)) AND ((NOT ( SELECT app.owner_scoped('marketing.audience'::text) AS owner_scoped)) OR (owner_id IS NULL) OR (owner_id = ( SELECT auth.uid() AS uid)) OR ( SELECT app.has_grant('marketing.audience'::text, plg_marketing_audiences.id, ARRAY['shared_with'::text]) AS has_grant) OR ( SELECT app.has_permission('marketing.read_all'::text, plg_marketing_audiences.unit_id) AS has_permission)) AND ( SELECT app.has_permission('marketing.delete'::text, plg_marketing_audiences.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_audiences_authz_insert ON public.plg_marketing_audiences FOR INSERT TO authenticated WITH CHECK (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_audiences.unit_id) AS has_unit)) AND ( SELECT app.has_permission('marketing.create'::text, plg_marketing_audiences.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_audiences_authz_select ON public.plg_marketing_audiences FOR SELECT TO authenticated USING (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_audiences.unit_id) AS has_unit)) AND ((NOT ( SELECT app.owner_scoped('marketing.audience'::text) AS owner_scoped)) OR (owner_id IS NULL) OR (owner_id = ( SELECT auth.uid() AS uid)) OR ( SELECT app.has_grant('marketing.audience'::text, plg_marketing_audiences.id, ARRAY['shared_with'::text]) AS has_grant) OR ( SELECT app.has_permission('marketing.read_all'::text, plg_marketing_audiences.unit_id) AS has_permission)) AND ( SELECT app.has_permission('marketing.read'::text, plg_marketing_audiences.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_audiences_authz_update ON public.plg_marketing_audiences FOR UPDATE TO authenticated USING (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_audiences.unit_id) AS has_unit)) AND ((NOT ( SELECT app.owner_scoped('marketing.audience'::text) AS owner_scoped)) OR (owner_id IS NULL) OR (owner_id = ( SELECT auth.uid() AS uid)) OR ( SELECT app.has_grant('marketing.audience'::text, plg_marketing_audiences.id, ARRAY['shared_with'::text]) AS has_grant) OR ( SELECT app.has_permission('marketing.read_all'::text, plg_marketing_audiences.unit_id) AS has_permission)) AND ( SELECT app.has_permission('marketing.edit'::text, plg_marketing_audiences.unit_id) AS has_permission))) WITH CHECK (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_audiences.unit_id) AS has_unit)) AND ( SELECT app.has_permission('marketing.edit'::text, plg_marketing_audiences.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_campaigns_authz_delete ON public.plg_marketing_campaigns FOR DELETE TO authenticated USING (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_campaigns.unit_id) AS has_unit)) AND ((NOT ( SELECT app.owner_scoped('marketing.campaign'::text) AS owner_scoped)) OR (owner_id IS NULL) OR (owner_id = ( SELECT auth.uid() AS uid)) OR ( SELECT app.has_grant('marketing.campaign'::text, plg_marketing_campaigns.id, ARRAY['shared_with'::text]) AS has_grant) OR ( SELECT app.has_permission('marketing.read_all'::text, plg_marketing_campaigns.unit_id) AS has_permission)) AND ( SELECT app.has_permission('marketing.delete'::text, plg_marketing_campaigns.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_campaigns_authz_insert ON public.plg_marketing_campaigns FOR INSERT TO authenticated WITH CHECK (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_campaigns.unit_id) AS has_unit)) AND ( SELECT app.has_permission('marketing.create'::text, plg_marketing_campaigns.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_campaigns_authz_select ON public.plg_marketing_campaigns FOR SELECT TO authenticated USING (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_campaigns.unit_id) AS has_unit)) AND ((NOT ( SELECT app.owner_scoped('marketing.campaign'::text) AS owner_scoped)) OR (owner_id IS NULL) OR (owner_id = ( SELECT auth.uid() AS uid)) OR ( SELECT app.has_grant('marketing.campaign'::text, plg_marketing_campaigns.id, ARRAY['shared_with'::text]) AS has_grant) OR ( SELECT app.has_permission('marketing.read_all'::text, plg_marketing_campaigns.unit_id) AS has_permission)) AND ( SELECT app.has_permission('marketing.read'::text, plg_marketing_campaigns.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_campaigns_authz_update ON public.plg_marketing_campaigns FOR UPDATE TO authenticated USING (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_campaigns.unit_id) AS has_unit)) AND ((NOT ( SELECT app.owner_scoped('marketing.campaign'::text) AS owner_scoped)) OR (owner_id IS NULL) OR (owner_id = ( SELECT auth.uid() AS uid)) OR ( SELECT app.has_grant('marketing.campaign'::text, plg_marketing_campaigns.id, ARRAY['shared_with'::text]) AS has_grant) OR ( SELECT app.has_permission('marketing.read_all'::text, plg_marketing_campaigns.unit_id) AS has_permission)) AND ( SELECT app.has_permission('marketing.edit'::text, plg_marketing_campaigns.unit_id) AS has_permission))) WITH CHECK (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_campaigns.unit_id) AS has_unit)) AND ( SELECT app.has_permission('marketing.edit'::text, plg_marketing_campaigns.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_channels_authz_delete ON public.plg_marketing_channels FOR DELETE TO authenticated USING (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_channels.unit_id) AS has_unit)) AND ((NOT ( SELECT app.owner_scoped('marketing.channel'::text) AS owner_scoped)) OR (owner_id IS NULL) OR (owner_id = ( SELECT auth.uid() AS uid)) OR ( SELECT app.has_grant('marketing.channel'::text, plg_marketing_channels.id, ARRAY['shared_with'::text]) AS has_grant) OR ( SELECT app.has_permission('marketing.read_all'::text, plg_marketing_channels.unit_id) AS has_permission)) AND ( SELECT app.has_permission('marketing.delete'::text, plg_marketing_channels.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_channels_authz_insert ON public.plg_marketing_channels FOR INSERT TO authenticated WITH CHECK (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_channels.unit_id) AS has_unit)) AND ( SELECT app.has_permission('marketing.create'::text, plg_marketing_channels.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_channels_authz_select ON public.plg_marketing_channels FOR SELECT TO authenticated USING (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_channels.unit_id) AS has_unit)) AND ((NOT ( SELECT app.owner_scoped('marketing.channel'::text) AS owner_scoped)) OR (owner_id IS NULL) OR (owner_id = ( SELECT auth.uid() AS uid)) OR ( SELECT app.has_grant('marketing.channel'::text, plg_marketing_channels.id, ARRAY['shared_with'::text]) AS has_grant) OR ( SELECT app.has_permission('marketing.read_all'::text, plg_marketing_channels.unit_id) AS has_permission)) AND ( SELECT app.has_permission('marketing.read'::text, plg_marketing_channels.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_channels_authz_update ON public.plg_marketing_channels FOR UPDATE TO authenticated USING (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_channels.unit_id) AS has_unit)) AND ((NOT ( SELECT app.owner_scoped('marketing.channel'::text) AS owner_scoped)) OR (owner_id IS NULL) OR (owner_id = ( SELECT auth.uid() AS uid)) OR ( SELECT app.has_grant('marketing.channel'::text, plg_marketing_channels.id, ARRAY['shared_with'::text]) AS has_grant) OR ( SELECT app.has_permission('marketing.read_all'::text, plg_marketing_channels.unit_id) AS has_permission)) AND ( SELECT app.has_permission('marketing.edit'::text, plg_marketing_channels.unit_id) AS has_permission))) WITH CHECK (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_channels.unit_id) AS has_unit)) AND ( SELECT app.has_permission('marketing.edit'::text, plg_marketing_channels.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_consents_authz_delete ON public.plg_marketing_consents FOR DELETE TO authenticated USING (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_consents.unit_id) AS has_unit)) AND ((NOT ( SELECT app.owner_scoped('marketing.consent'::text) AS owner_scoped)) OR (owner_id IS NULL) OR (owner_id = ( SELECT auth.uid() AS uid)) OR ( SELECT app.has_grant('marketing.consent'::text, plg_marketing_consents.id, ARRAY['shared_with'::text]) AS has_grant) OR ( SELECT app.has_permission('marketing.read_all'::text, plg_marketing_consents.unit_id) AS has_permission)) AND ( SELECT app.has_permission('marketing.delete'::text, plg_marketing_consents.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_consents_authz_insert ON public.plg_marketing_consents FOR INSERT TO authenticated WITH CHECK (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_consents.unit_id) AS has_unit)) AND ( SELECT app.has_permission('marketing.create'::text, plg_marketing_consents.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_consents_authz_select ON public.plg_marketing_consents FOR SELECT TO authenticated USING (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_consents.unit_id) AS has_unit)) AND ((NOT ( SELECT app.owner_scoped('marketing.consent'::text) AS owner_scoped)) OR (owner_id IS NULL) OR (owner_id = ( SELECT auth.uid() AS uid)) OR ( SELECT app.has_grant('marketing.consent'::text, plg_marketing_consents.id, ARRAY['shared_with'::text]) AS has_grant) OR ( SELECT app.has_permission('marketing.read_all'::text, plg_marketing_consents.unit_id) AS has_permission)) AND ( SELECT app.has_permission('marketing.read'::text, plg_marketing_consents.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_consents_authz_update ON public.plg_marketing_consents FOR UPDATE TO authenticated USING (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_consents.unit_id) AS has_unit)) AND ((NOT ( SELECT app.owner_scoped('marketing.consent'::text) AS owner_scoped)) OR (owner_id IS NULL) OR (owner_id = ( SELECT auth.uid() AS uid)) OR ( SELECT app.has_grant('marketing.consent'::text, plg_marketing_consents.id, ARRAY['shared_with'::text]) AS has_grant) OR ( SELECT app.has_permission('marketing.read_all'::text, plg_marketing_consents.unit_id) AS has_permission)) AND ( SELECT app.has_permission('marketing.edit'::text, plg_marketing_consents.unit_id) AS has_permission))) WITH CHECK (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_consents.unit_id) AS has_unit)) AND ( SELECT app.has_permission('marketing.edit'::text, plg_marketing_consents.unit_id) AS has_permission)));\n\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() AS user_tenant_ids)));\n\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() AS user_tenant_ids)));\n\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() AS user_tenant_ids)));\n\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() AS user_tenant_ids)));\n\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() AS user_tenant_ids)));\n\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() AS user_tenant_ids)));\n\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() AS user_tenant_ids)));\n\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() AS user_tenant_ids)));\n\nCREATE POLICY plg_marketing_landing_pages_authz_delete ON public.plg_marketing_landing_pages FOR DELETE TO authenticated USING (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_landing_pages.unit_id) AS has_unit)) AND ((NOT ( SELECT app.owner_scoped('marketing.landing_page'::text) AS owner_scoped)) OR (owner_id IS NULL) OR (owner_id = ( SELECT auth.uid() AS uid)) OR ( SELECT app.has_grant('marketing.landing_page'::text, plg_marketing_landing_pages.id, ARRAY['shared_with'::text]) AS has_grant) OR ( SELECT app.has_permission('marketing.read_all'::text, plg_marketing_landing_pages.unit_id) AS has_permission)) AND ( SELECT app.has_permission('marketing.delete'::text, plg_marketing_landing_pages.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_landing_pages_authz_insert ON public.plg_marketing_landing_pages FOR INSERT TO authenticated WITH CHECK (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_landing_pages.unit_id) AS has_unit)) AND ( SELECT app.has_permission('marketing.create'::text, plg_marketing_landing_pages.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_landing_pages_authz_select ON public.plg_marketing_landing_pages FOR SELECT TO authenticated USING (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_landing_pages.unit_id) AS has_unit)) AND ((NOT ( SELECT app.owner_scoped('marketing.landing_page'::text) AS owner_scoped)) OR (owner_id IS NULL) OR (owner_id = ( SELECT auth.uid() AS uid)) OR ( SELECT app.has_grant('marketing.landing_page'::text, plg_marketing_landing_pages.id, ARRAY['shared_with'::text]) AS has_grant) OR ( SELECT app.has_permission('marketing.read_all'::text, plg_marketing_landing_pages.unit_id) AS has_permission)) AND ( SELECT app.has_permission('marketing.read'::text, plg_marketing_landing_pages.unit_id) AS has_permission)));\n\nCREATE POLICY plg_marketing_landing_pages_authz_update ON public.plg_marketing_landing_pages FOR UPDATE TO authenticated USING (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_landing_pages.unit_id) AS has_unit)) AND ((NOT ( SELECT app.owner_scoped('marketing.landing_page'::text) AS owner_scoped)) OR (owner_id IS NULL) OR (owner_id = ( SELECT auth.uid() AS uid)) OR ( SELECT app.has_grant('marketing.landing_page'::text, plg_marketing_landing_pages.id, ARRAY['shared_with'::text]) AS has_grant) OR ( SELECT app.has_permission('marketing.read_all'::text, plg_marketing_landing_pages.unit_id) AS has_permission)) AND ( SELECT app.has_permission('marketing.edit'::text, plg_marketing_landing_pages.unit_id) AS has_permission))) WITH CHECK (((tenant_id = ( SELECT app.current_tenant_id() AS current_tenant_id)) AND ((unit_id IS NULL) OR ( SELECT app.has_unit(plg_marketing_landing_pages.unit_id) AS has_unit)) AND ( SELECT app.has_permission('marketing.edit'::text, plg_marketing_landing_pages.unit_id) AS has_permission)));\n\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() AS user_tenant_ids)));\n\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() AS user_tenant_ids)));\n\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() AS user_tenant_ids)));\n\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() AS user_tenant_ids)));\n\n\n-- ── acl ─────────────────────────────────────────────────────────────────\n\nREVOKE ALL ON FUNCTION public.agent_marketing_create_campaign(p_tenant_id uuid, p_actor_user_id uuid, p_payload jsonb) FROM PUBLIC;\nGRANT ALL ON FUNCTION public.agent_marketing_create_campaign(p_tenant_id uuid, p_actor_user_id uuid, p_payload jsonb) TO authenticated;\nGRANT ALL ON FUNCTION public.agent_marketing_create_campaign(p_tenant_id uuid, p_actor_user_id uuid, p_payload jsonb) TO service_role;\n\nREVOKE ALL ON FUNCTION public.marketing_campaign_run(p_campaign_id uuid, p_limit integer) FROM PUBLIC;\nGRANT ALL ON FUNCTION public.marketing_campaign_run(p_campaign_id uuid, p_limit integer) TO authenticated;\nGRANT ALL ON FUNCTION public.marketing_campaign_run(p_campaign_id uuid, p_limit integer) TO service_role;\n\nREVOKE ALL ON FUNCTION public.marketing_has_consent(p_tenant uuid, p_person uuid, p_purpose text) FROM PUBLIC;\nGRANT ALL ON FUNCTION public.marketing_has_consent(p_tenant uuid, p_person uuid, p_purpose text) TO authenticated;\nGRANT ALL ON FUNCTION public.marketing_has_consent(p_tenant uuid, p_person uuid, p_purpose text) TO service_role;\n\nREVOKE ALL ON FUNCTION public.marketing_resolve_audience(p_campaign_id uuid) FROM PUBLIC;\nGRANT ALL ON FUNCTION public.marketing_resolve_audience(p_campaign_id uuid) TO authenticated;\nGRANT ALL ON FUNCTION public.marketing_resolve_audience(p_campaign_id uuid) TO service_role;\n\nREVOKE ALL ON FUNCTION public.marketing_run_due(p_limit integer) FROM PUBLIC;\nGRANT ALL ON FUNCTION public.marketing_run_due(p_limit integer) TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_marketing_audiences TO anon;\nGRANT ALL ON TABLE public.plg_marketing_audiences TO authenticated;\nGRANT ALL ON TABLE public.plg_marketing_audiences TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_marketing_campaigns TO anon;\nGRANT ALL ON TABLE public.plg_marketing_campaigns TO authenticated;\nGRANT ALL ON TABLE public.plg_marketing_campaigns TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_marketing_channels TO anon;\nGRANT ALL ON TABLE public.plg_marketing_channels TO authenticated;\nGRANT ALL ON TABLE public.plg_marketing_channels TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_marketing_consents TO anon;\nGRANT ALL ON TABLE public.plg_marketing_consents TO authenticated;\nGRANT ALL ON TABLE public.plg_marketing_consents TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_marketing_content_plans TO anon;\nGRANT ALL ON TABLE public.plg_marketing_content_plans TO authenticated;\nGRANT ALL ON TABLE public.plg_marketing_content_plans TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_marketing_content_posts TO anon;\nGRANT ALL ON TABLE public.plg_marketing_content_posts TO authenticated;\nGRANT ALL ON TABLE public.plg_marketing_content_posts TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_marketing_landing_pages TO anon;\nGRANT ALL ON TABLE public.plg_marketing_landing_pages TO authenticated;\nGRANT ALL ON TABLE public.plg_marketing_landing_pages TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_marketing_social_accounts TO anon;\nGRANT ALL ON TABLE public.plg_marketing_social_accounts TO authenticated;\nGRANT ALL ON TABLE public.plg_marketing_social_accounts TO service_role;\n\nGRANT MAINTAIN ON TABLE public.v_marketing_attribution TO anon;\nGRANT ALL ON TABLE public.v_marketing_attribution TO authenticated;\nGRANT ALL ON TABLE public.v_marketing_attribution TO service_role;\n\nGRANT MAINTAIN ON TABLE public.v_marketing_campaign_metrics TO anon;\nGRANT ALL ON TABLE public.v_marketing_campaign_metrics TO authenticated;\nGRANT ALL ON TABLE public.v_marketing_campaign_metrics TO service_role;\n\nGRANT MAINTAIN ON TABLE public.v_marketing_campaigns TO anon;\nGRANT ALL ON TABLE public.v_marketing_campaigns TO authenticated;\nGRANT ALL ON TABLE public.v_marketing_campaigns TO service_role;\n\nGRANT MAINTAIN ON TABLE public.v_marketing_channels TO anon;\nGRANT ALL ON TABLE public.v_marketing_channels TO authenticated;\nGRANT ALL ON TABLE public.v_marketing_channels TO service_role;\n\nGRANT MAINTAIN ON TABLE public.v_marketing_landing_pages TO anon;\nGRANT ALL ON TABLE public.v_marketing_landing_pages TO authenticated;\nGRANT ALL ON TABLE public.v_marketing_landing_pages TO service_role;\n\nGRANT MAINTAIN ON TABLE public.v_marketing_lead_tag_events TO anon;\nGRANT ALL ON TABLE public.v_marketing_lead_tag_events TO authenticated;\nGRANT ALL ON TABLE public.v_marketing_lead_tag_events TO service_role;\n\n\n-- ── comment ─────────────────────────────────────────────────────────────\n\nCOMMENT ON FUNCTION public.marketing_campaign_run(p_campaign_id uuid, p_limit integer) IS 'Run a campaign (PRD 09): re-resolve the audience, drop whoever no longer qualifies, and ENQUEUE the rest through the notification engine. It never sends — that is what makes a promotion and a dunning reminder the same machine.';\n\nCOMMENT ON FUNCTION public.marketing_resolve_audience(p_campaign_id uuid) IS 'Who is in a campaign''s audience right now (PRD 09). Declarative filters over a read model, with consent for the campaign''s purpose applied AT THE SOURCE — someone who revoked never appears here, rather than appearing and being dropped later.';\n\nCOMMENT ON TABLE public.plg_marketing_audiences IS 'Who a campaign reached and what happened (PRD 09). The audience is a QUERY re-evaluated on every run, not a frozen list: whoever qualifies later enters later, and whoever revokes consent leaves on the next run. This table is the record of that, not its definition.';\n\nCOMMENT ON COLUMN public.plg_marketing_campaigns.kind IS 'ad_spend (the imported numbers of an external campaign) or outbound (a campaign this system fires). Same noun, two animals — a species rather than a second table called almost the same thing.';\n\nCOMMENT ON COLUMN public.plg_marketing_campaigns.audience_query IS 'A DECLARATIVE audience: {\"source_view\": \"...\", \"where\": [{\"column\",\"op\",\"value\"}]}. Not SQL — a stored query string would make every campaign an injection surface, and a frozen list would answer yesterday''s question.';\n\nCOMMENT ON TABLE public.plg_marketing_consents IS 'Consent per PURPOSE (PRD 09), separate from the channel opt-out: a customer may accept a payment reminder and refuse a promotion. Revoking is a timestamp, never a delete — the record that consent once existed is itself the evidence LGPD asks for.';\n\nCOMMENT ON VIEW public.v_marketing_campaign_metrics IS 'Reach, delivery and conversion per campaign (PRD 09), computed from the audience and the notification queue. The campaign keeps no counter of its own — two tallies of the same fact is how a dashboard starts disagreeing with the queue.';\n\n\n-- ── default privileges: restore ─────────────────────────────────────────\n-- Put back, so the NEXT thing installed inherits what the chain had.\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT MAINTAIN ON TABLES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT MAINTAIN ON TABLES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$--\n-- PostgreSQL database dump complete\n--$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$--\n-- PostgreSQL database dump complete\n--$stmt$;\nEND $dp$;\n`\n\nexport const MIGRATION_001_THE_LANDING_PAGE_NAMES_THE_SITE = `-- ============================================================================\n-- 001_the_landing_page_names_the_site — the last caller of fayz_projects, and\n-- then the name itself (#352).\n--\n-- 137 renamed the vendor out of the spine: \\`fayz_projects\\` became\n-- \\`published_sites\\`, because a table should say what it holds and not who\n-- built it. 141 left the old name answering as a view until callers moved.\n-- This view is the last one that did not, and it is the reason the name could\n-- not be dropped by the spine: a CREATE VIEW is a HARD dependency, so the\n-- spine — which runs first — would be dropping a name this file then joins.\n--\n-- So the drop lives here, with the last reader. The view body is\n-- 000_baseline's with one name changed.\n-- ============================================================================\n\n-- DROP, not CREATE OR REPLACE: this renames a COLUMN (fayz_project_id ->\n-- provider_site_id) and Postgres refuses that in a replace, which is the same\n-- wall 0084 and 0086 hit. Dropping takes the grants with it, so they are\n-- restored below exactly as 000_baseline set them.\nDROP VIEW IF EXISTS public.v_marketing_landing_pages;\n\nCREATE VIEW public.v_marketing_landing_pages WITH (security_invoker='true') AS\n SELECT lp.id,\n lp.tenant_id,\n lp.site_id,\n lp.name,\n lp.route,\n lp.lead_tags,\n lp.status,\n lp.prompt,\n lp.is_active,\n s.name AS site_name,\n s.preview_url AS site_url,\n s.app_id,\n s.provider_site_id,\n s.editor_url,\n lp.created_at,\n lp.updated_at\n FROM (public.plg_marketing_landing_pages lp\n JOIN public.published_sites s ON ((s.id = lp.site_id)));\nGRANT MAINTAIN ON TABLE public.v_marketing_landing_pages TO anon;\nGRANT ALL ON TABLE public.v_marketing_landing_pages TO authenticated;\nGRANT ALL ON TABLE public.v_marketing_landing_pages TO service_role;\n\nDROP VIEW IF EXISTS public.fayz_projects;\n`\n\nexport const MIGRATION_003_A_PORTA_PUBLICA_E_A_PAGINA = `-- 003_a_porta_publica_e_a_pagina.sql\n--\n-- Havia DUAS portas públicas para a mesma coisa.\n--\n-- A landing page é uma página com endereço público que existe para capturar\n-- gente. A \"página de captura\" (crm/007) é um endereço público que existe para\n-- capturar gente. A diferença que eu tinha em mente — uma é conteúdo, a outra é\n-- regra — não é uma diferença que o lojista faz: ele quer UMA porta, com o\n-- texto e as regras dela no mesmo lugar.\n--\n-- Então a regra entra na página. A landing page ganha o que só a captura tinha:\n-- a chave opaca, o destino, os campos obrigatórios e a janela de antecedência.\n-- E as duas funções que \\`anon\\` executa passam a ler daqui.\n--\n-- POR QUE AS FUNÇÕES MUDAM DE PLUGIN: a corrente aplica \\`crm\\` ANTES de\n-- \\`marketing\\`, então uma função do CRM não pode ler uma tabela de marketing —\n-- num replay do zero ela apontaria para algo que ainda não existe. Captura\n-- passou a ser assunto de marketing, e a função vai junto.\n\nALTER TABLE public.plg_marketing_landing_pages\n -- O identificador PÚBLICO e opaco. Continua sendo o que vai na URL; um slug\n -- adivinhável deixaria achar a página de outra casa escrevendo o nome dela.\n ADD COLUMN IF NOT EXISTS capture_key text,\n -- Em que sala a porta dá. \"Agendamento\" é palavra de salão; num restaurante a\n -- mesma página marca MESA, e numa loja só captura contato.\n ADD COLUMN IF NOT EXISTS capture_destination text DEFAULT 'lead' NOT NULL,\n ADD COLUMN IF NOT EXISTS capture_required_fields text[] DEFAULT '{}'::text[] NOT NULL,\n -- A janela é dupla: piso em horas contra \"daqui a dez minutos\", teto em dias\n -- contra \"o ano que vem\". Nulas quando o destino não marca nada.\n ADD COLUMN IF NOT EXISTS min_advance_hours integer,\n ADD COLUMN IF NOT EXISTS max_advance_days integer;\n\nDO $$ BEGIN\n IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'plg_marketing_landing_pages_capture_key_key') THEN\n ALTER TABLE ONLY public.plg_marketing_landing_pages\n ADD CONSTRAINT plg_marketing_landing_pages_capture_key_key UNIQUE (capture_key);\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'plg_marketing_landing_pages_destination') THEN\n ALTER TABLE public.plg_marketing_landing_pages\n ADD CONSTRAINT plg_marketing_landing_pages_destination\n CHECK (capture_destination = ANY (ARRAY['lead'::text, 'booking'::text, 'reservation'::text]));\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'plg_marketing_landing_pages_window') THEN\n ALTER TABLE public.plg_marketing_landing_pages\n ADD CONSTRAINT plg_marketing_landing_pages_window CHECK (\n min_advance_hours IS NULL OR max_advance_days IS NULL\n OR (min_advance_hours >= 0 AND max_advance_days >= 1\n AND min_advance_hours <= max_advance_days * 24));\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'plg_marketing_landing_pages_fields') THEN\n ALTER TABLE public.plg_marketing_landing_pages\n ADD CONSTRAINT plg_marketing_landing_pages_fields CHECK (\n capture_required_fields <@ ARRAY['name','phone','email','document','notes']::text[]);\n END IF;\nEND $$;\n\nCOMMENT ON COLUMN public.plg_marketing_landing_pages.capture_key IS\n 'A chave PÚBLICA e opaca da página. Uma porta só: conteúdo e regra no mesmo lugar (marketing/003).';\n\n-- A chave nasce sozinha, com o mesmo auxiliar do token de convite (crm/003),\n-- que resolve o pgcrypto em tempo de execução.\nCREATE OR REPLACE FUNCTION public.trg_marketing_capture_key()\nRETURNS trigger LANGUAGE plpgsql SET search_path TO '' AS $$\nBEGIN\n IF NEW.capture_key IS NULL OR btrim(NEW.capture_key) = '' THEN\n NEW.capture_key := public.crm_url_token(18);\n END IF;\n RETURN NEW;\nEND $$;\n\nDROP TRIGGER IF EXISTS plg_marketing_capture_key ON public.plg_marketing_landing_pages;\nCREATE TRIGGER plg_marketing_capture_key\n BEFORE INSERT ON public.plg_marketing_landing_pages\n FOR EACH ROW EXECUTE FUNCTION public.trg_marketing_capture_key();\n\nUPDATE public.plg_marketing_landing_pages\n SET capture_key = public.crm_url_token(18)\n WHERE capture_key IS NULL;\n\n-- ── abrir a porta (quem está de fora) ──────────────────────────────────────\n--\n-- \\`anon\\` executa: devolve o mínimo para desenhar a página e NADA que sirva para\n-- descobrir outra coisa. Não lista páginas, não aceita id (só a chave), não\n-- devolve tenant_id. Página inativa responde \\`closed\\` e continua existindo — um\n-- 404 num endereço que o cliente tem salvo parece site fora do ar.\nCREATE OR REPLACE FUNCTION public.marketing_capture_load(p_key text)\nRETURNS jsonb\n LANGUAGE plpgsql SECURITY DEFINER STABLE SET search_path TO ''\nAS $$\nDECLARE v record;\nBEGIN\n IF p_key IS NULL OR length(p_key) < 8 THEN\n RETURN jsonb_build_object('status', 'not_found');\n END IF;\n SELECT * INTO v FROM public.plg_marketing_landing_pages WHERE capture_key = p_key;\n IF v.id IS NULL THEN RETURN jsonb_build_object('status', 'not_found'); END IF;\n\n RETURN jsonb_build_object(\n 'status', CASE WHEN v.is_active AND v.status = 'live' THEN 'ok' ELSE 'closed' END,\n 'name', v.name,\n 'route', v.route,\n 'destination', v.capture_destination,\n 'requiredFields', to_jsonb(v.capture_required_fields),\n 'leadTags', to_jsonb(v.lead_tags),\n -- A janela vai junto para a página APAGAR os horários impossíveis, em vez\n -- de deixar o cliente escolher um e levar um \"não\" depois.\n 'minAdvanceHours', v.min_advance_hours,\n 'maxAdvanceDays', v.max_advance_days\n );\nEND $$;\n\nREVOKE ALL ON FUNCTION public.marketing_capture_load(text) FROM PUBLIC;\nGRANT EXECUTE ON FUNCTION public.marketing_capture_load(text) TO anon, authenticated, service_role;\n\n-- ── a janela, aplicada no servidor ─────────────────────────────────────────\n--\n-- Uma janela que só existe na tela é decoração: quem manda um POST direto passa\n-- por cima. Devolve o MOTIVO porque \"cedo demais\" e \"longe demais\" pedem\n-- correções opostas, e uma recusa genérica faz o cliente tentar de novo errado.\nCREATE OR REPLACE FUNCTION public.marketing_capture_window_check(p_key text, p_starts_at timestamp with time zone)\nRETURNS jsonb\n LANGUAGE plpgsql SECURITY DEFINER STABLE SET search_path TO ''\nAS $$\nDECLARE v record;\nBEGIN\n SELECT * INTO v FROM public.plg_marketing_landing_pages WHERE capture_key = p_key;\n IF v.id IS NULL THEN RETURN jsonb_build_object('ok', false, 'reason', 'not_found'); END IF;\n IF NOT (v.is_active AND v.status = 'live') THEN RETURN jsonb_build_object('ok', false, 'reason', 'closed'); END IF;\n IF p_starts_at IS NULL THEN RETURN jsonb_build_object('ok', true); END IF;\n\n IF v.min_advance_hours IS NOT NULL\n AND p_starts_at < now() + make_interval(hours => v.min_advance_hours) THEN\n RETURN jsonb_build_object('ok', false, 'reason', 'too_soon', 'minAdvanceHours', v.min_advance_hours);\n END IF;\n IF v.max_advance_days IS NOT NULL\n AND p_starts_at > now() + make_interval(days => v.max_advance_days) THEN\n RETURN jsonb_build_object('ok', false, 'reason', 'too_far', 'maxAdvanceDays', v.max_advance_days);\n END IF;\n RETURN jsonb_build_object('ok', true);\nEND $$;\n\nREVOKE ALL ON FUNCTION public.marketing_capture_window_check(text, timestamp with time zone) FROM PUBLIC;\nGRANT EXECUTE ON FUNCTION public.marketing_capture_window_check(text, timestamp with time zone) TO anon, authenticated, service_role;\n\n-- ── a porta antiga vem para a página ───────────────────────────────────────\n--\n-- Cada \\`plg_crm_capture_pages\\` vira uma landing page \\`planned\\` com a mesma\n-- chave — a chave é o endereço que o cliente pode ter salvo, e trocá-la\n-- quebraria todo link já colado num site. Nasce como \\`planned\\` e não \\`live\\`\n-- porque a página ainda não tem conteúdo: publicar automaticamente poria no ar\n-- um endereço em branco.\nDO $$\nDECLARE r record; v_site uuid; v_n integer := 0;\nBEGIN\n IF to_regclass('public.plg_crm_capture_pages') IS NULL THEN RETURN; END IF;\n\n FOR r IN SELECT * FROM public.plg_crm_capture_pages LOOP\n SELECT s.id INTO v_site FROM public.published_sites s\n WHERE s.tenant_id = r.tenant_id ORDER BY s.created_at LIMIT 1;\n -- Sem site não há onde a página morar. A porta é preservada no aviso, não\n -- apagada em silêncio.\n IF v_site IS NULL THEN\n RAISE WARNING '003: tenant % tem porta de captura \"%\" e nenhum site — a porta não foi migrada', r.tenant_id, r.name;\n CONTINUE;\n END IF;\n\n INSERT INTO public.plg_marketing_landing_pages\n (tenant_id, site_id, name, route, status, is_active, lead_tags, unit_id,\n capture_key, capture_destination, capture_required_fields, min_advance_hours, max_advance_days)\n VALUES\n (r.tenant_id, v_site, r.name,\n '/' || coalesce(public.crm_slug(r.name), 'captura'),\n 'planned', r.is_active, r.lead_tags, r.unit_id,\n r.key, r.destination, r.required_fields, r.min_advance_hours, r.max_advance_days)\n ON CONFLICT DO NOTHING;\n v_n := v_n + 1;\n END LOOP;\n\n RAISE NOTICE '003: % porta(s) de captura viraram landing page', v_n;\nEND $$;\n\nDROP TABLE IF EXISTS public.plg_crm_capture_pages;\nDELETE FROM app.scaffold_registry WHERE table_name = 'plg_crm_capture_pages';\nDROP FUNCTION IF EXISTS public.crm_capture_page_load(text);\nDROP FUNCTION IF EXISTS public.crm_capture_window_check(text, timestamp with time zone);\nDROP FUNCTION IF EXISTS public.trg_crm_capture_page_key();\n`\n\nexport const MIGRATION_004_A_CAMPANHA_APONTA_PARA_UM_RECORTE = `-- 004_a_campanha_aponta_para_um_recorte.sql\n--\n-- A CAMPANHA NÃO CONSEGUIA APONTAR PARA UM SEGMENTO, QUE É PARA O QUE O\n-- SEGMENTO FOI FEITO.\n--\n-- O comentário da 004 do CRM diz textualmente por que \\`plg_crm_segments\\`\n-- existe: \"a campanha aponta para ele em vez de carregar a própria cópia do\n-- filtro\". Só que \\`marketing_resolve_audience\\` nunca aprendeu a ler um\n-- segmento — ela resolve \\`audience_query = {source_view, where[]}\\`, a cópia do\n-- filtro. Então havia duas verdades sobre quem é \"cliente ativo\": a da tela de\n-- segmentos e a da campanha, e elas divergiam no dia em que alguém corrigisse\n-- uma.\n--\n-- E O VOCABULÁRIO DELA É MENOR, que é o problema mais grave dos dois. A\n-- campanha aceita seis operadores de comparação e mais nada: sem \\`within_days\\`,\n-- sem \\`has_tag\\`, sem \\`is_null\\`. Copiar a regra do segmento para dentro da\n-- campanha, além de duplicar, QUEBRA — \"comprou nos últimos 30 dias\" não tem\n-- como ser expresso, e \"aniversário este mês\" também não.\n--\n-- ── as duas decisões ──────────────────────────────────────────────────────\n--\n-- 1. A CAMPANHA GUARDA UM PONTEIRO, NÃO UMA CÓPIA. \\`{\"segment_id\": \"...\"}\\` no\n-- \\`audience_query\\`. Editar o recorte muda para quem a campanha vai — que é\n-- a expectativa de quem acabou de editar o recorte. Quem quiser a foto\n-- congelada usa um segmento do tipo \\`list\\`, que é exatamente o que ele é.\n--\n-- 2. O CONJUNTO DE OPERADORES PASSA A SER O MESMO DO CRM, ponteiro ou não.\n-- Uma campanha que aponta direto (sem segmento) ganha \\`within_days\\`,\n-- \\`has_tag\\` e companhia pela mesma tabela de CASE. Duas linguagens de\n-- filtro no mesmo produto é como se chega a duas respostas diferentes para\n-- a mesma pergunta.\n--\n-- O QUE NÃO MUDA, E É O MAIS IMPORTANTE: o filtro de consentimento continua na\n-- saída. \\`marketing_has_consent(tenant, pessoa, purpose)\\` é a última cláusula,\n-- sempre — um público resolvido por segmento não atravessa o opt-out só porque\n-- veio do CRM. A \\`purpose\\` da campanha é o que dá sentido a ele, e é por isso\n-- que \"criar campanha com uma finalidade específica\" é uma funcionalidade e\n-- não um campo de texto: a finalidade DECIDE quem pode receber.\n--\n-- Sem dependência dura de plugin: se \\`plg_crm_segments\\` não existe neste app,\n-- um \\`segment_id\\` é recusado com mensagem clara em vez de estourar 42P01.\n\nSET check_function_bodies = false;\n\nCREATE OR REPLACE FUNCTION public.marketing_resolve_audience(p_campaign_id uuid)\nRETURNS TABLE(person_id uuid)\n LANGUAGE plpgsql STABLE SECURITY DEFINER\n SET search_path TO ''\nAS $_$\nDECLARE\n c public.plg_marketing_campaigns%ROWTYPE;\n v_source text;\n v_rules jsonb;\n v_where text := '';\n v_clause jsonb;\n v_col text;\n v_op text;\n v_kind char;\n v_seg_id uuid;\n v_seg record;\nBEGIN\n SELECT * INTO c FROM public.plg_marketing_campaigns WHERE id = p_campaign_id;\n IF c.id IS NULL THEN\n RAISE EXCEPTION 'marketing_resolve_audience: campaign % not found', p_campaign_id USING ERRCODE = 'P0002';\n END IF;\n\n -- ── o ponteiro ───────────────────────────────────────────────────────────\n IF c.audience_query ? 'segment_id' THEN\n IF to_regclass('public.plg_crm_segments') IS NULL THEN\n RAISE EXCEPTION 'marketing_resolve_audience: campanha aponta para um segmento, mas o CRM não está instalado neste app'\n USING ERRCODE = '42P01';\n END IF;\n BEGIN\n v_seg_id := (c.audience_query ->> 'segment_id')::uuid;\n EXCEPTION WHEN OTHERS THEN\n RAISE EXCEPTION 'marketing_resolve_audience: segment_id inválido' USING ERRCODE = '22023';\n END;\n\n -- Mesmo tenant, sempre. Um público que atravessasse inquilino seria a pior\n -- falha possível deste arquivo.\n SELECT s.source_view, s.rules, s.kind INTO v_seg\n FROM public.plg_crm_segments s\n WHERE s.id = v_seg_id AND s.tenant_id = c.tenant_id;\n IF NOT FOUND THEN\n RAISE EXCEPTION 'marketing_resolve_audience: segmento % não é deste tenant', v_seg_id USING ERRCODE = 'P0002';\n END IF;\n\n -- A lista escolhida a dedo É a resposta — e mesmo ela passa pelo consentimento.\n IF v_seg.kind = 'list' THEN\n RETURN QUERY\n SELECT m.person_id FROM public.plg_crm_segment_members m\n WHERE m.segment_id = v_seg_id AND m.tenant_id = c.tenant_id\n AND public.marketing_has_consent(c.tenant_id, m.person_id, c.purpose);\n RETURN;\n END IF;\n\n v_source := coalesce(v_seg.source_view, 'people');\n v_rules := coalesce(v_seg.rules -> 'where', '[]'::jsonb);\n ELSE\n v_source := coalesce(c.audience_query ->> 'source_view', 'people');\n v_rules := coalesce(c.audience_query -> 'where', '[]'::jsonb);\n END IF;\n\n IF v_source !~ '^[a-z_][a-z0-9_]*$' THEN\n RAISE EXCEPTION 'marketing_resolve_audience: % is not a bare relation name', v_source USING ERRCODE = '22023';\n END IF;\n SELECT cl.relkind INTO v_kind FROM pg_catalog.pg_class cl\n JOIN pg_catalog.pg_namespace n ON n.oid = cl.relnamespace\n WHERE n.nspname = 'public' AND cl.relname = v_source;\n IF v_kind IS NULL THEN\n RAISE EXCEPTION 'marketing_resolve_audience: public.% does not exist', v_source USING ERRCODE = '42P01';\n END IF;\n\n v_where := format('tenant_id = %L', c.tenant_id);\n\n -- Unidade da campanha estreita o público, quando a leitura tem a coluna.\n IF c.unit_id IS NOT NULL AND EXISTS (\n SELECT 1 FROM information_schema.columns\n WHERE table_schema = 'public' AND table_name = v_source AND column_name = 'unit_id'\n ) THEN\n v_where := v_where || format(' AND unit_id = %L', c.unit_id);\n END IF;\n\n -- ── o mesmo CASE do CRM, operador por operador ───────────────────────────\n FOR v_clause IN SELECT * FROM jsonb_array_elements(v_rules) LOOP\n v_col := v_clause ->> 'column';\n v_op := coalesce(v_clause ->> 'op', '=');\n\n IF NOT EXISTS (SELECT 1 FROM information_schema.columns\n WHERE table_schema = 'public' AND table_name = v_source AND column_name = v_col) THEN\n RAISE EXCEPTION 'marketing_resolve_audience: public.% has no column %', v_source, v_col USING ERRCODE = '42703';\n END IF;\n\n v_where := v_where || CASE\n WHEN v_op IN ('=', '<>', '>', '<', '>=', '<=') THEN\n format(' AND %I %s %L', v_col,\n CASE v_op WHEN '<>' THEN '<>' WHEN '>' THEN '>' WHEN '<' THEN '<'\n WHEN '>=' THEN '>=' WHEN '<=' THEN '<=' ELSE '=' END,\n v_clause ->> 'value')\n\n WHEN v_op = 'ilike' THEN\n format(' AND %I ILIKE %L', v_col, '%' || coalesce(v_clause ->> 'value', '') || '%')\n\n WHEN v_op IN ('in', 'not_in') THEN (\n SELECT format(' AND %I %s (%s)', v_col,\n CASE WHEN v_op = 'not_in' THEN 'NOT IN' ELSE 'IN' END,\n coalesce(string_agg(quote_literal(e), ','), 'NULL'))\n FROM jsonb_array_elements_text(coalesce(v_clause -> 'value', '[]'::jsonb)) AS e)\n\n WHEN v_op = 'is_null' THEN format(' AND %I IS NULL', v_col)\n WHEN v_op = 'not_null' THEN format(' AND %I IS NOT NULL', v_col)\n\n WHEN v_op = 'has_tag' THEN\n format(' AND %L = ANY(%I)', v_clause ->> 'value', v_col)\n\n WHEN v_op IN ('within_days', 'older_than_days') THEN (\n SELECT format(' AND %I %s now() - make_interval(days => %s)', v_col,\n CASE WHEN v_op = 'within_days' THEN '>=' ELSE '<' END,\n (coalesce(v_clause ->> 'value', '0'))::integer))\n\n WHEN v_op = 'birthday_within_days' THEN (\n SELECT format(\n ' AND %I IS NOT NULL AND ((EXTRACT(doy FROM %I::date)::int - EXTRACT(doy FROM now())::int + 366) %% 366) <= %s',\n v_col, v_col, (coalesce(v_clause ->> 'value', '0'))::integer))\n\n ELSE\n -- Operador desconhecido ALARGA o público se for ignorado — e um público\n -- alargado em silêncio é a mensagem indo para quem não devia.\n NULL\n END;\n\n IF v_where IS NULL THEN\n RAISE EXCEPTION 'marketing_resolve_audience: operador % não é reconhecido', v_op USING ERRCODE = '22023';\n END IF;\n END LOOP;\n\n -- O consentimento é a ÚLTIMA cláusula, e continua sendo, venha o público de\n -- onde vier.\n RETURN QUERY EXECUTE format(\n 'SELECT s.id FROM public.%I s WHERE %s AND public.marketing_has_consent(%L, s.id, %L)',\n v_source, v_where, c.tenant_id, c.purpose);\nEND $_$;\n\nCOMMENT ON FUNCTION public.marketing_resolve_audience(uuid) IS\n 'Quem a campanha alcança. Aponta para um segmento do CRM (segment_id) ou carrega a própria regra; mesmo conjunto de operadores do CRM; consentimento sempre na saída (004).';\n`\n\nexport const MIGRATION_005_A_ATRIBUICAO_DO_LEAD_ATRAVESSA_A_ORIGEM_ATE_O_CANAL = `-- ---------------------------------------------------------------------------\n-- 005_a_atribuicao_do_lead_atravessa_a_origem_ate_o_canal.sql — os três níveis\n-- de atribuição num lugar só, e o conserto de uma tela que contava zero.\n--\n-- ── por que este arquivo está no marketing e não no CRM ─────────────────\n--\n-- A view junta três tabelas de duas casas: \\`plg_crm_lead_sources\\` (CRM) com\n-- \\`plg_marketing_channels\\` e \\`plg_marketing_campaigns\\` (aqui). Na ordem da\n-- chain o CRM roda ANTES do marketing, então do lado de lá as tabelas deste\n-- plugin ainda não existem. Do lado de cá as do CRM já existem.\n--\n-- A regra que isso ensina: quem cria uma view que atravessa plugins é o ÚLTIMO\n-- dos seus dependentes. \\`crm/038\\` tentou o contrário e o \\`db-from-zero\\` pegou\n-- na primeira passada.\n--\n-- ── as três perguntas ───────────────────────────────────────────────────\n--\n-- CANAL (medium) COMO a gente se encontrou. \"Evento presencial\"\n-- ORIGEM (source) ONDE, especificamente. \"Salão Abrasel\"\n-- CAMPANHA QUAL esforço, com custo. \"ABRASEL 2026\"\n--\n-- Salesforce separa \\`LeadSource\\` de \\`Campaign\\`; HubSpot separa \"Original\n-- source\" do drill-down; Odoo e Mautic usam o trio UTM. Nenhum junta os três\n-- num campo só: \"quanto custou este lead\" só existe na campanha, e \"que tipo\n-- de esforço traz gente melhor\" só existe no canal.\n--\n-- ── o defeito que isto conserta ─────────────────────────────────────────\n--\n-- \\`v_marketing_attribution\\` lia \\`metadata.sourceId\\` e chamava aquilo de\n-- \\`channel_raw\\` — a ORIGEM ocupando o lugar do CANAL. Com isso a tela de\n-- Canais contava zero para todos, porque nenhum \\`channel_key\\` jamais bate com\n-- um uuid de origem. Esta view atravessa a origem até o canal, que é o salto\n-- que faltava. A antiga fica: outras telas dependem da forma dela.\n-- ---------------------------------------------------------------------------\n\nDROP VIEW IF EXISTS public.v_marketing_lead_attribution;\nCREATE VIEW public.v_marketing_lead_attribution\nWITH (security_invoker = true) AS\n SELECT p.id AS lead_id,\n p.tenant_id,\n p.created_at,\n s.id AS source_id,\n s.name AS source_name,\n -- O canal vem da ORIGEM; quando ela não declara, o lead não é\n -- atribuído a canal nenhum. Nulo é honesto: forçar 'direct' faria a\n -- tela afirmar uma procedência que ninguém mediu.\n s.channel_key,\n ch.label AS channel_label,\n ch.kind AS channel_kind,\n (p.metadata ->> 'campaignId') AS campaign_id,\n mc.name AS campaign_name,\n mc.spend AS campaign_spend\n FROM public.people p\n LEFT JOIN public.plg_crm_lead_sources s\n ON s.tenant_id = p.tenant_id\n AND s.id::text = (p.metadata ->> 'sourceId')\n LEFT JOIN public.plg_marketing_channels ch\n ON ch.tenant_id = p.tenant_id\n AND ch.channel_key = s.channel_key\n LEFT JOIN public.plg_marketing_campaigns mc\n ON mc.tenant_id = p.tenant_id\n AND mc.id::text = (p.metadata ->> 'campaignId')\n WHERE p.kind = 'lead'\n AND p.merged_into_id IS NULL\n AND p.tenant_id IN (SELECT public.user_tenant_ids());\n\nGRANT SELECT ON public.v_marketing_lead_attribution TO authenticated;\n\nCOMMENT ON VIEW public.v_marketing_lead_attribution IS\n 'Cada lead com seus três níveis: canal (COMO), origem (ONDE) e campanha (QUAL esforço, com custo). A origem resolve o canal — o lead não o carrega (marketing/005).';\n`\n\nexport const MIGRATION_006_THE_CAMPAIGN_ENGINE_IS_SERVER_ONLY = `-- 006_the_campaign_engine_is_server_only.sql\n--\n-- \\`marketing_campaign_run\\`, \\`marketing_resolve_audience\\` and\n-- \\`marketing_has_consent\\` are SECURITY DEFINER and look a campaign or a tenant\n-- up by id without asking who is calling. Granted to \\`authenticated\\`, any\n-- logged-in user of any tenant could fire another tenant's campaign or list\n-- its audience by guessing a uuid.\n--\n-- No screen, edge function or agent tool calls them: the only caller is\n-- \\`marketing_run_due\\` on the minute tick (via \\`event_runner_tick\\`, as postgres)\n-- and the functions themselves. So the fix is to take the door away, not to\n-- guard it. A future \"send now\" button gets a tenant-checked wrapper.\n--\n-- \\`REVOKE ... FROM PUBLIC\\` alone is not enough here: the pool's default\n-- privileges grant EXECUTE to \\`authenticated\\` on every new function in public.\n\nREVOKE ALL ON FUNCTION public.marketing_campaign_run(uuid, integer) FROM PUBLIC, anon, authenticated;\nGRANT EXECUTE ON FUNCTION public.marketing_campaign_run(uuid, integer) TO service_role;\n\nREVOKE ALL ON FUNCTION public.marketing_resolve_audience(uuid) FROM PUBLIC, anon, authenticated;\nGRANT EXECUTE ON FUNCTION public.marketing_resolve_audience(uuid) TO service_role;\n\nREVOKE ALL ON FUNCTION public.marketing_has_consent(uuid, uuid, text) FROM PUBLIC, anon, authenticated;\nGRANT EXECUTE ON FUNCTION public.marketing_has_consent(uuid, uuid, text) TO service_role;\n\nREVOKE ALL ON FUNCTION public.marketing_run_due(integer) FROM PUBLIC, anon, authenticated;\nGRANT EXECUTE ON FUNCTION public.marketing_run_due(integer) TO service_role;\n`\n\nexport const MIGRATIONS: Array<{ id: string; sql: string }> = [\n { id: \"000_baseline\", sql: MIGRATION_000_BASELINE },\n { id: \"001_the_landing_page_names_the_site\", sql: MIGRATION_001_THE_LANDING_PAGE_NAMES_THE_SITE },\n { id: \"003_a_porta_publica_e_a_pagina\", sql: MIGRATION_003_A_PORTA_PUBLICA_E_A_PAGINA },\n { id: \"004_a_campanha_aponta_para_um_recorte\", sql: MIGRATION_004_A_CAMPANHA_APONTA_PARA_UM_RECORTE },\n { id: \"005_a_atribuicao_do_lead_atravessa_a_origem_ate_o_canal\", sql: MIGRATION_005_A_ATRIBUICAO_DO_LEAD_ATRAVESSA_A_ORIGEM_ATE_O_CANAL },\n { id: \"006_the_campaign_engine_is_server_only\", sql: MIGRATION_006_THE_CAMPAIGN_ENGINE_IS_SERVER_ONLY },\n]\n","import type { ConnectorSetting } from '@fayz-ai/core'\n\n/**\n * What the connection needs to WORK — not what authorizes it.\n *\n * The site domain used to be a `ConnectorField`, asked for in the connect step\n * next to nothing else, which put a config question in the one place reserved\n * for \"do you authorize this\". Authorization is OAuth on RankLayer's own\n * screen; this is the Configurações tab, and until it is filled the connection\n * reads \"conectado, falta configurar\" rather than broken.\n */\nexport const RANKLAYER_SETTINGS: ConnectorSetting[] = [\n {\n key: 'siteDomain',\n label: 'Domínio do site',\n description: 'O site em que a RankLayer publica os artigos deste blog.',\n type: 'text',\n placeholder: 'exemplo.com.br',\n requiredToOperate: true,\n },\n]\n","import { createConnectionStore } from '@fayz-ai/core'\nimport type { ConnectionConfig, ConnectionStore, SyncRun } from '@fayz-ai/core'\nimport { RANKLAYER_SETTINGS } from '../settings'\nimport type { RankLayerIntegration, RankLayerSyncLogEntry } from '../types'\n\n// ---------------------------------------------------------------------------\n// RankLayer connector — control-plane client.\n//\n// Writes no SQL. The connection is a row of public.connections and the\n// publication history is public.sync_runs (packages/db 029), reached through\n// createConnectionStore — the two bespoke tables this file used to address were\n// the same shape under a private name (FAY-1376, migration 010).\n//\n// It holds NO credential: RankLayer authenticates against the Fayz platform\n// with a key the platform will issue (the ingress that would receive those\n// calls does not exist yet — FAY-1354). connections has no credential\n// column at all, so that is a property of the table rather than of this file.\n// ---------------------------------------------------------------------------\n\nexport const RANKLAYER_CONNECTOR_ID = 'ranklayer'\n\n/**\n * One site per tenant, so a single unnamed instance. Kept as a named constant\n * because the day RankLayer publishes to two sites for one tenant, that is a\n * second `instance_key` here and nothing else changes.\n */\nconst INSTANCE_KEY = ''\n\n/**\n * The connector's whole store, exported because the definition needs the same\n * one: `connectionStatus`, `connectionSettings` and this panel must all read\n * and write a single row, or the Configurações tab saves a domain the status\n * line never sees.\n */\nexport function ranklayerConnectionStore(): ConnectionStore {\n return createConnectionStore(RANKLAYER_CONNECTOR_ID, {\n settings: RANKLAYER_SETTINGS,\n instanceKey: INSTANCE_KEY,\n })\n}\n\nconst store = ranklayerConnectionStore\n\nexport function toIntegration(connection: ConnectionConfig): RankLayerIntegration {\n return {\n id: connection.id ?? '',\n siteDomain: (connection.settings?.siteDomain as string | undefined) || undefined,\n active: connection.active,\n lastSyncAt: connection.lastSyncAt ?? undefined,\n }\n}\n\n/**\n * A run, as the panel reads it. The bespoke log had ONE `message` column for\n * both a failure reason and a success note; 029 kept only the failure half and\n * this had to recompose it out of `stats`. 031 gave the generic table its own\n * `message`, so the recomposition is now a fallback for pools behind on\n * migrations, not the mechanism.\n */\nexport function toLogEntry(run: SyncRun): RankLayerSyncLogEntry {\n return {\n id: run.id ?? '',\n createdAt: run.startedAt ?? '',\n status: run.status === 'success' ? 'success' : 'error',\n message: run.error ?? run.message ?? undefined,\n fetched: run.fetched ?? 0,\n written: run.written ?? 0,\n }\n}\n\nexport function createRankLayerProvider() {\n return {\n async getIntegration(): Promise<RankLayerIntegration | null> {\n try {\n const connection = await store().get()\n return connection ? toIntegration(connection) : null\n } catch {\n // No client / no active tenant — the settings tab renders before either\n // is guaranteed, and \"not connected\" is the honest answer.\n return null\n }\n },\n\n async saveIntegration(values: { siteDomain?: string }): Promise<RankLayerIntegration> {\n const saved = await store().save({\n settings: { siteDomain: values.siteDomain ?? null },\n active: true,\n })\n return toIntegration(saved)\n },\n\n /**\n * Soft, where the old table hard-deleted the row. The publication history\n * survives a disconnect now — it is attributed to the connection, and a\n * tenant that reconnects next week should still see what was published.\n */\n async disconnect(): Promise<void> {\n await store().disconnect()\n },\n\n async getSyncLog(): Promise<RankLayerSyncLogEntry[]> {\n try {\n const runs = await store().listRuns({ limit: 20 })\n return runs.map(toLogEntry)\n } catch {\n return []\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).\n//\n// A PUSH connector: RankLayer runs its own server and writes posts in through\n// blog_upsert_external_post. So it ships no edge function, asks the tenant for\n// no secret, and has nothing to \"test\" from this side. What it declares instead\n// is what it wants to hear back — see ./RANKLAYER.md for the partner-facing\n// contract.\n//\n// It is on the OAUTH STANDARD, the same one Bling, Melhor Envio and Google\n// Calendar are on: the tenant links their RankLayer account on RankLayer's own\n// screen, the platform holds the token, and nothing in this file ever sees a\n// credential. The half that is not written yet is RankLayer's, and every piece\n// of it is marked `TODO(ranklayer)` below — they are the steps to take against\n// the latest @fayz-ai/plugin-marketing + @fayz-ai/plugin-blog, in order.\nimport React, { useEffect, useState } from 'react'\nimport { History, CheckCircle2, AlertCircle } from 'lucide-react'\nimport {\n connectionSettings,\n connectionStatus,\n settingsStatus,\n type ConnectorDefinition,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport {\n createRankLayerProvider,\n ranklayerConnectionStore,\n toIntegration,\n RANKLAYER_CONNECTOR_ID,\n} from './data/supabase'\nimport { RANKLAYER_SETTINGS } from './settings'\nimport type { RankLayerIntegration, RankLayerSyncLogEntry } from './types'\n\nconst provider = createRankLayerProvider()\n\n// One instance for the definition — `connectionSettings` and `connectionStatus`\n// read and write the same row the panel does.\nconst store = ranklayerConnectionStore()\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) {\n // The store resolves the connection itself — the panel no longer\n // carries a row id around to name the history it wants.\n const rows = await provider.getSyncLog()\n if (!cancelled) setLog(rows)\n }\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 // Nothing until the connection is live. `active` and not merely \"a row\n // exists\": disconnect is soft now, so a revoked connection still has one.\n if (!loaded || !integration?.active) return null\n\n return (\n <div className=\"space-y-4 border-t pt-4\">\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 de publicações</h4>\n </div>\n\n {log.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">\n Nenhuma publicação recebida até agora. Quem envia é a RankLayer\n {integration.siteDomain ? ` (site ${integration.siteDomain})` : ''}: a cada envio, uma linha\n aparece aqui com a data e quantos artigos foram gravados.\n </p>\n ) : (\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\" title={r.message}>\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 )}\n\n <p className=\"text-[11px] text-muted-foreground\">\n A chave que a RankLayer usa para publicar aqui é emitida na plataforma Fayz e não fica\n guardada neste aplicativo.\n </p>\n </div>\n )\n}\n\n// Inlined as a data URI so the mark can never fail to load from an app's domain.\nconst RANKLAYER_MARK = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48cmVjdCB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHJ4PSI3IiBmaWxsPSIjMUYyNDMxIi8+PHBvbHlnb24gcG9pbnRzPSIxNiw1LjYgMjYuNCwxMS42IDE2LDE3LjYgNS42LDExLjYiIGZpbGw9IiNGRkZGRkYiIHN0cm9rZT0iI0ZGRkZGRiIgc3Ryb2tlLXdpZHRoPSIxLjI1IiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PGcgb3BhY2l0eT0iMC41NSI+PHBvbHlnb24gcG9pbnRzPSI1LjYsMTYuNCAxNiwyMi40IDI2LjQsMTYuNCAyNi40LDE4LjIgMTYsMjQuMiA1LjYsMTguMiIgZmlsbD0iI0ZGRkZGRiIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjEuMjUiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L2c+PGcgb3BhY2l0eT0iMC4yOCI+PHBvbHlnb24gcG9pbnRzPSI1LjYsMjEuMiAxNiwyNy4yIDI2LjQsMjEuMiAyNi40LDIzIDE2LDI5IDUuNiwyMyIgZmlsbD0iI0ZGRkZGRiIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjEuMjUiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L2c+PC9zdmc+'\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 logoUrl: RANKLAYER_MARK,\n // OAuth, not a pasted key: what the tenant is doing is linking their RankLayer\n // account, and a key typed into this app would be a second copy of a secret\n // the platform already holds — the exact shape migration 009 deleted.\n authKind: 'oauth',\n // The catalogue files RankLayer under \"Analytics & Marketing\"\n // (docs/site/data/integrations.json).\n category: 'analytics',\n // Inbound because RankLayer reaches us: it writes the articles in. The edit\n // that goes back is delivered by the Fayz ingress, not by this app.\n direction: 'inbound',\n docsUrl: 'https://ranklayer.app',\n // The write is grounded: RankLayer's server calls `blog_upsert_external_post`\n // (plugin-blog migrations §external), which INSERTs/UPDATEs plg_blog_posts and\n // refuses a credential not scoped to exactly one tenant.\n //\n // The read is grounded only as far as the managed automation below — sending\n // an edit back means reading the article. That push is declared and its\n // anti-loop guard exists (./outbound.ts `shouldPushToRankLayer`), but nothing\n // calls it: the ingress that would is the same one that does not exist. Kept\n // rather than dropped because the automation IS declared, and a permission\n // list that contradicts the automation next to it is the defect this whole\n // declaration exists to prevent.\n permissions: [\n {\n kind: 'data',\n resource: 'blog_post',\n actions: ['read', 'write'],\n reason:\n 'Publicar aqui os artigos que a RankLayer escreve, e ler os artigos daqui para mandar de volta as edições que você fizer.',\n },\n {\n kind: 'event',\n resource: 'blog.post.*',\n actions: ['listen'],\n reason: 'Saber quando um artigo é criado, editado, publicado ou apagado aqui.',\n },\n ],\n /**\n * No form. The connect step authorizes and nothing else; the site domain is\n * configuration and lives on the Configurações tab (./settings.ts).\n *\n * TODO(ranklayer): the consent screen only opens once the platform has a\n * `ranklayer` OAuth provider registered — client id/secret and the authorize\n * and token URLs, plus our redirect URI allow-listed on RankLayer's side. Until\n * then Conectar answers `config_missing` and the tenant is told, in as many\n * words, that this is not something they can fix. Nothing in this repository\n * changes when it lands.\n */\n startOAuth: fayzConnectorOAuth(RANKLAYER_CONNECTOR_ID),\n settings: RANKLAYER_SETTINGS,\n subscribesTo: ['blog.post.*'],\n managedAutomations: [\n { eventKey: 'blog.post.updated', label: 'Enviar para a RankLayer as edições feitas no artigo aqui' },\n ],\n // Read from the row the list already batched — one request for N connectors.\n ...connectionStatus(\n RANKLAYER_CONNECTOR_ID,\n (connection) => {\n const found = connection ? toIntegration(connection) : null\n return {\n connected: !!found?.active,\n detail: found?.siteDomain,\n plane: 'sync',\n // \"Conectado, falta configurar\" while the domain is empty — which is\n // true, and is the difference between not ready and broken.\n ...settingsStatus(RANKLAYER_SETTINGS, connection),\n }\n },\n { store: () => store },\n ),\n ...connectionSettings(store),\n /**\n * Called with no values: the credential is not ours to see, and the platform's\n * redirect route does not write this pool's `connections` (FAY-1388) — the\n * app writes its own row, or the tenant authorizes, comes back, and reads \"not\n * connected\" forever. Bling shipped with the other belief and looped.\n */\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => provider.disconnect(),\n ExtraPanel: RankLayerExtraPanel,\n}\n\n// ---------------------------------------------------------------------------\n// TODO(ranklayer) — the partner's half, in order, against the latest\n// @fayz-ai/plugin-marketing + @fayz-ai/plugin-blog. Everything below is written\n// on RankLayer's server; none of it is a change in this repository.\n//\n// 1. OAuth app. Register the Fayz redirect URI, hand over client id/secret and\n// the authorize/token URLs so the platform can register the `ranklayer`\n// provider. Scope: publish and read this tenant's blog articles.\n// → until this exists, `startOAuth` above fails with `config_missing`.\n//\n// 2. Inbound writes. Call `blog_upsert_external_post` with the platform\n// credential, always stamping `source: 'ranklayer'` and a stable\n// `external_ref` — the idempotency key within (tenant, source). Re-sending\n// the same `external_ref` must update, never duplicate. See RANKLAYER.md §1.\n//\n// 3. Outbound endpoint. One endpoint accepting the four `blog.post.*` facts,\n// idempotent on the event id, tolerating out-of-order delivery. Ignore any\n// payload whose `source` is 'ranklayer' — it is your own article coming home,\n// and acting on it is the loop `shouldPushToRankLayer` exists to break.\n// → the Fayz ingress that dispatches `subscribesTo` does not exist yet, so\n// nothing reaches this endpoint today. The declaration is what will be read\n// the day it does.\n//\n// 4. Publication history. Each accepted push writes a sync_runs row through\n// the platform so the Integrações panel stops saying \"nenhuma publicação\n// recebida\" — the panel already reads it (RankLayerExtraPanel above).\n// ---------------------------------------------------------------------------\n","export const en: Record<string, string> = {\n \"marketing.composer.kind\": \"Campaign type\",\n \"marketing.composer.kindSpend\": \"Ad spend\",\n \"marketing.composer.kindOutbound\": \"Outbound\",\n \"marketing.composer.kindSpendHint\": \"Records what was spent on a channel. Sends nothing — it is what makes cost per acquisition exist.\",\n \"marketing.composer.kindOutboundHint\": \"Sends a message to a segment of people. Runs on its own and respects each recipient's opt-in.\",\n \"marketing.composer.audience\": \"Who it reaches\",\n \"marketing.composer.audiencePlaceholder\": \"Pick a segment\",\n \"marketing.composer.noSegments\": \"No active segment. Create one in Settings → CRM → Segments and it shows up here.\",\n \"marketing.composer.purpose\": \"Purpose\",\n \"marketing.composer.template\": \"Message template\",\n \"marketing.composer.templateHint\": \"The template key in Communication. It defines the text that goes out.\",\n \"marketing.purpose.promotion\": \"Promotion\",\n \"marketing.purpose.newsletter\": \"Newsletter\",\n \"marketing.purpose.survey\": \"Survey\",\n \"marketing.purpose.transactional\": \"Notice about something they already have\",\n \"marketing.purpose.promotion.hint\": \"Only reaches people who opted in to promotions.\",\n \"marketing.purpose.newsletter.hint\": \"Only reaches people who opted in to the newsletter.\",\n \"marketing.purpose.survey.hint\": \"Only reaches people who opted in to surveys.\",\n \"marketing.purpose.transactional.hint\": \"Reaches everyone: talking about something they bought is not marketing. Still respects the channel block.\",\n \"marketing.nav.blogCategories\": \"Categories\",\n \"marketing.nav.segments\": \"Segments\",\n \"marketing.nav.messageTemplates\": \"Message Templates\",\n \"marketing.nav.sendHistory\": \"Send History\",\n \"marketing.nav.quickTriggers\": \"Quick Triggers\",\n \"marketing.nav.brand\": \"Brand\",\n \"marketing.nav.authorizedImages\": \"Authorized Images\",\n \"marketing.nav.overview\": \"Overview\",\n \"marketing.nav.channels\": \"Channels\",\n \"marketing.nav.campaigns\": \"Campaigns\",\n \"marketing.nav.funnel\": \"Funnel\",\n \"marketing.nav.landingPages\": \"Landing pages\",\n \"marketing.nav.content\": \"Content\",\n \"marketing.nav.blog\": \"Blog\",\n \"marketing.cadences.title\": \"Cadences\",\n \"marketing.cadences.subtitle\": \"The sequence: what goes out on day 0, day 2 and day 5 — and what takes somebody out of it\",\n \"marketing.cadences.missingTitle\": \"Cadences are not mounted in this app\",\n \"marketing.cadences.missingHint\": \"The screen comes from the Automations plugin. Install it and pass `cadenceSurface` to the Marketing plugin to plan the sequence here.\",\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.leads': 'Leads',\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 'marketing.col.route': 'Route',\n 'marketing.col.leadTag': 'Tag',\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.aiHint': 'Describe the campaign and I set it up.',\n 'marketing.campaigns.newByHand': 'Create by hand',\n 'marketing.campaigns.newByHandHint': 'Fill in channel, budget and period.',\n 'marketing.campaigns.askPlaceholder': 'Describe the campaign…',\n 'marketing.campaigns.askPersona': 'Campaign planner',\n 'marketing.campaigns.askPitch': 'Tell me the campaign you want to run.',\n 'marketing.campaigns.askDescription': 'Goal, channel, how much you mean to spend and for how long — tell me what you have and I fill the rest sensibly against your history. You confirm before it is created.',\n 'marketing.campaigns.askSuggestion.0': 'Instagram campaign for the month, $800',\n 'marketing.campaigns.askSuggestion.1': 'Win back clients who have not returned in 90 days',\n 'marketing.campaigns.askSuggestion.2': 'Weekend promo on Google',\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.new': 'New page',\n 'marketing.landing.edit': 'Edit page',\n 'marketing.landing.delete': 'Delete page',\n 'marketing.landing.save': 'Save',\n 'marketing.landing.empty': 'No pages yet.',\n 'marketing.landing.site': 'Site',\n 'marketing.landing.sitePlaceholder': 'Pick a site',\n 'marketing.landing.name': 'Name',\n 'marketing.landing.namePlaceholder': 'Hair consult LP',\n 'marketing.landing.route': 'Route',\n 'marketing.landing.create': 'Create page',\n 'marketing.landing.status': 'Does this page exist on the site yet?',\n 'marketing.landing.statusLive': 'Already live',\n 'marketing.landing.statusPlanned': 'Not yet',\n 'marketing.landing.prompt': 'Page prompt',\n 'marketing.landing.promptPlaceholder': 'Describe the page: offer, audience, sections, call to action…',\n 'marketing.landing.buildWithFayz': 'Build page with Fayz',\n 'marketing.landing.leadTag': 'Lead tags',\n 'marketing.landing.leadTagPlaceholder': 'new tag…',\n 'marketing.landing.leadTagHint': 'Leads from this page enter the CRM with these tags.',\n 'marketing.landing.visitsPending': 'Visits come from the platform hosting the site; that source is not connected yet.',\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 \"marketing.brand.title\": \"Brand\",\n \"marketing.brand.subtitle\": \"What the assistant reads before writing anything for this business.\",\n \"marketing.brand.identity\": \"Identity\",\n \"marketing.brand.name\": \"Brand name\",\n \"marketing.brand.tagline\": \"Tagline\",\n \"marketing.brand.mission\": \"Positioning\",\n \"marketing.brand.voice\": \"How the brand speaks\",\n \"marketing.brand.voiceHint\": \"This rides along with every question asked of the assistant while marketing is open.\",\n \"marketing.brand.tone\": \"Tone of voice\",\n \"marketing.brand.tonePlaceholder\": \"Direct and warm. Talks like a person, not a brochure.\",\n \"marketing.brand.keywords\": \"Words the house uses\",\n \"marketing.brand.ctas\": \"Standard calls to action\",\n \"marketing.brand.ctasPlaceholder\": \"Book your slot, Message us on WhatsApp\",\n \"marketing.brand.hashtags\": \"Hashtags\",\n \"marketing.brand.avoid\": \"What the brand does not say\",\n \"marketing.brand.avoidHint\": \"The one field whose absence is invisible: nobody proofreads a piece looking for the word the house asked not to use.\",\n \"marketing.brand.avoidWords\": \"Words to avoid\",\n \"marketing.brand.avoidPlaceholder\": \"cheap, unmissable, flash sale\",\n \"marketing.brand.agentOn\": \"The assistant is receiving these standards and will follow them when writing.\",\n \"marketing.brand.agentOff\": \"Nothing filled in yet — the assistant writes with no brand guidance.\",\n \"marketing.brand.agentSummary\": \"The house brand kit: tone of voice, keywords, standard CTAs and the forbidden words.\",\n \"marketing.brand.saved\": \"Brand saved.\",\n \"marketing.brand.saveFailed\": \"Could not save the brand.\",\n \"marketing.landing.formTitle\": \"The page's form\",\n \"marketing.landing.formHint\": \"The page is the content; this is the door's rule — what it asks for and where it leads.\",\n \"marketing.landing.destination\": \"Where it leads\",\n \"marketing.landing.dest.lead\": \"Captures a contact\",\n \"marketing.landing.dest.booking\": \"Books a slot\",\n \"marketing.landing.dest.reservation\": \"Books a table\",\n \"marketing.landing.required\": \"What the house requires\",\n \"marketing.landing.requiredHint\": \"Every extra required field costs conversion. Ask for the minimum you need to reply.\",\n \"marketing.landing.field.name\": \"Name\",\n \"marketing.landing.field.phone\": \"Phone\",\n \"marketing.landing.field.email\": \"Email\",\n \"marketing.landing.field.document\": \"Tax ID\",\n \"marketing.landing.field.notes\": \"Note\",\n \"marketing.landing.minAdvance\": \"Minimum notice (hours)\",\n \"marketing.landing.minAdvanceHint\": \"Stops someone booking for ten minutes from now.\",\n \"marketing.landing.maxAdvance\": \"Furthest ahead (days)\",\n \"marketing.landing.maxAdvanceHint\": \"Stops someone booking for next year.\",\n \"marketing.landing.publicKey\": \"Public key: {{key}} — it never changes once created, because a customer may have saved it.\",\n}\n","export const ptBR: Record<string, string> = {\n \"marketing.composer.kind\": \"Tipo de campanha\",\n \"marketing.composer.kindSpend\": \"Investimento\",\n \"marketing.composer.kindOutbound\": \"Disparo\",\n \"marketing.composer.kindSpendHint\": \"Registra quanto foi gasto num canal. Não envia nada — é o que faz o custo por aquisição existir.\",\n \"marketing.composer.kindOutboundHint\": \"Manda uma mensagem para um recorte de gente. Roda sozinha e respeita o opt-in de quem for receber.\",\n \"marketing.composer.audience\": \"Para quem\",\n \"marketing.composer.audiencePlaceholder\": \"Escolha um segmento\",\n \"marketing.composer.noSegments\": \"Nenhum segmento ativo. Crie um em Configurações → CRM → Segmentos e ele aparece aqui.\",\n \"marketing.composer.purpose\": \"Finalidade\",\n \"marketing.composer.template\": \"Modelo de mensagem\",\n \"marketing.composer.templateHint\": \"A chave do modelo em Comunicação. É ele que define o texto que sai.\",\n \"marketing.purpose.promotion\": \"Promoção\",\n \"marketing.purpose.newsletter\": \"Novidades\",\n \"marketing.purpose.survey\": \"Pesquisa\",\n \"marketing.purpose.transactional\": \"Aviso sobre algo que a pessoa já tem\",\n \"marketing.purpose.promotion.hint\": \"Só alcança quem aceitou receber promoção.\",\n \"marketing.purpose.newsletter.hint\": \"Só alcança quem aceitou receber novidades.\",\n \"marketing.purpose.survey.hint\": \"Só alcança quem aceitou responder pesquisas.\",\n \"marketing.purpose.transactional.hint\": \"Alcança todo mundo: falar de algo que a pessoa já comprou não é marketing. Ainda respeita o bloqueio do canal.\",\n \"marketing.nav.blogCategories\": \"Categorias\",\n \"marketing.nav.segments\": \"Segmentos\",\n \"marketing.nav.messageTemplates\": \"Modelos de Mensagem\",\n \"marketing.nav.sendHistory\": \"Histórico de Envios\",\n \"marketing.nav.quickTriggers\": \"Gatilhos Rápidos\",\n \"marketing.nav.brand\": \"Marca\",\n \"marketing.nav.authorizedImages\": \"Imagens Autorizadas\",\n \"marketing.nav.overview\": \"Visão geral\",\n \"marketing.nav.channels\": \"Canais\",\n \"marketing.nav.campaigns\": \"Campanhas\",\n \"marketing.nav.funnel\": \"Funil\",\n \"marketing.nav.landingPages\": \"Páginas de captura\",\n \"marketing.nav.content\": \"Conteúdo\",\n \"marketing.nav.blog\": \"Blog\",\n \"marketing.cadences.title\": \"Cadências\",\n \"marketing.cadences.subtitle\": \"A régua: o que sai no dia 0, no dia 2 e no dia 5 — e o que faz alguém sair dela\",\n \"marketing.cadences.missingTitle\": \"Cadências não estão montadas neste app\",\n \"marketing.cadences.missingHint\": \"A tela vem do plugin de Automações. Instale-o e passe `cadenceSurface` ao plugin de Marketing para planejar a régua por aqui.\",\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.leads': 'Leads',\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 'marketing.col.route': 'Rota',\n 'marketing.col.leadTag': 'Tag',\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.aiHint': 'Descreva a campanha e eu monto.',\n 'marketing.campaigns.newByHand': 'Criar manualmente',\n 'marketing.campaigns.newByHandHint': 'Preencher canal, orçamento e período.',\n 'marketing.campaigns.askPlaceholder': 'Descreva a campanha…',\n 'marketing.campaigns.askPersona': 'Planejador de campanhas',\n 'marketing.campaigns.askPitch': 'Diga a campanha que você quer rodar.',\n 'marketing.campaigns.askDescription': 'Objetivo, canal, quanto pretende gastar e por quanto tempo — diga o que tiver e eu completo o resto com o que faz sentido para o seu histórico. Você confirma antes de criar.',\n 'marketing.campaigns.askSuggestion.0': 'Campanha de Instagram para o mês, R$ 800',\n 'marketing.campaigns.askSuggestion.1': 'Reativar clientes que não voltam há 90 dias',\n 'marketing.campaigns.askSuggestion.2': 'Promoção de fim de semana no Google',\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.new': 'Nova página',\n 'marketing.landing.edit': 'Editar página',\n 'marketing.landing.delete': 'Excluir página',\n 'marketing.landing.save': 'Salvar',\n 'marketing.landing.empty': 'Nenhuma página cadastrada ainda.',\n 'marketing.landing.site': 'Site',\n 'marketing.landing.sitePlaceholder': 'Selecione o site',\n 'marketing.landing.name': 'Nome',\n 'marketing.landing.namePlaceholder': 'LP Capilar',\n 'marketing.landing.route': 'Rota',\n 'marketing.landing.create': 'Criar página',\n 'marketing.landing.status': 'Esta página já existe no site?',\n 'marketing.landing.statusLive': 'Já existe',\n 'marketing.landing.statusPlanned': 'Ainda não existe',\n 'marketing.landing.prompt': 'Prompt da página',\n 'marketing.landing.promptPlaceholder': 'Descreva a página: oferta, público, seções, chamada para ação…',\n 'marketing.landing.buildWithFayz': 'Criar página com Fayz',\n 'marketing.landing.leadTag': 'Tags dos leads',\n 'marketing.landing.leadTagPlaceholder': 'nova tag…',\n 'marketing.landing.leadTagHint': 'Os leads desta página entram no CRM com estas tags.',\n 'marketing.landing.visitsPending': 'As visitas vêm da plataforma que hospeda o site; essa origem ainda não está conectada.',\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 \"marketing.brand.title\": \"Marca\",\n \"marketing.brand.subtitle\": \"O que o assistente lê antes de escrever qualquer texto para esta casa.\",\n \"marketing.brand.identity\": \"Identidade\",\n \"marketing.brand.name\": \"Nome da marca\",\n \"marketing.brand.tagline\": \"Assinatura\",\n \"marketing.brand.mission\": \"Posicionamento\",\n \"marketing.brand.voice\": \"Como a marca fala\",\n \"marketing.brand.voiceHint\": \"Isto acompanha toda pergunta feita ao assistente enquanto o marketing está aberto.\",\n \"marketing.brand.tone\": \"Tom de voz\",\n \"marketing.brand.tonePlaceholder\": \"Direto e caloroso. Fala como gente, não como folheto.\",\n \"marketing.brand.keywords\": \"Palavras que a casa usa\",\n \"marketing.brand.ctas\": \"Chamadas padrão\",\n \"marketing.brand.ctasPlaceholder\": \"Agende seu horário, Fale no WhatsApp\",\n \"marketing.brand.hashtags\": \"Hashtags\",\n \"marketing.brand.avoid\": \"O que a marca não diz\",\n \"marketing.brand.avoidHint\": \"É o único campo cujo esquecimento é invisível: ninguém revisa uma peça procurando a palavra que a casa pediu para não usar.\",\n \"marketing.brand.avoidWords\": \"Palavras a evitar\",\n \"marketing.brand.avoidPlaceholder\": \"barato, imperdível, promoção relâmpago\",\n \"marketing.brand.agentOn\": \"O assistente está recebendo estes padrões e vai segui-los ao escrever.\",\n \"marketing.brand.agentOff\": \"Nada preenchido ainda — o assistente escreve sem orientação de marca.\",\n \"marketing.brand.agentSummary\": \"O kit de marca da casa: tom de voz, palavras-chave, chamadas padrão e as palavras proibidas.\",\n \"marketing.brand.saved\": \"Marca salva.\",\n \"marketing.brand.saveFailed\": \"Não foi possível salvar a marca.\",\n \"marketing.landing.formTitle\": \"O formulário da página\",\n \"marketing.landing.formHint\": \"A página é o conteúdo; isto é a regra da porta — o que ela pede e para onde leva.\",\n \"marketing.landing.destination\": \"Para onde leva\",\n \"marketing.landing.dest.lead\": \"Captura contato\",\n \"marketing.landing.dest.booking\": \"Marca horário\",\n \"marketing.landing.dest.reservation\": \"Marca mesa\",\n \"marketing.landing.required\": \"O que a casa exige\",\n \"marketing.landing.requiredHint\": \"Cada campo exigido a mais derruba conversão. Peça o mínimo para conseguir responder.\",\n \"marketing.landing.field.name\": \"Nome\",\n \"marketing.landing.field.phone\": \"Telefone\",\n \"marketing.landing.field.email\": \"E-mail\",\n \"marketing.landing.field.document\": \"CPF\",\n \"marketing.landing.field.notes\": \"Observação\",\n \"marketing.landing.minAdvance\": \"Antecedência mínima (horas)\",\n \"marketing.landing.minAdvanceHint\": \"Impede marcar para daqui a dez minutos.\",\n \"marketing.landing.maxAdvance\": \"Prazo máximo (dias)\",\n \"marketing.landing.maxAdvanceHint\": \"Impede marcar para o ano que vem.\",\n \"marketing.landing.publicKey\": \"Chave pública: {{key}} — não muda depois de criada, porque o cliente pode tê-la salvo.\",\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/admin'\nimport { MarketingPage } from './views/MarketingPage'\nimport { SettingsView } from './views/SettingsView'\nimport { buildMarketingRegistries } from './data/registries'\nimport { buildMarketingOnboarding } from './lib/onboarding'\nimport { buildBlogPostEntity } from './data/blogEntities'\nimport { createMarketingDashboardWidgets } from './views/dashboardWidgets'\nimport {\n MarketingContextProvider,\n type ResolvedMarketingConfig,\n type MarketingLabels,\n} from './context'\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 { MIGRATIONS } from './migrations'\nimport { ranklayerConnectorDef } from './integrations/ranklayer/connectorDef'\nimport { DEFAULT_CURRENCY, type MarketingCurrency } from './lib/format'\nimport { MARKETING_PRESETS, type MarketingDomain, type MarketingDomainModules } from './lib/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 /** Where the module's sub-nav lives. MarketingPage already reads it. */\n moduleNav?: 'rail' | 'tabs' | 'sidebar'\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 visits (mounted later). */\n sitesBridge?: SitesPerformanceBridge\n /** Where the lead-tag catalog is read from for the landing-page form.\n * Defaults to plugin-crm's plg_crm_tags (slug/name). */\n leadTags?: { table?: string; valueField?: string; labelField?: string }\n /**\n * A tela de cadências, injetada — `CadenceFlowsSurface` do\n * @fayz-ai/plugin-automations.\n *\n * DI e não import: o motor da cadência mora naquele plugin (tabelas,\n * `automations_flows_run_due` no tick do minuto), e o Marketing só decide que\n * é AQUI que ela se planeja. Sem isto, `modules.cadences` não desenha item\n * nenhum — um menu apontando para uma tela que o app não montou é pior que a\n * ausência dele.\n */\n cadenceSurface?: React.ComponentType\n}\n\nconst DEFAULT_LABELS: MarketingLabels = {\n pageTitle: 'Marketing',\n pageSubtitle: 'Acquisition & conversion performance',\n}\n\n/** Lido fora de componente (features do gate de permissão, montadas antes de\n * existir árvore React). Dentro da página quem nomeia é o i18n. */\nconst FEATURE_FALLBACK = {\n landingPages: 'Landing pages', content: 'Content', blog: 'Blog', cadences: 'Cadences',\n} as const\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 moduleNav: options?.moduleNav,\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 leadTags: options?.leadTags,\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, cadenceSurface: options?.cadenceSurface }))\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 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 defaultAgentRole: 'growth',\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 ?? FEATURE_FALLBACK.landingPages, group: 'Engage' }] : []),\n ...(config.modules.cadences && options?.cadenceSurface ? [{ id: 'marketing.cadences', label: config.labels.cadences ?? FEATURE_FALLBACK.cadences, group: 'Engage' }] : []),\n ...(config.modules.contentPlanner ? [{ id: 'marketing.content', label: config.labels.content ?? FEATURE_FALLBACK.content, group: 'Engage' }] : []),\n ...(config.modules.blog ? [{ id: 'marketing.blog', label: config.labels.blog ?? FEATURE_FALLBACK.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 // O post do blog é a única entidade daqui que o agente pode ESCREVER: é\n // um rascunho de texto, o formulário é o mesmo que a pessoa usaria, e a\n // permissão de create continua sendo cobrada pelas primitivas. Campanha e\n // post de conteúdo seguem só-leitura — campanha tem RPC própria e o\n // planner escreve por outro caminho.\n ...(config.modules.blog ? [{\n key: 'marketing:blogPosts',\n writable: true,\n entity: buildBlogPostEntity(),\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 // One baseline per unit since #338 — read from the generated barrel\n // rather than listed here, so regenerating the SQL never needs a\n // manifest edit to match.\n migrations: MIGRATIONS.map((entry) => ({\n id: `marketing-${entry.id}`,\n version: '1.0.0',\n sql: entry.sql,\n description:\n 'The whole schema this plugin provisions, as one file: every table, view, function, policy and grant, plus the reference rows it seeds. Replaced the per-change chain in the 1.0.0 squash (#338); the files it collapsed are kept, unapplied, in src/migrations.archive/.',\n })),\n // RankLayer SEO connector — renders in the Integrações settings tab. A push\n // connector: RankLayer writes posts in and subscribes to blog.post.* to hear\n // the edits back. See src/integrations/ranklayer/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: 'Qual canal converte melhor?' }, { label: 'Qual meu custo por aquisição?' }],\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: 'Crie uma campanha no Instagram para este mês' }],\n permission: { feature: 'marketing', action: 'create' as const },\n },\n ],\n registries: marketingRegistries,\n onboarding: { program: buildMarketingOnboarding() },\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 // Google Meu Negócio sits on the same shelf as RankLayer above: being\n // found locally, not being measured.\n integrations: ['google-my-business'],\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 './lib/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"]}
1
+ {"version":3,"sources":["../src/data/tables.ts","../src/data/registries.ts","../src/lib/onboarding.ts","../src/views/dashboardWidgets.tsx","../src/lib/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/integrations/ranklayer/settings.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":["counter","normalizeRoute","data","error","acc","plan","post","getClient","getSupabaseClientOptional","requireTenantId","getActiveTenantId","provider","createStore","store","useEffect","jsxs","jsx","React"],"mappings":"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","file":"index.js","sourcesContent":["// 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 landingPages: 'plg_marketing_landing_pages',\n} as const\n\n/** The tenant's sites are its fayz projects (@fayz-ai/db 020) — the same rows\n * Settings → Sites manages. Marketing only READS them: a landing page points\n * at one and adds a route. */\nexport const SITES_TABLE = 'published_sites'\n\n/** Where the lead-tag catalog lives. Marketing only READS it (to offer the\n * tags in the landing-page form); plugin-crm owns the table. Overridable via\n * the plugin's `leadTags` option for apps that keep tags somewhere else. */\nexport const LEAD_TAGS_SOURCE = {\n table: 'plg_crm_tags',\n valueField: 'slug',\n labelField: 'name',\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 landingPages: 'v_marketing_landing_pages',\n leadTagEvents: 'v_marketing_lead_tag_events',\n} as const\n","import type { PluginRegistryDef, EntityDef } from '@fayz-ai/core'\nimport type { AcquisitionChannel } from '../types'\nimport { T } from './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). Sites are\n * NOT here on purpose: they are the tenant's fayz projects, managed by the\n * shell in Settings → Sites, and marketing only points a page at one. */\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 { countByTenant, type OnboardingProgramDef } from '@fayz-ai/core'\nimport { T } from '../data/tables'\n\n/**\n * Implantação do marketing — dois cadastros e a conta que fecha.\n *\n * Ordem 90, DEPOIS do CRM (80), e a razão é a métrica: neste plugin a conversão\n * do funil é lida da venda — negócio ganho, pedido, agendamento, conforme o\n * domínio. Sem funil com etapa de ganho do lado do CRM, cada painel daqui\n * mostra zero e a pessoa conclui que a ferramenta não funciona, quando o que\n * falta é o outro lado da conta.\n *\n * O programa é curto porque o módulo é curto de verdade: canais e campanhas são\n * dois cadastros. O que ele NÃO consegue fazer sozinho é o terceiro passo —\n * fechar o circuito da origem, que depende de um hábito do atendimento e mora\n * no CRM. Ele está aqui mesmo assim, dito com todas as letras, porque é onde a\n * atribuição morre e o passo que ninguém dá é o que ninguém escreveu.\n */\nexport function buildMarketingOnboarding(): OnboardingProgramDef {\n return {\n id: 'marketing',\n title: 'De onde vem o movimento',\n order: 90,\n role: 'growth',\n instructions: `Você está implantando o marketing. O risco aqui não é a pessoa não achar a tela — é ela olhar um painel de zeros e achar que a ferramenta está quebrada.\n\n- Diga logo de cara de onde vêm os números: a conversão deste módulo é a VENDA (negócio ganho, pedido, agendamento — depende do ramo), lida do outro módulo. Painel zerado quase sempre quer dizer que ninguém está preenchendo origem, e não que o marketing não funcionou.\n- Comece pelos CANAIS. A lista já vem com os do ramo: o trabalho é desativar o que a casa não usa e acrescentar o que ela usa de verdade. Lista curta é lista preenchida.\n- Só depois CAMPANHA, e só se ela investe em alguma. Quem não anuncia não precisa de campanha para ver de onde vem gente — os canais já respondem isso.\n- O último passo não é uma tela e não é seu: sem origem preenchida no lead, nada aqui tem o que somar. Diga isso explicitamente e ofereça combinar com quem atende.`,\n steps: [\n {\n key: 'channels',\n title: 'Marque por onde as pessoas chegam',\n description: 'Anúncio, busca, indicação, boca a boca — a lista que responde onde investir.',\n icon: 'Radio',\n route: '/marketing/channels',\n priority: 'high',\n requiresRoute: true,\n agentHint:\n 'A lista já vem com os canais do ramo. Conduza como PODA: mostre o que existe, pergunte o que não é o caso e acrescente o que a casa usa de verdade.',\n howTo:\n 'Marketing › Canais. Já vêm os canais típicos do seu ramo — desative o que a casa não usa e acrescente os seus. Se você investe em algum, preencha o gasto do mês: é o que transforma \"veio bastante gente do Instagram\" em \"cada cliente do Instagram custou tanto\".',\n celebrate: 'Dá para saber por onde chega gente 📡',\n script: [\n { kind: 'goto', route: '/marketing/channels' },\n {\n kind: 'ask',\n text: 'Estamos nos Canais, que já vêm preenchidos pelo ramo. Mostre a lista, pergunte quais não são o caso desta casa e quais faltam, e ajuste com a pessoa.',\n },\n ],\n check: async () => (await countByTenant(T.channels)) > 0,\n },\n {\n key: 'campaign',\n title: 'Registre a primeira campanha',\n description: 'Só se você investe em alguma — quem não anuncia não precisa deste passo.',\n icon: 'Megaphone',\n route: '/marketing/campaigns',\n requiresRoute: true,\n agentHint:\n 'Pergunte ANTES se a casa investe em anúncio. Se não investe, diga que este passo não é para ela e siga — uma campanha inventada para fechar a checklist polui o painel para sempre.',\n howTo:\n 'Marketing › Campanhas › Nova campanha. Amarre a campanha ao canal onde ela roda e ao período em que rodou. O resultado que aparece aqui não é clique: é venda fechada que veio daquele canal, com o valor junto.',\n celebrate: 'Campanha registrada 📣',\n check: async () => (await countByTenant(T.campaigns)) > 0,\n },\n {\n key: 'attribution',\n title: 'Combine que todo lead sai com origem',\n description: 'É aqui que a atribuição morre. O campo já existe; o hábito é o que falta.',\n icon: 'Compass',\n // Aponta para o CRM de propósito: o passo é deste programa porque é\n // este painel que fica zerado sem ele, e a tela é de lá porque é lá\n // que o campo mora. Um passo honesto sobre onde a coisa falha vale\n // mais que um passo dentro do próprio módulo.\n route: '/sales/leads/new',\n agentHint:\n 'Não é passo de tela. Mostre onde o campo de origem está no formulário do lead, diga em uma linha o que se perde sem ele — todo painel deste módulo — e ofereça criar uma tarefa para combinar isso com a equipe.',\n howTo:\n 'A origem é preenchida no cadastro do lead, não aqui. Sem ela, os painéis de Canais e Campanhas somam zero: não existe outro jeito de o sistema saber que aquele cliente veio do anúncio. Combine com quem atende que nenhum lead sai sem origem — é uma pergunta a mais no atendimento e é a única coisa que faz o resto valer.',\n celebrate: 'Agora dá para saber o que valeu a pena 🧭',\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 '../context'\nimport type { MarketingDataProvider } from '../data/types'\nimport type { MarketingUIState } from '../store'\nimport { formatCurrency, formatNumber, formatPercent, formatCompact } from '../lib/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 /**\n * Cadências: a régua de relacionamento — dia 0 mensagem, dia 2 ligação, dia 5\n * mensagem, e o que faz alguém SAIR da régua.\n *\n * A tela é do plugin-automations (o motor roda no banco, num tick de minuto);\n * o Marketing só a hospeda, porque é aqui que se decide como a casa fala com\n * quem ainda não comprou. Sem `cadenceSurface` injetado, o item não aparece —\n * um menu que abre uma tela vazia é pior que a ausência dele.\n */\n cadences: 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, cadences: true, broadcasts: false, journeys: false },\n}\n\nconst BEAUTY: MarketingDomainPreset = {\n conversion: {\n id: 'booking',\n label: 'Booking',\n labelPlural: 'Bookings',\n valueLabel: 'Booking revenue',\n source: 'agenda',\n avgValue: 85,\n },\n channels: [\n { id: 'instagram', label: 'Instagram', icon: 'Instagram', kind: 'social' },\n { id: 'google', label: 'Google', icon: 'Globe', kind: 'organic' },\n { id: 'referral', label: 'Referral', icon: 'Users', kind: 'referral' },\n { id: 'whatsapp', label: 'WhatsApp', icon: 'MessageCircle', kind: 'social' },\n { id: 'walkin', label: 'Walk-in', icon: 'DoorOpen', kind: 'direct' },\n ],\n modules: { channels: true, campaigns: true, funnel: true, landingPages: false, contentPlanner: true, blog: false, cadences: true, 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, cadences: true, 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, SaveLandingPageInput } from './types'\nimport type {\n AcquisitionChannel,\n AcquisitionChannelKind,\n Campaign,\n ChannelPerformance,\n ConversionModel,\n DateRangeKey,\n FunnelStage,\n LandingPage,\n LandingPagePerf,\n MarketingOverview,\n MarketingQuery,\n MarketingSite,\n} from '../types'\nimport { CAMPAIGN_NAME_SEEDS, type MarketingDomain } from '../lib/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 kind: 'ad_spend' as const,\n purpose: 'promotion' as const,\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\nconst MOCK_SITE: MarketingSite = {\n id: 'site-1',\n name: 'Site principal',\n url: 'https://exemplo.com.br',\n appId: 'app-demo',\n}\n\nconst MOCK_LEAD_TAGS = [\n { slug: 'lp-consulta', name: 'LP Consulta' },\n { slug: 'lp-promo', name: 'LP Promo' },\n]\n\ninterface MockLandingPage extends LandingPage {\n /** 30d baseline; scaled per range at read time. */\n visits: number\n conversions: number\n}\n\nfunction seedLandingPages(): MockLandingPage[] {\n return [\n // Duas portas com destinos DIFERENTES, porque é o que a tela precisa\n // provar: a de agendamento mostra a janela de antecedência, a de contato\n // não — oferecer \"mínimo 2h\" num formulário de contato prometeria uma regra\n // sem sobre o que valer.\n { id: 'lp-1', siteId: MOCK_SITE.id, name: 'Consulta gratuita', route: '/consulta', leadTags: ['lp-consulta'], status: 'live', isActive: true,\n captureKey: 'Kx7mQp2rTn9vBw4sYd6h', captureDestination: 'booking', captureRequiredFields: ['name', 'phone'],\n minAdvanceHours: 2, maxAdvanceDays: 60, visits: 3820, conversions: 474 },\n { id: 'lp-2', siteId: MOCK_SITE.id, name: 'Promo da estação', route: '/promo', leadTags: ['lp-promo'], status: 'live', isActive: true,\n captureKey: 'Lp3nRt8wZc5vMq1xJh7k', captureDestination: 'lead', captureRequiredFields: ['name', 'email'],\n visits: 1560, conversions: 126 },\n ]\n}\n\nfunction normalizeRoute(route: string): string {\n const trimmed = route.trim().replace(/\\/+$/, '')\n if (!trimmed || trimmed === '/') return '/'\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`\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 kind: input.kind ?? existing.kind, purpose: input.purpose ?? existing.purpose,\n segmentId: input.segmentId, templateKey: input.templateKey,\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 kind: input.kind ?? 'ad_spend',\n purpose: input.purpose ?? 'promotion',\n segmentId: input.segmentId,\n templateKey: input.templateKey,\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 // Sem cluster não há recorte para apontar: a tela cai no público por regra\n // própria em vez de mostrar um seletor vazio.\n async listAudienceSegments() { return [] },\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 {\n ...p,\n siteName: MOCK_SITE.name,\n siteUrl: MOCK_SITE.url,\n appId: MOCK_SITE.appId,\n editorUrl: MOCK_SITE.editorUrl,\n url: `${MOCK_SITE.url}${p.route}`,\n visits,\n conversions,\n cvr: visits > 0 ? (conversions / visits) * 100 : null,\n }\n })\n },\n\n async saveLandingPage(input: SaveLandingPageInput): Promise<LandingPage> {\n const route = normalizeRoute(input.route)\n const existing = input.id ? landing.find((p) => p.id === input.id) : undefined\n if (existing) {\n Object.assign(existing, {\n siteId: input.siteId, name: input.name, route,\n leadTags: input.leadTags ?? existing.leadTags,\n status: input.status ?? existing.status,\n prompt: input.prompt,\n isActive: input.isActive ?? existing.isActive,\n captureDestination: input.captureDestination ?? existing.captureDestination,\n captureRequiredFields: input.captureRequiredFields ?? existing.captureRequiredFields,\n minAdvanceHours: input.captureDestination === 'lead' ? undefined : (input.minAdvanceHours ?? existing.minAdvanceHours) ?? undefined,\n maxAdvanceDays: input.captureDestination === 'lead' ? undefined : (input.maxAdvanceDays ?? existing.maxAdvanceDays) ?? undefined,\n })\n return existing\n }\n const created: MockLandingPage = {\n id: `lp-${++counter}`,\n siteId: input.siteId,\n name: input.name,\n route,\n leadTags: input.leadTags ?? [],\n status: input.status ?? 'live',\n prompt: input.prompt,\n isActive: input.isActive ?? true,\n captureKey: `mock-${Math.abs(input.name.length * 7919).toString(36)}`,\n captureDestination: input.captureDestination ?? 'lead',\n captureRequiredFields: input.captureRequiredFields ?? [],\n minAdvanceHours: input.captureDestination === 'lead' ? undefined : (input.minAdvanceHours ?? undefined),\n maxAdvanceDays: input.captureDestination === 'lead' ? undefined : (input.maxAdvanceDays ?? undefined),\n visits: 0,\n conversions: 0,\n }\n landing.push(created)\n return created\n },\n\n async deleteLandingPage(id: string): Promise<void> {\n const idx = landing.findIndex((p) => p.id === id)\n if (idx >= 0) landing.splice(idx, 1)\n },\n\n async listSites(): Promise<MarketingSite[]> {\n return [MOCK_SITE]\n },\n\n async listLeadTags(): Promise<Array<{ slug: string; name: string }>> {\n return MOCK_LEAD_TAGS\n },\n }\n}\n","import { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport type {\n AttributionBridge,\n AudienceSegment,\n MarketingDataProvider,\n SaveCampaignInput,\n SaveLandingPageInput,\n SitesPerformanceBridge,\n} from './types'\nimport type {\n AcquisitionChannel,\n Campaign,\n ChannelPerformance,\n ConversionModel,\n DateRangeKey,\n FunnelStage,\n LandingPage,\n LandingPagePerf,\n MarketingOverview,\n MarketingQuery,\n MarketingSite,\n} from '../types'\nimport { LEAD_TAGS_SOURCE, SITES_TABLE, 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 /** Where the lead-tag catalog is read from (defaults to plugin-crm's). */\n leadTags?: { table?: string; valueField?: string; labelField?: string }\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\n/** Fallback editor link when the project row has no explicit editor_url —\n * same convention the shell's \"Seu site\" widget uses. */\nconst FAYZ_EDITOR_BASE = 'https://fayz.ai/editor'\n\n/** '/lp-capilar' ← 'lp-capilar' | 'lp-capilar/' | '' */\nfunction normalizeRoute(route: string): string {\n const trimmed = route.trim().replace(/\\/+$/, '')\n if (!trimmed || trimmed === '/') return '/'\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`\n}\n\n/** The site's URL is whatever the fayz project recorded (may be missing while\n * the deploy has no public URL yet) — then the page shows just its route. */\nfunction pageUrl(siteUrl: string | null | undefined, route: string): string {\n const path = normalizeRoute(route)\n if (!siteUrl) return path\n const base = siteUrl.trim().replace(/\\/+$/, '')\n const withScheme = /^https?:\\/\\//.test(base) ? base : `https://${base}`\n return `${withScheme}${path === '/' ? '' : path}`\n}\n\nfunction landingPageFromRow(row: Record<string, any>): LandingPage {\n return {\n id: row.id,\n siteId: row.site_id,\n name: row.name,\n route: row.route,\n leadTags: row.lead_tags ?? [],\n status: row.status === 'planned' ? 'planned' : 'live',\n prompt: row.prompt ?? undefined,\n isActive: row.is_active !== false,\n captureKey: row.capture_key ?? undefined,\n captureDestination: (row.capture_destination ?? 'lead') as LandingPage['captureDestination'],\n captureRequiredFields: (row.capture_required_fields ?? []) as LandingPage['captureRequiredFields'],\n minAdvanceHours: row.min_advance_hours ?? undefined,\n maxAdvanceDays: row.max_advance_days ?? undefined,\n }\n}\n\ninterface LandingPageRow {\n id: string\n site_id: string\n name: string\n route: string\n lead_tags: string[] | null\n status: string\n prompt: string | null\n is_active: boolean\n site_name: string\n site_url: string | null\n app_id: string | null\n provider_site_id: string | null\n editor_url: string | null\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 const leadTagsSource = { ...LEAD_TAGS_SOURCE, ...options.leadTags }\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 fetchLandingPages(tenantId: string): Promise<LandingPageRow[]> {\n return memo(`lp:${tenantId}`, async () => {\n const { data, error } = await getClient()\n .from(V.landingPages)\n .select('id, site_id, name, route, lead_tags, status, prompt, is_active, site_name, site_url, app_id, provider_site_id, editor_url')\n .eq('tenant_id', tenantId)\n .order('name')\n // A pool that hasn't run migration 008 has no view — that must cost the\n // page its rows, not take the whole Marketing surface down with it.\n if (error) return []\n return (data ?? []) as LandingPageRow[]\n })\n }\n\n /** Leads carrying each page's tags within the window — the CRM cross. Keyed\n * by tag → lead ids so a page with several tags counts each lead once. */\n function fetchLeadsByTag(\n tenantId: string,\n tags: string[],\n since: Date,\n ): Promise<Map<string, Set<string>>> {\n const key = `lptags:${tenantId}:${since.getTime()}:${tags.join(',')}`\n return memo(key, async () => {\n const { data, error } = await getClient()\n .from(V.leadTagEvents)\n .select('tag, person_id')\n .eq('tenant_id', tenantId)\n .in('tag', tags)\n .gte('occurred_at', since.toISOString())\n if (error) return new Map<string, Set<string>>()\n const byTag = new Map<string, Set<string>>()\n for (const row of data ?? []) {\n const set = byTag.get(row.tag) ?? new Set<string>()\n set.add(row.person_id)\n byTag.set(row.tag, set)\n }\n return byTag\n })\n }\n\n /** Visits come from wherever the site is deployed. No bridge ⇒ unknown, and\n * the surface says so instead of showing zeros. */\n async function fetchVisits(\n range: DateRangeKey,\n rows: LandingPageRow[],\n ): Promise<Map<string, number>> {\n if (!sitesBridge) return new Map()\n const result = await sitesBridge.visitsByRoute({\n range,\n pages: rows.map((r) => ({\n id: r.id,\n appId: r.app_id ?? undefined,\n fayzProjectId: r.provider_site_id ?? undefined,\n siteUrl: r.site_url ?? undefined,\n route: r.route,\n })),\n })\n return new Map(result.map((r) => [r.id, r.visits]))\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 kind: row.kind ?? 'ad_spend',\n purpose: row.purpose ?? 'promotion',\n segmentId: (row.audience_query ?? {}).segment_id ?? undefined,\n templateKey: row.template_key ?? undefined,\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 kind = input.kind ?? 'ad_spend'\n const payload: Record<string, unknown> = {\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 kind,\n purpose: input.purpose ?? 'promotion',\n }\n if (kind === 'outbound') {\n // O público vai como PONTEIRO para o recorte, não como cópia da regra:\n // editar o segmento muda para quem a campanha vai, que é o que quem\n // acabou de editá-lo espera. A resolução (e o consentimento) é do\n // `marketing_resolve_audience` (004).\n payload.audience_query = input.segmentId ? { segment_id: input.segmentId } : {}\n payload.template_key = input.templateKey ?? null\n // `key` é exigido pelo CHECK de forma do outbound e é o identificador\n // estável por onde a fila deduplica.\n payload.key = input.id\n ? undefined\n : `camp-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`\n if (payload.key === undefined) delete payload.key\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 /**\n * Os recortes do CRM. Leitura direta de `plg_crm_segments` — a mesma\n * licença que este plugin já usa para o catálogo de tags: quem é DONO da\n * tabela é o CRM, o Marketing só lê. Sem o CRM montado a tabela não\n * existe, e a resposta é uma lista vazia em vez de um erro na tela.\n */\n async listAudienceSegments(): Promise<AudienceSegment[]> {\n const tenantId = requireTenantId()\n const { data, error } = await getClient()\n .from('plg_crm_segments')\n .select('id, name, description')\n .eq('tenant_id', tenantId)\n .eq('is_active', true)\n .order('sort_order')\n if (error) return []\n return (data ?? []).map((r: any) => ({ id: r.id, name: r.name, description: r.description ?? undefined }))\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 const tenantId = requireTenantId()\n const { since } = windowFor(query.range)\n const rows = await fetchLandingPages(tenantId)\n if (!rows.length) return []\n\n const tags = [...new Set(rows.flatMap((r) => r.lead_tags ?? []))]\n const [leadsByTag, visitsById] = await Promise.all([\n tags.length ? fetchLeadsByTag(tenantId, tags, since) : Promise.resolve(new Map<string, Set<string>>()),\n fetchVisits(query.range, rows),\n ])\n\n return rows.map((r) => {\n const visits = visitsById.get(r.id) ?? null\n const leads = new Set<string>()\n for (const tag of r.lead_tags ?? []) {\n for (const personId of leadsByTag.get(tag) ?? []) leads.add(personId)\n }\n const conversions = leads.size\n return {\n ...landingPageFromRow(r),\n siteName: r.site_name,\n siteUrl: r.site_url ?? undefined,\n appId: r.app_id ?? undefined,\n editorUrl: r.editor_url ?? (r.provider_site_id ? `${FAYZ_EDITOR_BASE}/${r.provider_site_id}` : undefined),\n url: pageUrl(r.site_url, r.route),\n visits,\n conversions,\n cvr: visits && visits > 0 ? (conversions / visits) * 100 : null,\n }\n })\n },\n\n async saveLandingPage(input: SaveLandingPageInput): Promise<LandingPage> {\n const tenantId = requireTenantId()\n const payload = {\n tenant_id: tenantId,\n site_id: input.siteId,\n name: input.name,\n route: normalizeRoute(input.route),\n lead_tags: input.leadTags ?? [],\n status: input.status ?? 'live',\n prompt: input.prompt?.trim() || null,\n is_active: input.isActive ?? true,\n capture_destination: input.captureDestination ?? 'lead',\n capture_required_fields: input.captureRequiredFields ?? [],\n // A janela só faz sentido onde há horário para marcar. Num destino\n // 'lead' ela é nula de propósito: exigir \"no mínimo 2h de antecedência\"\n // de um formulário de contato não quer dizer nada.\n min_advance_hours: input.captureDestination === 'lead' ? null : (input.minAdvanceHours ?? null),\n max_advance_days: input.captureDestination === 'lead' ? null : (input.maxAdvanceDays ?? null),\n updated_at: new Date().toISOString(),\n }\n const query = input.id\n ? getClient().from(T.landingPages).update(payload).eq('id', input.id)\n : getClient().from(T.landingPages).insert(payload)\n const { data, error } = await query.select('*').single()\n if (error) throw error\n cache.clear()\n return landingPageFromRow(data)\n },\n\n async deleteLandingPage(id: string): Promise<void> {\n const { error } = await getClient().from(T.landingPages).delete().eq('id', id)\n if (error) throw error\n cache.clear()\n },\n\n async listSites(): Promise<MarketingSite[]> {\n const tenantId = requireTenantId()\n return memo(`sites:${tenantId}`, async () => {\n // Owned by the shell (Settings → Sites); marketing just picks one.\n const { data, error } = await getClient()\n .from(SITES_TABLE)\n .select('id, name, preview_url, app_id, provider_site_id, editor_url')\n .eq('tenant_id', tenantId)\n .order('is_default', { ascending: false })\n .order('name')\n if (error) return []\n return (data ?? []).map((r: any) => ({\n id: r.id,\n name: r.name,\n url: r.preview_url ?? undefined,\n appId: r.app_id ?? undefined,\n fayzProjectId: r.provider_site_id ?? undefined,\n editorUrl: r.editor_url ?? (r.provider_site_id ? `${FAYZ_EDITOR_BASE}/${r.provider_site_id}` : undefined),\n }))\n })\n },\n\n async listLeadTags(): Promise<Array<{ slug: string; name: string }>> {\n const tenantId = requireTenantId()\n const { table, valueField, labelField } = leadTagsSource\n return memo(`leadtags:${tenantId}`, async () => {\n // The catalog belongs to another plugin — an app without it (or with a\n // different tag store) must not break the landing-page form.\n const { data, error } = await getClient()\n .from(table)\n .select(`${valueField}, ${labelField}`)\n .eq('tenant_id', tenantId)\n .order(labelField)\n if (error) return []\n return (data ?? [])\n .map((r: any) => ({ slug: r[valueField] as string, name: (r[labelField] as string) ?? r[valueField] }))\n .filter((tag: { slug: string }) => Boolean(tag.slug))\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","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, SaveLandingPageInput } from './data/types'\nimport type {\n Campaign,\n ChannelPerformance,\n DateRangeKey,\n FunnelStage,\n LandingPage,\n LandingPagePerf,\n MarketingOverview,\n MarketingSite,\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 sites: MarketingSite[]\n leadTags: Array<{ slug: string; name: string }>\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 saveLandingPage(input: SaveLandingPageInput): Promise<LandingPage>\n deleteLandingPage(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 sites: [],\n leadTags: [],\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, sites, leadTags] = await Promise.all([\n provider.overview({ range }),\n provider.channelPerformance({ range }),\n provider.listCampaigns({ range }),\n provider.funnel({ range }),\n provider.landingPages({ range }),\n provider.listSites(),\n provider.listLeadTags(),\n ])\n set({ overview, channels, campaigns, funnel, landingPages, sites, leadTags, 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 async saveLandingPage(input) {\n const saved = await provider.saveLandingPage(input)\n provider.invalidateCache?.()\n await get().load()\n return saved\n },\n\n async deleteLandingPage(id) {\n await provider.deleteLandingPage(id)\n provider.invalidateCache?.()\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","import type { ConnectorSetting } from '@fayz-ai/core'\n\n/**\n * What the connection needs to WORK — not what authorizes it.\n *\n * The site domain used to be a `ConnectorField`, asked for in the connect step\n * next to nothing else, which put a config question in the one place reserved\n * for \"do you authorize this\". Authorization is OAuth on RankLayer's own\n * screen; this is the Configurações tab, and until it is filled the connection\n * reads \"conectado, falta configurar\" rather than broken.\n */\nexport const RANKLAYER_SETTINGS: ConnectorSetting[] = [\n {\n key: 'siteDomain',\n label: 'Domínio do site',\n description: 'O site em que a RankLayer publica os artigos deste blog.',\n type: 'text',\n placeholder: 'exemplo.com.br',\n requiredToOperate: true,\n },\n]\n","import { createConnectionStore } from '@fayz-ai/core'\nimport type { ConnectionConfig, ConnectionStore, SyncRun } from '@fayz-ai/core'\nimport { RANKLAYER_SETTINGS } from '../settings'\nimport type { RankLayerIntegration, RankLayerSyncLogEntry } from '../types'\n\n// ---------------------------------------------------------------------------\n// RankLayer connector — control-plane client.\n//\n// Writes no SQL. The connection is a row of public.connections and the\n// publication history is public.sync_runs (packages/db 029), reached through\n// createConnectionStore — the two bespoke tables this file used to address were\n// the same shape under a private name (FAY-1376, migration 010).\n//\n// It holds NO credential: RankLayer authenticates against the Fayz platform\n// with a key the platform will issue (the ingress that would receive those\n// calls does not exist yet — FAY-1354). connections has no credential\n// column at all, so that is a property of the table rather than of this file.\n// ---------------------------------------------------------------------------\n\nexport const RANKLAYER_CONNECTOR_ID = 'ranklayer'\n\n/**\n * One site per tenant, so a single unnamed instance. Kept as a named constant\n * because the day RankLayer publishes to two sites for one tenant, that is a\n * second `instance_key` here and nothing else changes.\n */\nconst INSTANCE_KEY = ''\n\n/**\n * The connector's whole store, exported because the definition needs the same\n * one: `connectionStatus`, `connectionSettings` and this panel must all read\n * and write a single row, or the Configurações tab saves a domain the status\n * line never sees.\n */\nexport function ranklayerConnectionStore(): ConnectionStore {\n return createConnectionStore(RANKLAYER_CONNECTOR_ID, {\n settings: RANKLAYER_SETTINGS,\n instanceKey: INSTANCE_KEY,\n })\n}\n\nconst store = ranklayerConnectionStore\n\nexport function toIntegration(connection: ConnectionConfig): RankLayerIntegration {\n return {\n id: connection.id ?? '',\n siteDomain: (connection.settings?.siteDomain as string | undefined) || undefined,\n active: connection.active,\n lastSyncAt: connection.lastSyncAt ?? undefined,\n }\n}\n\n/**\n * A run, as the panel reads it. The bespoke log had ONE `message` column for\n * both a failure reason and a success note; 029 kept only the failure half and\n * this had to recompose it out of `stats`. 031 gave the generic table its own\n * `message`, so the recomposition is now a fallback for pools behind on\n * migrations, not the mechanism.\n */\nexport function toLogEntry(run: SyncRun): RankLayerSyncLogEntry {\n return {\n id: run.id ?? '',\n createdAt: run.startedAt ?? '',\n status: run.status === 'success' ? 'success' : 'error',\n message: run.error ?? run.message ?? undefined,\n fetched: run.fetched ?? 0,\n written: run.written ?? 0,\n }\n}\n\nexport function createRankLayerProvider() {\n return {\n async getIntegration(): Promise<RankLayerIntegration | null> {\n try {\n const connection = await store().get()\n return connection ? toIntegration(connection) : null\n } catch {\n // No client / no active tenant — the settings tab renders before either\n // is guaranteed, and \"not connected\" is the honest answer.\n return null\n }\n },\n\n async saveIntegration(values: { siteDomain?: string }): Promise<RankLayerIntegration> {\n const saved = await store().save({\n settings: { siteDomain: values.siteDomain ?? null },\n active: true,\n })\n return toIntegration(saved)\n },\n\n /**\n * Soft, where the old table hard-deleted the row. The publication history\n * survives a disconnect now — it is attributed to the connection, and a\n * tenant that reconnects next week should still see what was published.\n */\n async disconnect(): Promise<void> {\n await store().disconnect()\n },\n\n async getSyncLog(): Promise<RankLayerSyncLogEntry[]> {\n try {\n const runs = await store().listRuns({ limit: 20 })\n return runs.map(toLogEntry)\n } catch {\n return []\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).\n//\n// A PUSH connector: RankLayer runs its own server and writes posts in through\n// blog_upsert_external_post. So it ships no edge function, asks the tenant for\n// no secret, and has nothing to \"test\" from this side. What it declares instead\n// is what it wants to hear back — see ./RANKLAYER.md for the partner-facing\n// contract.\n//\n// It is on the OAUTH STANDARD, the same one Bling, Melhor Envio and Google\n// Calendar are on: the tenant links their RankLayer account on RankLayer's own\n// screen, the platform holds the token, and nothing in this file ever sees a\n// credential. The half that is not written yet is RankLayer's, and every piece\n// of it is marked `TODO(ranklayer)` below — they are the steps to take against\n// the latest @fayz-ai/plugin-marketing + @fayz-ai/plugin-blog, in order.\nimport React, { useEffect, useState } from 'react'\nimport { History, CheckCircle2, AlertCircle } from 'lucide-react'\nimport {\n connectionSettings,\n connectionStatus,\n settingsStatus,\n type ConnectorDefinition,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport {\n createRankLayerProvider,\n ranklayerConnectionStore,\n toIntegration,\n RANKLAYER_CONNECTOR_ID,\n} from './data/supabase'\nimport { RANKLAYER_SETTINGS } from './settings'\nimport type { RankLayerIntegration, RankLayerSyncLogEntry } from './types'\n\nconst provider = createRankLayerProvider()\n\n// One instance for the definition — `connectionSettings` and `connectionStatus`\n// read and write the same row the panel does.\nconst store = ranklayerConnectionStore()\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) {\n // The store resolves the connection itself — the panel no longer\n // carries a row id around to name the history it wants.\n const rows = await provider.getSyncLog()\n if (!cancelled) setLog(rows)\n }\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 // Nothing until the connection is live. `active` and not merely \"a row\n // exists\": disconnect is soft now, so a revoked connection still has one.\n if (!loaded || !integration?.active) return null\n\n return (\n <div className=\"space-y-4 border-t pt-4\">\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 de publicações</h4>\n </div>\n\n {log.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">\n Nenhuma publicação recebida até agora. Quem envia é a RankLayer\n {integration.siteDomain ? ` (site ${integration.siteDomain})` : ''}: a cada envio, uma linha\n aparece aqui com a data e quantos artigos foram gravados.\n </p>\n ) : (\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\" title={r.message}>\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 )}\n\n <p className=\"text-[11px] text-muted-foreground\">\n A chave que a RankLayer usa para publicar aqui é emitida na plataforma Fayz e não fica\n guardada neste aplicativo.\n </p>\n </div>\n )\n}\n\n// Inlined as a data URI so the mark can never fail to load from an app's domain.\nconst RANKLAYER_MARK = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48cmVjdCB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHJ4PSI3IiBmaWxsPSIjMUYyNDMxIi8+PHBvbHlnb24gcG9pbnRzPSIxNiw1LjYgMjYuNCwxMS42IDE2LDE3LjYgNS42LDExLjYiIGZpbGw9IiNGRkZGRkYiIHN0cm9rZT0iI0ZGRkZGRiIgc3Ryb2tlLXdpZHRoPSIxLjI1IiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PGcgb3BhY2l0eT0iMC41NSI+PHBvbHlnb24gcG9pbnRzPSI1LjYsMTYuNCAxNiwyMi40IDI2LjQsMTYuNCAyNi40LDE4LjIgMTYsMjQuMiA1LjYsMTguMiIgZmlsbD0iI0ZGRkZGRiIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjEuMjUiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L2c+PGcgb3BhY2l0eT0iMC4yOCI+PHBvbHlnb24gcG9pbnRzPSI1LjYsMjEuMiAxNiwyNy4yIDI2LjQsMjEuMiAyNi40LDIzIDE2LDI5IDUuNiwyMyIgZmlsbD0iI0ZGRkZGRiIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjEuMjUiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L2c+PC9zdmc+'\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 logoUrl: RANKLAYER_MARK,\n // OAuth, not a pasted key: what the tenant is doing is linking their RankLayer\n // account, and a key typed into this app would be a second copy of a secret\n // the platform already holds — the exact shape migration 009 deleted.\n authKind: 'oauth',\n // The catalogue files RankLayer under \"Analytics & Marketing\"\n // (docs/site/data/integrations.json).\n category: 'analytics',\n // Inbound because RankLayer reaches us: it writes the articles in. The edit\n // that goes back is delivered by the Fayz ingress, not by this app.\n direction: 'inbound',\n docsUrl: 'https://ranklayer.app',\n // The write is grounded: RankLayer's server calls `blog_upsert_external_post`\n // (plugin-blog migrations §external), which INSERTs/UPDATEs plg_blog_posts and\n // refuses a credential not scoped to exactly one tenant.\n //\n // The read is grounded only as far as the managed automation below — sending\n // an edit back means reading the article. That push is declared and its\n // anti-loop guard exists (./outbound.ts `shouldPushToRankLayer`), but nothing\n // calls it: the ingress that would is the same one that does not exist. Kept\n // rather than dropped because the automation IS declared, and a permission\n // list that contradicts the automation next to it is the defect this whole\n // declaration exists to prevent.\n permissions: [\n {\n kind: 'data',\n resource: 'blog_post',\n actions: ['read', 'write'],\n reason:\n 'Publicar aqui os artigos que a RankLayer escreve, e ler os artigos daqui para mandar de volta as edições que você fizer.',\n },\n {\n kind: 'event',\n resource: 'blog.post.*',\n actions: ['listen'],\n reason: 'Saber quando um artigo é criado, editado, publicado ou apagado aqui.',\n },\n ],\n /**\n * No form. The connect step authorizes and nothing else; the site domain is\n * configuration and lives on the Configurações tab (./settings.ts).\n *\n * TODO(ranklayer): the consent screen only opens once the platform has a\n * `ranklayer` OAuth provider registered — client id/secret and the authorize\n * and token URLs, plus our redirect URI allow-listed on RankLayer's side. Until\n * then Conectar answers `config_missing` and the tenant is told, in as many\n * words, that this is not something they can fix. Nothing in this repository\n * changes when it lands.\n */\n startOAuth: fayzConnectorOAuth(RANKLAYER_CONNECTOR_ID),\n settings: RANKLAYER_SETTINGS,\n subscribesTo: ['blog.post.*'],\n managedAutomations: [\n { eventKey: 'blog.post.updated', label: 'Enviar para a RankLayer as edições feitas no artigo aqui' },\n ],\n // Read from the row the list already batched — one request for N connectors.\n ...connectionStatus(\n RANKLAYER_CONNECTOR_ID,\n (connection) => {\n const found = connection ? toIntegration(connection) : null\n return {\n connected: !!found?.active,\n detail: found?.siteDomain,\n plane: 'sync',\n // \"Conectado, falta configurar\" while the domain is empty — which is\n // true, and is the difference between not ready and broken.\n ...settingsStatus(RANKLAYER_SETTINGS, connection),\n }\n },\n { store: () => store },\n ),\n ...connectionSettings(store),\n /**\n * Called with no values: the credential is not ours to see, and the platform's\n * redirect route does not write this pool's `connections` (FAY-1388) — the\n * app writes its own row, or the tenant authorizes, comes back, and reads \"not\n * connected\" forever. Bling shipped with the other belief and looped.\n */\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => provider.disconnect(),\n ExtraPanel: RankLayerExtraPanel,\n}\n\n// ---------------------------------------------------------------------------\n// TODO(ranklayer) — the partner's half, in order, against the latest\n// @fayz-ai/plugin-marketing + @fayz-ai/plugin-blog. Everything below is written\n// on RankLayer's server; none of it is a change in this repository.\n//\n// 1. OAuth app. Register the Fayz redirect URI, hand over client id/secret and\n// the authorize/token URLs so the platform can register the `ranklayer`\n// provider. Scope: publish and read this tenant's blog articles.\n// → until this exists, `startOAuth` above fails with `config_missing`.\n//\n// 2. Inbound writes. Call `blog_upsert_external_post` with the platform\n// credential, always stamping `source: 'ranklayer'` and a stable\n// `external_ref` — the idempotency key within (tenant, source). Re-sending\n// the same `external_ref` must update, never duplicate. See RANKLAYER.md §1.\n//\n// 3. Outbound endpoint. One endpoint accepting the four `blog.post.*` facts,\n// idempotent on the event id, tolerating out-of-order delivery. Ignore any\n// payload whose `source` is 'ranklayer' — it is your own article coming home,\n// and acting on it is the loop `shouldPushToRankLayer` exists to break.\n// → the Fayz ingress that dispatches `subscribesTo` does not exist yet, so\n// nothing reaches this endpoint today. The declaration is what will be read\n// the day it does.\n//\n// 4. Publication history. Each accepted push writes a sync_runs row through\n// the platform so the Integrações panel stops saying \"nenhuma publicação\n// recebida\" — the panel already reads it (RankLayerExtraPanel above).\n// ---------------------------------------------------------------------------\n","export const en: Record<string, string> = {\n \"marketing.composer.kind\": \"Campaign type\",\n \"marketing.composer.kindSpend\": \"Ad spend\",\n \"marketing.composer.kindOutbound\": \"Outbound\",\n \"marketing.composer.kindSpendHint\": \"Records what was spent on a channel. Sends nothing — it is what makes cost per acquisition exist.\",\n \"marketing.composer.kindOutboundHint\": \"Sends a message to a segment of people. Runs on its own and respects each recipient's opt-in.\",\n \"marketing.composer.audience\": \"Who it reaches\",\n \"marketing.composer.audiencePlaceholder\": \"Pick a segment\",\n \"marketing.composer.noSegments\": \"No active segment. Create one in Settings → CRM → Segments and it shows up here.\",\n \"marketing.composer.purpose\": \"Purpose\",\n \"marketing.composer.template\": \"Message template\",\n \"marketing.composer.templateHint\": \"The template key in Communication. It defines the text that goes out.\",\n \"marketing.purpose.promotion\": \"Promotion\",\n \"marketing.purpose.newsletter\": \"Newsletter\",\n \"marketing.purpose.survey\": \"Survey\",\n \"marketing.purpose.transactional\": \"Notice about something they already have\",\n \"marketing.purpose.promotion.hint\": \"Only reaches people who opted in to promotions.\",\n \"marketing.purpose.newsletter.hint\": \"Only reaches people who opted in to the newsletter.\",\n \"marketing.purpose.survey.hint\": \"Only reaches people who opted in to surveys.\",\n \"marketing.purpose.transactional.hint\": \"Reaches everyone: talking about something they bought is not marketing. Still respects the channel block.\",\n \"marketing.nav.blogCategories\": \"Categories\",\n \"marketing.nav.segments\": \"Segments\",\n \"marketing.nav.messageTemplates\": \"Message Templates\",\n \"marketing.nav.sendHistory\": \"Send History\",\n \"marketing.nav.quickTriggers\": \"Quick Triggers\",\n \"marketing.nav.brand\": \"Brand\",\n \"marketing.nav.authorizedImages\": \"Authorized Images\",\n \"marketing.nav.overview\": \"Overview\",\n \"marketing.nav.channels\": \"Channels\",\n \"marketing.nav.campaigns\": \"Campaigns\",\n \"marketing.nav.funnel\": \"Funnel\",\n \"marketing.nav.landingPages\": \"Landing pages\",\n \"marketing.nav.content\": \"Content\",\n \"marketing.nav.blog\": \"Blog\",\n \"marketing.cadences.title\": \"Cadences\",\n \"marketing.cadences.subtitle\": \"The sequence: what goes out on day 0, day 2 and day 5 — and what takes somebody out of it\",\n \"marketing.cadences.missingTitle\": \"Cadences are not mounted in this app\",\n \"marketing.cadences.missingHint\": \"The screen comes from the Automations plugin. Install it and pass `cadenceSurface` to the Marketing plugin to plan the sequence here.\",\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.leads': 'Leads',\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 'marketing.col.route': 'Route',\n 'marketing.col.leadTag': 'Tag',\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.aiHint': 'Describe the campaign and I set it up.',\n 'marketing.campaigns.newByHand': 'Create by hand',\n 'marketing.campaigns.newByHandHint': 'Fill in channel, budget and period.',\n 'marketing.campaigns.askPlaceholder': 'Describe the campaign…',\n 'marketing.campaigns.askPersona': 'Campaign planner',\n 'marketing.campaigns.askPitch': 'Tell me the campaign you want to run.',\n 'marketing.campaigns.askDescription': 'Goal, channel, how much you mean to spend and for how long — tell me what you have and I fill the rest sensibly against your history. You confirm before it is created.',\n 'marketing.campaigns.askSuggestion.0': 'Instagram campaign for the month, $800',\n 'marketing.campaigns.askSuggestion.1': 'Win back clients who have not returned in 90 days',\n 'marketing.campaigns.askSuggestion.2': 'Weekend promo on Google',\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.new': 'New page',\n 'marketing.landing.edit': 'Edit page',\n 'marketing.landing.delete': 'Delete page',\n 'marketing.landing.save': 'Save',\n 'marketing.landing.empty': 'No pages yet.',\n 'marketing.landing.site': 'Site',\n 'marketing.landing.sitePlaceholder': 'Pick a site',\n 'marketing.landing.name': 'Name',\n 'marketing.landing.namePlaceholder': 'Hair consult LP',\n 'marketing.landing.route': 'Route',\n 'marketing.landing.create': 'Create page',\n 'marketing.landing.status': 'Does this page exist on the site yet?',\n 'marketing.landing.statusLive': 'Already live',\n 'marketing.landing.statusPlanned': 'Not yet',\n 'marketing.landing.prompt': 'Page prompt',\n 'marketing.landing.promptPlaceholder': 'Describe the page: offer, audience, sections, call to action…',\n 'marketing.landing.buildWithFayz': 'Build page with Fayz',\n 'marketing.landing.leadTag': 'Lead tags',\n 'marketing.landing.leadTagPlaceholder': 'new tag…',\n 'marketing.landing.leadTagHint': 'Leads from this page enter the CRM with these tags.',\n 'marketing.landing.visitsPending': 'Visits come from the platform hosting the site; that source is not connected yet.',\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 \"marketing.brand.title\": \"Brand\",\n \"marketing.brand.subtitle\": \"What the assistant reads before writing anything for this business.\",\n \"marketing.brand.identity\": \"Identity\",\n \"marketing.brand.name\": \"Brand name\",\n \"marketing.brand.tagline\": \"Tagline\",\n \"marketing.brand.mission\": \"Positioning\",\n \"marketing.brand.voice\": \"How the brand speaks\",\n \"marketing.brand.voiceHint\": \"This rides along with every question asked of the assistant while marketing is open.\",\n \"marketing.brand.tone\": \"Tone of voice\",\n \"marketing.brand.tonePlaceholder\": \"Direct and warm. Talks like a person, not a brochure.\",\n \"marketing.brand.keywords\": \"Words the house uses\",\n \"marketing.brand.ctas\": \"Standard calls to action\",\n \"marketing.brand.ctasPlaceholder\": \"Book your slot, Message us on WhatsApp\",\n \"marketing.brand.hashtags\": \"Hashtags\",\n \"marketing.brand.avoid\": \"What the brand does not say\",\n \"marketing.brand.avoidHint\": \"The one field whose absence is invisible: nobody proofreads a piece looking for the word the house asked not to use.\",\n \"marketing.brand.avoidWords\": \"Words to avoid\",\n \"marketing.brand.avoidPlaceholder\": \"cheap, unmissable, flash sale\",\n \"marketing.brand.agentOn\": \"The assistant is receiving these standards and will follow them when writing.\",\n \"marketing.brand.agentOff\": \"Nothing filled in yet — the assistant writes with no brand guidance.\",\n \"marketing.brand.agentSummary\": \"The house brand kit: tone of voice, keywords, standard CTAs and the forbidden words.\",\n \"marketing.brand.saved\": \"Brand saved.\",\n \"marketing.brand.saveFailed\": \"Could not save the brand.\",\n \"marketing.landing.formTitle\": \"The page's form\",\n \"marketing.landing.formHint\": \"The page is the content; this is the door's rule — what it asks for and where it leads.\",\n \"marketing.landing.destination\": \"Where it leads\",\n \"marketing.landing.dest.lead\": \"Captures a contact\",\n \"marketing.landing.dest.booking\": \"Books a slot\",\n \"marketing.landing.dest.reservation\": \"Books a table\",\n \"marketing.landing.required\": \"What the house requires\",\n \"marketing.landing.requiredHint\": \"Every extra required field costs conversion. Ask for the minimum you need to reply.\",\n \"marketing.landing.field.name\": \"Name\",\n \"marketing.landing.field.phone\": \"Phone\",\n \"marketing.landing.field.email\": \"Email\",\n \"marketing.landing.field.document\": \"Tax ID\",\n \"marketing.landing.field.notes\": \"Note\",\n \"marketing.landing.minAdvance\": \"Minimum notice (hours)\",\n \"marketing.landing.minAdvanceHint\": \"Stops someone booking for ten minutes from now.\",\n \"marketing.landing.maxAdvance\": \"Furthest ahead (days)\",\n \"marketing.landing.maxAdvanceHint\": \"Stops someone booking for next year.\",\n \"marketing.landing.publicKey\": \"Public key: {{key}} — it never changes once created, because a customer may have saved it.\",\n}\n","export const ptBR: Record<string, string> = {\n \"marketing.composer.kind\": \"Tipo de campanha\",\n \"marketing.composer.kindSpend\": \"Investimento\",\n \"marketing.composer.kindOutbound\": \"Disparo\",\n \"marketing.composer.kindSpendHint\": \"Registra quanto foi gasto num canal. Não envia nada — é o que faz o custo por aquisição existir.\",\n \"marketing.composer.kindOutboundHint\": \"Manda uma mensagem para um recorte de gente. Roda sozinha e respeita o opt-in de quem for receber.\",\n \"marketing.composer.audience\": \"Para quem\",\n \"marketing.composer.audiencePlaceholder\": \"Escolha um segmento\",\n \"marketing.composer.noSegments\": \"Nenhum segmento ativo. Crie um em Configurações → CRM → Segmentos e ele aparece aqui.\",\n \"marketing.composer.purpose\": \"Finalidade\",\n \"marketing.composer.template\": \"Modelo de mensagem\",\n \"marketing.composer.templateHint\": \"A chave do modelo em Comunicação. É ele que define o texto que sai.\",\n \"marketing.purpose.promotion\": \"Promoção\",\n \"marketing.purpose.newsletter\": \"Novidades\",\n \"marketing.purpose.survey\": \"Pesquisa\",\n \"marketing.purpose.transactional\": \"Aviso sobre algo que a pessoa já tem\",\n \"marketing.purpose.promotion.hint\": \"Só alcança quem aceitou receber promoção.\",\n \"marketing.purpose.newsletter.hint\": \"Só alcança quem aceitou receber novidades.\",\n \"marketing.purpose.survey.hint\": \"Só alcança quem aceitou responder pesquisas.\",\n \"marketing.purpose.transactional.hint\": \"Alcança todo mundo: falar de algo que a pessoa já comprou não é marketing. Ainda respeita o bloqueio do canal.\",\n \"marketing.nav.blogCategories\": \"Categorias\",\n \"marketing.nav.segments\": \"Segmentos\",\n \"marketing.nav.messageTemplates\": \"Modelos de Mensagem\",\n \"marketing.nav.sendHistory\": \"Histórico de Envios\",\n \"marketing.nav.quickTriggers\": \"Gatilhos Rápidos\",\n \"marketing.nav.brand\": \"Marca\",\n \"marketing.nav.authorizedImages\": \"Imagens Autorizadas\",\n \"marketing.nav.overview\": \"Visão geral\",\n \"marketing.nav.channels\": \"Canais\",\n \"marketing.nav.campaigns\": \"Campanhas\",\n \"marketing.nav.funnel\": \"Funil\",\n \"marketing.nav.landingPages\": \"Páginas de captura\",\n \"marketing.nav.content\": \"Conteúdo\",\n \"marketing.nav.blog\": \"Blog\",\n \"marketing.cadences.title\": \"Cadências\",\n \"marketing.cadences.subtitle\": \"A régua: o que sai no dia 0, no dia 2 e no dia 5 — e o que faz alguém sair dela\",\n \"marketing.cadences.missingTitle\": \"Cadências não estão montadas neste app\",\n \"marketing.cadences.missingHint\": \"A tela vem do plugin de Automações. Instale-o e passe `cadenceSurface` ao plugin de Marketing para planejar a régua por aqui.\",\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.leads': 'Leads',\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 'marketing.col.route': 'Rota',\n 'marketing.col.leadTag': 'Tag',\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.aiHint': 'Descreva a campanha e eu monto.',\n 'marketing.campaigns.newByHand': 'Criar manualmente',\n 'marketing.campaigns.newByHandHint': 'Preencher canal, orçamento e período.',\n 'marketing.campaigns.askPlaceholder': 'Descreva a campanha…',\n 'marketing.campaigns.askPersona': 'Planejador de campanhas',\n 'marketing.campaigns.askPitch': 'Diga a campanha que você quer rodar.',\n 'marketing.campaigns.askDescription': 'Objetivo, canal, quanto pretende gastar e por quanto tempo — diga o que tiver e eu completo o resto com o que faz sentido para o seu histórico. Você confirma antes de criar.',\n 'marketing.campaigns.askSuggestion.0': 'Campanha de Instagram para o mês, R$ 800',\n 'marketing.campaigns.askSuggestion.1': 'Reativar clientes que não voltam há 90 dias',\n 'marketing.campaigns.askSuggestion.2': 'Promoção de fim de semana no Google',\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.new': 'Nova página',\n 'marketing.landing.edit': 'Editar página',\n 'marketing.landing.delete': 'Excluir página',\n 'marketing.landing.save': 'Salvar',\n 'marketing.landing.empty': 'Nenhuma página cadastrada ainda.',\n 'marketing.landing.site': 'Site',\n 'marketing.landing.sitePlaceholder': 'Selecione o site',\n 'marketing.landing.name': 'Nome',\n 'marketing.landing.namePlaceholder': 'LP Capilar',\n 'marketing.landing.route': 'Rota',\n 'marketing.landing.create': 'Criar página',\n 'marketing.landing.status': 'Esta página já existe no site?',\n 'marketing.landing.statusLive': 'Já existe',\n 'marketing.landing.statusPlanned': 'Ainda não existe',\n 'marketing.landing.prompt': 'Prompt da página',\n 'marketing.landing.promptPlaceholder': 'Descreva a página: oferta, público, seções, chamada para ação…',\n 'marketing.landing.buildWithFayz': 'Criar página com Fayz',\n 'marketing.landing.leadTag': 'Tags dos leads',\n 'marketing.landing.leadTagPlaceholder': 'nova tag…',\n 'marketing.landing.leadTagHint': 'Os leads desta página entram no CRM com estas tags.',\n 'marketing.landing.visitsPending': 'As visitas vêm da plataforma que hospeda o site; essa origem ainda não está conectada.',\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 \"marketing.brand.title\": \"Marca\",\n \"marketing.brand.subtitle\": \"O que o assistente lê antes de escrever qualquer texto para esta casa.\",\n \"marketing.brand.identity\": \"Identidade\",\n \"marketing.brand.name\": \"Nome da marca\",\n \"marketing.brand.tagline\": \"Assinatura\",\n \"marketing.brand.mission\": \"Posicionamento\",\n \"marketing.brand.voice\": \"Como a marca fala\",\n \"marketing.brand.voiceHint\": \"Isto acompanha toda pergunta feita ao assistente enquanto o marketing está aberto.\",\n \"marketing.brand.tone\": \"Tom de voz\",\n \"marketing.brand.tonePlaceholder\": \"Direto e caloroso. Fala como gente, não como folheto.\",\n \"marketing.brand.keywords\": \"Palavras que a casa usa\",\n \"marketing.brand.ctas\": \"Chamadas padrão\",\n \"marketing.brand.ctasPlaceholder\": \"Agende seu horário, Fale no WhatsApp\",\n \"marketing.brand.hashtags\": \"Hashtags\",\n \"marketing.brand.avoid\": \"O que a marca não diz\",\n \"marketing.brand.avoidHint\": \"É o único campo cujo esquecimento é invisível: ninguém revisa uma peça procurando a palavra que a casa pediu para não usar.\",\n \"marketing.brand.avoidWords\": \"Palavras a evitar\",\n \"marketing.brand.avoidPlaceholder\": \"barato, imperdível, promoção relâmpago\",\n \"marketing.brand.agentOn\": \"O assistente está recebendo estes padrões e vai segui-los ao escrever.\",\n \"marketing.brand.agentOff\": \"Nada preenchido ainda — o assistente escreve sem orientação de marca.\",\n \"marketing.brand.agentSummary\": \"O kit de marca da casa: tom de voz, palavras-chave, chamadas padrão e as palavras proibidas.\",\n \"marketing.brand.saved\": \"Marca salva.\",\n \"marketing.brand.saveFailed\": \"Não foi possível salvar a marca.\",\n \"marketing.landing.formTitle\": \"O formulário da página\",\n \"marketing.landing.formHint\": \"A página é o conteúdo; isto é a regra da porta — o que ela pede e para onde leva.\",\n \"marketing.landing.destination\": \"Para onde leva\",\n \"marketing.landing.dest.lead\": \"Captura contato\",\n \"marketing.landing.dest.booking\": \"Marca horário\",\n \"marketing.landing.dest.reservation\": \"Marca mesa\",\n \"marketing.landing.required\": \"O que a casa exige\",\n \"marketing.landing.requiredHint\": \"Cada campo exigido a mais derruba conversão. Peça o mínimo para conseguir responder.\",\n \"marketing.landing.field.name\": \"Nome\",\n \"marketing.landing.field.phone\": \"Telefone\",\n \"marketing.landing.field.email\": \"E-mail\",\n \"marketing.landing.field.document\": \"CPF\",\n \"marketing.landing.field.notes\": \"Observação\",\n \"marketing.landing.minAdvance\": \"Antecedência mínima (horas)\",\n \"marketing.landing.minAdvanceHint\": \"Impede marcar para daqui a dez minutos.\",\n \"marketing.landing.maxAdvance\": \"Prazo máximo (dias)\",\n \"marketing.landing.maxAdvanceHint\": \"Impede marcar para o ano que vem.\",\n \"marketing.landing.publicKey\": \"Chave pública: {{key}} — não muda depois de criada, porque o cliente pode tê-la salvo.\",\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 { lazyComponent, createSafeDataProvider, registerTranslations } from '@fayz-ai/core'\nimport { PluginSettingsPanel } from '@fayz-ai/admin'\nimport { buildMarketingRegistries } from './data/registries'\nimport { buildMarketingOnboarding } from './lib/onboarding'\nimport { buildBlogPostEntity } from './data/blogEntities'\nimport { createMarketingDashboardWidgets } from './views/dashboardWidgets'\nimport {\n MarketingContextProvider,\n type ResolvedMarketingConfig,\n type MarketingLabels,\n} from './context'\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 { MIGRATIONS } from './migrations'\nimport { ranklayerConnectorDef } from './integrations/ranklayer/connectorDef'\nimport { DEFAULT_CURRENCY, type MarketingCurrency } from './lib/format'\nimport { MARKETING_PRESETS, type MarketingDomain, type MarketingDomainModules } from './lib/presets'\nimport type { AcquisitionChannel, ConversionModel } from './types'\nimport { marketingLocales } from './locales'\n\n// Code loads when it is first drawn, not with the app. Pages use React.lazy\n// (the shell's route boundary shows the page skeleton); anything that may\n// render elsewhere uses lazyComponent, which carries its own boundary.\nconst MarketingPage = React.lazy(() => import('./views/MarketingPage').then((m) => ({ default: m.MarketingPage })))\nconst SettingsView = lazyComponent(() => import('./views/SettingsView').then((m) => m.SettingsView))\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 /** Where the module's sub-nav lives. MarketingPage already reads it. */\n moduleNav?: 'rail' | 'tabs' | 'sidebar'\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 visits (mounted later). */\n sitesBridge?: SitesPerformanceBridge\n /** Where the lead-tag catalog is read from for the landing-page form.\n * Defaults to plugin-crm's plg_crm_tags (slug/name). */\n leadTags?: { table?: string; valueField?: string; labelField?: string }\n /**\n * A tela de cadências, injetada — `CadenceFlowsSurface` do\n * @fayz-ai/plugin-automations.\n *\n * DI e não import: o motor da cadência mora naquele plugin (tabelas,\n * `automations_flows_run_due` no tick do minuto), e o Marketing só decide que\n * é AQUI que ela se planeja. Sem isto, `modules.cadences` não desenha item\n * nenhum — um menu apontando para uma tela que o app não montou é pior que a\n * ausência dele.\n */\n cadenceSurface?: React.ComponentType\n}\n\nconst DEFAULT_LABELS: MarketingLabels = {\n pageTitle: 'Marketing',\n pageSubtitle: 'Acquisition & conversion performance',\n}\n\n/** Lido fora de componente (features do gate de permissão, montadas antes de\n * existir árvore React). Dentro da página quem nomeia é o i18n. */\nconst FEATURE_FALLBACK = {\n landingPages: 'Landing pages', content: 'Content', blog: 'Blog', cadences: 'Cadences',\n} as const\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 moduleNav: options?.moduleNav,\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 leadTags: options?.leadTags,\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, cadenceSurface: options?.cadenceSurface }))\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 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 defaultAgentRole: 'growth',\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 ?? FEATURE_FALLBACK.landingPages, group: 'Engage' }] : []),\n ...(config.modules.cadences && options?.cadenceSurface ? [{ id: 'marketing.cadences', label: config.labels.cadences ?? FEATURE_FALLBACK.cadences, group: 'Engage' }] : []),\n ...(config.modules.contentPlanner ? [{ id: 'marketing.content', label: config.labels.content ?? FEATURE_FALLBACK.content, group: 'Engage' }] : []),\n ...(config.modules.blog ? [{ id: 'marketing.blog', label: config.labels.blog ?? FEATURE_FALLBACK.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 // O post do blog é a única entidade daqui que o agente pode ESCREVER: é\n // um rascunho de texto, o formulário é o mesmo que a pessoa usaria, e a\n // permissão de create continua sendo cobrada pelas primitivas. Campanha e\n // post de conteúdo seguem só-leitura — campanha tem RPC própria e o\n // planner escreve por outro caminho.\n ...(config.modules.blog ? [{\n key: 'marketing:blogPosts',\n writable: true,\n entity: buildBlogPostEntity(),\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 // One baseline per unit since #338 — read from the generated barrel\n // rather than listed here, so regenerating the SQL never needs a\n // manifest edit to match.\n migrations: MIGRATIONS.map((entry) => ({\n id: `marketing-${entry.id}`,\n version: '1.0.0',\n sql: entry.sql,\n description:\n 'The whole schema this plugin provisions, as one file: every table, view, function, policy and grant, plus the reference rows it seeds. Replaced the per-change chain in the 1.0.0 squash (#338); the files it collapsed are kept, unapplied, in src/migrations.archive/.',\n })),\n // RankLayer SEO connector — renders in the Integrações settings tab. A push\n // connector: RankLayer writes posts in and subscribes to blog.post.* to hear\n // the edits back. See src/integrations/ranklayer/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: 'Qual canal converte melhor?' }, { label: 'Qual meu custo por aquisição?' }],\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: 'Crie uma campanha no Instagram para este mês' }],\n permission: { feature: 'marketing', action: 'create' as const },\n },\n ],\n registries: marketingRegistries,\n onboarding: { program: buildMarketingOnboarding() },\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 // Google Meu Negócio sits on the same shelf as RankLayer above: being\n // found locally, not being measured.\n integrations: ['google-my-business'],\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 './lib/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"]}