feat: calendario bajo Social, SEO/GEO con datos live, Drive = 03-Clientes

Calendario editorial anidado en Social; Orgánico con queries/páginas GSC y landings GA4 + dashboard GEO; Biblioteca enlazada a la carpeta real del cliente bajo 03-Clientes (no carpetas homónimas); previews Ads solo en Meta/Google.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
4Ventures
2026-09-24 16:12:07 +02:00
parent 3425364b07
commit f4dfc50cc9
9 changed files with 699 additions and 107 deletions

View File

@@ -64,13 +64,6 @@ const NAV_ITEMS: NavItem[] = [
iconClass: 'text-emerald-500',
moduleId: 'estrategia',
},
{
href: '/dashboard/calendario',
label: 'Calendario Editorial',
icon: CalendarDays,
iconClass: 'text-pink-500',
moduleId: 'calendario',
},
{
href: '/dashboard/ad-tracker',
label: 'Ads',
@@ -174,6 +167,7 @@ export default function DashboardShell({
const [open, setOpen] = useState(false);
const close = () => setOpen(false);
const dateRange = useDateRange();
const pathname = usePathname();
const visibleNav = NAV_ITEMS.filter((item) => {
if (isAgency) return true;
@@ -230,9 +224,32 @@ export default function DashboardShell({
</div>
<nav className="flex-1 overflow-y-auto space-y-1.5 pr-1">
{visibleNav.map((item) => (
<NavLink key={item.href} item={item} onNavigate={close} />
))}
{visibleNav.map((item) => {
const showCalendarioUnderSocial =
item.moduleId === 'social' &&
(isAgency ||
!enabledModules ||
enabledModules.calendario !== false);
return (
<div key={item.href} className="space-y-0.5">
<NavLink item={item} onNavigate={close} />
{showCalendarioUnderSocial ? (
<Link
href="/dashboard/calendario"
onClick={close}
className={`ml-4 flex items-center gap-2.5 px-3 py-2 rounded-lg text-xs font-medium transition-all ${
isActive(pathname, '/dashboard/calendario')
? 'bg-brand-50 text-gray-900 border border-brand-200'
: 'text-gray-500 border border-transparent hover:text-gray-900 hover:bg-gray-50'
}`}
>
<CalendarDays className="w-3.5 h-3.5 shrink-0 text-pink-500" />
Calendario editorial
</Link>
) : null}
</div>
);
})}
{isAgency ? (
<div className="pt-4 mt-4 border-t border-gray-200">