{"id":11039,"date":"2026-06-22T09:32:07","date_gmt":"2026-06-22T07:32:07","guid":{"rendered":"https:\/\/vincesconsulting.com\/wats\/"},"modified":"2026-06-24T10:49:32","modified_gmt":"2026-06-24T08:49:32","slug":"wats","status":"publish","type":"page","link":"https:\/\/vincesconsulting.com\/ca\/tecnologia\/wats\/","title":{"rendered":"Wats"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"11039\" class=\"elementor elementor-11039 elementor-11019\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fb775a4 e-con-full e-flex e-con e-parent\" data-id=\"fb775a4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5d28f2b elementor-widget elementor-widget-html\" data-id=\"5d28f2b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\n\n<!--\n  Dashboard Vinces \u00b7 p\u00e1gina standalone por producto\n  Generado: 2026-05-13T10:34:51.200Z\n  Endpoint API: https:\/\/vision360.vincesconsulting.com\/api\/dashboard-publico\/wats\/\n\n  C\u00f3mo integrarlo en WordPress:\n    1. Editor de la p\u00e1gina \u2192 bloque 'HTML personalizado'.\n    2. Pega el fichero completo (todo, incluyendo <html>, <head>, <body>).\n       En la mayor\u00eda de temas WP basta con pegar a partir de <body>.\n    3. Aseg\u00farate de que el dominio WP est\u00e1 incluido en CORS del backend.\n    4. El cliente refresca cada 30 min; el backend cachea 1h.\n-->\n<html lang=\"ca\"><head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n<title>WATS: temes de conversa dels partits pol\u00edtics \u00b7 Intel\u00b7lig\u00e8ncia social \u00b7 Vinces<\/title>\n<meta name=\"description\" content=\"WATS, la inteligencia social de Vinces. An\u00e1lisis autom\u00e1tico de los principales temas que los decisores pol\u00edticos y grupos parlamentarios est\u00e1n tratando en redes sociales y medios. Clasificado por \u00e1mbito sectorial y sentimiento (positivo, negativo, neutro o mixto).\">\n<meta name=\"keywords\" content=\"WATS, inteligencia social pol\u00edtica, temas de conversaci\u00f3n, redes sociales, X Twitter LinkedIn, sentimiento positivo negativo, an\u00e1lisis reputacional, narrativas pol\u00edticas, monitorizaci\u00f3n medios, decisores pol\u00edticos, qu\u00e9 hablan PSOE PP VOX Sumar, Vinces consulting\">\n<meta name=\"author\" content=\"Vinces Consulting\">\n<meta name=\"robots\" content=\"index,follow,max-image-preview:large,max-snippet:-1\">\n<link rel=\"canonical\" href=\"https:\/\/vincesconsulting.com\/wats\/\">\n\n<meta property=\"og:type\" content=\"website\">\n<meta property=\"og:site_name\" content=\"Vinces Consulting\">\n<meta property=\"og:title\" content=\"WATS \u00b7 Inteligencia social pol\u00edtica \u00b7 Vinces\">\n<meta property=\"og:description\" content=\"Temas de conversaci\u00f3n de los partidos pol\u00edticos detectados en redes y medios, por \u00e1mbito y sentimiento.\">\n<meta property=\"og:locale\" content=\"ca_ES\">\n<meta property=\"og:url\" content=\"https:\/\/vincesconsulting.com\/wats\/\">\n<meta name=\"twitter:card\" content=\"summary_large_image\">\n<meta name=\"twitter:title\" content=\"WATS \u00b7 Inteligencia social\">\n<meta name=\"twitter:description\" content=\"Qu\u00e9 hablan los decisores en redes: temas, frecuencia y sentimiento.\">\n\n<script type=\"application\/ld+json\" id=\"ld-json-page\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"WebPage\",\n  \"name\": \"WATS \u00b7 Inteligencia social pol\u00edtica\",\n  \"description\": \"Principales temas de conversaci\u00f3n de los decisores pol\u00edticos en redes sociales y medios digitales, clasificados por \u00e1mbito sectorial y sentimiento.\",\n  \"inLanguage\": \"es\",\n  \"isPartOf\": {\"@type\":\"WebSite\",\"name\":\"Vinces Consulting\",\"url\":\"https:\/\/vincesconsulting.com\"},\n  \"publisher\": {\"@type\":\"Organization\",\"name\":\"Vinces Consulting\",\"url\":\"https:\/\/vincesconsulting.com\",\"sameAs\":[\"https:\/\/www.linkedin.com\/company\/vinces-consulting\/\"]},\n  \"breadcrumb\": {\"@type\":\"BreadcrumbList\",\"itemListElement\":[\n    {\"@type\":\"ListItem\",\"position\":1,\"name\":\"Inicio\",\"item\":\"https:\/\/vincesconsulting.com\/\"},\n    {\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tecnolog\u00eda\",\"item\":\"https:\/\/vincesconsulting.com\/tecnologia\/\"},\n    {\"@type\":\"ListItem\",\"position\":3,\"name\":\"WATS\"}\n  ]}\n}\n<\/script>\n<script type=\"application\/ld+json\" id=\"ld-json-faq\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\"@type\":\"Question\",\"name\":\"\u00bfDe qu\u00e9 temas hablan los grupos pol\u00edticos en redes sociales?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"WATS detecta y agrupa los temas m\u00e1s tratados por decisores pol\u00edticos en redes sociales por \u00e1mbito (sanidad, vivienda, econom\u00eda, educaci\u00f3n, fiscalidad, medio ambiente, energ\u00eda, social, infraestructuras, pol\u00edtica) y sentimiento (positivo, negativo, neutro o mixto).\"}},\n    {\"@type\":\"Question\",\"name\":\"\u00bfQu\u00e9 redes monitoriza WATS?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"X (Twitter), LinkedIn, Facebook, Instagram, YouTube, TikTok, Telegram p\u00fablico, blogs pol\u00edticos y medios digitales.\"}},\n    {\"@type\":\"Question\",\"name\":\"\u00bfWATS detecta crisis reputacionales?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"S\u00ed. WATS alerta cuando un tema asociado a tu organizaci\u00f3n (o a tu sector) entra en una din\u00e1mica negativa o de viralizaci\u00f3n r\u00e1pida.\"}},\n    {\"@type\":\"Question\",\"name\":\"\u00bfWATS hace an\u00e1lisis comparativo entre partidos?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"S\u00ed. Puedes comparar c\u00f3mo PSOE, PP, VOX, Sumar, ERC, Junts, EH Bildu, PNV o cualquier grupo aborda un tema, con qu\u00e9 intensidad y con qu\u00e9 sentimiento.\"}}\n  ]\n}\n<\/script>\n\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin=\"\">\n<link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Libre+Franklin:wght@400;500;600;700&amp;family=Manrope:wght@500;600;700;800&amp;family=Lato:wght@400;700&amp;display=swap\">\n<script defer=\"\" src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js@4.4.1\/dist\/chart.umd.min.js\"><\/script>\n\n<style>\n\/* =========================================================\n   Vinces \u00b7 Dashboards p\u00fablicos \u2014 capa visual redesign\n   Mantiene todas las clases del HTML\/JS original e\n   incorpora la identidad de vincesconsulting.com (hero\n   navy, kicker naranja, tipograf\u00eda display, CTAs p\u00edldora).\n   ========================================================= *\/\n:root{\n  --navy:#1F2547;\n  --navy-deep:#161A36;\n  --navy-light:#2A3158;\n  --navy-soft:#E9ECF3;\n  --orange:#F3A53A;\n  --orange-soft:#FFF1DA;\n  --green:#1FA886;\n  --bg:#EEF1F3;\n  --bg-alt:#F6F8FA;\n  --card:#FFFFFF;\n  --ink:#1F2547;\n  --ink-soft:#5A6076;\n  --muted:#8A90A3;\n  --line:#E2E6EE;\n  --line-soft:#EDF0F5;\n  --good:#1FA886;\n  --warn:#E5A040;\n  --bad:#C0392B;\n\n  \/* Aliases para mantener compatibilidad con el CSS original *\/\n  --vinces-primary:var(--navy);\n  --vinces-secondary:var(--orange);\n  --vinces-dark:var(--navy-deep);\n  --panel:var(--card);\n  --panel-soft:var(--bg-alt);\n  --brand:var(--navy);\n  --brand-soft:var(--navy-soft);\n  --brand-light:var(--navy-light);\n  --accent:var(--orange);\n  --accent-soft:var(--orange-soft);\n  --accent-dark:#D88E25;\n\n  --radius:18px;\n  --radius-sm:10px;\n  --radius-pill:999px;\n  --shadow:0 1px 2px rgba(31,37,71,.04), 0 8px 24px rgba(31,37,71,.06);\n  --shadow-lg:0 4px 12px rgba(31,37,71,.06), 0 24px 60px rgba(31,37,71,.12);\n\n  --hm-0:#F1F3F7;--hm-1:#DDE2EE;--hm-2:#B8C2D9;\n  --hm-3:#7889B0;--hm-4:#42507A;--hm-5:#1F2547;\n\n  --font-display:\"Libre Franklin\",-apple-system,BlinkMacSystemFont,sans-serif;\n  --font-body:\"Lato\",\"Libre Franklin\",-apple-system,BlinkMacSystemFont,sans-serif;\n}\n\n*{box-sizing:border-box}\nhtml,body{margin:0;padding:0}\nbody{\n  font-family:var(--font-body);\n  background:var(--bg);\n  color:var(--ink);\n  line-height:1.65;\n  -webkit-font-smoothing:antialiased;\n  text-rendering:optimizeLegibility;\n}\n\n\/* =========================================================\n   HERO full-bleed (estilo Vinces)\n   ========================================================= *\/\n.vc-hero{\n  position:relative;\n  background:var(--navy);\n  color:#fff;\n  padding:96px 24px 88px;\n  overflow:hidden;\n}\n.vc-hero::before{\n  content:\"\";\n  position:absolute;inset:0;\n  background:\n    radial-gradient(circle at 88% 18%, rgba(243,165,58,.10), transparent 45%),\n    radial-gradient(circle at 8% 95%, rgba(31,168,134,.07), transparent 50%);\n  pointer-events:none;\n}\n.vc-hero::after{\n  content:\"\";\n  position:absolute;left:0;right:0;bottom:0;height:1px;\n  background:linear-gradient(90deg, transparent, rgba(243,165,58,.45), transparent);\n}\n.vc-hero-inner{\n  position:relative;\n  max-width:1240px;margin:0 auto;\n  display:grid;grid-template-columns:1fr;gap:28px;\n}\n@media(min-width:880px){\n  .vc-hero-inner{grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:48px}\n}\n.vc-kicker{\n  display:inline-block;\n  color:var(--orange);\n  font-family:var(--font-display);\n  font-weight:700;font-size:.78rem;\n  letter-spacing:.18em;text-transform:uppercase;\n  margin:0 0 22px;line-height:1.2;\n}\n.vc-kicker::before{content:\"\/\/ \"}\n.vc-hero h1{\n  font-family:var(--font-display);\n  font-size:clamp(2.4rem,5.6vw,4.8rem);\n  font-weight:800;\n  letter-spacing:-.035em;\n  line-height:.98;\n  margin:0 0 24px;\n  color:#fff;\n  text-wrap:balance;\n}\n.vc-hero-lead{\n  font-size:clamp(1rem,1.25vw,1.15rem);\n  color:rgba(255,255,255,.78);\n  max-width:680px;\n  line-height:1.55;\n  margin:0 0 28px;\n}\n.vc-hero-lead strong{color:#fff;font-weight:600}\n.vc-hero-meta{\n  display:inline-flex;align-items:center;gap:10px;\n  background:rgba(255,255,255,.05);\n  border:1px solid rgba(255,255,255,.14);\n  padding:9px 18px;\n  border-radius:999px;\n  font-size:.8rem;\n  color:rgba(255,255,255,.85);\n  backdrop-filter:blur(6px);\n}\n.vc-hero-meta .dot{\n  width:8px;height:8px;border-radius:50%;\n  background:#4ADE80;\n  box-shadow:0 0 0 4px rgba(74,222,128,.18);\n}\n.vc-hero-meta.err .dot{background:#FCA5A5;box-shadow:0 0 0 4px rgba(252,165,165,.18)}\n.vc-hero-meta.err{color:#FCA5A5;border-color:rgba(252,165,165,.25)}\n\n.vc-hero-cta{\n  display:inline-flex;align-items:center;gap:14px;\n  background:#fff;color:var(--navy);\n  padding:14px 16px 14px 26px;\n  border-radius:999px;\n  text-decoration:none;\n  font-family:var(--font-display);\n  font-weight:700;font-size:1.45rem;\n  transition:transform .15s ease, box-shadow .2s ease;\n  align-self:start;\n}\n.vc-hero-cta:hover{transform:translateY(-2px);box-shadow:0 10px 24px rgba(0,0,0,.25)}\n.vc-hero-cta .ico{\n  width:30px;height:30px;border-radius:50%;\n  background:var(--navy);color:#fff;\n  display:inline-flex;align-items:center;justify-content:center;\n  font-size:1.45rem;font-weight:400;\n  transition:transform .2s ease;\n}\n.vc-hero-cta:hover .ico{transform:rotate(-12deg)}\n\n\/* =========================================================\n   Layout principal (sustituye al .wrap inline)\n   ========================================================= *\/\n.wrap{max-width:1240px;margin:0 auto;padding:56px 24px 96px}\n@media(max-width:768px){.wrap{padding:40px 18px 64px}}\n\n\/* Cabecera vieja: la ocultamos porque ahora vive en el hero *\/\nheader.page{display:none}\n\nnoscript .nojs{\n  background:#FFF7ED;border:1px solid #FED7AA;color:#9A3412;\n  padding:16px 20px;border-radius:var(--radius-sm);margin-bottom:24px;font-size:.9rem;\n}\n\n\/* =========================================================\n   PRODUCT SECTION \u2014 card grande con dos columnas\n   ========================================================= *\/\n.product-section{\n  margin:0 0 40px;\n  background:var(--card);\n  border:1px solid var(--line);\n  border-radius:var(--radius);\n  box-shadow:var(--shadow);\n  overflow:hidden;\n  position:relative;\n}\n.product-section::before{\n  content:\"\";position:absolute;top:0;left:0;\n  width:160px;height:4px;\n  background:linear-gradient(90deg,var(--navy) 0%,var(--orange) 100%);\n}\n.product-grid{display:grid;grid-template-columns:1fr;gap:0}\n@media(min-width:1020px){\n  .product-grid{grid-template-columns:360px 1fr}\n  .product-grid.reverse{grid-template-columns:1fr 360px}\n}\n.product-info{\n  padding:48px 38px;\n  background:linear-gradient(180deg,#FAFBFC 0%, #F0F3F7 100%);\n  border-right:1px solid var(--line);\n  display:flex;flex-direction:column;gap:18px;\n}\n.product-grid.reverse .product-info{\n  border-right:0;border-left:1px solid var(--line);order:2;\n}\n@media(max-width:1019px){\n  .product-info{padding:32px 24px;border-right:0;border-left:0;border-bottom:1px solid var(--line)}\n  .product-grid.reverse .product-info{order:0;border-left:0;border-bottom:1px solid var(--line)}\n}\n\n.product-badge{\n  display:inline-block;\n  color:var(--orange);\n  font-family:var(--font-display);\n  font-weight:700;font-size:.72rem;\n  letter-spacing:.16em;text-transform:uppercase;\n  background:transparent;padding:0;border:0;\n  align-self:flex-start;line-height:1.2;\n}\n.product-badge::before{content:\"\/\/ \"}\n.product-badge.brand{color:var(--navy)}\n\n.product-name{\n  font-family:var(--font-display);\n  font-size:clamp(1.7rem,2.4vw,2.2rem);\n  font-weight:800;color:var(--navy);\n  margin:0;letter-spacing:-.025em;line-height:1.05;\n  text-wrap:balance;\n}\n.product-tagline{\n  font-size:1rem;color:var(--ink-soft);\n  margin:0;line-height:1.7;\n}\n.product-tagline strong{color:var(--ink);font-weight:600}\n\n.product-content{padding:42px 38px;min-width:0}\n@media(max-width:1019px){.product-content{padding:30px 24px}}\n.product-content-header{\n  display:flex;align-items:flex-start;justify-content:space-between;\n  gap:16px;flex-wrap:wrap;margin-bottom:22px;\n}\n.product-content-header h3{\n  margin:0;\n  font-family:var(--font-display);\n  font-size:clamp(1.25rem,1.6vw,1.55rem);\n  font-weight:700;color:var(--navy);\n  letter-spacing:-.02em;line-height:1.2;\n}\n.product-content-header .sub{\n  font-size:1.45rem;color:var(--ink-soft);\n  margin:8px 0 0;line-height:1.55;max-width:62ch;\n}\n\n\/* =========================================================\n   CTA p\u00edldora \u2014 el patr\u00f3n Vinces \"Contacta con nosotros \u2197\"\n   ========================================================= *\/\n.pane-cta,\n.product-cta,\n.dl-btn{\n  display:inline-flex;align-items:center;gap:12px;\n  background:var(--navy);color:#fff;\n  padding:13px 18px 13px 26px;\n  border-radius:999px;\n  text-decoration:none;\n  font-family:var(--font-display);\n  font-weight:700;font-size:.88rem;\n  transition:transform .15s ease, box-shadow .2s ease, background .2s ease;\n  border:0;cursor:pointer;line-height:1;\n  white-space:nowrap;\n}\n.pane-cta::after,\n.product-cta::after{content:none}\n.pane-cta::before,\n.product-cta::before,\n.dl-btn::before{\n  order:2;\n  content:\"\\2197\";\n  width:26px;height:26px;border-radius:50%;\n  background:rgba(255,255,255,.16);\n  display:inline-flex;align-items:center;justify-content:center;\n  font-size:1.25rem;font-weight:500;\n  transition:transform .25s ease;\n}\n.pane-cta:hover,\n.product-cta:hover,\n.dl-btn:hover{\n  background:var(--navy-light);\n  transform:translateY(-2px);\n  box-shadow:0 10px 24px rgba(31,37,71,.18);\n  color:#fff;\n}\n.pane-cta:hover::before,\n.product-cta:hover::before{transform:translate(2px,-2px) rotate(-8deg)}\n\n.pane-cta-row{\n  margin-top:28px;padding:22px 24px;\n  background:var(--bg-alt);\n  border:1px solid var(--line-soft);\n  border-radius:var(--radius-sm);\n  display:flex;flex-wrap:wrap;align-items:center;gap:18px;\n}\n.pane-cta-row .pane-cta-text{\n  flex:1;min-width:240px;\n  font-size:1.45rem;color:var(--ink-soft);\n  margin:0;line-height:1.6;\n}\n.pane-cta-row .pane-cta-text strong{color:var(--ink);font-weight:700}\n.content-cta-row{\n  margin-top:32px;padding:24px 26px;\n  background:linear-gradient(135deg, var(--navy) 0%, var(--navy-deep) 100%);\n  color:#fff;\n  border-radius:var(--radius-sm);\n  display:flex;flex-wrap:wrap;align-items:center;gap:20px;\n}\n.content-cta-row .pane-cta-text{\n  flex:1;min-width:240px;\n  font-size:1.45rem;color:rgba(255,255,255,.78);\n  margin:0;line-height:1.6;\n}\n.content-cta-row .pane-cta-text strong{color:#fff;font-weight:700}\n.content-cta-row .pane-cta{\n  background:#fff;color:var(--navy);\n}\n.content-cta-row .pane-cta::before{background:var(--navy);color:#fff}\n.content-cta-row .pane-cta:hover{background:var(--orange);color:var(--navy)}\n.content-cta-row .pane-cta:hover::before{background:var(--navy);color:#fff}\n\n\/* Updated pill compatible con c\u00f3digo original (queda oculto en hero, pero el JS a\u00fan escribe en \u00e9l) *\/\n.updated{\n  font-size:.8rem;color:var(--ink-soft);\n  background:var(--card);border:1px solid var(--line);\n  padding:8px 16px;border-radius:999px;\n  display:inline-flex;align-items:center;gap:8px;\n}\n.updated .dot{width:8px;height:8px;border-radius:50%;background:var(--good);box-shadow:0 0 0 4px rgba(31,168,134,.15)}\n.updated.err .dot{background:var(--bad);box-shadow:0 0 0 4px rgba(192,57,43,.15)}\n.updated.err{color:var(--bad);border-color:#FECACA}\n\n\/* =========================================================\n   Carrusel de tabs (PolicyAlert)\n   ========================================================= *\/\n.car-tabs{\n  display:flex;gap:6px;margin:-8px 0 28px;\n  padding:6px;background:var(--bg-alt);\n  border:1px solid var(--line-soft);border-radius:999px;\n  flex-wrap:wrap;width:fit-content;max-width:100%;\n}\n.car-tab{\n  background:transparent;border:0;\n  padding:10px 20px;font-weight:600;font-size:1.25rem;\n  color:var(--ink-soft);cursor:pointer;\n  font-family:var(--font-display);\n  border-radius:999px;\n  transition:all .15s ease;\n  line-height:1.2;\n}\n.car-tab:hover{color:var(--navy)}\n.car-tab.active{\n  background:var(--navy);color:#fff;\n  box-shadow:0 2px 8px rgba(31,37,71,.18);\n}\n.car-pane{display:none}\n.car-pane.active{display:block;animation:vc-fade .35s cubic-bezier(.16,1,.3,1)}\n@keyframes vc-fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\n\n\/* =========================================================\n   Nombramientos (Poder Digital)\n   ========================================================= *\/\n.nomb-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:12px}\n.nomb-list-grid{display:grid;grid-template-columns:1fr;gap:14px}\n@media(min-width:780px){.nomb-list-grid{grid-template-columns:1fr 1fr}}\n.nomb-item{\n  display:flex;align-items:flex-start;gap:16px;\n  padding:22px;background:#fff;\n  border:1px solid var(--line);border-radius:var(--radius-sm);\n  transition:all .18s ease;\n  position:relative;\n}\n.nomb-item::before{\n  content:\"\";position:absolute;left:0;top:22px;bottom:22px;width:3px;\n  background:var(--orange);border-radius:3px;opacity:0;transition:opacity .18s ease;\n}\n.nomb-item:hover{\n  border-color:var(--navy);\n  box-shadow:0 8px 24px rgba(31,37,71,.08);\n  transform:translateY(-2px);\n}\n.nomb-item:hover::before{opacity:1}\n.nomb-item .badge{\n  flex:0 0 auto;width:48px;height:48px;border-radius:50%;\n  background:linear-gradient(135deg, var(--navy) 0%, var(--navy-light) 100%);\n  color:#fff;\n  display:flex;align-items:center;justify-content:center;\n  font-weight:700;font-size:.9rem;\n  font-family:var(--font-display);\n  box-shadow:0 4px 10px rgba(31,37,71,.18);\n}\n.nomb-item .body{flex:1;min-width:0}\n.nomb-item .name{\n  font-family:var(--font-display);\n  font-weight:700;font-size:1rem;\n  margin:0 0 6px;color:var(--navy);line-height:1.25;\n  letter-spacing:-.01em;\n}\n.nomb-item .cargo{font-size:.88rem;color:var(--ink-soft);margin:0;line-height:1.5}\n.nomb-item time{\n  font-size:.72rem;color:var(--muted);\n  display:inline-block;margin-top:10px;\n  text-transform:uppercase;letter-spacing:.06em;font-weight:600;\n}\n.nomb-item a{\n  display:inline-block;margin-top:8px;\n  color:var(--navy);text-decoration:none;\n  font-size:.78rem;font-weight:600;\n}\n.nomb-item a:hover{color:var(--orange)}\n\n\/* =========================================================\n   Leyes \/ stepper (PolicyAlert)\n   ========================================================= *\/\n.ley{\n  padding:24px 26px;margin-bottom:14px;\n  border:1px solid var(--line);border-radius:var(--radius-sm);\n  background:#fff;transition:all .18s ease;\n}\n.ley:last-child{margin-bottom:0}\n.ley:hover{\n  border-color:var(--navy);\n  box-shadow:0 8px 24px rgba(31,37,71,.08);\n  transform:translateY(-2px);\n}\n.ley .ley-title{\n  font-family:var(--font-display);\n  font-weight:700;font-size:1.05rem;\n  color:var(--navy);display:block;margin-bottom:8px;\n  letter-spacing:-.015em;line-height:1.35;\n  text-decoration:none;\n}\n.ley .ley-meta{font-size:1.1rem;color:var(--ink-soft);margin:0 0 18px;line-height:1.5}\n.ley .ley-meta strong{color:var(--navy);font-weight:700}\n.stepper{display:flex;flex-wrap:wrap;align-items:flex-start;width:100%;gap:2px 0}\n.stepper .step{\n  flex:1 1 auto;min-width:60px;text-align:center;position:relative;\n  font-size:.64rem;color:var(--muted);padding:0 4px;\n  text-transform:uppercase;letter-spacing:.04em;font-weight:600;\n}\n.stepper .step .dot{\n  width:12px;height:12px;border-radius:50%;\n  background:var(--line);border:2px solid #fff;\n  margin:0 auto 6px;position:relative;z-index:1;\n  box-shadow:0 0 0 1px var(--line);\n}\n.stepper .step.done .dot{background:var(--good);box-shadow:0 0 0 1px var(--good)}\n.stepper .step.current .dot{\n  background:var(--orange);\n  box-shadow:0 0 0 1px var(--orange), 0 0 0 4px rgba(243,165,58,.25);\n  width:14px;height:14px;\n}\n.stepper .step.done,.stepper .step.current{color:var(--ink)}\n.stepper .step.current{font-weight:700;color:var(--navy)}\n.stepper .step::before{content:\"\";position:absolute;top:5px;left:0;right:50%;height:2px;background:var(--line);z-index:0}\n.stepper .step::after{content:\"\";position:absolute;top:5px;left:50%;right:0;height:2px;background:var(--line);z-index:0}\n.stepper .step.done::before,.stepper .step.done::after{background:var(--good)}\n.stepper .step.current::before{background:var(--good)}\n.stepper .step:first-child::before{display:none}\n.stepper .step:last-child::after{display:none}\n\n\/* =========================================================\n   KPIs (PolicyAlert)\n   ========================================================= *\/\n.kpi-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin:8px 0 0}\n@media(min-width:760px){.kpi-grid{grid-template-columns:repeat(4,1fr)}}\n.kpi-card{\n  padding:24px 22px;background:#fff;\n  border:1px solid var(--line);border-radius:var(--radius-sm);\n  display:flex;flex-direction:column;gap:6px;\n  position:relative;overflow:hidden;\n  transition:all .18s ease;\n}\n.kpi-card::before{\n  content:\"\";position:absolute;top:0;left:0;right:0;height:3px;\n  background:var(--navy);\n}\n.kpi-card.accent::before{background:var(--orange)}\n.kpi-card.green::before{background:var(--good)}\n.kpi-card.purple::before{background:#7C3AED}\n.kpi-card:hover{box-shadow:0 12px 28px rgba(31,37,71,.08);transform:translateY(-2px)}\n.kpi-label{\n  font-size:1.1rem;color:var(--muted);\n  text-transform:uppercase;letter-spacing:.08em;font-weight:700;margin:0;\n}\n.kpi-value{\n  font-family:var(--font-display);\n  font-size:2.4rem;font-weight:800;\n  color:var(--navy);line-height:1;margin:6px 0 2px;\n  letter-spacing:-.03em;font-variant-numeric:tabular-nums;\n}\n.kpi-card.accent .kpi-value{color:var(--orange)}\n.kpi-card.green .kpi-value{color:var(--good)}\n.kpi-card.purple .kpi-value{color:#7C3AED}\n.kpi-sub{font-size:.8rem;color:var(--ink-soft);margin:0;line-height:1.4}\n\n\/* =========================================================\n   Temas conversaci\u00f3n (WATS): filtros, leyenda, chart\n   ========================================================= *\/\n.tc-meta{\n  font-size:1.25rem;color:var(--muted);margin:8px 0 0;\n  font-weight:500;\n}\n.tc-filters{\n  display:flex;flex-wrap:wrap;gap:6px;\n  margin:20px 0 24px;\n  padding:0 0 18px;border-bottom:1px solid var(--line);\n}\n.tc-filters button{\n  border:1px solid var(--line);background:#fff;\n  color:var(--ink-soft);\n  padding:8px 16px;border-radius:999px;\n  cursor:pointer;font-size:1.1rem;font-weight:600;\n  transition:all .15s ease;line-height:1.2;\n  font-family:var(--font-display);\n}\n.tc-filters button:hover{border-color:var(--navy);color:var(--navy)}\n.tc-filters button.active{\n  background:var(--navy);color:#fff;border-color:var(--navy);\n  box-shadow:0 2px 8px rgba(31,37,71,.16);\n}\n.tc-filters button[disabled]{opacity:.35;cursor:not-allowed}\n.tc-chart-wrap{position:relative;min-height:380px;margin-bottom:16px}\n.tc-legend{\n  display:flex;flex-wrap:wrap;gap:18px;align-items:center;\n  padding:14px 18px;background:var(--bg-alt);\n  border:1px solid var(--line-soft);\n  border-radius:var(--radius-sm);\n  font-size:.8rem;color:var(--ink-soft);\n}\n.tc-legend .lg{display:inline-flex;align-items:center;gap:8px;font-weight:500}\n.tc-legend .sw{width:12px;height:12px;border-radius:3px;display:inline-block}\n\n\/* =========================================================\n   Temas activos (PolicyAlert)\n   ========================================================= *\/\n.temas-act-wrap{position:relative;height:340px;margin:14px 0 14px}\n.temas-act-summary{\n  display:flex;flex-wrap:wrap;gap:10px;align-items:center;\n  margin-bottom:14px;font-size:.88rem;color:var(--ink-soft);\n}\n.temas-act-summary .pill{\n  background:var(--orange);color:var(--navy);\n  padding:6px 14px;border-radius:999px;\n  font-weight:700;font-size:.78rem;\n  font-family:var(--font-display);letter-spacing:.01em;\n}\n.temas-act-legend{\n  display:flex;flex-wrap:wrap;gap:8px;\n  margin-top:14px;padding-top:18px;border-top:1px solid var(--line);\n}\n.temas-act-legend .ta-tag{\n  display:inline-flex;align-items:center;gap:7px;\n  padding:7px 14px;\n  border:1px solid var(--line);border-radius:999px;\n  background:#fff;cursor:pointer;\n  font-family:var(--font-display);\n  font-size:.78rem;font-weight:600;color:var(--ink);\n  transition:all .14s ease;user-select:none;line-height:1.2;\n}\n.temas-act-legend .ta-tag:hover{border-color:var(--navy)}\n.temas-act-legend .ta-tag .sw{width:10px;height:10px;border-radius:50%;display:inline-block;flex-shrink:0;border:1.5px solid transparent}\n.temas-act-legend .ta-tag.off{opacity:.45;background:var(--bg-alt);text-decoration:line-through;color:var(--muted)}\n.temas-act-legend .ta-tag.off .sw{border-color:var(--muted);background:transparent !important}\n.temas-act-legend .ta-actions{display:inline-flex;gap:8px;margin-left:auto;align-items:center;font-size:.78rem}\n.temas-act-legend .ta-actions a{color:var(--navy);font-weight:700;cursor:pointer;text-decoration:none;font-family:var(--font-display)}\n.temas-act-legend .ta-actions a:hover{color:var(--orange)}\n.temas-act-legend .ta-actions span{color:var(--muted)}\n\n\/* =========================================================\n   FAQ\n   ========================================================= *\/\n.faq-section{\n  margin:0 0 40px;padding:56px 48px;\n  background:var(--card);border:1px solid var(--line);\n  border-radius:var(--radius);box-shadow:var(--shadow);\n}\n@media(max-width:768px){.faq-section{padding:36px 24px}}\n.faq-section > h2{\n  font-family:var(--font-display);\n  font-size:clamp(1.8rem,2.6vw,2.3rem);color:var(--navy);\n  font-weight:800;margin:0 0 14px;letter-spacing:-.025em;line-height:1.1;\n  text-wrap:balance;\n}\n.faq-intro{font-size:1.05rem;color:var(--ink-soft);margin:0 0 36px;line-height:1.6;max-width:62ch}\n.faq-block{margin-bottom:36px;padding-top:32px;border-top:1px solid var(--line);scroll-margin-top:24px}\n.faq-block:first-of-type{border-top:0;padding-top:0}\n.faq-block-title{\n  font-family:var(--font-display);\n  font-size:1.35rem;color:var(--navy);\n  font-weight:800;margin:0 0 22px;letter-spacing:-.015em;\n  display:flex;align-items:center;gap:14px;flex-wrap:wrap;\n}\n.faq-badge{\n  display:inline-block;\n  background:var(--navy);color:#fff;\n  font-family:var(--font-display);\n  font-size:.68rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;\n  padding:5px 12px;border-radius:999px;\n}\n.faq-badge.brand{background:var(--orange);color:var(--navy)}\n.faq-list{display:grid;grid-template-columns:1fr;gap:10px}\n@media(min-width:1100px){.faq-list{grid-template-columns:1fr 1fr;gap:10px 24px}}\n.faq-list details{\n  border:1px solid var(--line);border-radius:var(--radius-sm);\n  background:#fff;transition:all .18s ease;overflow:hidden;\n}\n.faq-list details:hover{border-color:var(--navy-light);box-shadow:0 4px 14px rgba(31,37,71,.06)}\n.faq-list details[open]{border-color:var(--navy);box-shadow:0 8px 24px rgba(31,37,71,.10)}\n.faq-list details summary{\n  padding:16px 22px;cursor:pointer;font-weight:600;\n  color:var(--ink);font-size:1.45rem;list-style:none;line-height:1.45;\n}\n.faq-list details summary::after{\n  content:\"+\";float:right;font-weight:300;color:var(--orange);\n  font-size:1.6rem;line-height:.7;margin-left:8px;transition:transform .2s ease;\n}\n.faq-list details[open] summary::after{content:\"\\2212\";color:var(--navy)}\n.faq-list details p{padding:0 22px 18px;margin:0;font-size:.9rem;color:var(--ink-soft);line-height:1.7}\n.faq-list details p a{color:var(--navy);font-weight:700}\n\n\/* =========================================================\n   SEO block \u2014 texto largo indexable\n   ========================================================= *\/\n.seo-block{\n  margin:0 0 32px;padding:56px 48px;\n  background:var(--card);border:1px solid var(--line);\n  border-radius:var(--radius);box-shadow:var(--shadow);\n}\n@media(max-width:768px){.seo-block{padding:36px 24px}}\n.seo-block h2{\n  font-family:var(--font-display);\n  font-size:clamp(1.7rem,2.4vw,2.1rem);color:var(--navy);\n  font-weight:800;margin:0 0 32px;letter-spacing:-.025em;\n  padding-bottom:18px;border-bottom:3px solid var(--orange);\n  line-height:1.15;display:inline-block;\n}\n.seo-grid{display:grid;grid-template-columns:1fr;gap:40px;margin-top:0}\n@media(min-width:960px){.seo-grid{grid-template-columns:1fr 1fr;gap:48px}}\n.seo-item h3{\n  font-family:var(--font-display);\n  font-size:1.25rem;color:var(--navy);font-weight:800;\n  margin:0 0 14px;line-height:1.25;letter-spacing:-.015em;\n}\n.seo-item h4{\n  font-family:var(--font-display);\n  font-size:.78rem;color:var(--orange);font-weight:700;\n  margin:24px 0 12px;text-transform:uppercase;letter-spacing:.12em;\n}\n.seo-item h4::before{content:\"\/\/ \"}\n.seo-item p{font-size:1rem;color:var(--ink-soft);margin:0 0 14px;line-height:1.75}\n.seo-item p strong{color:var(--ink);font-weight:600}\n.seo-item a{color:var(--navy);font-weight:600;text-decoration:none;border-bottom:1px solid currentColor}\n.seo-item a:hover{color:var(--orange)}\n.seo-table{\n  width:100%;border-collapse:collapse;font-size:.86rem;margin-top:12px;\n  background:#fff;border:1px solid var(--line);border-radius:var(--radius-sm);overflow:hidden;\n}\n.seo-table caption{\n  text-align:left;padding:14px 16px;background:var(--navy);color:#fff;\n  font-family:var(--font-display);font-weight:700;font-size:1.25rem;\n  letter-spacing:-.005em;\n}\n.seo-table th,.seo-table td{padding:12px 16px;text-align:left;border-bottom:1px solid var(--line)}\n.seo-table th{\n  background:var(--bg-alt);color:var(--ink);\n  font-family:var(--font-display);font-weight:700;\n  font-size:.76rem;text-transform:uppercase;letter-spacing:.06em;\n}\n.seo-table tr:last-child td{border-bottom:0}\n.seo-table tr:nth-child(even){background:#FAFBFC}\n.seo-table .muted-cell{color:var(--muted);font-style:italic;text-align:center;padding:20px}\n\n\/* =========================================================\n   Utilidades + estados\n   ========================================================= *\/\n.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n.skeleton{background:linear-gradient(90deg,#F1F5F9 25%,#E2E8F0 50%,#F1F5F9 75%);background-size:200% 100%;animation:sk 1.4s infinite;border-radius:6px;color:transparent}\n@keyframes sk{0%{background-position:200% 0}100%{background-position:-200% 0}}\n.error{\n  background:#FEF2F2;border:1px solid #FECACA;color:#991B1B;\n  padding:14px 18px;border-radius:var(--radius-sm);font-size:.92rem;line-height:1.55;\n}\n.empty{color:var(--muted);font-size:.9rem;font-style:italic}\n\n\/* Di\u00e1logos (snippets) *\/\ndialog.snippets{border:none;border-radius:var(--radius);padding:0;max-width:560px;width:90%;box-shadow:var(--shadow-lg)}\ndialog.snippets::backdrop{background:rgba(22,26,54,.55)}\ndialog.snippets .head{padding:20px 24px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;gap:12px}\ndialog.snippets .head h3{margin:0;font-size:1.05rem;color:var(--navy);font-family:var(--font-display);font-weight:800}\ndialog.snippets .head button{border:0;background:transparent;font-size:1.5rem;cursor:pointer;color:var(--ink-soft)}\ndialog.snippets .body{padding:20px 24px;max-height:50vh;overflow:auto}\ndialog.snippets blockquote{margin:0 0 14px;padding:14px 18px;border-left:3px solid var(--orange);background:var(--bg-alt);border-radius:6px;font-size:.92rem;color:var(--ink-soft)}\n\n\/* Heatmap (por si lo activan) *\/\n.hm-meta{display:flex;flex-wrap:wrap;gap:10px;align-items:center;font-size:.84rem;color:var(--ink-soft);margin-bottom:16px}\n.hm-meta .pill{background:var(--navy);color:#fff;padding:5px 14px;border-radius:999px;font-weight:600;font-size:.74rem;font-family:var(--font-display)}\n.hm-scroll{overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;max-width:100%}\n\n\/* Hemiciclo *\/\n.hemi-wrap{position:relative;width:100%;max-width:580px;margin:0 auto}\n.hemi-wrap svg{width:100%;height:auto;display:block}\n.hemi-totals{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:16px 0 16px}\n.hemi-total{padding:14px 12px;border-radius:var(--radius-sm);background:#fff;border:1px solid var(--line);text-align:center}\n.hemi-total .lbl{font-size:.68rem;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;font-weight:700}\n.hemi-total .val{font-family:var(--font-display);font-size:1.4rem;font-weight:800;display:block;margin-top:4px;color:var(--navy);letter-spacing:-.02em}\n.hemi-total.yes .val{color:#16A34A}\n.hemi-total.no .val{color:#DC2626}\n.hemi-total.abs .val{color:var(--orange)}\n\n\/* Pregunta del d\u00eda *\/\n.pregunta-card{\n  padding:26px 28px;background:#fff;\n  border:1px solid var(--line);border-radius:var(--radius-sm);\n  border-top:4px solid var(--orange);\n}\n.pregunta-meta{font-size:.72rem;color:var(--muted);margin-bottom:10px;text-transform:uppercase;letter-spacing:.08em;font-weight:700;font-family:var(--font-display)}\n.pregunta-q{\n  font-family:var(--font-display);font-size:1.2rem;font-weight:800;\n  color:var(--navy);margin:0 0 14px;line-height:1.3;letter-spacing:-.015em;\n}\n.pregunta-a{font-size:1.45rem;color:var(--ink);line-height:1.7;border-left:3px solid var(--navy);padding:4px 0 4px 18px;margin-top:6px}\n\n\n\n\/* ==========================================================\n   AJUSTES UX (compact hero \u00b7 loading pill a la derecha \u00b7\n   sin aside repetido) \u2014 aplicado a todos los productos\n   ========================================================== *\/\n.vc-hero{\n  padding:42px 24px 34px !important;\n}\n.vc-hero::before{opacity:.85}\n.vc-hero-inner{\n  gap:18px;\n  align-items:center !important;\n}\n@media(min-width:880px){\n  .vc-hero-inner{\n    grid-template-columns:minmax(0,1fr) auto !important;\n    align-items:center !important;\n    gap:32px;\n  }\n}\n.vc-kicker{\n  margin:0 0 10px !important;\n  font-size:.72rem !important;\n  letter-spacing:.16em !important;\n}\n.vc-hero h1{\n  font-size:clamp(1.65rem,3.2vw,2.4rem) !important;\n  margin:0 0 10px !important;\n  line-height:1.08 !important;\n  letter-spacing:-.02em !important;\n}\n.vc-hero-lead{\n  font-size:clamp(.92rem,1.05vw,1rem) !important;\n  margin:0 !important;\n  max-width:72ch;\n  line-height:1.5 !important;\n}\n\n\/* Columna derecha: pill arriba, CTA debajo *\/\n.vc-hero-right{\n  display:flex;flex-direction:column;align-items:flex-end;gap:12px;\n}\n.vc-hero-cta{\n  padding:11px 14px 11px 22px !important;\n  font-size:.88rem !important;\n  align-self:flex-end !important;\n}\n.vc-hero-cta .ico{width:26px;height:26px;font-size:.85rem}\n\n\/* WATS no tiene logo propio: cartel \"WATS\" no clicable (en lugar del bot\u00f3n-logo) *\/\n.vc-hero-wordmark{\n  align-self:flex-end;\n  font-family:var(--font-display);\n  font-weight:800;\n  font-size:clamp(2rem,3vw,2.6rem);\n  letter-spacing:-.03em;\n  line-height:1;\n  color:#fff;\n  user-select:none;\n}\n.vc-hero-wordmark::after{\n  content:\"\";\n  display:block;\n  width:42px;height:4px;border-radius:999px;\n  margin-top:10px;\n  background:var(--orange);\n}\n@media(max-width:879px){.vc-hero-wordmark{align-self:flex-start}}\n\n\/* Loading \/ \"Actualizado\u2026\" pill \u2014 sin posici\u00f3n absoluta *\/\n.vc-hero #updated-pill{\n  position:static !important;\n  display:inline-flex;align-items:center;gap:8px;\n  background:rgba(255,255,255,.06) !important;\n  border:1px solid rgba(255,255,255,.16) !important;\n  color:rgba(255,255,255,.82) !important;\n  padding:5px 12px;border-radius:999px;\n  font-size:1.1rem;letter-spacing:.04em;\n  margin:0 !important;\n  max-width:min(80vw,360px);\n  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;\n  align-self:flex-end;\n}\n.vc-hero #updated-pill .dot{\n  width:7px;height:7px;border-radius:50%;\n  background:#4ADE80;\n  box-shadow:0 0 0 3px rgba(74,222,128,.16);\n  flex-shrink:0;\n}\n.vc-hero #updated-pill.err{\n  background:rgba(252,165,165,.08) !important;\n  border-color:rgba(252,165,165,.28) !important;\n  color:#FCA5A5 !important;\n}\n.vc-hero #updated-pill.err .dot{\n  background:#FCA5A5;\n  box-shadow:0 0 0 3px rgba(252,165,165,.18);\n}\n@media(max-width:879px){\n  .vc-hero{padding:32px 18px 26px !important;}\n  .vc-hero-right{flex-direction:row;flex-wrap:wrap;align-items:center;gap:10px;align-self:flex-start}\n  .vc-hero #updated-pill{align-self:auto}\n}\n\n\/* Quitar la aside \"product-info\" que repite los textos del hero \u00b7 grid a 1 columna *\/\n.product-grid .product-info,\n.product-grid.reverse .product-info{\n  display:none !important;\n}\n.product-grid,\n.product-grid.reverse{\n  grid-template-columns:1fr !important;\n}\n.product-grid > .product-content{\n  order:1 !important;\n  border:0 !important;\n}\n\n\/* Acercar los gr\u00e1ficos al header *\/\n.wrap{padding-top:32px !important;}\n@media(max-width:768px){.wrap{padding-top:22px !important}}\n\n\/* Asegurar que los gr\u00e1ficos aprovechan todo el ancho ahora disponible *\/\n.temas-act-wrap,\n.tc-chart-wrap{width:100% !important;}\n.temas-act-wrap canvas,\n.tc-chart-wrap canvas{\n  width:100% !important;\n  max-width:100% !important;\n}\n\n\/* ==========================================================\n   WATS \u00b7 Layout dos columnas (CTA izquierda, viz derecha)\n   ========================================================== *\/\n.wats-section{padding:0 !important;overflow:hidden}\n.wats-split{\n  display:grid;\n  grid-template-columns:1fr;\n  gap:0;\n}\n@media(min-width:980px){\n  .wats-split{grid-template-columns:380px minmax(0,1fr)}\n}\n.wats-cta{\n  background:linear-gradient(165deg,#1F2547 0%, #161A36 55%, #2A3158 100%);\n  color:#fff;\n  padding:44px 36px;\n  display:flex;flex-direction:column;gap:22px;\n  position:relative;overflow:hidden;\n}\n.wats-cta::before{\n  content:\"\";position:absolute;inset:0;pointer-events:none;\n  background:\n    radial-gradient(circle at 85% 12%, rgba(243,165,58,.18), transparent 50%),\n    radial-gradient(circle at 10% 95%, rgba(31,168,134,.14), transparent 55%);\n}\n.wats-cta > *{position:relative;z-index:1}\n.wats-cta-eyebrow{\n  color:#F3A53A;\n  font-family:var(--font-display);\n  font-weight:700;font-size:.72rem;\n  letter-spacing:.16em;text-transform:uppercase;\n}\n.wats-cta-title{\n  font-family:var(--font-display);\n  font-size:clamp(1.4rem,2.1vw,1.85rem);\n  font-weight:800;letter-spacing:-.025em;line-height:1.1;\n  margin:0;color:#fff;text-wrap:balance;\n}\n.wats-cta-lead{\n  font-size:1.45rem;line-height:1.6;margin:0;\n  color:rgba(255,255,255,.78);\n}\n.wats-cta-lead strong{color:#fff;font-weight:600}\n.wats-cta-bullets{\n  list-style:none;margin:0;padding:0;\n  display:flex;flex-direction:column;gap:12px;\n  font-size:.88rem;color:rgba(255,255,255,.82);\n  line-height:1.5;\n}\n.wats-cta-bullets li{\n  display:flex;gap:12px;align-items:flex-start;\n  padding:12px 14px;\n  background:rgba(255,255,255,.04);\n  border:1px solid rgba(255,255,255,.08);\n  border-radius:10px;\n}\n.wats-cta-bullets li strong{color:#fff;font-weight:700}\n.wats-cta-dot{\n  flex-shrink:0;width:10px;height:10px;border-radius:50%;\n  margin-top:6px;\n  box-shadow:0 0 0 3px rgba(255,255,255,.08);\n}\n.wats-cta-actions{\n  display:flex;gap:14px;align-items:center;flex-wrap:wrap;\n  margin-top:4px;\n}\n.wats-cta-btn{\n  display:inline-flex;align-items:center;gap:12px;\n  background:#fff;color:#1F2547;\n  padding:12px 14px 12px 22px;\n  border-radius:999px;\n  text-decoration:none;\n  font-family:var(--font-display);\n  font-weight:700;font-size:.88rem;\n  transition:transform .15s ease, box-shadow .2s ease;\n}\n.wats-cta-btn:hover{transform:translateY(-2px);box-shadow:0 10px 24px rgba(0,0,0,.3)}\n.wats-cta-btn .ico{\n  width:26px;height:26px;border-radius:50%;\n  background:#1F2547;color:#fff;\n  display:inline-flex;align-items:center;justify-content:center;\n  font-size:1.25rem;transition:transform .2s ease;\n}\n.wats-cta-btn:hover .ico{transform:rotate(-12deg)}\n.wats-cta-link{\n  color:rgba(255,255,255,.82);text-decoration:none;\n  font-family:var(--font-display);font-weight:600;font-size:.86rem;\n  border-bottom:1px solid rgba(255,255,255,.3);padding-bottom:2px;\n}\n.wats-cta-link:hover{color:#fff;border-color:#fff}\n.wats-cta-stats{\n  display:grid;grid-template-columns:repeat(3,1fr);gap:14px;\n  margin-top:8px;\n  padding-top:22px;\n  border-top:1px solid rgba(255,255,255,.1);\n}\n.wats-stat .num{\n  display:block;font-family:var(--font-display);\n  font-size:1.6rem;font-weight:800;color:#fff;\n  letter-spacing:-.02em;line-height:1;\n}\n.wats-stat .lbl{\n  display:block;margin-top:6px;\n  font-size:.85rem;color:rgba(255,255,255,.6);\n  text-transform:uppercase;letter-spacing:.1em;font-weight:600;\n}\n\n\/* Panel derecho: contenido (filtros + viz) *\/\n.wats-chart-panel{padding:36px 36px 36px !important}\n@media(max-width:760px){.wats-chart-panel{padding:26px 22px !important}}\n\n\/* WATS \u00b7 ocultar hero completo: todo se integra en el panel CTA izquierdo *\/\n.wats-hero-hidden{display:none !important}\n\n\/* Meta resumen dentro del panel CTA \u2014 pills compactos *\/\n.wats-cta-meta{\n  list-style:none;margin:6px 0 0;padding:18px 0 0;\n  border-top:1px solid rgba(255,255,255,.1);\n  display:flex;flex-wrap:wrap;gap:8px;\n}\n.wats-cta-meta li{\n  display:inline-flex;align-items:center;gap:8px;\n  padding:6px 11px;\n  background:rgba(255,255,255,.05);\n  border:1px solid rgba(255,255,255,.1);\n  border-radius:999px;\n  font-size:.74rem;color:rgba(255,255,255,.78);\n  font-weight:600;letter-spacing:.01em;\n  font-family:var(--font-display);\n}\n.wats-cta-meta li b{\n  color:#fff;font-weight:800;\n  font-variant-numeric:tabular-nums;\n}\n.wats-cta-meta li svg{\n  width:13px;height:13px;flex-shrink:0;\n  color:var(--orange);opacity:.95;\n}\n\n\/* Eliminar el aside product-info hu\u00e9rfano que sigue dentro de .wats-split *\/\n.wats-split .product-info{display:none !important}\n\n\/* Pill \"Actualizado\u2026\" dentro del panel CTA \u2014 estilo oscuro consistente *\/\n.wats-cta-pill{\n  display:inline-flex;align-items:center;gap:8px;\n  background:rgba(255,255,255,.06);\n  border:1px solid rgba(255,255,255,.16);\n  color:rgba(255,255,255,.82);\n  padding:6px 13px;border-radius:999px;\n  font-size:1.1rem;letter-spacing:.04em;\n  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;\n  max-width:280px;\n}\n.wats-cta-pill .dot{\n  width:7px;height:7px;border-radius:50%;\n  background:#4ADE80;flex-shrink:0;\n  box-shadow:0 0 0 3px rgba(74,222,128,.16);\n}\n.wats-cta-pill.err{\n  background:rgba(252,165,165,.08);\n  border-color:rgba(252,165,165,.28);\n  color:#FCA5A5;\n}\n.wats-cta-pill.err .dot{background:#FCA5A5;box-shadow:0 0 0 3px rgba(252,165,165,.18)}\n\n\/* Quitar header repetitivo del panel derecho *\/\n.wats-chart-panel .product-content-header{display:none !important}\n.wats-chart-panel .tc-filters{margin-top:0 !important}\n\n\/* Lista de temas (sustituye al canvas) *\/\n.tc-chart-wrap{\n  position:relative;\n  height:auto !important;\n  min-height:0 !important;\n  max-height:560px;\n  overflow-y:auto;overflow-x:hidden;\n  padding:4px 6px 4px 0;\n  margin:0 0 14px;\n  scrollbar-width:thin;\n  scrollbar-color:#cfd4df transparent;\n}\n.tc-chart-wrap::-webkit-scrollbar{width:8px}\n.tc-chart-wrap::-webkit-scrollbar-thumb{background:#cfd4df;border-radius:8px}\n.tc-chart-wrap canvas{display:none !important}\n.tc-topics-list{display:flex;flex-direction:column;gap:8px}\n.tc-topic{\n  display:grid;\n  grid-template-columns:auto minmax(0,1fr) auto;\n  align-items:center;gap:14px;\n  padding:10px 14px;\n  background:#fff;\n  border:1px solid var(--line);\n  border-left:4px solid var(--c, #6B7280);\n  border-radius:8px;\n  transition:transform .15s ease, box-shadow .2s ease, border-color .15s;\n  cursor:default;\n}\n.tc-topic:hover{\n  transform:translateX(2px);\n  box-shadow:0 6px 18px rgba(31,37,71,.08);\n  border-color:var(--c, #6B7280);\n}\n.tc-topic .tc-rank{\n  font-family:var(--font-display);font-variant-numeric:tabular-nums;\n  font-size:.78rem;font-weight:700;\n  color:var(--muted);\n  width:24px;text-align:center;\n}\n.tc-topic .tc-body{min-width:0;display:flex;flex-direction:column;gap:5px}\n.tc-topic .tc-topic-name{\n  font-weight:600;color:var(--ink);\n  font-size:.92rem;line-height:1.35;\n  text-overflow:ellipsis;overflow:hidden;\n  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;\n}\n.tc-topic .tc-bar{\n  position:relative;height:6px;\n  background:rgba(0,0,0,.05);border-radius:999px;overflow:hidden;\n  margin-top:2px;\n}\n.tc-topic .tc-bar .tc-fill{\n  display:block;height:100%;border-radius:999px;\n  background:var(--c, #6B7280);\n  transition:width .8s cubic-bezier(.2,.7,.2,1);\n}\n.tc-topic .tc-meta-line{\n  display:flex;gap:10px;align-items:center;flex-wrap:wrap;\n  font-size:1.1rem;color:var(--muted);\n  text-transform:uppercase;letter-spacing:.06em;font-weight:600;\n}\n.tc-topic .tc-meta-line .tc-ambito{\n  display:inline-flex;align-items:center;gap:5px;\n  color:var(--ink-soft);\n}\n.tc-topic .tc-meta-line .tc-ambito::before{\n  content:\"\";width:5px;height:5px;border-radius:50%;background:currentColor;opacity:.5;\n}\n.tc-topic .tc-sentiment{\n  font-size:.85rem;font-weight:800;letter-spacing:.08em;\n  text-transform:uppercase;\n  padding:3px 9px;border-radius:999px;\n  background:var(--c, #6B7280);color:#fff;\n  white-space:nowrap;\n}\n.tc-topic .tc-freq{\n  font-family:var(--font-display);font-variant-numeric:tabular-nums;\n  font-size:1.25rem;font-weight:800;\n  color:var(--c, #1F2547);\n  line-height:1;\n  display:flex;flex-direction:column;align-items:flex-end;\n  min-width:42px;\n}\n.tc-topic .tc-freq small{\n  font-size:.55rem;color:var(--muted);\n  text-transform:uppercase;letter-spacing:.1em;font-weight:600;\n  margin-top:3px;line-height:1;\n}\n@media(max-width:560px){\n  .tc-topic{grid-template-columns:auto 1fr auto;gap:10px;padding:10px 12px}\n  .tc-topic .tc-rank{display:none}\n  .tc-topic .tc-topic-name{font-size:.88rem}\n}\n\n\/* ==========================================================\n   WATS \u00b7 Treemap de tendencias (temas de conversaci\u00f3n) \u2014 Vinces\n   Namespaced bajo .wt-tree\n   ========================================================== *\/\n.wt-tree{--blue:var(--navy);--fd:var(--font-display);--fb:var(--font-body);--fm:ui-monospace,Menlo,monospace}\n.wt-tree .wt-hint{font-size:.92rem;color:var(--ink-soft);margin:0 0 18px;max-width:72ch;line-height:1.55}\n.wt-tree .wt-hint strong{color:var(--ink);font-weight:700}\n.wt-tree .filterbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 4px}\n.wt-tree .flabel{font-family:var(--fm);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-right:2px;min-width:88px;display:inline-block}\n.wt-tree .schip{display:inline-flex;align-items:center;gap:8px;font-family:var(--fb);font-weight:600;font-size:13px;border:1.5px solid var(--line);background:#fff;border-radius:999px;padding:7px 15px;cursor:pointer;transition:all .14s;color:var(--ink);white-space:nowrap}\n.wt-tree .filterbar .period-pill{display:none}\n.product-content-header .period-tag{display:inline-flex;align-items:center;gap:7px;align-self:flex-start;margin-top:5px;font-family:var(--fb);font-weight:500;font-size:13px;color:var(--muted);white-space:nowrap}\n.product-content-header .period-tag svg{width:15px;height:15px;color:var(--muted);flex:none}\n.product-content-header .period-tag b{color:var(--ink);font-weight:700}\n@media(max-width:620px){.product-content-header .period-tag{align-self:flex-start;margin-top:4px}}\n.wt-tree .schip .cdot{width:11px;height:11px;border-radius:50%}\n.wt-tree .metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin:26px 0 0}\n@media(max-width:980px){.wt-tree .metrics{grid-template-columns:repeat(2,1fr)}}\n@media(max-width:520px){.wt-tree .metrics{grid-template-columns:repeat(1,1fr)}}\n.wt-tree .metric{background:var(--bg-alt);border-radius:14px;padding:14px 16px;text-align:center}\n.wt-tree .metric .k{font-family:var(--fm);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:0 0 8px}\n.wt-tree .metric .v{font-family:var(--fd);font-weight:800;font-size:24px;line-height:1.05;color:var(--blue)}\n.wt-tree .metric .v small{font-family:var(--fb);font-weight:500;font-size:12px;color:var(--ink-soft);display:block;margin-top:6px;letter-spacing:0;text-transform:none;line-height:1.35}\n.wt-tree .metric .split{margin-top:4px}\n.wt-tree .metric .split-bar{display:flex;height:11px;border-radius:999px;overflow:hidden;background:var(--line)}\n.wt-tree .metric .split-bar span{display:block;height:100%;transition:filter .15s}\n.wt-tree .metric .split-bar .seg{cursor:default}\n.wt-tree .metric .split-bar .seg.hot{filter:brightness(1.16)}\n.wt-tree .metric .split-legend span{transition:color .15s,transform .15s;cursor:default}\n.wt-tree .metric .split-legend span b{display:none;font-weight:700;color:var(--ink);margin-left:3px;transition:color .15s}\n.wt-tree .metric .split-legend span.hot b{display:inline-block;color:var(--ink);font-weight:600;font-size:12px}\n.wt-tree .metric .split-legend span.hot i{transform:scale(1.3)}\n.wt-tree .metric .split-legend{display:flex;flex-wrap:wrap;justify-content:center;gap:5px 14px;margin-top:9px;font-family:var(--fb);font-weight:500;font-size:12px;color:var(--ink-soft);letter-spacing:0;text-transform:none;line-height:1.2}\n.wt-tree .metric .split-legend i{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:5px;vertical-align:middle}\n.wt-tree .top-ents{margin:18px 0 0;background:var(--bg-alt);border-radius:14px;padding:14px 16px}\n.wt-tree .top-ents .k{font-family:var(--fm);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:0 0 10px}\n.wt-tree .top-ents .k .mock{text-transform:none;letter-spacing:0;color:var(--ink-soft);font-family:var(--fb);font-weight:500}\n.wt-tree .top-ents ol{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:10px}\n.wt-tree .top-ents li{display:flex;align-items:center;gap:9px;background:#fff;border:1px solid var(--line);border-radius:999px;padding:6px 14px 6px 8px}\n.wt-tree .top-ents .ent{display:flex;flex-direction:column;line-height:1.15;min-width:0;max-width:210px}\n.wt-tree .top-ents .nm{font-family:var(--fb);font-weight:600;font-size:13px;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:210px}\n.wt-tree .top-ents .role{font-family:var(--fb);font-weight:500;font-size:11px;color:var(--ink-soft);margin-top:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:210px}\n.wt-tree .top-ents .rk{width:20px;height:20px;border-radius:50%;background:var(--blue);color:#fff;font-family:var(--fd);font-weight:800;font-size:11px;display:grid;place-items:center;flex:none}\n.wt-tree .top-ents .nm{font-family:var(--fb);font-weight:600;font-size:13px;color:var(--ink)}\n.wt-tree .top-ents .ct{font-family:var(--fm);font-size:12px;color:var(--ink-soft)}\n.wt-tree .top-ents li.ent-row{cursor:pointer;transition:border-color .14s,box-shadow .14s,transform .14s}\n.wt-tree .top-ents li.ent-row:hover{border-color:var(--blue);box-shadow:0 4px 14px rgba(31,37,71,.1);transform:translateY(-1px)}\n.wt-tree .top-ents li.ent-row:focus-visible{outline:2px solid var(--blue);outline-offset:2px}\n.wt-tree .top-ents .nm-orig-removed{}\n.wt-tree .metric .crit{display:flex;align-items:center;justify-content:center;gap:9px}\n\/* CTA banner siempre visible bajo el gr\u00e1fico \u2014 abre el modal de contacto *\/\n.wt-tree .wt-cta-bar{display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap;margin:22px 0 0;padding:20px 24px;border-radius:16px;background:linear-gradient(135deg,#1F2547 0%,#161A36 60%,#2A3158 100%);position:relative;overflow:hidden}\n.wt-tree .wt-cta-bar::before{content:\"\";position:absolute;inset:0;pointer-events:none;background:radial-gradient(circle at 90% 10%,rgba(243,165,58,.18),transparent 55%)}\n.wt-tree .wt-cta-txt{position:relative;z-index:1;color:rgba(255,255,255,.82);font-family:var(--fb);font-size:1.45rem;line-height:1.5;max-width:62ch}\n.wt-tree .wt-cta-txt strong{color:#fff;font-weight:700}\n.wt-tree .wt-cta-btn{position:relative;z-index:1;flex-shrink:0;display:inline-flex;align-items:center;gap:10px;border:0;cursor:pointer;background:var(--orange);color:var(--navy);font-family:var(--fd);font-weight:700;font-size:.92rem;padding:12px 24px;border-radius:999px;transition:transform .15s ease,box-shadow .2s ease,background .2s ease;box-shadow:0 6px 18px rgba(243,165,58,.28)}\n.wt-tree .wt-cta-btn:hover{transform:translateY(-1px);background:#f7b35a;box-shadow:0 10px 24px rgba(243,165,58,.4)}\n.wt-tree .wt-cta-btn .arr{transition:transform .18s ease}\n.wt-tree .wt-cta-btn:hover .arr{transform:translateX(3px)}\n@media(max-width:620px){.wt-tree .wt-cta-bar{flex-direction:column;align-items:flex-start}.wt-tree .wt-cta-btn{width:100%;justify-content:center}}\n.wt-tree .metric .climate{display:flex;flex-direction:column;gap:11px;margin-top:2px}\n.wt-tree .metric .climate-one{display:flex;flex-direction:column;align-items:center;gap:5px;margin-top:4px}\n.wt-tree .metric .climate-one .cl-top{display:flex;align-items:center;justify-content:center;gap:8px}\n.wt-tree .metric .climate-one .cl-ic{display:inline-flex;width:22px;height:22px;color:var(--navy)}\n.wt-tree .metric .climate-one .cl-ic svg{width:22px;height:22px;display:block}\n.wt-tree .metric .climate-one .cl-nm{font-family:var(--fd);font-weight:700;font-size:14px;color:var(--ink);line-height:1.15}\n.wt-tree .metric .climate-one .cl-pct{font-family:var(--fd);font-weight:600;font-size:15px;line-height:1}\n.wt-tree .metric .climate-one .cl-pct.pos{color:#3F875C}\n.wt-tree .metric .climate-one .cl-pct.neg{color:#C2564A}\n.wt-tree .metric .crit-ic{display:inline-flex;width:26px;height:26px;flex:none}\n.wt-tree .metric .crit-ic svg{width:26px;height:26px;display:block}\n.wt-modal{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;padding:20px;background:rgba(22,26,54,.55);opacity:0;visibility:hidden;transition:opacity .18s}\n.wt-modal.open{opacity:1;visibility:visible}\n.wt-modal .box{background:#fff;border-radius:18px;max-width:380px;width:100%;padding:28px;box-shadow:0 24px 60px rgba(31,37,71,.32);text-align:center;transform:translateY(10px);transition:transform .18s;font-family:var(--font-body)}\n.wt-modal.open .box{transform:none}\n.wt-modal h4{font-family:var(--font-display);font-weight:800;font-size:1.2rem;color:var(--navy);margin:0 0 8px}\n.wt-modal p{color:var(--ink-soft);font-size:1.45rem;line-height:1.55;margin:0 0 20px}\n.wt-modal .acts{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}\n.wt-modal a.cta{background:var(--navy);color:#fff;text-decoration:none;font-family:var(--font-display);font-weight:700;font-size:.9rem;padding:11px 20px;border-radius:10px}\n.wt-modal button.x{background:var(--bg-alt);border:1px solid var(--line);color:var(--ink);font-family:var(--font-display);font-weight:700;font-size:.9rem;padding:11px 18px;border-radius:10px;cursor:pointer}\n.wt-tree .tchips{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:20px 0 0}\n.wt-tree .tchip{font-family:var(--fb);font-weight:600;font-size:13px;border-radius:999px;padding:7px 16px;cursor:pointer;border:1.5px solid;background:#fff;transition:all .14s;white-space:nowrap}\n.wt-tree .tchip.on{box-shadow:0 0 0 3px rgba(0,0,0,.06)}\n.wt-tree .scope{font-family:var(--fm);font-size:12px;color:var(--muted);margin:22px 0 0}\n.wt-tree .intro{font-size:15px;color:var(--ink-soft);margin:8px 0 0;max-width:74ch}\n.wt-tree .treebox{position:relative}\n.wt-tree #canvas{position:relative;width:100%;height:520px;margin-top:14px}\n.wt-tree .box{position:absolute;border-radius:10px;overflow:hidden;padding:12px 14px;display:flex;flex-direction:column;cursor:pointer;transition:transform .14s cubic-bezier(.2,.8,.2,1),filter .14s ease}\n.wt-tree .box:hover{filter:brightness(.95);transform:translateY(-2px)}\n.wt-tree .box .lbl{font-family:var(--fd);font-weight:700;line-height:1.13;letter-spacing:-.01em}\n.wt-tree .box .num{font-family:var(--fm);font-size:11.5px;margin-top:6px;opacity:.9}\n.wt-tree .wt-empty{color:var(--muted);font-family:var(--fm);padding:32px 0;text-align:center}\n.wt-tree .pos .phead{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin:6px 0 0}\n.wt-tree .pos .phead .back{margin-top:0;flex:none}\n.wt-tree .pos .ptitle{font-family:var(--fd);font-weight:800;font-size:clamp(20px,3vw,28px);letter-spacing:-.015em;color:var(--ink);margin:0;line-height:1.2}\n.wt-tree .pos .pcrumb{font-family:var(--fm);font-size:12px;color:var(--muted);margin:10px 0 0}\n.wt-tree .ptags{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-top:12px}\n.wt-tree .ptag{display:inline-flex;align-items:center;gap:7px;font-family:var(--fm);font-size:12px;padding:5px 13px;border-radius:999px}\n.wt-tree .sentdot{width:10px;height:10px;border-radius:50%}\n.wt-tree .psummary{font-size:16px;color:var(--ink);max-width:74ch;margin:16px 0 0;line-height:1.65}\n.wt-tree .pmeta{font-family:var(--fm);font-size:13px;color:var(--ink-soft);margin:14px 0 2px}\n.wt-tree .pgroup{border:1px solid var(--line);border-radius:14px;padding:18px 20px;margin-top:14px}\n.wt-tree .pgroup h3{font-family:var(--fd);font-size:15px;margin:0;display:flex;align-items:center;gap:9px}\n.wt-tree .pgroup h3 .gd{width:12px;height:12px;border-radius:50%}\n.wt-tree .pstance{font-size:15px;color:var(--ink);margin:8px 0 14px;line-height:1.6;max-width:74ch}\n.wt-tree .orgs{display:flex;gap:8px;flex-wrap:wrap}\n.wt-tree .org{font-family:var(--fm);font-size:12px;color:var(--ink-soft);background:var(--bg-alt);border:1px solid var(--line);padding:5px 11px;border-radius:8px}\n.wt-tree .tops{display:flex;flex-direction:column;gap:10px;margin-top:12px;max-width:74ch}\n.wt-tree .pos .pos-grid{display:grid;grid-template-columns:1fr 1fr;gap:26px;align-items:start;margin-top:22px}\n@media(max-width:880px){.wt-tree .pos .pos-grid{grid-template-columns:1fr;gap:22px}}\n.wt-tree .pos .pdesc{display:grid;grid-template-columns:1.5fr 1fr;background:var(--bg-alt);border:1px solid var(--line);border-radius:14px;padding:0;margin:18px 0 0;overflow:hidden}\n@media(max-width:760px){.wt-tree .pos .pdesc{grid-template-columns:1fr}}\n.wt-tree .pos .pdesc .pdesc-col{padding:18px 20px}\n.wt-tree .pos .pdesc .pdesc-col + .pdesc-col{border-left:1px solid var(--line)}\n@media(max-width:760px){.wt-tree .pos .pdesc .pdesc-col + .pdesc-col{border-left:0;border-top:1px solid var(--line)}}\n.wt-tree .pos .pdesc .pdesc-h{font-family:var(--fd);font-weight:800;font-size:12px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);margin:0 0 8px}\n.wt-tree .pos .pdesc .psummary{margin:0;max-width:none}\n.wt-tree .pos .pdesc .pconcepts{margin:0;border-top:0;padding-top:18px}\n.wt-tree .pos .pdesc .pconcepts-h{display:block;font-family:var(--fm);font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:0 0 9px}\n.wt-tree .pos .pdesc .pconcepts-row{display:flex;flex-wrap:wrap;gap:8px}\n.wt-tree .pos .pdesc .pconcept{font-family:var(--fb);font-weight:600;font-size:12.5px;color:var(--navy);background:#fff;border:1px solid var(--line);border-radius:999px;padding:5px 13px;cursor:pointer;transition:border-color .14s,background .14s}\n.wt-tree .pos .pdesc .pconcept:hover{border-color:var(--navy);background:var(--navy-soft)}\n.wt-tree .pos .col-h{font-family:var(--fd);font-weight:800;font-size:12px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);margin:0 0 14px}\n.wt-tree .pos-left .pgroup{border:1px solid var(--line);border-left:4px solid var(--gc,var(--navy));background:#fff;border-radius:12px;padding:16px 18px;margin:0 0 14px;box-shadow:0 1px 2px rgba(31,37,71,.04)}\n.wt-tree .pos-left .pgroup:last-child{margin-bottom:0}\n.wt-tree .pos-right .tops{max-width:none;margin-top:0}\n.wt-tree .pos-right .top{min-height:120px;height:auto;overflow:hidden;background:var(--bg-alt);border:1px solid var(--line);border-radius:12px;padding:12px 15px;cursor:default}\n.wt-tree .pos-right .top .top-text{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin-top:6px}\n.wt-tree .pos-right .ver-mas{margin-top:14px;width:100%;background:#fff;border:1.5px solid var(--line);border-radius:10px;padding:11px;font-family:var(--fd);font-weight:700;font-size:.9rem;color:var(--navy);cursor:pointer;transition:border-color .14s,background .14s}\n.wt-tree .pos-right .ver-mas:hover{border-color:var(--navy);background:var(--bg-alt)}\n.wt-tree .top-head .top-dot{display:inline-block;width:10px;height:10px;border-radius:50%;flex:none}\n.wt-tree .top{border:1px solid var(--line);border-radius:12px;padding:12px 15px;background:var(--bg-alt)}\n.wt-tree .top-head{display:flex;align-items:center;gap:9px;flex-wrap:wrap;font-size:13.5px}\n.wt-tree .top-head>strong{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}\n.wt-tree .top-head strong{font-weight:600}\n.wt-tree .top-net{font-family:var(--fm);font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;display:inline-flex;align-items:center}\n.wt-tree .top-net svg{width:15px;height:15px;display:block}\n.wt-tree .top-role{font-family:var(--fb);font-size:11.5px;font-weight:600;color:var(--ink-soft);background:var(--bg-alt);border:1px solid var(--line);border-radius:999px;padding:1px 9px;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.wt-tree .top-impact{font-family:var(--fm);font-size:12px;color:var(--blue);font-weight:700}\n.wt-tree .top-link{margin-left:auto;font-weight:600;font-size:12.5px;color:var(--blue);text-decoration:none;border:1px solid var(--line);border-radius:7px;padding:3px 9px}\n.wt-tree .top-text{font-size:14px;color:var(--ink);margin-top:8px;line-height:1.5}\n.wt-tree .back{display:inline-flex;align-items:center;gap:8px;margin-top:14px;font-family:var(--fb);font-weight:600;font-size:14px;color:var(--blue);background:none;border:1.5px solid var(--blue);border-radius:10px;padding:8px 16px;cursor:pointer}\n.wt-tree .back:hover{background:var(--blue);color:#fff}\n@media(max-width:720px){.wt-tree #canvas{height:560px}}\n\n\/* ==========================================================\n   HERO IMPACTO \u2014 titular grande, LIVE pulsante, malla + glow,\n   chips de alcance. Sobrescribe los ajustes \"compact\".\n   ========================================================== *\/\n.vc-hero{\n  padding:46px 24px 40px !important;\n  background:\n    radial-gradient(120% 140% at 85% -10%, var(--navy-light) 0%, var(--navy) 42%, var(--navy-deep) 100%) !important;\n}\n\/* Malla de puntos sutil sobre el navy *\/\n.vc-hero::before{\n  background:\n    radial-gradient(circle at 88% 12%, rgba(243,165,58,.16), transparent 42%),\n    radial-gradient(circle at 4% 100%, rgba(31,168,134,.10), transparent 52%),\n    radial-gradient(rgba(255,255,255,.05) 1px, transparent 1px) !important;\n  background-size:auto, auto, 22px 22px !important;\n  opacity:1 !important;\n}\n.vc-hero::after{\n  height:2px !important;\n  background:linear-gradient(90deg, transparent, var(--orange), transparent) !important;\n  opacity:.6;\n}\n.vc-hero-inner{\n  align-items:center !important;\n  gap:28px !important;\n}\n@media(min-width:880px){\n  .vc-hero-inner{\n    grid-template-columns:minmax(0,1fr) auto !important;\n    align-items:center !important;\n    gap:56px !important;\n  }\n}\n\n\/* Kicker con punto LIVE pulsante *\/\n.vc-kicker{\n  display:inline-flex !important;align-items:center;gap:9px;\n  margin:0 0 13px !important;\n  font-size:.72rem !important;\n  letter-spacing:.18em !important;\n  padding:6px 14px 6px 11px;\n  border:1px solid rgba(243,165,58,.32);\n  border-radius:999px;\n  background:rgba(243,165,58,.08);\n  color:var(--orange);\n}\n.vc-kicker::before{content:none !important}\n.vc-live-dot{\n  position:relative;width:8px;height:8px;border-radius:50%;\n  background:#4ADE80;flex-shrink:0;\n}\n.vc-live-dot::after{\n  content:\"\";position:absolute;inset:0;border-radius:50%;\n  background:#4ADE80;\n}\n@media(prefers-reduced-motion:no-preference){\n  .vc-live-dot::after{animation:vcLivePulse 1.8s ease-out infinite}\n}\n@keyframes vcLivePulse{\n  0%{transform:scale(1);opacity:.7}\n  70%{transform:scale(3);opacity:0}\n  100%{transform:scale(3);opacity:0}\n}\n\n\/* Titular grande con segunda l\u00ednea destacada *\/\n.vc-hero h1{\n  font-size:clamp(1.7rem,3.3vw,2.7rem) !important;\n  font-weight:800 !important;\n  line-height:1 !important;\n  letter-spacing:-.035em !important;\n  margin:0 0 14px !important;\n  white-space:nowrap;\n}\n.vc-hero h1 .hl{\n  position:relative;\n  color:var(--orange);\n  white-space:nowrap;\n}\n.vc-hero h1 .hl::after{\n  content:\"\";position:absolute;left:0;right:0;bottom:.04em;height:.09em;\n  background:linear-gradient(90deg,var(--orange),rgba(243,165,58,.15));\n  border-radius:999px;\n}\n\n.vc-hero-lead{\n  font-size:clamp(.9rem,1vw,1.02rem) !important;\n  color:rgba(255,255,255,.82) !important;\n  max-width:60ch !important;\n  line-height:1.58 !important;\n  margin:0 0 20px !important;\n}\n\n\/* Fila de chips de alcance *\/\n.vc-hero-chips{\n  display:flex;flex-wrap:wrap;gap:10px;margin:0;padding:0;list-style:none;\n}\n.vc-hero-chips li{\n  display:inline-flex;align-items:center;gap:8px;\n  font-family:var(--font-display);\n  font-size:1.1rem;font-weight:600;\n  color:rgba(255,255,255,.9);\n  background:rgba(255,255,255,.06);\n  border:1px solid rgba(255,255,255,.14);\n  padding:8px 14px;border-radius:999px;\n  backdrop-filter:blur(6px);\n  transition:transform .15s ease, border-color .15s ease, background .15s ease;\n}\n.vc-hero-chips li:hover{\n  transform:translateY(-2px);\n  border-color:rgba(243,165,58,.4);\n  background:rgba(243,165,58,.1);\n}\n.vc-hero-chips .chip-ico{\n  color:var(--orange);display:inline-flex;flex-shrink:0;\n}\n@media(prefers-reduced-motion:reduce){\n  .vc-hero-chips li:hover{transform:none}\n}\n\n\/* CTA m\u00e1s presente *\/\n.vc-hero-cta{\n  padding:14px 18px 14px 26px !important;\n  font-size:.95rem !important;\n  box-shadow:0 8px 24px rgba(0,0,0,.22);\n}\n.vc-hero-cta .ico{width:30px;height:30px;font-size:.95rem}\n\n@media(max-width:879px){\n  .vc-hero{padding:44px 18px 36px !important;}\n  .vc-hero h1{font-size:clamp(1.7rem,7vw,2.6rem) !important;white-space:normal}\n  .vc-hero h1 .hl{white-space:normal}\n}\n\n\/* ==========================================================\n   RUEDA VERTICAL (estilo cr\u00e9ditos) \u2014 rail derecho del hero\n   ========================================================== *\/\n\/* Rail: pill arriba, tarjeta de la rueda en medio, CTA abajo *\/\n.vc-hero-right{\n  gap:18px !important;\n  align-self:center !important;\n}\n\/* Tarjeta que enmarca la rueda *\/\n.vc-hero-rail-card{\n  width:286px;\n  background:rgba(255,255,255,.045);\n  border:1px solid rgba(255,255,255,.12);\n  border-radius:16px;\n  padding:16px 16px 8px;\n  backdrop-filter:blur(6px);\n}\n.vc-wheel-label{\n  display:block;\n  font-family:var(--font-display);\n  font-size:.85rem;font-weight:700;\n  letter-spacing:.18em;text-transform:uppercase;\n  color:var(--orange);\n  margin:0 0 12px 2px;\n}\n.vc-hero-wheel{\n  position:relative;\n  height:184px;\n  overflow:hidden;\n  -webkit-mask-image:linear-gradient(180deg,transparent 0,#000 20%,#000 80%,transparent 100%);\n  mask-image:linear-gradient(180deg,transparent 0,#000 18%,#000 82%,transparent 100%);\n}\n.vc-hero-wheel-track{\n  display:flex;flex-direction:column;\n  will-change:transform;\n}\n@media(prefers-reduced-motion:no-preference){\n  .vc-hero-wheel-track{animation:vcWheelScroll 16s linear infinite}\n}\n.vc-hero-wheel:hover .vc-hero-wheel-track{animation-play-state:paused}\n@keyframes vcWheelScroll{\n  from{transform:translateY(0)}\n  to{transform:translateY(-50%)}\n}\n.vc-wheel-chip{\n  display:flex;align-items:center;gap:10px;\n  margin-bottom:10px;\n  font-family:var(--font-display);\n  font-size:1.1rem;font-weight:600;line-height:1.25;\n  color:rgba(255,255,255,.92);\n  background:rgba(255,255,255,.06);\n  border:1px solid rgba(255,255,255,.14);\n  padding:10px 14px;border-radius:12px;\n  backdrop-filter:blur(6px);\n}\n.vc-wheel-chip .chip-ico{\n  color:var(--orange);display:inline-flex;flex-shrink:0;\n}\n\/* Acciones bajo el texto: bot\u00f3n-logo + badge \"Actualizado\" *\/\n.vc-hero-actions{\n  display:flex;align-items:center;flex-wrap:wrap;\n  gap:16px;margin-top:22px;\n}\n.vc-hero-actions .vc-hero-cta{align-self:auto !important}\n.vc-hero-actions #updated-pill{align-self:auto !important}\n.vc-hero .period-pill{\n  display:inline-flex;align-items:center;gap:9px;align-self:auto;\n  font-family:var(--font-display);font-weight:700;font-size:.9rem;\n  color:#fff;background:rgba(243,165,58,.14);\n  border:1px solid rgba(243,165,58,.55);border-radius:999px;\n  padding:9px 16px;line-height:1;\n}\n.vc-hero .period-pill svg{width:17px;height:17px;color:var(--orange);flex:none}\n.vc-hero .period-pill b{color:var(--orange);font-weight:800}\n\n\/* Bot\u00f3n = logotipo completo de PolicyAlert (sin texto) *\/\n.vc-hero-cta{\n  padding:10px 18px !important;\n  gap:10px !important;\n}\n.vc-cta-logo{display:inline-flex;align-items:center;flex-shrink:0}\n.vc-cta-logo svg{height:30px;width:auto;display:block}\n\/* Icono \"abrir en nueva ventana\": badge circular navy \u2192 se\u00f1ala que es un enlace *\/\n.vc-cta-ext{\n  width:26px;height:26px;border-radius:50%;flex-shrink:0;\n  background:var(--navy);color:#fff;\n  display:inline-flex;align-items:center;justify-content:center;\n  transition:transform .15s ease, background .2s ease;\n}\n.vc-cta-ext svg{width:14px;height:14px;display:block}\n.vc-hero-cta:hover .vc-cta-ext{background:var(--navy-light);transform:translate(1px,-1px)}\n\n@media(max-width:879px){\n  .vc-hero-rail-card{width:100%}\n  .vc-hero-wheel{height:148px}\n  .vc-cta-logo svg{height:30px}\n}\n\n\/* Logo de producto (imagotipo) en el CTA *\/\n.vc-cta-logo svg, .vc-cta-logo img{height:40px !important;width:auto;display:block}\n\n<\/style>\n\n<style id=\"rubrika-type\">\n\/* === Sistema tipogr\u00e1fico Rubrika + hero padding (jun 2026) ===\n   T\u00edtulos\/Subt\u00edtulos: Libre Franklin \u00b7 Textos\/Botones: Lato *\/\n.vc-hero{ padding:150px 24px 100px !important; }\n@media(max-width:879px){ .vc-hero{ padding:110px 18px 64px !important; } }\n\/* T\u00edtulos \u2014 Libre Franklin 600 \u00b7 48\/58 *\/\n.vc-hero h1{\n  font-family:\"Libre Franklin\",sans-serif !important;\n  font-weight:600 !important; font-size:48px !important;\n  line-height:58px !important; letter-spacing:-.01em !important;\n  white-space:normal !important;\n}\n@media(max-width:879px){ .vc-hero h1{ font-size:34px !important; line-height:42px !important; } }\n\/* Subt\u00edtulos \u2014 Libre Franklin 600 \u00b7 32\/38 *\/\n.product-name, .product-content-header h3, .faq-section > h2, .seo-block h2{\n  font-family:\"Libre Franklin\",sans-serif !important;\n  font-weight:600 !important; font-size:32px !important;\n  line-height:38px !important; letter-spacing:-.01em !important;\n}\n@media(max-width:879px){\n  .product-name, .product-content-header h3, .faq-section > h2, .seo-block h2{\n    font-size:25px !important; line-height:31px !important;\n  }\n}\n\/* Textos \u2014 Lato 400 \u00b7 16\/24 *\/\n.vc-hero-lead, .product-content-header .sub, .faq-intro,\n.faq-list details p, .pane-cta-text, .seo-item p{\n  font-family:\"Lato\",sans-serif !important;\n  font-weight:400 !important; font-size:16px !important; line-height:24px !important;\n}\n\/* Botones \u2014 Lato 700 \u00b7 15\/15 *\/\n.vc-hero-cta, .vc-hero-contact, .pane-cta, .vc-cmodal .cta,\n.wt-cta-btn, .saber-mas, .ley-follow{\n  font-family:\"Lato\",sans-serif !important;\n  font-weight:700 !important; font-size:15px !important; line-height:15px !important;\n}\n<\/style>\n<\/head>\n<body>\n\n<!-- HERO oculto en WATS \u00b7 todo el contenido se integra en el panel CTA izquierdo -->\n<section class=\"vc-hero\" aria-label=\"Cabecera de producto\" data-vc-hero-injected=\"1\">\n  <div class=\"vc-hero-inner\">\n    <div>\n      <span class=\"vc-kicker\"><span class=\"vc-live-dot\"><\/span>WATS \u00b7 Intel\u00b7lig\u00e8ncia social<\/span>\n      <h1>Qu\u00e8 diuen <span class=\"hl\">els qui t\u2019interessen<\/span>?<\/h1>\n      <p class=\"vc-hero-lead\"><strong>WATS<\/strong> respon a What Are They Saying?: qu\u00e8 diuen associacions, l\u00edders d\u2019opini\u00f3, decisors i altres actors clau sobre els temes que et preocupen. Analitza la conversa p\u00fablica a les xarxes socials i als mitjans per identificar posicionaments i tend\u00e8ncies.<\/p>\n      <div class=\"vc-hero-actions\">\n        <div class=\"vc-hero-wordmark\" role=\"img\" aria-label=\"WATS\">WATS<\/div>\n        <span class=\"updated\" id=\"updated-pill\" aria-live=\"polite\" style=\"background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.14);color:rgba(255,255,255,.85)\">\n          <span class=\"dot\"><\/span>\n          <span id=\"updated-text\">Carregant dades\u2026<\/span>\n        <\/span>\n      <\/div>\n    <\/div>\n    <div class=\"vc-hero-rail-card\" id=\"vc-hero-wheel\" role=\"group\" aria-label=\"Qu\u00e8 analitza WATS\">\n      <span class=\"vc-wheel-label\">Qu\u00e8 analitzem<\/span>\n      <div class=\"vc-hero-wheel\">\n        <div class=\"vc-hero-wheel-track\">\n          <span class=\"vc-wheel-chip\"><span class=\"chip-ico\" aria-hidden=\"true\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"18\" cy=\"5\" r=\"3\"\/><circle cx=\"6\" cy=\"12\" r=\"3\"\/><circle cx=\"18\" cy=\"19\" r=\"3\"\/><path d=\"M8.6 13.5l6.8 4M15.4 6.5l-6.8 4\"\/><\/svg><\/span>X, Instagram, TikTok i LinkedIn<\/span>\n          <span class=\"vc-wheel-chip\"><span class=\"chip-ico\" aria-hidden=\"true\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"\/><\/svg><\/span>Narratives i missatges<\/span>\n          <span class=\"vc-wheel-chip\"><span class=\"chip-ico\" aria-hidden=\"true\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.6l-1-1a5.5 5.5 0 0 0-7.8 7.8l1 1L12 21l7.8-7.6 1-1a5.5 5.5 0 0 0 0-7.8z\"\/><\/svg><\/span>Sentiment positiu i negatiu<\/span>\n          <span class=\"vc-wheel-chip\"><span class=\"chip-ico\" aria-hidden=\"true\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20.6 13.4l-7.2 7.2a2 2 0 0 1-2.8 0L2 12V2h10l8.6 8.6a2 2 0 0 1 0 2.8z\"\/><circle cx=\"7\" cy=\"7\" r=\"1.5\"\/><\/svg><\/span>Temes i \u00e0mbits sectorials<\/span>\n          <span class=\"vc-wheel-chip\"><span class=\"chip-ico\" aria-hidden=\"true\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"\/><circle cx=\"9\" cy=\"7\" r=\"4\"\/><path d=\"M23 21v-2a4 4 0 0 0-3-3.87\"\/><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"\/><\/svg><\/span>Decisors pol\u00edtics<\/span>\n          <span class=\"vc-wheel-chip\"><span class=\"chip-ico\" aria-hidden=\"true\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"\/><path d=\"M9 21V9h6v12M9 9V3M15 9V3\"\/><\/svg><\/span>Associacions i agents<\/span>\n          <span class=\"vc-wheel-chip\"><span class=\"chip-ico\" aria-hidden=\"true\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"23 6 13.5 15.5 8.5 10.5 1 18\"\/><polyline points=\"17 6 23 6 23 12\"\/><\/svg><\/span>Tend\u00e8ncies de conversa<\/span>\n          <!-- duplicado para loop infinito sin salto -->\n          <span class=\"vc-wheel-chip\" aria-hidden=\"true\"><span class=\"chip-ico\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"18\" cy=\"5\" r=\"3\"\/><circle cx=\"6\" cy=\"12\" r=\"3\"\/><circle cx=\"18\" cy=\"19\" r=\"3\"\/><path d=\"M8.6 13.5l6.8 4M15.4 6.5l-6.8 4\"\/><\/svg><\/span>X, Instagram, TikTok i LinkedIn<\/span>\n          <span class=\"vc-wheel-chip\" aria-hidden=\"true\"><span class=\"chip-ico\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"\/><\/svg><\/span>Narratives i missatges<\/span>\n          <span class=\"vc-wheel-chip\" aria-hidden=\"true\"><span class=\"chip-ico\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.6l-1-1a5.5 5.5 0 0 0-7.8 7.8l1 1L12 21l7.8-7.6 1-1a5.5 5.5 0 0 0 0-7.8z\"\/><\/svg><\/span>Sentiment positiu i negatiu<\/span>\n          <span class=\"vc-wheel-chip\" aria-hidden=\"true\"><span class=\"chip-ico\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20.6 13.4l-7.2 7.2a2 2 0 0 1-2.8 0L2 12V2h10l8.6 8.6a2 2 0 0 1 0 2.8z\"\/><circle cx=\"7\" cy=\"7\" r=\"1.5\"\/><\/svg><\/span>Temes i \u00e0mbits sectorials<\/span>\n          <span class=\"vc-wheel-chip\" aria-hidden=\"true\"><span class=\"chip-ico\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"\/><circle cx=\"9\" cy=\"7\" r=\"4\"\/><path d=\"M23 21v-2a4 4 0 0 0-3-3.87\"\/><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"\/><\/svg><\/span>Decisors pol\u00edtics<\/span>\n          <span class=\"vc-wheel-chip\" aria-hidden=\"true\"><span class=\"chip-ico\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"\/><path d=\"M9 21V9h6v12M9 9V3M15 9V3\"\/><\/svg><\/span>Associacions i agents<\/span>\n          <span class=\"vc-wheel-chip\" aria-hidden=\"true\"><span class=\"chip-ico\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"23 6 13.5 15.5 8.5 10.5 1 18\"\/><polyline points=\"17 6 23 6 23 12\"\/><\/svg><\/span>Tend\u00e8ncies de conversa<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n\n<div class=\"wrap\">\n\n  \n\n  <noscript>\n    <div class=\"nojs\">\n      Aquesta p\u00e0gina utilitza JavaScript per mostrar gr\u00e0fics interactius. Si el tens desactivat, pots consultar les dades en brut a\n      <a href=\"\/api\/dashboard-publico\/wats\/\">\/api\/dashboard-publico\/wats\/<\/a>.\n    <\/div>\n  <\/noscript>\n\n  <!-- =========================================================\n       PRODUCTO: WATS\n       Datos: temas de conversaci\u00f3n p\u00fablica (WebVinces \/ Firestore)\n       ========================================================= -->\n  <section class=\"product-section\" aria-label=\"WATS \u00b7 Temes de la conversa\" itemscope=\"\" itemtype=\"https:\/\/schema.org\/Dataset\">\n    <div class=\"product-grid\">\n      <div class=\"product-content\">\n        <div class=\"product-content-header\">\n          <div>\n            <h3>Temes de conversa p\u00fablica<\/h3>\n            <p class=\"sub\">Explora qu\u00e8 diuen pol\u00edtics i associacions sobre els temes que et preocupen.<\/p>\n          <\/div>\n          <span class=\"period-tag\" id=\"periodo-pill\" hidden>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.1\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"17\" rx=\"2\"\/><path d=\"M16 2v4M8 2v4M3 10h18\"\/><\/svg>\n            <span>Per\u00edode&nbsp;\u00b7&nbsp;<b id=\"periodo-text\"><\/b><\/span>\n          <\/span>\n        <\/div>\n        <div class=\"wt-tree\">\n          <div class=\"filterbar\">\n            <span class=\"flabel\">Stakeholder<\/span>\n            <button class=\"schip\" data-f=\"todos\">Tots<\/button>\n            <button class=\"schip\" data-f=\"pol\">Pol\u00edtics<\/button>\n            <button class=\"schip\" data-f=\"aso\">Associacions<\/button>\n          <\/div>\n          <div class=\"tchips\" id=\"tchips\"><\/div>\n          <div class=\"metrics\" id=\"metrics\"><\/div>\n          <div class=\"top-ents\" id=\"topents\" hidden><\/div>\n          <div class=\"scope\" id=\"scope\"><\/div>\n          <p class=\"intro\" id=\"intro\" hidden><\/p>\n          <div class=\"treebox\"><div id=\"canvas\"><\/div><div id=\"detail\" hidden><\/div><\/div>\n          <div class=\"wt-cta-bar\">\n            <p class=\"wt-cta-txt\"><strong>Aix\u00f2 \u00e9s nom\u00e9s una mostra.<\/strong> Sol\u00b7licita l\u2019an\u00e0lisi completa del teu sector: tots els temes, stakeholders, posts i l\u2019evoluci\u00f3 del sentiment.<\/p>\n            <button class=\"wt-cta-btn\" type=\"button\" id=\"wtCtaBtn\">Sol\u00b7licitar demo<span class=\"arr\" aria-hidden=\"true\">\u2192<\/span><\/button>\n          <\/div>\n        <\/div>\n        <table class=\"sr-only\" id=\"tc-seo-table\" aria-label=\"Dades completes de temes de conversa p\u00fablica\">\n          <caption>Temes de conversa p\u00fablica detectats per WATS<\/caption>\n          <thead><tr><th scope=\"col\">Tema<\/th><th scope=\"col\">\u00c0mbit<\/th><th scope=\"col\">Freq\u00fc\u00e8ncia (publicacions)<\/th><th scope=\"col\">Sentiment<\/th><th scope=\"col\">Descripci\u00f3<\/th><\/tr><\/thead>\n          <tbody><\/tbody>\n        <\/table>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- =========================================================\n       PREGUNTAS FRECUENTES\n       ========================================================= -->\n  <section class=\"faq-section\" aria-labelledby=\"faq-title\" id=\"faq\">\n    <h2 id=\"faq-title\">Preguntes freq\u00fcents<\/h2>\n    <p class=\"faq-intro\">Tot el que necessites saber sobre WATS, l\u2019eina d\u2019intel\u00b7lig\u00e8ncia social de Vinces per entendre la conversa p\u00fablica, els posicionaments i les tend\u00e8ncies.<\/p>\n    <article class=\"faq-block\" id=\"faqs-wats\">\n  <h3 class=\"faq-block-title\"><span class=\"faq-badge\">WATS<\/span> Intel\u00b7lig\u00e8ncia social<\/h3>\n  <div class=\"faq-list\">\n    <details><summary>Qu\u00e8 \u00e9s WATS?<\/summary><p>WATS \u00e9s l\u2019eina d\u2019intel\u00b7lig\u00e8ncia social de Vinces. Respon a What Are They Saying?: qu\u00e8 diuen associacions, l\u00edders d\u2019opini\u00f3, decisors i altres actors clau sobre els temes que et preocupen. Analitza la conversa p\u00fablica a les xarxes socials i als mitjans per identificar posicionaments i tend\u00e8ncies.<\/p><\/details>\n    <details><summary>Quines fonts p\u00fabliques analitza WATS?<\/summary><p>WATS analitza la conversa p\u00fablica a les xarxes socials i als mitjans digitals, incloent-hi X, LinkedIn, Instagram, TikTok, YouTube, Facebook, Telegram p\u00fablic, blogs i mitjans digitals.<\/p><\/details>\n    <details><summary>Quina an\u00e0lisi fa WATS sobre els temes detectats?<\/summary><p>Ordena la conversa per temes, \u00e0mbits sectorials, actors, to i evoluci\u00f3. Aix\u00ed ajuda a entendre quines posicions s\u2019estan consolidant i quines tend\u00e8ncies comencen a guanyar rellev\u00e0ncia.<\/p><\/details>\n    <details><summary>Per qu\u00e8 \u00e9s \u00fatil entendre qu\u00e8 diuen els actors clau?<\/summary><p>Perqu\u00e8 la conversa p\u00fablica anticipa prioritats, posicions i moviments rellevants per a la teva organitzaci\u00f3. WATS ajuda a identificar quins temes guanyen for\u00e7a, qui els impulsa i com evolucionen a les xarxes socials i als mitjans.<\/p><\/details>\n    <details><summary>Detecta crisis reputacionals?<\/summary><p>S\u00ed. WATS alerta quan un tema associat a la teva organitzaci\u00f3 (o al teu sector) entra en una din\u00e0mica negativa o de viralitzaci\u00f3 r\u00e0pida.<\/p><\/details>\n    <details><summary>Quines m\u00e8triques retorna per tema?<\/summary><p>Freq\u00fc\u00e8ncia (nombre de publicacions), sentiment dominant, \u00e0mbit, evoluci\u00f3 temporal, principals emissors i cites literals rellevants.<\/p><\/details>\n    <details><summary>Puc monitorar un tema concret?<\/summary><p>S\u00ed. Defineixes paraules clau o conceptes i WATS et lliura el dashboard d\u2019activitat sobre aquest tema en temps real.<\/p><\/details>\n    <details><summary>Segueix tamb\u00e9 periodistes i opini\u00f3 p\u00fablica?<\/summary><p>S\u00ed. A m\u00e9s de c\u00e0rrecs pol\u00edtics, indexem periodistes especialitzats, l\u00edders d\u2019opini\u00f3 sectorials, sindicats, patronals i associacions.<\/p><\/details>\n    <details><summary>Funciona en castell\u00e0 i lleng\u00fces cooficials?<\/summary><p>S\u00ed. Processa contingut en castell\u00e0, catal\u00e0, gallec i \u00e8uscar amb la mateixa qualitat.<\/p><\/details>\n    <details><summary>Fa an\u00e0lisi comparativa entre partits?<\/summary><p>S\u00ed. Pots comparar com PSOE, PP, VOX, Sumar, ERC, Junts, EH Bildu, PNV o qualsevol grup aborda un tema, amb quina intensitat i amb quin sentiment.<\/p><\/details>\n    <details><summary>T\u00e9 API?<\/summary><p>S\u00ed. Disposem d\u2019API per integrar les an\u00e0lisis als teus dashboards interns.<\/p><\/details>\n    <details><summary>Quin preu t\u00e9?<\/summary><p>Dep\u00e8n de l\u2019abast tem\u00e0tic i el volum de monitoratge. Sol\u00b7licita una an\u00e0lisi a mida a <a href=\"https:\/\/vincesconsulting.com\/contacto\/\" rel=\"noopener\">contacte<\/a>.<\/p><\/details>\n  <\/div>\n<\/article>\n\n    \n\n  <\/section>\n\n<\/div>\n\n<script>\n\/*\n * Helpers compartidos por todas las p\u00e1ginas de producto (FREN, PolicyAlert,\n * Poder Digital, WATS). Se exponen en `window.VincesDash` para que cada\n * p\u00e1gina pueda invocarlos sin duplicar c\u00f3digo.\n *\n * IMPORTANT: las p\u00e1ginas standalone descargadas por \"Descargar HTML externo\"\n * inlinean este script. Mantenerlo autocontenido (sin imports).\n *\/\n(function () {\n  \"use strict\";\n\n  const LOCALE = \"ca-ES\";\n  const REFRESH_MS = 30 * 60 * 1000;\n\n  const $ = (s, r) => (r || document).querySelector(s);\n  const $$ = (s, r) => Array.from((r || document).querySelectorAll(s));\n\n  function fmtDate(iso) {\n    if (!iso) return \"\";\n    try {\n      return new Date(iso).toLocaleDateString(LOCALE, {\n        day: \"2-digit\", month: \"long\", year: \"numeric\",\n      });\n    } catch { return iso; }\n  }\n  function fmtDateTime(iso) {\n    if (!iso) return \"\";\n    try {\n      return new Date(iso).toLocaleString(LOCALE, {\n        day: \"2-digit\", month: \"short\", year: \"numeric\",\n        hour: \"2-digit\", minute: \"2-digit\",\n      });\n    } catch { return iso; }\n  }\n  function escapeHtml(s) {\n    return String(s == null ? \"\" : s)\n      .replace(\/&\/g, \"&amp;\").replace(\/<\/g, \"&lt;\").replace(\/>\/g, \"&gt;\")\n      .replace(\/\"\/g, \"&quot;\").replace(\/'\/g, \"&#39;\");\n  }\n  function initials(name) {\n    return (name || \"?\").trim().split(\/\\s+\/).slice(0, 2).map(p => p[0]).join(\"\").toUpperCase();\n  }\n\n  \/**\n   * Carga est\u00e1ndar de los endpoints p\u00fablicos del dashboard.\n   * - apiUrl: URL absoluta o relativa al endpoint \/api\/dashboard-publico\/...\n   * - onData: callback(data) llamado en \u00e9xito.\n   * - onError: callback(message, kind) llamado en error. kind: \"network\" | \"http\" | \"json\" | \"render\".\n   *\/\n  async function loadDashboardData(apiUrl, onData, onError) {\n    let response;\n    try {\n      response = await fetch(apiUrl, {\n        method: \"GET\",\n        headers: { Accept: \"application\/json\" },\n        mode: \"cors\",\n        cache: \"no-cache\",\n      });\n    } catch (err) {\n      console.error(\"[Dashboard] Network\/CORS error:\", err);\n      const isFileProtocol = window.location.protocol === \"file:\";\n      const msg = isFileProtocol\n        ? `No se pudieron cargar los datos desde <code>${escapeHtml(apiUrl)}<\/code>. <br>Si has abierto este HTML como archivo local, s\u00edrvelo desde un servidor web (no <code>file:\/\/<\/code>) o aseg\u00farate de que el endpoint permite el origen <code>null<\/code>.`\n        : `No se pudieron cargar los datos desde <code>${escapeHtml(apiUrl)}<\/code>. <br>Comprueba la configuraci\u00f3n CORS del backend para el origen actual: <code>${escapeHtml(window.location.origin)}<\/code>.`;\n      onError && onError(msg, \"network\");\n      return;\n    }\n    if (!response.ok) {\n      console.error(\"[Dashboard] HTTP error:\", response.status);\n      onError && onError(`El servidor devolvi\u00f3 HTTP ${response.status} al consultar <code>${escapeHtml(apiUrl)}<\/code>.`, \"http\");\n      return;\n    }\n    let data;\n    try {\n      data = await response.json();\n    } catch (err) {\n      console.error(\"[Dashboard] JSON parse error:\", err);\n      onError && onError(\"La respuesta no es JSON v\u00e1lido.\", \"json\");\n      return;\n    }\n    try {\n      onData && onData(data);\n    } catch (err) {\n      console.error(\"[Dashboard] Render error:\", err);\n      onError && onError(\"Error al renderizar los datos.\", \"render\");\n    }\n  }\n\n  \/**\n   * Pinta el pill de \"Actualizado...\" en la cabecera y gestiona el estado de error.\n   *\/\n  function setUpdatedPill(data, errMessage) {\n    const pill = $(\"#updated-pill\");\n    const txt = $(\"#updated-text\");\n    if (!pill || !txt) return;\n    if (errMessage) {\n      pill.classList.add(\"err\");\n      txt.textContent = errMessage;\n    } else {\n      pill.classList.remove(\"err\");\n      txt.textContent = \"Actualitzat \" + fmtDateTime((data && data.generated_at) || new Date().toISOString());\n    }\n  }\n\n  \/**\n   * Bot\u00f3n \"Descargar HTML externo\": clona el DOM, elimina elementos de test,\n   * sustituye la API_URL relativa por una absoluta y descarga como fichero\n   * \u00fanico listo para WordPress.\n   *\/\n  function bindDownloadExternalHtml(absApiUrl) {\n    const btn = $(\"#download-html-btn\");\n    if (!btn) return;\n    btn.addEventListener(\"click\", () => {\n      try {\n        btn.dataset.state = \"generating\";\n        btn.querySelector(\".lbl\").textContent = \"Generando\u2026\";\n\n        const cloned = document.documentElement.cloneNode(true);\n        cloned.querySelectorAll(\".testbar, #download-html-btn\").forEach(el => el.remove());\n\n        cloned.querySelectorAll(\"script\").forEach(s => {\n          const txt = s.textContent || \"\";\n          if (txt.includes(\"DEFAULT_API_URL\")) {\n            s.textContent = txt.replace(\n              \/const\\s+DEFAULT_API_URL\\s*=\\s*[\"'][^\"']*[\"'];\/,\n              `const DEFAULT_API_URL = ${JSON.stringify(absApiUrl)};`\n            );\n          }\n        });\n\n        const banner =\n          \"\\n<!--\\n\" +\n          \"  Dashboard Vinces \u00b7 p\u00e1gina standalone por producto\\n\" +\n          \"  Generado: \" + new Date().toISOString() + \"\\n\" +\n          \"  Endpoint API: \" + absApiUrl + \"\\n\" +\n          \"\\n\" +\n          \"  C\u00f3mo integrarlo en WordPress:\\n\" +\n          \"    1. Editor de la p\u00e1gina \u2192 bloque 'HTML personalizado'.\\n\" +\n          \"    2. Pega el fichero completo (todo, incluyendo <html>, <head>, <body>).\\n\" +\n          \"       En la mayor\u00eda de temas WP basta con pegar a partir de <body>.\\n\" +\n          \"    3. Aseg\u00farate de que el dominio WP est\u00e1 incluido en CORS del backend.\\n\" +\n          \"    4. El cliente refresca cada 30 min; el backend cachea 1h.\\n\" +\n          \"-->\\n\";\n        const html = \"<!DOCTYPE html>\\n\" + cloned.outerHTML.replace(\/^<html\/, banner + \"<html\");\n\n        const blob = new Blob([html], { type: \"text\/html;charset=utf-8\" });\n        const url = URL.createObjectURL(blob);\n        const a = document.createElement(\"a\");\n        a.href = url;\n        const stamp = new Date().toISOString().slice(0, 10);\n        a.download = `dashboard-vinces-${(window.VincesDash && window.VincesDash.product) || \"page\"}-${stamp}.html`;\n        document.body.appendChild(a);\n        a.click();\n        document.body.removeChild(a);\n        setTimeout(() => URL.revokeObjectURL(url), 2000);\n\n        btn.dataset.state = \"done\";\n        btn.querySelector(\".lbl\").textContent = \"\u2714 Descargado\";\n        setTimeout(() => {\n          btn.removeAttribute(\"data-state\");\n          btn.querySelector(\".lbl\").textContent = \"Descarregar HTML extern\";\n        }, 2500);\n      } catch (err) {\n        console.error(\"[download-html] error:\", err);\n        btn.removeAttribute(\"data-state\");\n        btn.querySelector(\".lbl\").textContent = \"Error en generar\";\n        setTimeout(() => { btn.querySelector(\".lbl\").textContent = \"Descarregar HTML extern\"; }, 2500);\n      }\n    });\n  }\n\n  \/**\n   * Inicializa carruseles tipo tabs sobre cualquier elemento [data-carousel].\n   * Cuando un pane se activa, ejecuta el callback registrado en\n   * window.VincesDash.onPaneActivated[paneId] (si existe).\n   *\/\n  function initCarousels() {\n    document.querySelectorAll(\"[data-carousel]\").forEach(scope => {\n      const tabs = scope.querySelectorAll(\".car-tab\");\n      const panes = scope.querySelectorAll(\".car-pane\");\n      tabs.forEach(btn => {\n        btn.addEventListener(\"click\", () => {\n          const target = btn.getAttribute(\"data-pane\");\n          tabs.forEach(b => {\n            b.classList.toggle(\"active\", b === btn);\n            b.setAttribute(\"aria-selected\", b === btn ? \"true\" : \"false\");\n          });\n          panes.forEach(p => {\n            p.classList.toggle(\"active\", p.id === target);\n          });\n          const cb = window.VincesDash && window.VincesDash.onPaneActivated && window.VincesDash.onPaneActivated[target];\n          if (typeof cb === \"function\") cb();\n        });\n      });\n    });\n  }\n\n  window.VincesDash = Object.assign(window.VincesDash || {}, {\n    LOCALE,\n    REFRESH_MS,\n    $, $$,\n    fmtDate, fmtDateTime, escapeHtml, initials,\n    loadDashboardData,\n    setUpdatedPill,\n    bindDownloadExternalHtml,\n    initCarousels,\n    onPaneActivated: {},\n  });\n})();\n<\/script>\n\n\n<script>\n(() => {\n  \"use strict\";\n  const DEFAULT_API_URL = \"https:\/\/vision360.vincesconsulting.com\/api\/dashboard-publico\/wats\/\";\n  const { $, fmtDate, escapeHtml, loadDashboardData, setUpdatedPill, bindDownloadExternalHtml } = window.VincesDash;\n  const REFRESH_MS = window.VincesDash.REFRESH_MS;\n  window.VincesDash.product = \"wats\";\n  const esc = escapeHtml;\n\n  \/* ===== Etiquetas de \u00e1mbito (para tablas SEO + meta) ===== *\/\n  const TC_AMBITO_LABELS = {\n    \"todos\":{label:\"Todos los \u00e1mbitos\"},\"sanidad\":{label:\"Sanidad\"},\"vivienda\":{label:\"Vivienda\"},\n    \"economia\":{label:\"Econom\u00eda y empleo\"},\"educacion\":{label:\"Educaci\u00f3n\"},\"fiscalidad\":{label:\"Fiscalidad\"},\n    \"medioambiente\":{label:\"Medio ambiente\"},\"energia\":{label:\"Energ\u00eda\"},\"social\":{label:\"Social\"},\n    \"infraestructuras\":{label:\"Infraestructuras\"},\"politica\":{label:\"Pol\u00edtica\"},\n  };\n\n  \/* ===== Tablas SEO (temas_conversacion; fallback al informe report) ===== *\/\n  function seoRowsFromReport(rep) {\n    const out = [];\n    (rep.themes || []).forEach(t => {\n      (t.sub || []).forEach(s => {\n        out.push({\n          topic: s.label || \"\",\n          ambito: t.label || t.id || \"\",\n          frequency: (s.pol || 0) + (s.aso || 0),\n          sentiment: s.sent || \"\",\n          description: s.summary || \"\",\n        });\n      });\n    });\n    return out.sort((a, b) => (b.frequency || 0) - (a.frequency || 0));\n  }\n  function renderSeoTables(data) {\n    const tc = data.temas_conversacion;\n    let items = (tc && tc.topics) || [];\n    let labelOf = t => TC_AMBITO_LABELS[t.ambito]?.label || t.ambito || \"\u2014\";\n    if (!items.length && data.report && (data.report.themes || []).length) {\n      items = seoRowsFromReport(data.report);\n      labelOf = t => t.ambito || \"\u2014\";\n    }\n    const convBody = document.querySelector(\"#seo-table-conversacion tbody\");\n    if (convBody) {\n      if (!items.length) {\n        convBody.innerHTML = '<tr><td colspan=\"5\" class=\"muted-cell\">Sin datos de conversaci\u00f3n p\u00fablica disponibles.<\/td><\/tr>';\n      } else {\n        const sorted = [...items].sort((a, b) => (b.frequency || 0) - (a.frequency || 0));\n        convBody.innerHTML = sorted.map(t => {\n          return `<tr><td>${esc(t.topic || \"\u2014\")}<\/td><td>${esc(labelOf(t))}<\/td><td>${t.frequency || 0}<\/td><td>${esc(t.sentiment || \"\u2014\")}<\/td><td>${esc(t.description || \"\")}<\/td><\/tr>`;\n        }).join(\"\");\n      }\n    }\n    const seoBody = document.querySelector(\"#tc-seo-table tbody\");\n    if (seoBody) {\n      seoBody.innerHTML = items.map(t => {\n        return `<tr><td>${esc(t.topic)}<\/td><td>${esc(labelOf(t))}<\/td><td>${t.frequency || 0}<\/td><td>${esc(t.sentiment || \"\")}<\/td><td>${esc(t.description || \"\")}<\/td><\/tr>`;\n      }).join(\"\");\n    }\n  }\n\n  \/* ===== Meta del panel CTA izquierdo ===== *\/\n  function updateMeta(data) {\n    const tc = data.temas_conversacion || {};\n    const rep = data.report || {};\n    \/\/ Periodo analizado \u2192 badge de cabecera (siempre visible)\n    let periodoTxt = \"\";\n    const iDate = tc.initial_date || rep.initial_date || (rep.period && rep.period.initial_date);\n    const eDate = tc.end_date || rep.end_date || (rep.period && rep.period.end_date);\n    if (iDate && eDate) {\n      const a = new Date(iDate), b = new Date(eDate);\n      const fmt = d => d.toLocaleDateString(\"es-ES\", { day:\"numeric\", month:\"short\" }).replace(\".\", \"\");\n      periodoTxt = `${a.getDate()}\\u2013${fmt(b)} ${b.getFullYear()}`;\n    }\n    const pPill = document.getElementById(\"periodo-pill\"), pTxt = document.getElementById(\"periodo-text\");\n    if (pPill && pTxt) { if (periodoTxt) { pTxt.textContent = periodoTxt; pPill.hidden = false; } else { pPill.hidden = true; } }\n\n    const metaEl = document.querySelector(\"[data-stat='meta']\");\n    if (!metaEl) return;\n    const repThemes = rep.themes || [];\n    const repSubs = repThemes.reduce((n, t) => n + ((t.sub || []).length), 0);\n    const topics = tc.topics || [];\n    const total = repSubs || tc.total_topics || topics.length;\n    const ambitos = repThemes.length || new Set(topics.map(t => t.ambito)).size;\n    const ICONS = {\n      topics:'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M3 3v18h18\"\/><path d=\"M7 14l4-4 4 4 5-7\"\/><\/svg>',\n      tag:'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z\"\/><circle cx=\"7\" cy=\"7\" r=\"1.2\" fill=\"currentColor\"\/><\/svg>',\n      cal:'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"17\" rx=\"2\"\/><path d=\"M16 2v4M8 2v4M3 10h18\"\/><\/svg>',\n    };\n    const li = [\n      `<li>${ICONS.topics}<span><b>${total}<\/b> temas<\/span><\/li>`,\n      ambitos ? `<li>${ICONS.tag}<span><b>${ambitos}<\/b> \\u00e1mbitos<\/span><\/li>` : \"\",\n      periodoTxt ? `<li>${ICONS.cal}<span>${esc(periodoTxt)}<\/span><\/li>` : \"\",\n    ].filter(Boolean);\n    metaEl.innerHTML = li.join(\"\");\n  }\n\n  \/* ===== Treemap de tendencias ===== *\/\n  const GROUPS = { pol:{label:\"Pol\u00edtics\",color:\"#1F2547\"}, aso:{label:\"Associacions\",color:\"#B9C2D9\"}, todos:{label:\"Tots\",color:\"#8A90A3\"} };\n  const SENTC = { positivo:{c:\"#2E7D4A\",l:\"Positiu\"}, neutro:{c:\"#E3B341\",l:\"Neutre\"}, neutral:{c:\"#E3B341\",l:\"Neutre\"}, mixto:{c:\"#F3A53A\",l:\"Mixt\"}, negativo:{c:\"#C0392B\",l:\"Negatiu\"} };\n  function sentColor(s){ return (SENTC[s]||SENTC.mixto).c; }\n  const NET = { x:\"X\", instagram:\"Instagram\", linkedin:\"LinkedIn\", tiktok:\"TikTok\" };\n  const NET_ICONS = {\n    x:'<path d=\"M4 4l16 16M20 4L4 20\"\/>',\n    instagram:'<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"5\"\/><circle cx=\"12\" cy=\"12\" r=\"4\"\/><circle cx=\"17\" cy=\"7\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"\/>',\n    linkedin:'<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"3.5\"\/><path d=\"M7.6 10.6V16M7.6 7.7v.02M11 16v-3.3a1.9 1.9 0 0 1 3.8 0V16\"\/>',\n    tiktok:'<path d=\"M9.6 5v9.7a3.1 3.1 0 1 1-3.1-3.1\"\/><path d=\"M9.6 5c.5 2.7 2.4 4.4 5.2 4.6\"\/>'\n  };\n  function netIcon(net){ const p=NET_ICONS[(net||\"\").toLowerCase()]; return p?'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">'+p+'<\/svg>':''; }\n  let THEMES = [], st = { filter:\"todos\", level:1, theme:null, sub:null };\n  function _h2hsl(hex){ const m=\/^#?([0-9a-f]{6})$\/i.exec(hex||\"\"); if(!m) return null; const n=parseInt(m[1],16); let r=(n>>16&255)\/255,g=(n>>8&255)\/255,b=(n&255)\/255; const mx=Math.max(r,g,b),mn=Math.min(r,g,b); let h=0,s=0,l=(mx+mn)\/2; if(mx!==mn){ const d=mx-mn; s=l>.5?d\/(2-mx-mn):d\/(mx+mn); h=mx===r?(g-b)\/d+(g<b?6:0):mx===g?(b-r)\/d+2:(r-g)\/d+4; h\/=6; } return {h:h*360,s:s,l:l}; }\n  function _hsl2h(h,s,l){ h\/=360; const f=(p,q,t)=>{ if(t<0)t++; if(t>1)t--; if(t<1\/6)return p+(q-p)*6*t; if(t<1\/2)return q; if(t<2\/3)return p+(q-p)*(2\/3-t)*6; return p; }; let r,g,b; if(s===0){r=g=b=l;}else{ const q=l<.5?l*(1+s):l+s-l*s,p=2*l-q; r=f(p,q,h+1\/3);g=f(p,q,h);b=f(p,q,h-1\/3); } const to=v=>('0'+Math.round(v*255).toString(16)).slice(-2); return '#'+to(r)+to(g)+to(b); }\n  function intenseColor(hex){ const c=_h2hsl(hex); if(!c) return hex; return _hsl2h(c.h,Math.max(0.3,Math.min(c.s,0.46)),Math.min(c.l,0.45)); }\n  function softenThemes(){ THEMES.forEach(t=>{ const c=_h2hsl(t.color); if(!c) return; t._c0=t.color; const s=Math.min(c.s*0.8,0.46), l=c.l+(1-c.l)*0.25; t.color=_hsl2h(c.h,s,l); }); }\n\n  \/* Iconos por \u00e1mbito (se ti\u00f1en con el color del tema v\u00eda currentColor) *\/\n  const TOPIC_ICONS = {\n    sanidad:'<rect x=\"9.5\" y=\"3\" width=\"5\" height=\"18\" rx=\"1\"\/><rect x=\"3\" y=\"9.5\" width=\"18\" height=\"5\" rx=\"1\"\/>',\n    vivienda:'<path d=\"M3 11l9-8 9 8\"\/><path d=\"M5 10v10h14V10\"\/>',\n    economia:'<path d=\"M3 17l6-6 4 4 7-8\"\/><path d=\"M17 7h4v4\"\/>',\n    educacion:'<path d=\"M2 8l10-4 10 4-10 4z\"\/><path d=\"M6 10.5V16c0 1.5 3 3 6 3s6-1.5 6-3v-5.5\"\/>',\n    fiscalidad:'<line x1=\"19\" y1=\"5\" x2=\"5\" y2=\"19\"\/><circle cx=\"7.5\" cy=\"7.5\" r=\"2.4\"\/><circle cx=\"16.5\" cy=\"16.5\" r=\"2.4\"\/>',\n    medioambiente:'<path d=\"M5 20s1.5-11 15-15c0 0 1.5 11-8 15-3.5 1.4-7 0-7 0z\"\/><path d=\"M5 20c3.5-5.5 7.5-8 11.5-9\"\/>',\n    energia:'<path d=\"M13 2L4 14h7l-1 8 9-12h-7z\"\/>',\n    social:'<circle cx=\"9\" cy=\"8\" r=\"3.1\"\/><path d=\"M3.5 20c0-3.3 2.8-5.3 5.5-5.3s5.5 2 5.5 5.3\"\/><path d=\"M16 5.4a3 3 0 0 1 0 5.7\"\/><path d=\"M20.5 20c0-2.5-1.5-4.2-3.4-4.9\"\/>',\n    infraestructuras:'<rect x=\"4\" y=\"3\" width=\"16\" height=\"18\" rx=\"1\"\/><path d=\"M8 7h2M14 7h2M8 11h2M14 11h2M8 15h2M14 15h2\"\/>',\n    politica:'<path d=\"M3 9l9-6 9 6\"\/><path d=\"M5 9v9M9.5 9v9M14.5 9v9M19 9v9\"\/><path d=\"M3 21h18\"\/>',\n    _default:'<circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M8.5 10h7M8.5 14h5\"\/>'\n  };\n  function topicIcon(id,label){\n    let k=(id||\"\").toLowerCase();\n    if(!TOPIC_ICONS[k]){ const L=(label||\"\").toLowerCase(); k=Object.keys(TOPIC_ICONS).find(key=>key!==\"_default\"&&L.indexOf(key)>=0)||\"\"; }\n    const p=TOPIC_ICONS[k]||TOPIC_ICONS._default;\n    return '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">'+p+'<\/svg>';\n  }\n\n  function vol(sub, f){ return f === \"todos\" ? ((sub.pol||0)+(sub.aso||0)) : (sub[f]||0); }\n  function themeVol(t, f){ return (t.sub||[]).reduce((s,x)=>s+vol(x,f),0); }\n  function hex2rgb(h){ h=h.replace(\"#\",\"\"); return [parseInt(h.substr(0,2),16),parseInt(h.substr(2,2),16),parseInt(h.substr(4,2),16)]; }\n  function lum(r,g,b){ return 0.299*r+0.587*g+0.114*b; }\n  function fgFor(hex){ const c=hex2rgb(hex); return lum(c[0],c[1],c[2])>150?\"#1F2547\":\"#ffffff\"; }\n  function tint(hex,f){ const c=hex2rgb(hex),w=(1-f)*0.82; const r=Math.round(c[0]+(255-c[0])*w),g=Math.round(c[1]+(255-c[1])*w),b=Math.round(c[2]+(255-c[2])*w); return {css:\"rgb(\"+r+\",\"+g+\",\"+b+\")\",fg:lum(r,g,b)>150?\"#1F2547\":\"#ffffff\"}; }\n  function worst(row,s,side){ let rmax=-Infinity,rmin=Infinity; for(let k=0;k<row.length;k++){ if(row[k].a>rmax)rmax=row[k].a; if(row[k].a<rmin)rmin=row[k].a; } const s2=s*s,w2=side*side; return Math.max((w2*rmax)\/s2, s2\/(w2*rmin)); }\n  function treemap(values,width,height){\n    const idx=values.map((v,i)=>({a:v,i})).sort((a,b)=>b.a-a.a);\n    const total=idx.reduce((s,o)=>s+o.a,0)||1, scale=(width*height)\/total;\n    const items=idx.map(o=>({a:o.a*scale,i:o.i})), out=new Array(values.length);\n    let x=0,y=0,w=width,h=height,i=0;\n    while(i<items.length){\n      const side=Math.min(w,h); let row=[items[i]],s=items[i].a,j=i+1;\n      while(j<items.length){ const ns=s+items[j].a; if(worst(row.concat(items[j]),ns,side)<=worst(row,s,side)){ row.push(items[j]); s=ns; j++; } else break; }\n      const thick=s\/side;\n      if(w>=h){ let oy=y; for(let r=0;r<row.length;r++){ const chh=(row[r].a\/s)*h; out[row[r].i]={x,y:oy,w:thick,h:chh}; oy+=chh; } x+=thick; w-=thick; }\n      else{ let ox=x; for(let r2=0;r2<row.length;r2++){ const cww=(row[r2].a\/s)*w; out[row[r2].i]={x:ox,y,w:cww,h:thick}; ox+=cww; } y+=thick; h-=thick; }\n      i=j;\n    }\n    return out;\n  }\n  function build(container,items){\n    container.innerHTML=\"\";\n    const W=container.clientWidth||640, H=container.clientHeight||520;\n    const rects=treemap(items.map(it=>it.value),W,H);\n    items.forEach((it,idx)=>{\n      const r=rects[idx],box=document.createElement(\"div\");box.className=\"box\";\n      box.style.left=(r.x+3)+\"px\";box.style.top=(r.y+3)+\"px\";box.style.width=Math.max(0,r.w-6)+\"px\";box.style.height=Math.max(0,r.h-6)+\"px\";\n      box.style.background=it.color;box.style.color=it.fg;\n      if(r.w>48&&r.h>30){ const lbl=document.createElement(\"div\");lbl.className=\"lbl\";lbl.textContent=it.label;lbl.style.fontSize=Math.max(12,Math.min(20,Math.round(r.w\/10)))+\"px\";box.appendChild(lbl);\n        if(r.h>58){ const num=document.createElement(\"div\");num.className=\"num\";num.textContent=it.num;box.appendChild(num); } }\n      box.onclick=it.onclick;container.appendChild(box);\n    });\n  }\n  const canvas=document.getElementById(\"canvas\"), detail=document.getElementById(\"detail\"), scope=document.getElementById(\"scope\"), intro=document.getElementById(\"intro\");\n  function allSubs(){ const a=[]; THEMES.forEach(t=>{(t.sub||[]).forEach(x=>a.push(x));}); return a; }\n  function renderMetrics(){\n    const f=st.filter, subs=subsInView();\n    \/\/ Reparto pol\/aso sobre el \u00e1mbito en vista (cambia con el filtro de tema)\n    const polV=subs.reduce((s,x)=>s+(x.pol||0),0), asoV=subs.reduce((s,x)=>s+(x.aso||0),0), tot2=(polV+asoV)||1;\n    const polPct=Math.round(polV\/tot2*100), asoPct=100-polPct;\n    const polC=GROUPS.pol.color, asoC=GROUPS.aso.color;\n    const repartoHTML='<div class=\"split\"><div class=\"split-bar\">'+\n      '<span class=\"seg\" data-g=\"pol\" title=\"Pol\u00edtics '+polPct+'%\" style=\"width:'+polPct+'%;background:'+polC+'\"><\/span>'+\n      '<span class=\"seg\" data-g=\"aso\" title=\"Associacions '+asoPct+'%\" style=\"width:'+asoPct+'%;background:'+asoC+'\"><\/span><\/div>'+\n      '<div class=\"split-legend\"><span data-g=\"pol\"><i style=\"background:'+polC+'\"><\/i>Pol. <b>'+polPct+'%<\/b><\/span>'+\n      '<span data-g=\"aso\"><i style=\"background:'+asoC+'\"><\/i>Aso. <b>'+asoPct+'%<\/b><\/span><\/div><\/div>';\n    \/\/ Sentimiento sobre el \u00e1mbito en vista (cambia con el filtro de tema)\n    const sentDefs=[\n      {g:\"pos\",keys:[\"positivo\"],label:\"Pos.\",color:\"#4FA873\"},\n      {g:\"neu\",keys:[\"neutro\",\"neutral\"],label:\"Neu.\",color:\"#EDBB3C\"},\n      {g:\"mix\",keys:[\"mixto\"],label:\"Mix.\",color:\"#F3A53A\"},\n      {g:\"neg\",keys:[\"negativo\"],label:\"Neg.\",color:\"#D15F4D\"}\n    ];\n    let sTot=0; sentDefs.forEach(d=>{ d.v=subs.filter(x=>d.keys.indexOf(x.sent)>=0).reduce((s,x)=>s+vol(x,f),0); sTot+=d.v; }); sTot=sTot||1;\n    const sentBar='<div class=\"split\"><div class=\"split-bar\">'+\n      sentDefs.map(d=>{ const w=d.v\/sTot*100; return w>0?'<span class=\"seg\" data-g=\"s_'+d.g+'\" title=\"'+d.label.replace(\".\",\"\")+' '+Math.round(w)+'%\" style=\"width:'+w+'%;background:'+d.color+'\"><\/span>':''; }).join('')+\n      '<\/div><div class=\"split-legend\">'+\n      sentDefs.map(d=>{ const w=d.v\/sTot*100; return w>0?'<span data-g=\"s_'+d.g+'\"><i style=\"background:'+d.color+'\"><\/i>'+d.label+' <b>'+Math.round(w)+'%<\/b><\/span>':''; }).join('')+\n      '<\/div><\/div>';\n    \/\/ Positivo \/ negativo: temas (vista general) o subtemas del tema seleccionado\n    let best, worst, useIcon=false;\n    if(st.theme){\n      const tv=themeVol(st.theme,f)||0, ssub=st.theme.sub||[];\n      const pick=(sent)=>{ let c=null,mv=-1; ssub.forEach(s=>{ if(s.sent===sent){ const vv=vol(s,f); if(vv>mv){mv=vv;c=s;} } }); return c?{label:c.label,r:tv>0?vol(c,f)\/tv:0,has:true}:{label:\"\u2014\",r:0,has:false}; };\n      best=pick(\"positivo\"); worst=pick(\"negativo\");\n    } else {\n      useIcon=true;\n      best={label:\"\u2014\",id:\"\",color:\"\",r:-1,has:false}; worst={label:\"\u2014\",id:\"\",color:\"\",r:-1,has:false};\n      THEMES.forEach(t=>{ const tv=themeVol(t,f); if(tv<=0) return;\n        const pos=(t.sub||[]).filter(x=>x.sent===\"positivo\").reduce((s,x)=>s+vol(x,f),0)\/tv;\n        const neg=(t.sub||[]).filter(x=>x.sent===\"negativo\").reduce((s,x)=>s+vol(x,f),0)\/tv;\n        if(pos>best.r) best={label:t.label,id:t.id,color:t.color,r:pos,has:true};\n        if(neg>worst.r) worst={label:t.label,id:t.id,color:t.color,r:neg,has:true}; });\n    }\n    const oneCard=(o,kind)=>'<div class=\"climate-one\"><div class=\"cl-top\">'+((useIcon&&o.id)?'<span class=\"cl-ic\">'+topicIcon(o.id,o.label)+'<\/span>':'')+'<span class=\"cl-pct '+kind+'\">'+(o.has?Math.round(Math.max(o.r,0)*100)+'%':'\u2014')+'<\/span><\/div><span class=\"cl-nm\">'+esc(o.label)+'<\/span><\/div>';\n    const m=[\n      {k:\"Pol\u00edtics vs Associacions\",v:repartoHTML},\n      {k:'<span style=\"color:#3F875C\">\u25b2 Positiu<\/span>',v:oneCard(best,\"pos\")},\n      {k:'<span style=\"color:#C2564A\">\u25bc Negatiu<\/span>',v:oneCard(worst,\"neg\")},\n      {k:\"Sentiment\",v:sentBar}\n    ];\n    $(\"#metrics\").innerHTML=m.map(x=>'<div class=\"metric\"><p class=\"k\">'+x.k+'<\/p><div class=\"v\">'+x.v+'<\/div><\/div>').join(\"\");\n  }\n  function subsInView(){\n    if(st.level===2 && st.theme) return st.theme.sub||[];\n    if(st.level===3 && st.sub) return [st.sub];\n    return allSubs();\n  }\n  function subEntities(s){\n    \/* El backend ya env\u00eda sub[].entities[] (name, group, count real, role). *\/\n    return (s && s.entities && s.entities.length) ? s.entities : [];\n  }\n  function roleLabel(group,role){ if(role) return role; if(group===\"pol\") return \"C\u00e0rrec p\u00fablic\"; if(group===\"aso\") return \"Associaci\u00f3\"; return \"\"; }\n  \/* Versi\u00f3n corta del cargo para los pills compactos (texto antes de \" \u00b7 \" o \" (\") *\/\n  function shortRole(group,role){ const full=roleLabel(group,role); if(!full) return \"\"; return full.split(\/\\s\u00b7\\s|\\s*\\(\/)[0].trim(); }\n  const STOP = new Set(\"de la el en y a los las del un una que con por para se su sus al lo como mas m\u00e1s o e u ni entre sobre sin tras este esta estos estas ese esa eso son ha han hay no si s\u00ed ya muy tambi\u00e9n tan tanto cada uno dos tres esta est\u00e1n fue ser es las les le nos seg\u00fan hacia desde durante mientras cuando donde quien cual cuales todo toda todos todas otro otra otros otras mismo misma pero porque aunque sino ante bajo cabe contra hasta para pues c\u00f3mo qu\u00e9 cu\u00e1l qui\u00e9n d\u00f3nde m\u00e1s menos hace hacen tras ello esto eso aqu\u00ed all\u00ed han haber sido sera ser\u00e1\".split(\/\\s+\/));\n  function topConcepts(x,n){\n    const parts=[x.summary||\"\"]; (x.top_posts||[]).forEach(p=>parts.push(p.text||\"\"));\n    if(x.pos){ [\"pol\",\"aso\"].forEach(g=>{ if(x.pos[g]&&x.pos[g].stance) parts.push(x.pos[g].stance); }); }\n    const freq=Object.create(null);\n    (parts.join(\" \").toLowerCase().match(\/[a-z\u00e1\u00e9\u00ed\u00f3\u00fa\u00f1\u00fc]{4,}\/gi)||[]).forEach(w=>{ if(STOP.has(w)) return; freq[w]=(freq[w]||0)+1; });\n    return Object.keys(freq).sort((a,b)=>freq[b]-freq[a]).filter(w=>freq[w]>1).slice(0,n)\n      .map(w=>w.charAt(0).toUpperCase()+w.slice(1));\n  }\n  function renderTopEntities(){\n    const box=document.getElementById(\"topents\"); if(!box) return;\n    const f=st.filter, subs=subsInView(), agg=Object.create(null);\n    subs.forEach(s=>{ subEntities(s).forEach(e=>{\n      if(!e||!e.name) return;\n      if(f!==\"todos\" && e.group && e.group!==f) return;\n      const c=+e.count||0; if(c<=0) return;\n      const a=agg[e.name]||(agg[e.name]={name:e.name,count:0,group:e.group||\"\",role:e.role||\"\"});\n      a.count+=c; if(!a.role && e.role) a.role=e.role; if(!a.group && e.group) a.group=e.group;\n    }); });\n    const top=Object.keys(agg).map(k=>agg[k]).sort((a,b)=>b.count-a.count).slice(0,4);\n    if(!top.length){ box.hidden=true; box.innerHTML=\"\"; return; }\n    box.hidden=false;\n    const themed = st.theme ? tint(st.theme.color,0.45) : null;\n    const rkStyle = themed ? ' style=\"background:'+themed.css+';color:'+themed.fg+'\"' : '';\n    box.innerHTML='<p class=\"k\">Stakeholders m\u00e9s actius<\/p><ol>'+\n      top.map((e,i)=>{ const r=shortRole(e.group,e.role), rFull=roleLabel(e.group,e.role);\n        return '<li class=\"ent-row\" data-ent=\"'+esc(e.name)+'\" role=\"button\" tabindex=\"0\" title=\"'+esc(e.name)+(rFull?' \u2014 '+esc(rFull):'')+'\"><span class=\"rk\"'+rkStyle+'>'+(i+1)+'<\/span><span class=\"ent\"><span class=\"nm\">'+esc(e.name)+'<\/span>'+\n          (r?'<span class=\"role\">'+esc(r)+'<\/span>':'')+'<\/span>'+\n          '<span class=\"ct\" title=\"'+e.count.toLocaleString(\"es-ES\")+' mencions\">('+e.count.toLocaleString(\"es-ES\")+')<\/span><\/li>'; }).join(\"\")+'<\/ol>';\n  }\n  function renderChips(){\n    const nav=$(\"#tchips\");\n    nav.innerHTML='<span class=\"flabel\">Temas<\/span>'+\n      '<button class=\"tchip\" data-amb=\"todos\" style=\"border-color:var(--line);color:var(--ink)\">Todos<\/button>'+\n      THEMES.map(t=>'<button class=\"tchip\" data-amb=\"'+t.id+'\" style=\"border-color:var(--line);color:var(--ink)\">'+esc(t.label)+'<\/button>').join(\"\");\n    Array.prototype.forEach.call(nav.querySelectorAll(\"button\"),b=>{ b.onclick=()=>{ const id=b.getAttribute(\"data-amb\"); if(id===\"todos\")goLevel1(); else goLevel2(THEMES.filter(t=>t.id===id)[0]); }; });\n    updateChips();\n  }\n  function updateChips(){\n    const cur=st.theme?st.theme.id:\"todos\";\n    Array.prototype.forEach.call(document.querySelectorAll(\"#tchips .tchip\"),b=>{\n      const id=b.getAttribute(\"data-amb\"),on=id===cur;\n      if(id===\"todos\"){ b.style.background=on?\"#1F2547\":\"#fff\"; b.style.color=on?\"#fff\":\"var(--ink)\"; b.style.borderColor=on?\"#1F2547\":\"var(--line)\"; }\n      else{ const t=THEMES.filter(x=>x.id===id)[0]; if(t){ b.style.background=on?t.color:\"#fff\"; b.style.color=on?fgFor(t.color):\"var(--ink)\"; b.style.borderColor=on?t.color:\"var(--line)\"; } }\n    });\n  }\n  function render(){\n    if(!THEMES.length){ canvas.innerHTML='<p class=\"wt-empty\">Sin datos.<\/p>'; return; }\n    renderMetrics(); renderTopEntities(); updateChips();\n    if(st.level<3){ detail.hidden=true; canvas.style.display=\"\"; }\n    if(st.level===1){\n      intro.hidden=true; scope.textContent=\"\u00c0mbits per volum de conversa \u00b7 \"+GROUPS[st.filter].label;\n      build(canvas,THEMES.map(t=>{ const v=themeVol(t,st.filter); return {value:v,label:t.label,color:t.color,fg:fgFor(t.color),num:v+\" mencions \u00b7 \"+(t.sub||[]).length+\" temes\",onclick:()=>goLevel2(t)}; }));\n    } else if(st.level===2){\n      intro.hidden=true; intro.textContent=\"\";\n      scope.textContent=\"Temes per volum de conversa \u00b7 \"+GROUPS[st.filter].label;\n      const vols=st.theme.sub.map(x=>vol(x,st.filter)),mn=Math.min.apply(null,vols),mx=Math.max.apply(null,vols);\n      build(canvas,st.theme.sub.map(x=>{ const v=vol(x,st.filter); let f=mx>mn?(v-mn)\/(mx-mn):1; f=0.25+0.75*f; const tt=tint(st.theme.color,f); return {value:Math.max(v,0.5),label:x.label,color:tt.css,fg:tt.fg,num:v+\" mencions\",onclick:()=>goLevel3(x)}; }));\n    } else renderPos();\n  }\n  function renderPos(){\n    intro.hidden=true; canvas.style.display=\"none\"; detail.hidden=false; detail.className=\"pos\";\n    const t=st.theme,x=st.sub,v=vol(x,st.filter),sc=SENTC[x.sent]||SENTC.mixto;\n    scope.textContent=\"\";\n    const groups=st.filter===\"todos\"?[\"pol\",\"aso\"]:[st.filter];\n    \/\/ Cabecera: bot\u00f3n volver a la izquierda + t\u00edtulo del subtema; breadcrumb peque\u00f1o debajo\n    const head='<div class=\"phead\"><button class=\"back\" id=\"back\">\u2190 Tornar a '+esc(t.label)+'<\/button>'+\n      '<h3 class=\"ptitle\">'+esc(x.label)+'<\/h3><\/div>'+\n      '<p class=\"pcrumb\">'+esc(GROUPS[st.filter].label+\" \u00b7 \"+t.label+\" \u00b7 \"+x.label)+'<\/p>';\n    \/\/ Descripci\u00f3n del tema (dos columnas: descripci\u00f3n | conceptos)\n    let desc='<div class=\"pdesc\"><div class=\"pdesc-col\"><h4 class=\"pdesc-h\">Descripci\u00f3 del tema<\/h4>'+\n      '<p class=\"psummary\">'+esc(x.summary||\"Sense descripci\u00f3 disponible per a aquest tema.\")+'<\/p><\/div>';\n    const concepts=topConcepts(x,8);\n    if(concepts.length){ desc+='<div class=\"pdesc-col pconcepts\"><span class=\"pconcepts-h\">Conceptes m\u00e9s repetits<\/span><div class=\"pconcepts-row\">'+concepts.map(c=>'<span class=\"pconcept\">'+esc(c)+'<\/span>').join(\"\")+'<\/div><\/div>'; }\n    desc+='<\/div>';\n    \/\/ Columna izquierda: qu\u00e9 dicen pol\u00edticos y asociaciones\n    let left='<div class=\"col-h\">Qu\u00e8 diuen \u00b7 '+v+' mencions<\/div>';\n    groups.forEach(g=>{ const p=(x.pos&&x.pos[g])||{stance:\"\",orgs:[]};\n      left+='<div class=\"pgroup\" style=\"--gc:'+GROUPS[g].color+'\"><h3><span class=\"gd\" style=\"background:'+GROUPS[g].color+'\"><\/span>'+GROUPS[g].label+' \u00b7 '+(x[g]||0)+' mencions<\/h3>'+\n        '<p class=\"pstance\">'+esc(p.stance||\"\u2014\")+'<\/p><div class=\"orgs\">'+(p.orgs||[]).map(o=>'<span class=\"org\">'+esc(o)+'<\/span>').join(\"\")+'<\/div><\/div>'; });\n    \/\/ Columna derecha: posts destacados (hasta 6, mismo alto, recorte + hover, bot\u00f3n Ver m\u00e1s)\n    const posts=(x.top_posts||[]).slice(0,6);\n    let right='<div class=\"col-h\">Posts m\u00e9s destacats<\/div>';\n    if(posts.length){\n      right+='<div class=\"tops\">'+\n        posts.map(p=>{ const dot=sentColor(p.sent||x.sent); const r=shortRole(p.type,p.role), rFull=roleLabel(p.type,p.role); const full=p.text||\"\"; const link=p.url?'<a class=\"top-link\" href=\"'+esc(p.url)+'\" target=\"_blank\" rel=\"noopener\">ver \u2197<\/a>':'';\n          return '<div class=\"top\" title=\"'+esc(full)+'\"><div class=\"top-head\"><span class=\"top-dot\" title=\"'+esc((SENTC[p.sent||x.sent]||SENTC.mixto).l)+'\" style=\"background:'+dot+'\"><\/span>'+\n            '<strong>'+esc(p.author||\"\u2014\")+'<\/strong>'+(r?'<span class=\"top-role\" title=\"'+esc(rFull)+'\">'+esc(r)+'<\/span>':'')+'<span class=\"top-net\" title=\"'+esc(NET[p.network]||p.network||\"\")+'\">'+(netIcon(p.network)||esc(NET[p.network]||p.network||\"\"))+'<\/span>'+\n            '<span class=\"top-impact\">'+((p.impact||0).toLocaleString(\"es-ES\"))+' impacte<\/span>'+link+'<\/div><div class=\"top-text\">'+esc(full)+'<\/div><\/div>'; }).join(\"\")+'<\/div>'+\n        '<button class=\"ver-mas\" id=\"vermas\" type=\"button\">Veure m\u00e9s<\/button>';\n    } else {\n      right+='<p class=\"wt-empty\" style=\"font-size:14px;color:var(--muted);margin-top:12px\">Sense posts destacats per a aquest tema.<\/p>';\n    }\n    detail.innerHTML=head+desc+'<div class=\"pos-grid\"><div class=\"pos-left\">'+left+'<\/div><div class=\"pos-right\">'+right+'<\/div><\/div>';\n    document.getElementById(\"back\").onclick=()=>goLevel2(t);\n    const vm=document.getElementById(\"vermas\"); if(vm) vm.onclick=()=>showContactPopup(x.label);\n    Array.prototype.forEach.call(detail.querySelectorAll(\".pconcept\"),el=>{ el.setAttribute(\"role\",\"button\"); el.setAttribute(\"tabindex\",\"0\"); el.onclick=()=>showContactPopup(el.textContent); el.onkeydown=ev=>{ if(ev.key===\"Enter\"||ev.key===\" \"){ ev.preventDefault(); showContactPopup(el.textContent); } }; });\n    window.scrollTo({top:0,behavior:\"smooth\"});\n  }\n  function goLevel1(){ st.level=1; st.theme=null; st.sub=null; render(); }\n  function goLevel2(t){ st.level=2; st.theme=t; st.sub=null; render(); }\n  function goLevel3(x){ st.level=3; st.sub=x; render(); }\n\n  Array.prototype.forEach.call(document.querySelectorAll(\".wt-tree .schip\"),c=>{\n    c.onclick=()=>{ st.filter=c.getAttribute(\"data-f\");\n      Array.prototype.forEach.call(document.querySelectorAll(\".wt-tree .schip\"),b=>{ const on=b===c;\n        b.style.background=on?\"#1F2547\":\"#fff\"; b.style.color=on?\"#fff\":\"var(--ink)\"; b.style.borderColor=on?\"#1F2547\":\"var(--line)\";\n        const d=b.querySelector(\".cdot\"); if(d)d.style.background=on?\"#fff\":\"#1F2547\"; });\n      render(); };\n  });\n  const _def = document.querySelector('.wt-tree .schip[data-f=\"todos\"]');\n  if (_def) _def.click();\n\n  (function(){\n    const root=document.querySelector(\".wt-tree\"); if(!root) return;\n    function setHot(g,on){ Array.prototype.forEach.call(root.querySelectorAll('.split [data-g]'),el=>{ if(el.getAttribute('data-g')===g) el.classList.toggle('hot',on); }); }\n    root.addEventListener('mouseover',e=>{ const t=e.target.closest&&e.target.closest('.split [data-g]'); if(t)setHot(t.getAttribute('data-g'),true); });\n    root.addEventListener('mouseout', e=>{ const t=e.target.closest&&e.target.closest('.split [data-g]'); if(t)setHot(t.getAttribute('data-g'),false); });\n  })();\n\n  \/* Popup \"Contacta con Vinces\" al pulsar una cuenta activa *\/\n  function ensureModal(){\n    let m=document.getElementById(\"watsModal\"); if(m) return m;\n    m=document.createElement(\"div\"); m.className=\"wt-modal\"; m.id=\"watsModal\"; m.setAttribute(\"role\",\"dialog\"); m.setAttribute(\"aria-modal\",\"true\"); m.setAttribute(\"aria-hidden\",\"true\");\n    m.innerHTML='<div class=\"box\"><h4>Contacta amb Vinces<\/h4><p id=\"watsModalMsg\"><\/p><div class=\"acts\"><a class=\"cta\" href=\"https:\/\/vincesconsulting.com\/contacto\/\" target=\"_blank\" rel=\"noopener\">Sol\u00b7licitar demo<\/a><button class=\"x\" type=\"button\">Cerrar<\/button><\/div><\/div>';\n    document.body.appendChild(m);\n    m.addEventListener(\"click\",e=>{ if(e.target===m||e.target.classList.contains(\"x\")) closeModal(); });\n    document.addEventListener(\"keydown\",e=>{ if(e.key===\"Escape\") closeModal(); });\n    return m;\n  }\n  function closeModal(){ const m=document.getElementById(\"watsModal\"); if(m){ m.classList.remove(\"open\"); m.setAttribute(\"aria-hidden\",\"true\"); } }\n  function showContactPopup(name){\n    const m=ensureModal();\n    m.querySelector(\"#watsModalMsg\").innerHTML='Per obtenir m\u00e9s informaci\u00f3 o una demo del teu informe, contacta amb Vinces.';\n    m.classList.add(\"open\"); m.setAttribute(\"aria-hidden\",\"false\");\n  }\n  (function(){\n    const tEl=document.getElementById(\"topents\"); if(!tEl) return;\n    function hit(e){ return e.target.closest&&e.target.closest(\"li.ent-row[data-ent]\"); }\n    tEl.addEventListener(\"click\",e=>{ const li=hit(e); if(li) showContactPopup(li.getAttribute(\"data-ent\")); });\n    tEl.addEventListener(\"keydown\",e=>{ if(e.key!==\"Enter\"&&e.key!==\" \") return; const li=hit(e); if(li){ e.preventDefault(); showContactPopup(li.getAttribute(\"data-ent\")); } });\n  })();\n  \/* CTA banner siempre visible bajo el gr\u00e1fico \u2192 modal de contacto *\/\n  (function(){\n    const b=document.getElementById(\"wtCtaBtn\"); if(b) b.addEventListener(\"click\",()=>showContactPopup());\n  })();\n\n  function load() {\n    loadDashboardData(DEFAULT_API_URL, data => {\n      renderSeoTables(data);\n      updateMeta(data);\n      setUpdatedPill(data, null);\n      const rep = data.report;\n      if (!rep || !rep.themes || !rep.themes.length) {\n        THEMES = [];\n        if (canvas) canvas.innerHTML = '<p class=\"wt-empty\">Sin informe tem\u00e1tico disponible todav\u00eda.<\/p>';\n        return;\n      }\n      THEMES = rep.themes;\n      softenThemes();\n      if (st.theme) { const nt = THEMES.filter(t => t.id === st.theme.id)[0]; st.theme = nt || null; if (!nt) { st.level = 1; st.sub = null; } }\n      renderChips(); render();\n    }, (msg, kind) => {\n      setUpdatedPill(null, kind === \"network\" ? \"Error de connexi\u00f3\" : kind === \"http\" ? \"Error HTTP\" : \"Error\");\n      if (canvas) canvas.innerHTML = '<p class=\"wt-empty\" style=\"color:#C0392B\">No se pudieron cargar los datos.<\/p>';\n    });\n  }\n\n  const absUrl = `${window.location.protocol}\/\/${window.location.host}\/api\/dashboard-publico\/wats\/`;\n  bindDownloadExternalHtml(absUrl);\n  load();\n  setInterval(load, REFRESH_MS);\n})();\n<\/script>\n\n\n\n<script>\n(function(){\n  function wrapHeroRight(){\n    return; \/* hero ya estructurado con .vc-hero-actions + rueda *\/\n    var pill = document.getElementById('updated-pill');\n    var cta = document.querySelector('.vc-hero-cta');\n    if (!pill || !cta || cta.parentNode.classList.contains('vc-hero-right')) return;\n    var wrap = document.createElement('div');\n    wrap.className = 'vc-hero-right';\n    cta.parentNode.insertBefore(wrap, cta);\n    wrap.appendChild(pill);\n    wrap.appendChild(cta);\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', wrapHeroRight);\n  } else {\n    wrapHeroRight();\n  }\n})();\n<\/script>\n\n<\/body><\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>WATS: temes de conversa dels partits pol\u00edtics \u00b7 Intel\u00b7lig\u00e8ncia social \u00b7 Vinces WATS \u00b7 Intel\u00b7lig\u00e8ncia social Qu\u00e8 diuen els qui t\u2019interessen? WATS respon a What Are They Saying?: qu\u00e8 diuen associacions, l\u00edders d\u2019opini\u00f3, decisors i altres actors clau sobre els temes que et preocupen. Analitza la conversa p\u00fablica a les xarxes socials i als mitjans [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4957,"parent":11878,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-11039","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/vincesconsulting.com\/ca\/wp-json\/wp\/v2\/pages\/11039","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vincesconsulting.com\/ca\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/vincesconsulting.com\/ca\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/vincesconsulting.com\/ca\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vincesconsulting.com\/ca\/wp-json\/wp\/v2\/comments?post=11039"}],"version-history":[{"count":0,"href":"https:\/\/vincesconsulting.com\/ca\/wp-json\/wp\/v2\/pages\/11039\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/vincesconsulting.com\/ca\/wp-json\/wp\/v2\/pages\/11878"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vincesconsulting.com\/ca\/wp-json\/wp\/v2\/media\/4957"}],"wp:attachment":[{"href":"https:\/\/vincesconsulting.com\/ca\/wp-json\/wp\/v2\/media?parent=11039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}