{"id":2293,"date":"2026-06-12T12:00:01","date_gmt":"2026-06-12T12:00:01","guid":{"rendered":"https:\/\/macarenatorralba.es\/?p=2293"},"modified":"2026-06-12T12:14:10","modified_gmt":"2026-06-12T12:14:10","slug":"los-espacios-de-datos-no-son-repositorios-son-reglas-de-juego","status":"publish","type":"post","link":"https:\/\/macarenatorralba.es\/en\/los-espacios-de-datos-no-son-repositorios-son-reglas-de-juego\/","title":{"rendered":"Data spaces are not repositories: they are rules of the game"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"2293\" class=\"elementor elementor-2293\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9fafb15 e-flex e-con-boxed e-con e-parent\" data-id=\"9fafb15\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<h1 data-interaction-id=\"98a365a\" class=\"H1 e-98a365a-a18d3d3 e-heading-base\">Los espacios de datos no son repositorios: son reglas de juego<\/h1>\n\t\t\t\t\t<p class=\"Body1 e-paragraph-base\" data-interaction-id=\"805fbd0\">El valor de un espacio de datos no est\u00e1 en almacenar informaci\u00f3n en un lugar com\u00fan, sino en definir c\u00f3mo distintas organizaciones pueden compartir, consumir o prestar servicios sobre datos bajo reglas de confianza, interoperabilidad y control.<\/p>\n\t\t\t\t\t<p class=\"e-1dd29b9-777e70e Enphasis1 e-paragraph-base\" data-interaction-id=\"1dd29b9\">Espacios de datos \u00b7 Interoperabilidad \u00b7 Gobernanza \u00b7 SSI \u00b7 Datos sensibles \u00b7 Confianza digital \u00b7 Producto digital<\/p>\n\t\t\t\t<div class=\"elementor-element elementor-element-27e2922 elementor-widget elementor-widget-html\" data-id=\"27e2922\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div id=\"hero-end\"><\/div>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5ae9d59 e-flex e-con-boxed e-con e-parent\" data-id=\"5ae9d59\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<h2 data-interaction-id=\"00f2ba3\" class=\"H2 e-00f2ba3-dd0fdd9 e-heading-base\">El espacio de datos como marco de confianza<\/h2>\n\t\t\t\t\t<p class=\"Enphasis2 e-paragraph-base\" data-interaction-id=\"f81d8b5\">Un espacio de datos no deber\u00eda entenderse como una nube compartida ni como un repositorio centralizado, sino como un marco de reglas que permite conectar organizaciones, datos y servicios bajo condiciones claras de confianza.<\/p>\n\t\t\t\t\t<p class=\"Body2 e-paragraph-base\" data-interaction-id=\"97be46b\">Durante mucho tiempo, muchas conversaciones sobre datos se han centrado en acumular, centralizar o integrar informaci\u00f3n. Cuantos m\u00e1s datos, mejor. Cuanto m\u00e1s accesibles, m\u00e1s valor. Pero en sectores donde intervienen m\u00faltiples organizaciones, sistemas desconectados, datos sensibles y responsabilidades legales, el problema no suele ser \u00fanicamente d\u00f3nde guardar la informaci\u00f3n, sino c\u00f3mo permitir que pueda usarse sin perder control.<br><br>Ah\u00ed es donde los espacios de datos empiezan a tener sentido. No como una plataforma donde todo se copia, sino como un entorno donde se definen reglas de acceso, condiciones de uso, permisos, est\u00e1ndares, trazabilidad y mecanismos de confianza entre actores que no necesariamente comparten infraestructura ni relaci\u00f3n previa.<br><br>La idea cambia bastante el enfoque de producto. Ya no se trata solo de dise\u00f1ar una base de datos, una API o un portal de intercambio, sino de dise\u00f1ar un ecosistema donde cada participante pueda ofrecer, consumir o procesar datos de forma controlada, manteniendo soberan\u00eda, seguridad y utilidad real.<\/p>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7f0d61f e-flex e-con-boxed e-con e-parent\" data-id=\"7f0d61f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<h2 data-interaction-id=\"dd22d0f\" class=\"H2 e-dd22d0f-4ed1920 e-heading-base\">De compartir datos a compartir bajo condiciones<\/h2>\n\t\t<div class=\"elementor-element elementor-element-ece0136 e-con-full e-flex e-con e-child\" data-id=\"ece0136\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-ee88144 e-con-full e-flex e-con e-child\" data-id=\"ee88144\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<p class=\"Body2 e-e3473b7-41f9134 e-paragraph-base\" data-interaction-id=\"e3473b7\">Despu\u00e9s de trabajar en proyectos vinculados a interoperabilidad, credenciales verificables, datos sanitarios y servicios conectados a espacios de datos, cada vez veo m\u00e1s claro que el reto no est\u00e1 solo en mover informaci\u00f3n de un sistema a otro. El reto est\u00e1 en hacer que ese intercambio tenga sentido, est\u00e9 gobernado y pueda sostenerse en procesos reales.<br><br>Compartir datos parece una idea sencilla hasta que aparecen las preguntas importantes. Qui\u00e9n puede acceder. Para qu\u00e9 finalidad. Durante cu\u00e1nto tiempo. Con qu\u00e9 consentimiento. Bajo qu\u00e9 est\u00e1ndar. Con qu\u00e9 garant\u00edas. Qu\u00e9 ocurre si el dato es sensible. Qu\u00e9 parte se consume de forma temporal. Qu\u00e9 organizaci\u00f3n mantiene la responsabilidad. Qu\u00e9 sistema verifica que las reglas se cumplen.<br><br>Por eso, un espacio de datos no puede reducirse a una integraci\u00f3n t\u00e9cnica. Puede incluir conectores, cat\u00e1logos, servicios, APIs o mecanismos de identidad, pero su valor est\u00e1 en la gobernanza que permite que todo eso funcione. Sin reglas claras, el intercambio de datos se convierte en una transferencia m\u00e1s. Con reglas bien dise\u00f1adas, puede convertirse en una infraestructura de colaboraci\u00f3n.<br><br>Esto es especialmente importante en sectores como salud, administraci\u00f3n p\u00fablica, industria, energ\u00eda o movilidad, donde la informaci\u00f3n puede tener mucho valor, pero tambi\u00e9n muchas restricciones. En esos contextos, el dato no puede circular sin contexto. Necesita est\u00e1ndares, trazabilidad, permisos, controles de acceso y una experiencia que ayude a entender qu\u00e9 se est\u00e1 compartiendo y para qu\u00e9.<br><br>La oportunidad est\u00e1 en pasar de una l\u00f3gica de posesi\u00f3n del dato a una l\u00f3gica de uso confiable. No siempre hace falta mover el dato completo, duplicarlo o entregarlo definitivamente. A veces el valor est\u00e1 en permitir una consulta, una transformaci\u00f3n, una validaci\u00f3n o un servicio temporal sobre datos que siguen estando bajo control de quien los aporta.<\/p>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-d58776b e-con-full e-flex e-con e-child\" data-id=\"d58776b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" class=\"e-image-base \" data-interaction-id=\"ca7f320\" id=\"2294\" src=\"https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/06\/kevin-schmid-8-IkY5S4Dlc-unsplash-scaled.jpg\" width=\"2560\" height=\"1707\" srcset=\"https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/06\/kevin-schmid-8-IkY5S4Dlc-unsplash-scaled.jpg 2560w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/06\/kevin-schmid-8-IkY5S4Dlc-unsplash-300x200.jpg 300w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/06\/kevin-schmid-8-IkY5S4Dlc-unsplash-1024x683.jpg 1024w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/06\/kevin-schmid-8-IkY5S4Dlc-unsplash-768x512.jpg 768w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/06\/kevin-schmid-8-IkY5S4Dlc-unsplash-1536x1024.jpg 1536w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/06\/kevin-schmid-8-IkY5S4Dlc-unsplash-2048x1365.jpg 2048w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/06\/kevin-schmid-8-IkY5S4Dlc-unsplash-18x12.jpg 18w\" alt=\"fotograf\u00eda abstracta que representa la idea de c\u00edrculo o gobernanza en un espacio de datos\"\/>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4abed1b e-flex e-con-boxed e-con e-parent\" data-id=\"4abed1b\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<h2 data-interaction-id=\"1e0893a\" class=\"H2 e-1e0893a-f894618 e-heading-base\">El reto est\u00e1 en hacerlo operable<\/h2>\n\t\t\t\t\t<p class=\"Body2 e-54bdc55-84ca9db e-paragraph-base\" data-interaction-id=\"54bdc55\">El concepto de espacio de datos puede sonar abstracto si no se aterriza en casos de uso concretos. Para que funcione, no basta con definir un marco t\u00e9cnico o una arquitectura de referencia. Hay que convertir esas reglas en flujos, permisos, servicios, decisiones y experiencias que las organizaciones puedan entender y utilizar.<\/p>\n\t\t<div class=\"elementor-element elementor-element-7696944 e-con-full e-flex e-con e-child\" data-id=\"7696944\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-41bf3c3 e-con-full e-flex e-con e-child\" data-id=\"41bf3c3\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-svg-base\" data-interaction-id=\"1498867\"><\/div>\t\t<div class=\"elementor-element elementor-element-b4ffe24 e-con-full e-flex e-con e-child\" data-id=\"b4ffe24\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<h2 data-interaction-id=\"07d620d\" class=\"H3 e-heading-base\">Gobernanza antes que plataforma<\/h2>\n\t\t\t\t\t<p class=\"Body2 e-paragraph-base\" data-interaction-id=\"3ac84e4\">Un espacio de datos necesita tecnolog\u00eda, pero no empieza por la tecnolog\u00eda. Empieza por definir qui\u00e9n participa, qu\u00e9 puede aportar, qu\u00e9 puede consumir, bajo qu\u00e9 condiciones y con qu\u00e9 responsabilidades. Sin esa gobernanza, cualquier plataforma corre el riesgo de convertirse en un repositorio m\u00e1s, sin confianza suficiente para que las organizaciones compartan informaci\u00f3n valiosa.<\/p>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2b0b4c6 e-con-full e-flex e-con e-child\" data-id=\"2b0b4c6\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-svg-base\" data-interaction-id=\"0e5e8c3\"><\/div>\t\t<div class=\"elementor-element elementor-element-451e053 e-con-full e-flex e-con e-child\" data-id=\"451e053\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<h2 data-interaction-id=\"d8ae5fb\" class=\"H3 e-heading-base\">Interoperabilidad real<\/h2>\n\t\t\t\t\t<p class=\"Body2 e-paragraph-base\" data-interaction-id=\"9354f9f\">El intercambio de datos solo aporta valor si los sistemas pueden entenderse. Esto implica trabajar con est\u00e1ndares, modelos comunes, formatos estructurados y mecanismos que permitan transformar informaci\u00f3n heterog\u00e9nea en datos \u00fatiles. En salud, por ejemplo, no basta con tener informes cl\u00ednicos: hace falta estructurarlos para que puedan integrarse, consultarse o reutilizarse de forma segura.<\/p>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-06ec40a e-con-full e-flex e-con e-child\" data-id=\"06ec40a\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-svg-base\" data-interaction-id=\"e625111\"><\/div>\t\t<div class=\"elementor-element elementor-element-4e5f152 e-con-full e-flex e-con e-child\" data-id=\"4e5f152\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<h2 data-interaction-id=\"474387c\" class=\"H3 e-heading-base\">Identidad y confianza<\/h2>\n\t\t\t\t\t<p class=\"Body2 e-paragraph-base\" data-interaction-id=\"98ecc54\">Para que un espacio de datos funcione, no solo hay que saber qu\u00e9 dato se comparte, sino qui\u00e9n lo ofrece, qui\u00e9n lo consume y con qu\u00e9 legitimidad. Aqu\u00ed la identidad digital, las credenciales verificables y los mecanismos de autorizaci\u00f3n pueden tener un papel importante, especialmente cuando intervienen organizaciones, profesionales, pacientes, administraciones o terceros con distintos niveles de permiso.<\/p>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0c4d868 e-con-full e-flex e-con e-child\" data-id=\"0c4d868\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-svg-base\" data-interaction-id=\"3e823e3\"><\/div>\t\t<div class=\"elementor-element elementor-element-341499f e-con-full e-flex e-con e-child\" data-id=\"341499f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<h2 data-interaction-id=\"999072e\" class=\"H3 e-heading-base\">Uso controlado del dato<\/h2>\n\t\t\t\t\t<p class=\"Body2 e-paragraph-base\" data-interaction-id=\"c31371d\">La clave no siempre est\u00e1 en entregar datos, sino en permitir usos concretos bajo reglas concretas. Un espacio de datos puede habilitar consultas temporales, servicios de transformaci\u00f3n, anal\u00edtica, validaci\u00f3n o entrenamiento bajo condiciones definidas. Esta l\u00f3gica permite explorar valor sin convertir el intercambio en una cesi\u00f3n indiscriminada de informaci\u00f3n.<\/p>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e39e3b4 e-flex e-con-boxed e-con e-parent\" data-id=\"e39e3b4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<h2 data-interaction-id=\"6432882\" class=\"H2 e-6432882-592f4df e-heading-base\">SSI y est\u00e1ndares como piezas del ecosistema<\/h2>\n\t\t<div class=\"elementor-element elementor-element-af450e1 e-con-full e-flex e-con e-child\" data-id=\"af450e1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-1738cea e-con-full e-flex e-con e-child\" data-id=\"1738cea\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<h2 data-interaction-id=\"35839e6\" class=\"Enphasis2 e-heading-base\">La interoperabilidad no depende solo de que los datos tengan un formato com\u00fan. Tambi\u00e9n necesita confianza sobre qui\u00e9n participa, qu\u00e9 atributos tiene cada actor y qu\u00e9 permisos existen en cada interacci\u00f3n.<\/h2>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-cab7ced e-con-full e-flex e-con e-child\" data-id=\"cab7ced\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-a7168aa e-con-full e-flex e-con e-child\" data-id=\"a7168aa\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<p class=\"e-paragraph-base\" data-interaction-id=\"fa6c2ed\">En un espacio de datos, SSI puede aportar una capa muy \u00fatil para representar identidad, atributos, autorizaciones o consentimiento de forma verificable. Una organizaci\u00f3n podr\u00eda demostrar que est\u00e1 habilitada para acceder a un servicio, un profesional podr\u00eda acreditar su rol, un paciente podr\u00eda presentar informaci\u00f3n bajo determinadas condiciones o una entidad podr\u00eda verificar que otra cumple ciertos requisitos antes de permitir el consumo de datos.<br><br>Las credenciales verificables no sustituyen al espacio de datos, pero pueden reforzar su l\u00f3gica de confianza. Ayudan a que los actores no dependan \u00fanicamente de integraciones cerradas o validaciones manuales, sino de pruebas digitales que pueden presentarse y verificarse dentro del flujo. Esto es especialmente relevante cuando hay varias organizaciones, relaciones de confianza distribuidas o procesos donde importa saber en calidad de qu\u00e9 act\u00faa cada participante.<br><br>Los est\u00e1ndares de datos cumplen otra funci\u00f3n igual de importante. En salud, por ejemplo, HL7 permite estructurar informaci\u00f3n cl\u00ednica para que pueda ser entendida por sistemas distintos. Sin esa capa, una anal\u00edtica escaneada, un informe en PDF o un historial fragmentado pueden contener informaci\u00f3n valiosa, pero dif\u00edcilmente reutilizable en un proceso asistencial, de investigaci\u00f3n o de apoyo a la decisi\u00f3n.<\/p>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-86f1ff4 e-con-full e-flex e-con e-child\" data-id=\"86f1ff4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<p class=\"e-paragraph-base\" data-interaction-id=\"599f531\">La combinaci\u00f3n de espacios de datos, est\u00e1ndares e identidad verificable puede abrir escenarios muy potentes. No porque todo se conecte m\u00e1gicamente, sino porque permite ordenar varias piezas que suelen estar separadas: qui\u00e9n soy, qu\u00e9 dato tengo, qu\u00e9 formato utiliza, qu\u00e9 permiso existe, qu\u00e9 servicio puede procesarlo y qu\u00e9 uso est\u00e1 permitido.<br><br>Pero precisamente por eso, el reto de producto es grande. Si todos estos conceptos llegan al usuario como jerga t\u00e9cnica, el sistema no ser\u00e1 adoptable. Nadie deber\u00eda necesitar entender en detalle qu\u00e9 es SSI, HL7, una credencial verificable o un conector de espacio de datos para poder beneficiarse del flujo. La experiencia debe traducir todo eso en acciones comprensibles: solicitar, autorizar, compartir, transformar, consultar, verificar o revocar.<br><br>Por eso, dise\u00f1ar productos para espacios de datos exige mirar m\u00e1s all\u00e1 de la arquitectura. Hay que entender el caso de uso, los actores, la sensibilidad del dato, los est\u00e1ndares necesarios, las reglas de acceso y el momento exacto en el que cada persona u organizaci\u00f3n necesita tomar una decisi\u00f3n.<\/p>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a6d9917 e-flex e-con-boxed e-con e-parent\" data-id=\"a6d9917\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<h2 data-interaction-id=\"2d0a5ed\" class=\"H2 e-2d0a5ed-0fc9c24 e-heading-base\">De la arquitectura al valor real<\/h2>\n\t\t<div class=\"elementor-element elementor-element-bf8c5ad e-con-full e-flex e-con e-child\" data-id=\"bf8c5ad\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<h2 data-interaction-id=\"bac3d41\" class=\"Enphasis2 e-heading-base\">Un espacio de datos solo empieza a tener valor cuando sus reglas se convierten en servicios \u00fatiles, comprensibles y accionables para quienes participan.<\/h2>\n\t\t\t\t\t<p class=\"e-paragraph-base\" data-interaction-id=\"17463f6\">La promesa de los espacios de datos es muy potente: permitir que organizaciones que antes operaban de forma aislada puedan colaborar, compartir informaci\u00f3n o consumir servicios sin renunciar al control sobre sus datos. Pero esa promesa no se materializa solo con tecnolog\u00eda. Necesita gobernanza, est\u00e1ndares, confianza, experiencia de usuario y casos de uso que justifiquen el esfuerzo de participar.<br><br>Para quienes trabajamos en producto digital, el reto est\u00e1 en aterrizar esa complejidad sin simplificarla en exceso. Un espacio de datos no es una pantalla, ni un dashboard, ni una API. Es un ecosistema de relaciones, permisos, responsabilidades y servicios. Dise\u00f1arlo bien implica convertir reglas abstractas en flujos claros, y hacer que la confianza no sea solo una condici\u00f3n t\u00e9cnica, sino una experiencia comprensible para personas y organizaciones.<\/p>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c8ea259 e-flex e-con-boxed e-con e-parent\" data-id=\"c8ea259\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6eda82a elementor-widget elementor-widget-html\" data-id=\"6eda82a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- NAVEGACI\u00d3N REFLEXI\u00d3N ANTERIOR \/ SIGUIENTE -->\n<section class=\"mt-simple-post-nav is-loading\" id=\"mtSimplePostNav\" data-category-slug=\"insight\" aria-label=\"Navegaci\u00f3n entre reflexiones\">\n  <a class=\"mt-simple-post-nav-link mt-simple-post-nav-prev\" id=\"mtSimplePostPrev\" href=\"#\">\n    <span class=\"mt-simple-arrow mt-simple-arrow-left\"><\/span>\n    <span class=\"mt-simple-post-title\">Entrada anterior<\/span>\n  <\/a>\n\n  <a class=\"mt-simple-post-nav-link mt-simple-post-nav-next\" id=\"mtSimplePostNext\" href=\"#\">\n    <span class=\"mt-simple-post-title\">Entrada siguiente<\/span>\n    <span class=\"mt-simple-arrow mt-simple-arrow-right\"><\/span>\n  <\/a>\n<\/section>\n\n<style>\n\/* ===== INSIGHT DETAIL SIMPLE NAVIGATION ===== *\/\n\n.mt-simple-post-nav {\n  width: 100%;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 32px;\n  margin: 72px 0 0 0;\n  padding: 0;\n}\n\n.mt-simple-post-nav-link {\n  display: inline-flex;\n  align-items: center;\n  gap: 12px;\n  font-family: \"Poppins\", sans-serif !important;\n  font-size: 15px !important;\n  font-weight: 500 !important;\n  line-height: 1.3 !important;\n  color: #4E9288 !important;\n  text-decoration: none !important;\n  transition: color 0.25s ease, transform 0.25s ease;\n}\n\n.mt-simple-post-nav-link:hover {\n  color: #2B5E56 !important;\n}\n\n.mt-simple-post-nav-prev:hover {\n  transform: translateX(-3px);\n}\n\n.mt-simple-post-nav-next:hover {\n  transform: translateX(3px);\n}\n\n.mt-simple-post-nav-next {\n  margin-left: auto;\n  text-align: right;\n}\n\n.mt-simple-arrow {\n  width: 8px;\n  height: 8px;\n  border-top: 1.6px solid currentColor;\n  border-right: 1.6px solid currentColor;\n  display: inline-block;\n  flex: 0 0 auto;\n}\n\n.mt-simple-arrow-left {\n  transform: rotate(-135deg);\n}\n\n.mt-simple-arrow-right {\n  transform: rotate(45deg);\n}\n\n.mt-simple-post-title {\n  display: inline-block;\n}\n\n.mt-simple-post-nav.is-loading {\n  opacity: 0;\n  pointer-events: none;\n}\n\n.mt-simple-post-nav.is-empty {\n  display: none !important;\n}\n\n\/* Responsive *\/\n@media (max-width: 767px) {\n  .mt-simple-post-nav {\n    flex-direction: row;\n    align-items: center;\n    justify-content: space-between;\n    gap: 18px;\n    margin-top: 56px;\n    flex-wrap: nowrap;\n  }\n\n  .mt-simple-post-nav-link {\n    font-size: 15px !important;\n    line-height: 1.6 !important;\n    color: #4E9288 !important;\n    white-space: nowrap;\n  }\n\n  .mt-simple-post-nav-prev {\n    justify-content: flex-start;\n  }\n\n  .mt-simple-post-nav-next {\n    margin-left: auto;\n    justify-content: flex-end;\n    text-align: right;\n  }\n\n  .mt-simple-post-title {\n    white-space: nowrap;\n  }\n}\n<\/style>\n\n<script>\n(function () {\n  const DEFAULT_CATEGORY_SLUG = \"insight\";\n  let resizeTimer = null;\n\n  function isEnglish() {\n    const path = window.location.pathname || \"\";\n    return path.startsWith(\"\/en\/\") || path === \"\/en\";\n  }\n\n  function isMobileViewport() {\n    return window.innerWidth <= 767;\n  }\n\n  function getPrevFallbackText() {\n    return isEnglish() ? \"Previous entry\" : \"Entrada anterior\";\n  }\n\n  function getNextFallbackText() {\n    return isEnglish() ? \"Next entry\" : \"Entrada siguiente\";\n  }\n\n  function getPrevMobileText() {\n    return isEnglish() ? \"Previous\" : \"Anterior\";\n  }\n\n  function getNextMobileText() {\n    return isEnglish() ? \"Next\" : \"Siguiente\";\n  }\n\n  function cleanText(value) {\n    const div = document.createElement(\"div\");\n    div.innerHTML = value || \"\";\n\n    return (div.textContent || div.innerText || \"\")\n      .replace(\/\\s+\/g, \" \")\n      .trim();\n  }\n\n  function normalizeSlugFromPath(pathname) {\n    let path = pathname || window.location.pathname || \"\";\n\n    path = path\n      .replace(\/^\\\/es\\\/\/, \"\/\")\n      .replace(\/^\\\/en\\\/\/, \"\/\")\n      .replace(\/^\\\/+|\\\/+$\/g, \"\");\n\n    const parts = path.split(\"\/\").filter(Boolean);\n\n    return parts.length ? parts[parts.length - 1] : \"\";\n  }\n\n  function localizeUrl(url) {\n    if (!url) return \"#\";\n\n    const currentPath = window.location.pathname || \"\";\n    let cleanUrl = url.replace(window.location.origin, \"\");\n\n    if (currentPath.startsWith(\"\/es\/\")) {\n      cleanUrl = cleanUrl.replace(\/^\\\/en\\\/\/, \"\/es\/\");\n    }\n\n    if (currentPath.startsWith(\"\/en\/\")) {\n      cleanUrl = cleanUrl.replace(\/^\\\/es\\\/\/, \"\/en\/\");\n    }\n\n    return cleanUrl;\n  }\n\n  async function fetchCategoryId(categorySlug) {\n    const response = await fetch(\n      \"\/wp-json\/wp\/v2\/categories?slug=\" + encodeURIComponent(categorySlug)\n    );\n\n    if (!response.ok) {\n      throw new Error(\"No se pudo cargar la categor\u00eda\");\n    }\n\n    const categories = await response.json();\n\n    if (!categories || !categories.length) {\n      throw new Error(\"No existe la categor\u00eda \" + categorySlug);\n    }\n\n    return categories[0].id;\n  }\n\n  async function fetchInsightPosts(categoryId) {\n    const url =\n      \"\/wp-json\/wp\/v2\/posts\" +\n      \"?categories=\" + encodeURIComponent(categoryId) +\n      \"&per_page=100\" +\n      \"&orderby=date\" +\n      \"&order=desc\" +\n      \"&_fields=link,slug,title,date\";\n\n    const response = await fetch(url);\n\n    if (!response.ok) {\n      throw new Error(\"No se pudieron cargar las reflexiones\");\n    }\n\n    return await response.json();\n  }\n\n  function updatePostNavLabels() {\n    const prevLink = document.getElementById(\"mtSimplePostPrev\");\n    const nextLink = document.getElementById(\"mtSimplePostNext\");\n\n    if (!prevLink || !nextLink) return;\n\n    const prevTitleEl = prevLink.querySelector(\".mt-simple-post-title\");\n    const nextTitleEl = nextLink.querySelector(\".mt-simple-post-title\");\n\n    if (!prevTitleEl || !nextTitleEl) return;\n\n    const prevFullTitle = prevLink.dataset.fullTitle || getPrevFallbackText();\n    const nextFullTitle = nextLink.dataset.fullTitle || getNextFallbackText();\n\n    prevTitleEl.textContent = isMobileViewport() ? getPrevMobileText() : prevFullTitle;\n    nextTitleEl.textContent = isMobileViewport() ? getNextMobileText() : nextFullTitle;\n\n    prevLink.setAttribute(\"aria-label\", getPrevFallbackText() + \": \" + prevFullTitle);\n    nextLink.setAttribute(\"aria-label\", getNextFallbackText() + \": \" + nextFullTitle);\n  }\n\n  function renderInsightNav(posts) {\n    const nav = document.getElementById(\"mtSimplePostNav\");\n    const prevLink = document.getElementById(\"mtSimplePostPrev\");\n    const nextLink = document.getElementById(\"mtSimplePostNext\");\n\n    if (!nav || !prevLink || !nextLink || !posts || posts.length < 2) {\n      if (nav) nav.classList.add(\"is-empty\");\n      return;\n    }\n\n    const currentSlug = normalizeSlugFromPath(window.location.pathname);\n\n    const currentIndex = posts.findIndex(function (post) {\n      return post.slug === currentSlug;\n    });\n\n    if (currentIndex === -1) {\n      nav.classList.add(\"is-empty\");\n      return;\n    }\n\n    \/*\n      Orden por fecha descendente:\n      posts[0] = m\u00e1s reciente\n\n      Entrada anterior = m\u00e1s antigua.\n      Si estamos en la m\u00e1s antigua, vuelve a la m\u00e1s reciente.\n\n      Entrada siguiente = m\u00e1s reciente.\n      Si estamos en la m\u00e1s reciente, vuelve a la m\u00e1s antigua.\n    *\/\n    const prevIndex = currentIndex === posts.length - 1 ? 0 : currentIndex + 1;\n    const nextIndex = currentIndex === 0 ? posts.length - 1 : currentIndex - 1;\n\n    const prevPost = posts[prevIndex];\n    const nextPost = posts[nextIndex];\n\n    const prevTitle = cleanText(prevPost.title && prevPost.title.rendered) || getPrevFallbackText();\n    const nextTitle = cleanText(nextPost.title && nextPost.title.rendered) || getNextFallbackText();\n\n    prevLink.href = localizeUrl(prevPost.link);\n    nextLink.href = localizeUrl(nextPost.link);\n\n    prevLink.dataset.fullTitle = prevTitle;\n    nextLink.dataset.fullTitle = nextTitle;\n\n    updatePostNavLabels();\n\n    nav.classList.remove(\"is-loading\");\n  }\n\n  async function initSimplePostNavigation() {\n    const nav = document.getElementById(\"mtSimplePostNav\");\n\n    if (!nav) return;\n    if (nav.dataset.initialized === \"true\") return;\n\n    nav.dataset.initialized = \"true\";\n    nav.classList.add(\"is-loading\");\n\n    const categorySlug = nav.getAttribute(\"data-category-slug\") || DEFAULT_CATEGORY_SLUG;\n\n    try {\n      const categoryId = await fetchCategoryId(categorySlug);\n      const posts = await fetchInsightPosts(categoryId);\n      renderInsightNav(posts);\n    } catch (error) {\n      nav.classList.add(\"is-empty\");\n      console.warn(\"No se pudo inicializar la navegaci\u00f3n de reflexiones:\", error);\n    }\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", initSimplePostNavigation);\n  } else {\n    initSimplePostNavigation();\n  }\n\n  window.addEventListener(\"load\", initSimplePostNavigation);\n\n  window.addEventListener(\"resize\", function () {\n    clearTimeout(resizeTimer);\n\n    resizeTimer = setTimeout(function () {\n      updatePostNavLabels();\n    }, 150);\n  });\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f361c0d e-flex e-con-boxed e-con e-parent\" data-id=\"f361c0d\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<h1 data-interaction-id=\"66a0915\" class=\"H2-W e-66a0915-515bcb3 e-heading-base\">Hablemos de datos, confianza e interoperabilidad<\/h1>\n\t\t\t\t\t<p class=\"Body1 e-paragraph-base\" data-interaction-id=\"cc84cef\">Trabajo en productos digitales donde datos, identidad, interoperabilidad y experiencia de usuario tienen que convivir de forma clara. Si est\u00e1s explorando casos de uso relacionados con espacios de datos, credenciales verificables o servicios basados en confianza, podemos hablar.<\/p>\n\t\t<div class=\"elementor-element elementor-element-c941544 e-con-full e-flex e-con e-child\" data-id=\"c941544\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c06e277 elementor-widget elementor-widget-button\" data-id=\"c06e277\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"mailto:emacarenatorralba@gmail.com\" id=\"contacto\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Contacto<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5f59d5b e-flex e-con-boxed e-con e-parent\" data-id=\"5f59d5b\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-7e3dda8 e-con-full e-flex e-con e-child\" data-id=\"7e3dda8\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-4342e9b e-con-full e-flex e-con e-child\" data-id=\"4342e9b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<h1 data-interaction-id=\"b1ad7a1\" class=\"Enphasis1 e-heading-base\">Macarena Torralba<\/h1>\n\t\t\t\t\t<p class=\"Body1 e-paragraph-base\" data-interaction-id=\"9990d07\">Product Innovacion \u00b7 UX Strategy \u00b7 IA &amp; Emerging Tech<\/p>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-dfcd25b e-con-full e-flex e-con e-child\" data-id=\"dfcd25b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<p class=\"Body1 e-45e3dc0-856c94c e-paragraph-base\" data-interaction-id=\"45e3dc0\"><a href=\"mailto:emacarenatorralba@gmail.com\" target=\"_self\" class=\"e-paragraph-link-base\">\n\t\tMail\n\t<\/a><\/p>\n\t\t\t\t\t<p class=\"Body1 e-paragraph-base\" data-interaction-id=\"c7700fd\"><a href=\"https:\/\/www.linkedin.com\/in\/macarenatorralbagarcia\/\" target=\"_blank\" class=\"e-paragraph-link-base\">\n\t\tLinkedin\n\t<\/a><\/p>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-cc8ec59 e-con-full e-flex e-con e-child\" data-id=\"cc8ec59\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<h1 data-interaction-id=\"8d8efaf\" class=\"e-8d8efaf-66dd968 Body1 e-heading-base\">Definiendo y aterrizando productos digitales complejos desde la intersecci\u00f3n entre experiencia, tecnolog\u00eda e innovaci\u00f3n.<\/h1>\n\t\t<div class=\"elementor-element elementor-element-c95588f e-con-full e-flex e-con e-child\" data-id=\"c95588f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1b04d66 elementor-widget elementor-widget-html\" data-id=\"1b04d66\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<header class=\"mt-header\" id=\"mtHeader\">\n  <div class=\"mt-header-inner\">\n    <a class=\"mt-brand\" href=\"\/es\/\">\n      <span class=\"mt-brand-name\">Macarena Torralba<\/span>\n      <span class=\"mt-brand-role\">Product Innovation \u00b7 UX Strategy \u00b7 IA & Emerging Tech<\/span>\n    <\/a>\n\n    <button class=\"mt-burger\" id=\"mtBurger\" type=\"button\" aria-label=\"Abrir men\u00fa\" aria-expanded=\"false\">\n      <span><\/span>\n      <span><\/span>\n    <\/button>\n  <\/div>\n\n  <nav class=\"mt-menu-overlay\" id=\"mtNav\" aria-label=\"Men\u00fa principal\">\n    <div class=\"mt-menu-inner\">\n\n      <div class=\"mt-menu-top\">\n        <a class=\"mt-menu-brand\" href=\"\/es\/\">\n          <span class=\"mt-menu-brand-name\">Macarena Torralba<\/span>\n          <span class=\"mt-menu-brand-role\">Product Innovation \u00b7 UX Strategy \u00b7 IA & Emerging Tech<\/span>\n        <\/a>\n\n        <button class=\"mt-menu-close\" id=\"mtMenuClose\" type=\"button\" aria-label=\"Cerrar men\u00fa\">\n          <span><\/span>\n          <span><\/span>\n        <\/button>\n      <\/div>\n\n      <div class=\"mt-menu-content\">\n        <div class=\"mt-menu-left\">\n          <a href=\"\/es\/\" class=\"mt-menu-link\" data-menu=\"home\">Sobre m\u00ed<\/a>\n          <a href=\"\/es\/proyectos\/\" class=\"mt-menu-link\" data-menu=\"proyectos\">Mis proyectos<\/a>\n          <a href=\"\/es\/reflexiones\/\" class=\"mt-menu-link\" data-menu=\"reflexiones\">Reflexiones<\/a>\n          <a href=\"\/es\/contacto\/\" class=\"mt-menu-link\" data-menu=\"contacto\">Contacto<\/a>\n          <a href=\"https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/05\/Macarena_Torralba_CV.pdf\" class=\"mt-menu-cv\" target=\"_blank\" rel=\"noopener\">Descargar CV<\/a>\n        <\/div>\n\n        <div class=\"mt-menu-right\">\n          <div class=\"mt-contact-block\">\n            <span class=\"mt-contact-title\">Contacto<\/span>\n            <a href=\"mailto:emacarenatorralba@gmail.com\">emacarenatorralba@gmail.com<\/a>\n            <a href=\"https:\/\/www.linkedin.com\/in\/macarenatorralbagarcia\/\" target=\"_blank\" rel=\"noopener\">Linkedin<\/a>\n          <\/div>\n\n          <div class=\"mt-lang-switch\" aria-label=\"Cambiar idioma\">\n            <a href=\"#\" class=\"mt-lang-option\" id=\"mtLangEN\">EN<\/a>\n            <a href=\"#\" class=\"mt-lang-option\" id=\"mtLangES\">ES<\/a>\n          <\/div>\n        <\/div>\n      <\/div>\n\n    <\/div>\n  <\/nav>\n<\/header>\n\n<style>\n\/* ===== HEADER BASE ===== *\/\n\n.mt-header {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  z-index: 9999;\n  background: transparent !important;\n  box-shadow: none !important;\n  transition: background-color 0.28s ease, box-shadow 0.28s ease, backdrop-filter 0.28s ease;\n}\n\nbody.admin-bar .mt-header {\n  top: 32px;\n}\n\n@media (max-width: 782px) {\n  body.admin-bar .mt-header {\n    top: 46px;\n  }\n}\n\n.mt-header-inner,\n.mt-menu-inner {\n  width: min(calc(100% - 160px), 1320px);\n  margin-left: auto;\n  margin-right: auto;\n}\n\n.mt-header-inner {\n  padding: 22px 0;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n}\n\n.mt-brand {\n  display: flex;\n  flex-direction: column;\n  text-decoration: none;\n  gap: 2px;\n}\n\n.mt-brand-name {\n  font-family: \"Poppins\", sans-serif;\n  font-size: 16px;\n  font-weight: 600;\n  line-height: 1.2;\n  color: #ffffff;\n  transition: color 0.28s ease;\n}\n\n.mt-brand-role {\n  font-family: \"Poppins\", sans-serif;\n  font-size: 14px;\n  font-weight: 400;\n  line-height: 1.25;\n  color: rgba(255,255,255,0.72);\n  transition: color 0.28s ease;\n}\n\n\/* Burger *\/\n.mt-burger {\n  width: 44px;\n  height: 44px;\n  border: 1px solid rgba(255,255,255,0.9);\n  border-radius: 999px;\n  background: #ffffff;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  gap: 6px;\n  cursor: pointer;\n  padding: 0;\n  appearance: none;\n  -webkit-appearance: none;\n  transition: border-color 0.28s ease, background-color 0.28s ease, box-shadow 0.28s ease;\n}\n\n.mt-burger span {\n  width: 18px;\n  height: 1.5px;\n  border-radius: 999px;\n  background: #2B5E56;\n  transition: transform 0.28s ease, background-color 0.28s ease;\n}\n\n.mt-burger:hover,\n.mt-burger:focus,\n.mt-burger:active {\n  border-color: #2B5E56 !important;\n  background: #2B5E56 !important;\n  box-shadow: 0 8px 20px rgba(43,94,86,0.22) !important;\n}\n\n.mt-burger:hover span,\n.mt-burger:focus span,\n.mt-burger:active span {\n  background: #ffffff !important;\n}\n\n\/* Estado oscuro sobre hero *\/\n.mt-header.is-dark {\n  background: rgba(16, 42, 36, 0.94) !important;\n  backdrop-filter: blur(10px);\n  box-shadow: 0 8px 24px rgba(0,0,0,0.08) !important;\n}\n\n.mt-header.is-dark .mt-burger {\n  border-color: rgba(255,255,255,0.9);\n  background: #ffffff;\n}\n\n.mt-header.is-dark .mt-burger span {\n  background: #2B5E56;\n}\n\n\/* Estado blanco despu\u00e9s del hero *\/\n.mt-header.is-cream {\n  background: rgba(255, 255, 255, 0.96) !important;\n  backdrop-filter: blur(10px);\n  box-shadow: 0 8px 24px rgba(172,140,125,0.12) !important;\n}\n\n.mt-header.is-cream .mt-brand-name {\n  color: #111111;\n}\n\n.mt-header.is-cream .mt-brand-role {\n  color: #A07C6B;\n}\n\n.mt-header.is-cream .mt-burger {\n  border-color: rgba(43,94,86,0.28);\n  background: rgba(43,94,86,0.06);\n}\n\n.mt-header.is-cream .mt-burger span {\n  background: #2B5E56;\n}\n\n.mt-header.is-cream .mt-burger:hover,\n.mt-header.is-cream .mt-burger:focus,\n.mt-header.is-cream .mt-burger:active {\n  border-color: #2B5E56 !important;\n  background: #2B5E56 !important;\n}\n\n.mt-header.is-cream .mt-burger:hover span,\n.mt-header.is-cream .mt-burger:focus span,\n.mt-header.is-cream .mt-burger:active span {\n  background: #ffffff !important;\n}\n\n\/* ===== OVERLAY MENU ===== *\/\n\n.mt-menu-overlay {\n  position: fixed;\n  left: 0;\n  right: 0;\n  top: 0;\n  background: #F7F1E8;\n  z-index: 10000;\n  opacity: 0;\n  visibility: hidden;\n  pointer-events: none;\n  transform: translateY(-28px);\n  transition: opacity 0.32s ease, transform 0.32s ease, visibility 0.32s ease;\n  overflow-y: auto;\n  max-height: 100vh;\n}\n\nbody.admin-bar .mt-menu-overlay {\n  top: 32px;\n  max-height: calc(100vh - 32px);\n}\n\n@media (max-width: 782px) {\n  body.admin-bar .mt-menu-overlay {\n    top: 46px;\n    max-height: calc(100vh - 46px);\n  }\n}\n\n.mt-menu-overlay.is-open {\n  opacity: 1;\n  visibility: visible;\n  pointer-events: auto;\n  transform: translateY(0);\n}\n\n.mt-menu-inner {\n  padding-top: 48px;\n  padding-bottom: 72px;\n  display: flex;\n  flex-direction: column;\n}\n\n.mt-menu-top {\n  display: flex;\n  align-items: flex-start;\n  justify-content: space-between;\n  margin-bottom: 96px;\n}\n\n.mt-menu-brand {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  text-decoration: none;\n}\n\n.mt-menu-brand-name {\n  font-family: \"Poppins\", sans-serif;\n  font-size: 18px;\n  font-weight: 600;\n  color: #111111;\n  line-height: 1.2;\n}\n\n.mt-menu-brand-role {\n  font-family: \"Poppins\", sans-serif;\n  font-size: 14px;\n  font-weight: 400;\n  color: #A07C6B;\n  line-height: 1.3;\n}\n\n\/* Bot\u00f3n cerrar *\/\n.mt-menu-close {\n  width: 44px;\n  height: 44px;\n  min-width: 44px;\n  min-height: 44px;\n  border-radius: 999px;\n  border: 1px solid #111111;\n  background: transparent;\n  cursor: pointer;\n  position: relative;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 0;\n  appearance: none;\n  -webkit-appearance: none;\n  font-size: 0;\n  line-height: 0;\n  transition: background-color 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease;\n}\n\n.mt-menu-close span {\n  position: absolute;\n  width: 16px;\n  height: 1.4px;\n  background: #111111;\n  border-radius: 999px;\n  transition: background-color 0.25s ease;\n}\n\n.mt-menu-close span:first-child {\n  transform: rotate(45deg);\n}\n\n.mt-menu-close span:last-child {\n  transform: rotate(-45deg);\n}\n\n.mt-menu-close:hover,\n.mt-menu-close:focus,\n.mt-menu-close:active {\n  background: #2B5E56 !important;\n  border-color: #2B5E56 !important;\n  box-shadow: 0 8px 20px rgba(43,94,86,0.22) !important;\n}\n\n.mt-menu-close:hover span,\n.mt-menu-close:focus span,\n.mt-menu-close:active span {\n  background: #ffffff !important;\n}\n\n\/* Contenido *\/\n.mt-menu-content {\n  display: grid;\n  grid-template-columns: 1.2fr 1fr;\n  gap: 120px;\n  align-items: start;\n}\n\n.mt-menu-left {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  gap: 34px;\n}\n\n.mt-menu-left a {\n  font-family: \"Poppins\", sans-serif;\n  font-size: 30px;\n  line-height: 1.15;\n  font-weight: 500;\n  color: #2B5E56;\n  text-decoration: none;\n  transition: color 0.25s ease, transform 0.25s ease, background-color 0.25s ease;\n}\n\n.mt-menu-left .mt-menu-link {\n  width: 100%;\n  padding: 18px 18px;\n  border-radius: 0;\n}\n\n.mt-menu-left .mt-menu-link:hover,\n.mt-menu-left .mt-menu-link.is-selected {\n  background: #F0E6D9;\n  color: #2B5E56;\n  transform: translateX(4px);\n}\n\n.mt-menu-left .mt-menu-cv {\n  width: fit-content;\n  margin-top: 8px;\n  font-size: 15px;\n  line-height: 1;\n  font-weight: 600;\n  color: #F7F7F5;\n  background: #2B5E56;\n  padding: 16px 24px;\n  border-radius: 999px;\n}\n\n.mt-menu-left .mt-menu-cv:hover {\n  color: #F7F7F5;\n  background: #4E9288;\n  transform: translateY(-2px);\n}\n\n.mt-menu-right {\n  display: flex;\n  flex-direction: column;\n  gap: 36px;\n}\n\n.mt-contact-block {\n  display: flex;\n  flex-direction: column;\n  gap: 22px;\n}\n\n.mt-contact-title {\n  font-family: \"Poppins\", sans-serif;\n  font-size: 20px;\n  font-weight: 600;\n  color: #A07C6B;\n  line-height: 1.2;\n}\n\n.mt-contact-block a {\n  font-family: \"Poppins\", sans-serif;\n  font-size: 15px;\n  font-weight: 400;\n  color: #444444;\n  text-decoration: underline;\n  text-underline-offset: 3px;\n}\n\n.mt-contact-block a:hover {\n  color: #2B5E56;\n}\n\n.mt-lang-switch {\n  display: inline-flex;\n  width: fit-content;\n  border: 1px solid #2B5E56;\n  border-radius: 999px;\n  overflow: hidden;\n  margin-top: 8px;\n}\n\n.mt-lang-option {\n  font-family: \"Poppins\", sans-serif !important;\n  font-size: 14px !important;\n  font-weight: 500;\n  text-decoration: none;\n  color: #2B5E56;\n  padding: 10px 16px;\n  line-height: 1;\n  min-width: 52px;\n  text-align: center;\n  transition: background-color 0.25s ease, color 0.25s ease;\n}\n\n.mt-lang-option:hover {\n  background: #F0E6D9;\n  color: #2B5E56;\n}\n\n.mt-lang-option.is-active {\n  background: #2B5E56;\n  color: #F7F7F5;\n}\n\n\/* Animaci\u00f3n interna *\/\n.mt-menu-overlay .mt-menu-brand,\n.mt-menu-overlay .mt-menu-left,\n.mt-menu-overlay .mt-menu-right,\n.mt-menu-overlay .mt-menu-close {\n  opacity: 0;\n  transform: translateY(-18px);\n  transition: opacity 0.34s ease, transform 0.34s ease;\n}\n\n.mt-menu-overlay.is-open .mt-menu-brand,\n.mt-menu-overlay.is-open .mt-menu-left,\n.mt-menu-overlay.is-open .mt-menu-right,\n.mt-menu-overlay.is-open .mt-menu-close {\n  opacity: 1;\n  transform: translateY(0);\n}\n\n.mt-menu-overlay.is-open .mt-menu-brand {\n  transition-delay: 0.04s;\n}\n\n.mt-menu-overlay.is-open .mt-menu-close {\n  transition-delay: 0.06s;\n}\n\n.mt-menu-overlay.is-open .mt-menu-left {\n  transition-delay: 0.12s;\n}\n\n.mt-menu-overlay.is-open .mt-menu-right {\n  transition-delay: 0.18s;\n}\n\nbody.mt-menu-open {\n  overflow: hidden;\n}\n\n\/* Responsive *\/\n@media (max-width: 1200px) {\n  .mt-header-inner,\n  .mt-menu-inner {\n    width: calc(100% - 64px);\n  }\n}\n\n@media (max-width: 767px) {\n  .mt-header-inner,\n  .mt-menu-inner {\n    width: calc(100% - 40px);\n  }\n\n  .mt-header-inner {\n    padding: 18px 0;\n  }\n\n  .mt-brand-name {\n    font-size: 15px;\n  }\n\n  .mt-brand-role {\n    font-size: 12px;\n  }\n\n  .mt-menu-inner {\n    padding-top: 32px;\n    padding-bottom: 56px;\n  }\n\n  .mt-menu-top {\n    margin-bottom: 64px;\n  }\n\n  .mt-menu-content {\n    grid-template-columns: 1fr;\n    gap: 64px;\n  }\n\n  .mt-menu-left {\n    gap: 24px;\n  }\n\n  .mt-menu-left a {\n    font-size: 28px;\n  }\n\n  .mt-menu-left .mt-menu-link {\n    padding: 16px 14px;\n  }\n\n  .mt-menu-left .mt-menu-cv {\n    font-size: 15px;\n  }\n\n  .mt-menu-right {\n    gap: 32px;\n  }\n\n  .mt-menu-close {\n    width: 42px;\n    height: 42px;\n    min-width: 42px;\n    min-height: 42px;\n  }\n\n  .mt-menu-close span {\n    width: 15px;\n  }\n\n  .mt-lang-option {\n    font-size: 14px !important;\n    padding: 10px 15px;\n  }\n}\n<\/style>\n\n<script>\n(function () {\n  function initMacarenaHeader() {\n    const header = document.getElementById(\"mtHeader\");\n    const burger = document.getElementById(\"mtBurger\");\n    const closeBtn = document.getElementById(\"mtMenuClose\");\n    const nav = document.getElementById(\"mtNav\");\n    const heroEnd = document.getElementById(\"hero-end\");\n    const langEN = document.getElementById(\"mtLangEN\");\n    const langES = document.getElementById(\"mtLangES\");\n\n    if (!header || !burger || !nav) return;\n\n    if (header.dataset.initialized === \"true\") return;\n    header.dataset.initialized = \"true\";\n\n    function updateHeaderState() {\n      const scrollY = window.scrollY || window.pageYOffset;\n\n      header.classList.remove(\"is-dark\", \"is-cream\");\n\n      if (!heroEnd) {\n        header.classList.add(\"is-cream\");\n        return;\n      }\n\n      const heroBottom = heroEnd.getBoundingClientRect().top + scrollY;\n\n      if (scrollY < 80) {\n        return;\n      }\n\n      if (scrollY < heroBottom - 90) {\n        header.classList.add(\"is-dark\");\n      } else {\n        header.classList.add(\"is-cream\");\n      }\n    }\n\n    function openMenu() {\n      nav.classList.add(\"is-open\");\n      document.body.classList.add(\"mt-menu-open\");\n      burger.setAttribute(\"aria-expanded\", \"true\");\n    }\n\n    function closeMenu() {\n      nav.classList.remove(\"is-open\");\n      document.body.classList.remove(\"mt-menu-open\");\n      burger.setAttribute(\"aria-expanded\", \"false\");\n    }\n\n    function toggleMenu(event) {\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (nav.classList.contains(\"is-open\")) {\n        closeMenu();\n      } else {\n        openMenu();\n      }\n    }\n\n    function updateSelectedMenuItem() {\n      const path = window.location.pathname;\n      const menuLinks = nav.querySelectorAll(\".mt-menu-link\");\n\n      menuLinks.forEach(function (link) {\n        link.classList.remove(\"is-selected\");\n      });\n\n      let active = \"home\";\n\n      if (path.includes(\"\/proyectos\")) {\n        active = \"proyectos\";\n      } else if (path.includes(\"\/reflexiones\")) {\n        active = \"reflexiones\";\n      } else if (path.includes(\"\/contacto\")) {\n        active = \"contacto\";\n      } else {\n        active = \"home\";\n      }\n\n      const activeLink = nav.querySelector('[data-menu=\"' + active + '\"]');\n\n      if (activeLink) {\n        activeLink.classList.add(\"is-selected\");\n      }\n    }\n\n    function updateLanguageLinks() {\n      if (!langEN || !langES) return;\n\n      const currentPath = window.location.pathname;\n      const search = window.location.search || \"\";\n      const hash = window.location.hash || \"\";\n\n      let pathWithoutLang = currentPath;\n\n      if (currentPath.startsWith(\"\/es\/\")) {\n        pathWithoutLang = currentPath.replace(\/^\\\/es\/, \"\");\n        langES.classList.add(\"is-active\");\n        langEN.classList.remove(\"is-active\");\n      } else if (currentPath.startsWith(\"\/en\/\")) {\n        pathWithoutLang = currentPath.replace(\/^\\\/en\/, \"\");\n        langEN.classList.add(\"is-active\");\n        langES.classList.remove(\"is-active\");\n      } else {\n        langES.classList.add(\"is-active\");\n        langEN.classList.remove(\"is-active\");\n      }\n\n      if (pathWithoutLang === \"\") {\n        pathWithoutLang = \"\/\";\n      }\n\n      langES.href = \"\/es\" + pathWithoutLang + search + hash;\n      langEN.href = \"\/en\" + pathWithoutLang + search + hash;\n    }\n\n    burger.addEventListener(\"click\", toggleMenu);\n\n    if (closeBtn) {\n      closeBtn.addEventListener(\"click\", function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n        closeMenu();\n      });\n    }\n\n    nav.querySelectorAll(\"a\").forEach(function (link) {\n      link.addEventListener(\"click\", function () {\n        closeMenu();\n      });\n    });\n\n    document.addEventListener(\"keydown\", function (event) {\n      if (event.key === \"Escape\") {\n        closeMenu();\n      }\n    });\n\n    window.addEventListener(\"scroll\", updateHeaderState);\n    window.addEventListener(\"resize\", updateHeaderState);\n\n    updateHeaderState();\n    updateSelectedMenuItem();\n    updateLanguageLinks();\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", initMacarenaHeader);\n  } else {\n    initMacarenaHeader();\n  }\n\n  window.addEventListener(\"load\", initMacarenaHeader);\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b1de30b elementor-widget elementor-widget-html\" data-id=\"b1de30b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n.etiqueta {\n  display: inline-flex !important;\n  width: fit-content !important;\n  max-width: max-content !important;\n  white-space: nowrap !important;\n  align-items: center !important;\n  justify-content: center !important;\n  padding: 4px 10px !important;\n  border-radius: 999px !important;\n  border: 1px solid #4E9288 !important;\n  background: #4E92880D !important;\n  color: #4E9288 !important;\n  font-size: 12px !important;\n  font-weight: 500 !important;\n  line-height: 1 !important;\n}\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3b606eb elementor-widget elementor-widget-html\" data-id=\"3b606eb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\/* ===== OCULTAR BLOQUE T\u00c9CNICO DE PROYECTOS EN DETALLE ===== *\/\n\n\/* Oculta en p\u00e1ginas de detalle cualquier bloque que contenga los marcadores t\u00e9cnicos *\/\nbody.single-post .elementor-widget-text-editor:has(.elementor-widget-container),\nbody.single-post .elementor-widget-text-editor:has(p) {\n}\n\n\/* Bloques t\u00e9cnicos escritos como texto *\/\nbody.single-post .project-technical-meta {\n  display: none !important;\n}\n<\/style>\n\n<script>\n(function () {\n  function hideProjectTechnicalMeta() {\n    if (!document.body.classList.contains(\"single-post\")) return;\n\n    const candidates = document.querySelectorAll(\n      \".elementor-widget-text-editor, .elementor-widget-container, p, div\"\n    );\n\n    candidates.forEach(function (el) {\n      const text = el.textContent || \"\";\n\n      const isTechnicalBlock =\n        text.includes(\"::sub::\") &&\n        text.includes(\"::desc::\") &&\n        text.includes(\"::tags::\");\n\n      if (!isTechnicalBlock) return;\n\n      \/* Evita ocultar media p\u00e1gina: solo oculta bloques peque\u00f1os\/t\u00e9cnicos *\/\n      if (text.length < 2500) {\n        el.style.setProperty(\"display\", \"none\", \"important\");\n        el.classList.add(\"project-technical-meta\");\n      }\n    });\n  }\n\n  document.addEventListener(\"DOMContentLoaded\", function () {\n    setTimeout(hideProjectTechnicalMeta, 200);\n  });\n\n  window.addEventListener(\"load\", function () {\n    setTimeout(hideProjectTechnicalMeta, 300);\n    setTimeout(hideProjectTechnicalMeta, 1000);\n  });\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ec36563 elementor-widget elementor-widget-html\" data-id=\"ec36563\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\/* Contenedor del paso detectado autom\u00e1ticamente *\/\n.work-step {\n  transition: box-shadow 0.3s ease, transform 0.3s ease;\n}\n\n\/* Estilos base del n\u00famero *\/\n.work-step .step-number {\n  color: #DCCFC0 !important;\n  font-family: \"Poppins\", sans-serif !important;\n  font-size: 60px !important;\n  font-weight: 300 !important;\n  line-height: 1 !important;\n  transition: color 0.3s ease, opacity 0.3s ease;\n}\n\n\/* Estilos base del t\u00edtulo *\/\n.work-step .step-title {\n  color: #A07C6B !important;\n  font-family: \"Poppins\", sans-serif !important;\n  font-size: 32px !important;\n  font-weight: 400 !important;\n  line-height: 1.2 !important;\n  transition: color 0.3s ease, opacity 0.3s ease;\n}\n\n\/* Hover sobre todo el contenedor del paso *\/\n.work-step:hover {\n  box-shadow: 10px 10px 10px 0 #AC8C7D33;\n}\n\n\/* Cambio de color al hacer hover *\/\n.work-step:hover .step-number {\n  color: #BFE1DB !important;\n}\n\n.work-step:hover .step-title {\n  color: #4E9288 !important;\n}\n\n\/* Estado activo al hacer scroll *\/\n.work-step.is-active {\n  box-shadow: 10px 10px 10px 0 #AC8C7D33;\n}\n\n.work-step.is-active .step-number {\n  color: #BFE1DB !important;\n}\n\n.work-step.is-active .step-title {\n  color: #4E9288 !important;\n}\n<\/style>\n\n<script>\n(function () {\n  function findStepContainer(element) {\n    let parent = element.parentElement;\n\n    while (parent && parent !== document.body) {\n      if (parent.querySelector(\".step-number\") && parent.querySelector(\".step-title\")) {\n        return parent;\n      }\n      parent = parent.parentElement;\n    }\n\n    return null;\n  }\n\n  function initWorkSteps() {\n    const numbers = document.querySelectorAll(\".step-number\");\n    const steps = [];\n\n    numbers.forEach((number) => {\n      const step = findStepContainer(number);\n\n      if (step && !step.classList.contains(\"work-step\")) {\n        step.classList.add(\"work-step\");\n        steps.push(step);\n      } else if (step && step.classList.contains(\"work-step\") && !steps.includes(step)) {\n        steps.push(step);\n      }\n    });\n\n    if (!steps.length) return;\n\n    const observer = new IntersectionObserver(\n      (entries) => {\n        const visibleSteps = entries\n          .filter((entry) => entry.isIntersecting)\n          .sort((a, b) => b.intersectionRatio - a.intersectionRatio);\n\n        if (visibleSteps.length > 0) {\n          steps.forEach((step) => step.classList.remove(\"is-active\"));\n          visibleSteps[0].target.classList.add(\"is-active\");\n        }\n      },\n      {\n        threshold: [0.25, 0.45, 0.65],\n        rootMargin: \"-20% 0px -40% 0px\"\n      }\n    );\n\n    steps.forEach((step) => observer.observe(step));\n  }\n\n  window.addEventListener(\"load\", initWorkSteps);\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4d2ddd7 elementor-widget elementor-widget-html\" data-id=\"4d2ddd7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\/* ===== PROYECTOS DESTACADOS HOME - LAYOUT ===== *\/\n\n.proyectos-destacados-home {\n  display: flex !important;\n  flex-direction: column !important;\n  gap: 26px !important;\n  width: 100% !important;\n  margin: 0 !important;\n  padding: 0 !important;\n}\n\n\/* Card horizontal *\/\n.proyectos-destacados-home article,\n.proyectos-destacados-home li,\n.proyectos-destacados-home .lps-post,\n.proyectos-destacados-home .lps-item,\n.proyectos-destacados-home .listing-item,\n.proyectos-destacados-home > * {\n  display: grid !important;\n  grid-template-columns: 300px 1fr !important;\n  align-items: stretch !important;\n  background: #ffffff !important;\n  border-radius: 22px !important;\n  overflow: hidden !important;\n  border: none !important;\n  box-shadow: none !important;\n  min-height: 300px !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  transition: background-color 0.28s ease, box-shadow 0.28s ease, transform 0.28s ease !important;\n}\n\n\/* Hover card *\/\n.proyectos-destacados-home article:hover,\n.proyectos-destacados-home li:hover,\n.proyectos-destacados-home .lps-post:hover,\n.proyectos-destacados-home .lps-item:hover,\n.proyectos-destacados-home .listing-item:hover,\n.proyectos-destacados-home > *:hover {\n  background: #EFE4D6 !important;\n  box-shadow: 10px 10px 10px 0 #AC8C7D33 !important;\n  transform: translateY(-2px) !important;\n}\n\n\/* Imagen izquierda: ocupa toda la altura de la card *\/\n.proyectos-destacados-home a:has(img),\n.proyectos-destacados-home figure,\n.proyectos-destacados-home .lps-image,\n.proyectos-destacados-home .lps-thumbnail,\n.proyectos-destacados-home .post-thumbnail,\n.proyectos-destacados-home .featured-image {\n  width: 300px !important;\n  min-width: 300px !important;\n  max-width: 300px !important;\n  height: 100% !important;\n  min-height: 100% !important;\n  align-self: stretch !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  overflow: hidden !important;\n  display: block !important;\n  border-radius: 0 !important;\n}\n\n\/* Imagen interna: efecto background cover *\/\n.proyectos-destacados-home img {\n  width: 100% !important;\n  height: 100% !important;\n  min-height: 100% !important;\n  object-fit: cover !important;\n  object-position: center center !important;\n  display: block !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  border-radius: 0 !important;\n}\n\n\/* Contenido derecho *\/\n.proyectos-destacados-home article > div,\n.proyectos-destacados-home li > div,\n.proyectos-destacados-home .lps-content,\n.proyectos-destacados-home .content,\n.proyectos-destacados-home .entry-content,\n.proyectos-destacados-home .listing-item-content {\n  padding: 44px 44px !important;\n  margin: 0 !important;\n  min-width: 0 !important;\n  display: flex !important;\n  flex-direction: column !important;\n  justify-content: center !important;\n}\n\n\/* T\u00edtulo *\/\n.proyectos-destacados-home h3,\n.proyectos-destacados-home h3 a {\n  font-family: \"Poppins\", sans-serif !important;\n  font-size: 28px !important;\n  line-height: 1.2 !important;\n  font-weight: 500 !important;\n  color: #111111 !important;\n  text-decoration: none !important;\n  margin: 0 0 18px 0 !important;\n  padding: 0 !important;\n  transition: color 0.28s ease !important;\n}\n\n\/* Hover t\u00edtulo *\/\n.proyectos-destacados-home article:hover h3,\n.proyectos-destacados-home article:hover h3 a,\n.proyectos-destacados-home li:hover h3,\n.proyectos-destacados-home li:hover h3 a,\n.proyectos-destacados-home .lps-post:hover h3,\n.proyectos-destacados-home .lps-post:hover h3 a,\n.proyectos-destacados-home .lps-item:hover h3,\n.proyectos-destacados-home .lps-item:hover h3 a,\n.proyectos-destacados-home .listing-item:hover h3,\n.proyectos-destacados-home .listing-item:hover h3 a,\n.proyectos-destacados-home > *:hover h3,\n.proyectos-destacados-home > *:hover h3 a {\n  color: #2B5E56 !important;\n}\n\n\/* Texto formateado *\/\n.proyectos-destacados-home .project-subtitle {\n  display: block !important;\n  font-family: \"Poppins\", sans-serif !important;\n  font-size: 17px !important;\n  line-height: 1.45 !important;\n  font-weight: 500 !important;\n  color: #A07C6B !important;\n  margin: 0 0 18px 0 !important;\n}\n\n.proyectos-destacados-home .project-desc {\n  display: block !important;\n  font-family: \"Poppins\", sans-serif !important;\n  font-size: 15px !important;\n  line-height: 1.6 !important;\n  font-weight: 400 !important;\n  color: #444444 !important;\n  margin: 0 0 20px 0 !important;\n}\n\n.proyectos-destacados-home .project-tags {\n  display: block !important;\n  font-family: \"Poppins\", sans-serif !important;\n  font-size: 13px !important;\n  line-height: 1.4 !important;\n  font-weight: 600 !important;\n  color: #2B5E56 !important;\n  margin: 0 !important;\n}\n\n\/* Ver m\u00e1s *\/\n.proyectos-destacados-home a:not(:has(img)):not(h3 a) {\n  font-family: \"Poppins\", sans-serif !important;\n  font-size: 14px !important;\n  font-weight: 500 !important;\n  color: #4E9288 !important;\n  text-decoration: none !important;\n  margin-top: 22px !important;\n  align-self: flex-end !important;\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n}\n\n\/* Flecha dibujada con CSS para evitar emoji en iPhone *\/\n.proyectos-destacados-home a:not(:has(img)):not(h3 a)::after {\n  content: \"\" !important;\n  width: 8px !important;\n  height: 8px !important;\n  border-top: 1.5px solid currentColor !important;\n  border-right: 1.5px solid currentColor !important;\n  transform: rotate(45deg) !important;\n  display: inline-block !important;\n  margin-left: 2px !important;\n}\n\n.proyectos-destacados-home a:not(:has(img)):not(h3 a):hover {\n  color: #2B5E56 !important;\n}\n\n\/* Tablet *\/\n@media (max-width: 1024px) {\n  .proyectos-destacados-home article,\n  .proyectos-destacados-home li,\n  .proyectos-destacados-home .lps-post,\n  .proyectos-destacados-home .lps-item,\n  .proyectos-destacados-home .listing-item,\n  .proyectos-destacados-home > * {\n    grid-template-columns: 260px 1fr !important;\n    min-height: 260px !important;\n  }\n\n  .proyectos-destacados-home a:has(img),\n  .proyectos-destacados-home figure,\n  .proyectos-destacados-home .lps-image,\n  .proyectos-destacados-home .lps-thumbnail,\n  .proyectos-destacados-home .post-thumbnail,\n  .proyectos-destacados-home .featured-image {\n    width: 260px !important;\n    min-width: 260px !important;\n    max-width: 260px !important;\n    height: 100% !important;\n    min-height: 100% !important;\n    align-self: stretch !important;\n  }\n\n  .proyectos-destacados-home img {\n    width: 100% !important;\n    height: 100% !important;\n    min-height: 100% !important;\n    object-fit: cover !important;\n    object-position: center center !important;\n  }\n\n  .proyectos-destacados-home article > div,\n  .proyectos-destacados-home li > div,\n  .proyectos-destacados-home .lps-content,\n  .proyectos-destacados-home .content,\n  .proyectos-destacados-home .entry-content,\n  .proyectos-destacados-home .listing-item-content {\n    padding: 36px 34px !important;\n  }\n}\n\n\/* M\u00f3vil *\/\n@media (max-width: 767px) {\n  .proyectos-destacados-home article,\n  .proyectos-destacados-home li,\n  .proyectos-destacados-home .lps-post,\n  .proyectos-destacados-home .lps-item,\n  .proyectos-destacados-home .listing-item,\n  .proyectos-destacados-home > * {\n    grid-template-columns: 1fr !important;\n    min-height: auto !important;\n  }\n\n  .proyectos-destacados-home a:has(img),\n  .proyectos-destacados-home figure,\n  .proyectos-destacados-home .lps-image,\n  .proyectos-destacados-home .lps-thumbnail,\n  .proyectos-destacados-home .post-thumbnail,\n  .proyectos-destacados-home .featured-image {\n    width: 100% !important;\n    min-width: 100% !important;\n    max-width: 100% !important;\n    height: 220px !important;\n    min-height: 220px !important;\n    max-height: 220px !important;\n    overflow: hidden !important;\n  }\n\n  .proyectos-destacados-home img {\n    width: 100% !important;\n    height: 220px !important;\n    min-height: 220px !important;\n    max-height: 220px !important;\n    object-fit: cover !important;\n    object-position: center center !important;\n  }\n\n  .proyectos-destacados-home article > div,\n  .proyectos-destacados-home li > div,\n  .proyectos-destacados-home .lps-content,\n  .proyectos-destacados-home .content,\n  .proyectos-destacados-home .entry-content,\n  .proyectos-destacados-home .listing-item-content {\n    padding: 30px 26px !important;\n  }\n\n  .proyectos-destacados-home h3,\n  .proyectos-destacados-home h3 a {\n    font-size: 24px !important;\n  }\n\n  .proyectos-destacados-home a:not(:has(img)):not(h3 a) {\n    align-self: flex-start !important;\n  }\n}\n<\/style>\n\n<script>\n(function () {\n  function cleanProjectText(text) {\n    return text\n      .replace(\/\\s+\/g, \" \")\n      .trim();\n  }\n\n  function extractBetween(text, start, end) {\n    const startIndex = text.indexOf(start);\n    const endIndex = text.indexOf(end);\n\n    if (startIndex === -1 || endIndex === -1 || endIndex <= startIndex) {\n      return \"\";\n    }\n\n    return cleanProjectText(text.slice(startIndex + start.length, endIndex));\n  }\n\n  function formatProjectCards() {\n    const cards = document.querySelectorAll(\n      \".proyectos-destacados-home article, \" +\n      \".proyectos-destacados-home li, \" +\n      \".proyectos-destacados-home .lps-post, \" +\n      \".proyectos-destacados-home .lps-item, \" +\n      \".proyectos-destacados-home .listing-item, \" +\n      \".proyectos-destacados-home > *\"\n    );\n\n    cards.forEach(function (card) {\n      if (card.dataset.projectFormatted === \"true\") return;\n\n      const rawElements = Array.from(card.querySelectorAll(\"p, div, span\")).filter(function (el) {\n        const text = el.textContent || \"\";\n\n        return (\n          text.includes(\"::sub::\") ||\n          text.includes(\"::desc::\") ||\n          text.includes(\"::tags::\")\n        ) &&\n        !el.querySelector(\"h3\") &&\n        !el.querySelector(\"img\") &&\n        !el.querySelector(\"a\");\n      });\n\n      if (!rawElements.length) return;\n\n      const rawElement = rawElements[0];\n      const rawText = rawElement.textContent || \"\";\n\n      const subtitle = extractBetween(rawText, \"::sub::\", \"::\/sub::\");\n      const desc = extractBetween(rawText, \"::desc::\", \"::\/desc::\");\n      const tags = extractBetween(rawText, \"::tags::\", \"::\/tags::\");\n\n      rawElement.innerHTML =\n        (subtitle ? '<span class=\"project-subtitle\">' + subtitle + \"<\/span>\" : \"\") +\n        (desc ? '<span class=\"project-desc\">' + desc + \"<\/span>\" : \"\") +\n        (tags ? '<span class=\"project-tags\">' + tags + \"<\/span>\" : \"\");\n\n      card.dataset.projectFormatted = \"true\";\n    });\n  }\n\n  document.addEventListener(\"DOMContentLoaded\", function () {\n    setTimeout(formatProjectCards, 300);\n  });\n\n  window.addEventListener(\"load\", function () {\n    setTimeout(formatProjectCards, 300);\n    setTimeout(formatProjectCards, 1000);\n  });\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-090036d elementor-widget elementor-widget-html\" data-id=\"090036d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\/* ===== INSIGHTS HOME CARDS ===== *\/\n\n\/* Card base *\/\n.insights-home article,\n.insights-home li,\n.insights-home .lps-post,\n.insights-home .lps-item,\n.insights-home .listing-item,\n.insights-home > * {\n  background: #ffffff !important;\n  border-radius: 22px !important;\n  overflow: hidden !important;\n  border: none !important;\n  box-shadow: none !important;\n  transition: box-shadow 0.28s ease, transform 0.28s ease !important;\n}\n\n\/* Imagen rectangular *\/\n.insights-home img {\n  width: 100% !important;\n  height: 190px !important;\n  max-height: 190px !important;\n  object-fit: cover !important;\n  object-position: center center !important;\n  display: block !important;\n  border-radius: 0 !important;\n  margin: 0 !important;\n  padding: 0 !important;\n}\n\n\/* Enlace o contenedor que envuelve la imagen *\/\n.insights-home a:has(img),\n.insights-home figure,\n.insights-home .lps-image,\n.insights-home .lps-thumbnail,\n.insights-home .post-thumbnail,\n.insights-home .featured-image {\n  width: 100% !important;\n  height: 190px !important;\n  max-height: 190px !important;\n  overflow: hidden !important;\n  display: block !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  border-radius: 0 !important;\n}\n\n\/* T\u00edtulo *\/\n.insights-home h3,\n.insights-home h3 a {\n  font-family: \"Poppins\", sans-serif !important;\n  font-size: 22px !important;\n  line-height: 1.25 !important;\n  font-weight: 500 !important;\n  color: #111111 !important;\n  text-decoration: none !important;\n  transition: color 0.28s ease !important;\n}\n\n\/* Hover de card *\/\n.insights-home article:hover,\n.insights-home li:hover,\n.insights-home .lps-post:hover,\n.insights-home .lps-item:hover,\n.insights-home .listing-item:hover,\n.insights-home > *:hover {\n  box-shadow: 10px 10px 10px 0 #AC8C7D33 !important;\n  transform: translateY(-2px) !important;\n}\n\n\/* Hover del t\u00edtulo cuando haces hover en la card *\/\n.insights-home article:hover h3,\n.insights-home article:hover h3 a,\n.insights-home li:hover h3,\n.insights-home li:hover h3 a,\n.insights-home .lps-post:hover h3,\n.insights-home .lps-post:hover h3 a,\n.insights-home .lps-item:hover h3,\n.insights-home .lps-item:hover h3 a,\n.insights-home .listing-item:hover h3,\n.insights-home .listing-item:hover h3 a,\n.insights-home > *:hover h3,\n.insights-home > *:hover h3 a {\n  color: #2B5E56 !important;\n}\n\n\/* Leer m\u00e1s *\/\n.insights-home a:not(:has(img)):not(h3 a) {\n  font-family: \"Poppins\", sans-serif !important;\n  font-size: 14px !important;\n  font-weight: 500 !important;\n  color: #4E9288 !important;\n  text-decoration: none !important;\n  display: inline-flex !important;\n  align-items: center !important;\n  gap: 8px !important;\n  transition: color 0.28s ease !important;\n}\n\n\/* Flecha angular dibujada con CSS *\/\n.insights-home a:not(:has(img)):not(h3 a)::after {\n  content: \"\" !important;\n  width: 8px !important;\n  height: 8px !important;\n  border-top: 1.5px solid currentColor !important;\n  border-right: 1.5px solid currentColor !important;\n  transform: rotate(45deg) !important;\n  display: inline-block !important;\n  margin-left: 2px !important;\n}\n\n.insights-home a:not(:has(img)):not(h3 a):hover {\n  color: #2B5E56 !important;\n}\n\n\/* Tablet *\/\n@media (max-width: 1024px) {\n  .insights-home img,\n  .insights-home a:has(img),\n  .insights-home figure,\n  .insights-home .lps-image,\n  .insights-home .lps-thumbnail,\n  .insights-home .post-thumbnail,\n  .insights-home .featured-image {\n    height: 180px !important;\n    max-height: 180px !important;\n  }\n}\n\n\/* M\u00f3vil *\/\n@media (max-width: 767px) {\n  .insights-home img,\n  .insights-home a:has(img),\n  .insights-home figure,\n  .insights-home .lps-image,\n  .insights-home .lps-thumbnail,\n  .insights-home .post-thumbnail,\n  .insights-home .featured-image {\n    height: 190px !important;\n    max-height: 190px !important;\n  }\n\n  .insights-home h3,\n  .insights-home h3 a {\n    font-size: 21px !important;\n  }\n\n  .insights-home a:not(:has(img)):not(h3 a) {\n    font-size: 14px !important;\n  }\n}\n<\/style>\n\n<script>\n(function () {\n  function cleanInsightsReadMoreArrows() {\n    const links = document.querySelectorAll(\".insights-home a:not(:has(img)):not(h3 a)\");\n\n    links.forEach(function(link) {\n      link.childNodes.forEach(function(node) {\n        if (node.nodeType === Node.TEXT_NODE) {\n          node.textContent = node.textContent\n            .replace(\/[\u2192\u2197\u279c\u279d\u279e\u2794]\/g, \"\")\n            .replace(\/\\s+\/g, \" \")\n            .trim();\n        }\n      });\n    });\n  }\n\n  document.addEventListener(\"DOMContentLoaded\", function () {\n    setTimeout(cleanInsightsReadMoreArrows, 300);\n  });\n\n  window.addEventListener(\"load\", function () {\n    setTimeout(cleanInsightsReadMoreArrows, 300);\n    setTimeout(cleanInsightsReadMoreArrows, 1000);\n  });\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4637f91 elementor-widget elementor-widget-html\" data-id=\"4637f91\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script>\n(function () {\n  function adjustFooterContactMobile() {\n    const footerContact = document.querySelector(\".footer-contact-links\");\n    if (!footerContact) return;\n\n    const links = footerContact.querySelectorAll(\"a\");\n    if (!links.length) return;\n\n    if (window.innerWidth > 767) {\n      footerContact.style.removeProperty(\"width\");\n      footerContact.style.removeProperty(\"display\");\n      footerContact.style.removeProperty(\"flex-direction\");\n      footerContact.style.removeProperty(\"align-items\");\n      footerContact.style.removeProperty(\"text-align\");\n      footerContact.style.removeProperty(\"gap\");\n\n      links.forEach(function (link) {\n        link.style.removeProperty(\"display\");\n        link.style.removeProperty(\"width\");\n        link.style.removeProperty(\"text-align\");\n        link.style.removeProperty(\"align-self\");\n      });\n\n      return;\n    }\n\n    footerContact.style.setProperty(\"width\", \"100%\", \"important\");\n    footerContact.style.setProperty(\"display\", \"flex\", \"important\");\n    footerContact.style.setProperty(\"flex-direction\", \"column\", \"important\");\n    footerContact.style.setProperty(\"align-items\", \"flex-end\", \"important\");\n    footerContact.style.setProperty(\"text-align\", \"right\", \"important\");\n    footerContact.style.setProperty(\"gap\", \"8px\", \"important\");\n\n    links.forEach(function (link) {\n      link.style.setProperty(\"display\", \"inline-block\", \"important\");\n      link.style.setProperty(\"width\", \"auto\", \"important\");\n      link.style.setProperty(\"text-align\", \"right\", \"important\");\n      link.style.setProperty(\"align-self\", \"flex-end\", \"important\");\n    });\n  }\n\n  function runFooterContactAdjustment() {\n    adjustFooterContactMobile();\n\n    setTimeout(adjustFooterContactMobile, 300);\n    setTimeout(adjustFooterContactMobile, 1000);\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", runFooterContactAdjustment);\n  } else {\n    runFooterContactAdjustment();\n  }\n\n  window.addEventListener(\"load\", runFooterContactAdjustment);\n\n  window.addEventListener(\"resize\", function () {\n    setTimeout(adjustFooterContactMobile, 150);\n  });\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9a189cb elementor-widget elementor-widget-html\" data-id=\"9a189cb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script>\n\n(function () {\n\n  function updateCvDownloadLink() {\n\n    const cvSpanishUrl = \"https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/05\/Macarena_Torralba_CV.pdf\";\n\n    const cvEnglishUrl = \"https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/06\/Macarena_Torralba_CV_EN.pdf\";\n\n\n\n    const path = window.location.pathname || \"\";\n\n    const isEnglish = path.startsWith(\"\/en\/\") || path === \"\/en\";\n\n\n\n    const cvUrl = isEnglish ? cvEnglishUrl : cvSpanishUrl;\n\n    const cvText = isEnglish ? \"Download CV\" : \"Descargar CV\";\n\n\n\n    const buttons = document.querySelectorAll(\n\n      \"#cv-download, a[href*='.pdf'], .mt-cv-link, .mt-menu-cv\"\n\n    );\n\n\n\n    buttons.forEach(function (button) {\n\n      const text = (button.textContent || \"\").trim().toLowerCase();\n\n\n\n      const looksLikeCvButton =\n\n        button.id === \"cv-download\" ||\n\n        button.classList.contains(\"mt-cv-link\") ||\n\n        button.classList.contains(\"mt-menu-cv\") ||\n\n        text.includes(\"cv\") ||\n\n        text.includes(\"descargar\") ||\n\n        text.includes(\"download\");\n\n\n\n      if (!looksLikeCvButton) return;\n\n\n\n      button.setAttribute(\"href\", cvUrl);\n\n      button.setAttribute(\"target\", \"_blank\");\n\n      button.setAttribute(\"rel\", \"noopener\");\n\n\n\n      if (text.includes(\"descargar\") || text.includes(\"download\")) {\n\n        button.textContent = cvText;\n\n      }\n\n    });\n\n  }\n\n\n\n  if (document.readyState === \"loading\") {\n\n    document.addEventListener(\"DOMContentLoaded\", updateCvDownloadLink);\n\n  } else {\n\n    updateCvDownloadLink();\n\n  }\n\n\n\n  window.addEventListener(\"load\", updateCvDownloadLink);\n\n})();\n\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-71eb4ed e-con-full e-flex e-con e-child\" data-id=\"71eb4ed\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<p class=\"Body1 e-98220d9-c1ea14e e-paragraph-base\" data-interaction-id=\"98220d9\"><a href=\"https:\/\/macarenatorralba.es\/es\/politica-de-privacidad\/\" target=\"_self\" class=\"e-paragraph-link-base\">\n\t\tPol\u00edtica de Privacidad\n\t<\/a><\/p>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\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>Los espacios de datos no son repositorios: son reglas de juego El valor de un espacio de datos no est\u00e1 en almacenar informaci\u00f3n en un lugar com\u00fan, sino en definir c\u00f3mo distintas organizaciones pueden compartir, consumir o prestar servicios sobre datos bajo reglas de confianza, interoperabilidad y control. Espacios de datos \u00b7 Interoperabilidad \u00b7 Gobernanza [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2284,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"elementor_canvas","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[110,105,77,76,111,108,92,6,107,109],"class_list":["post-2293","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-insight","tag-compartir","tag-confianza-digital","tag-edc","tag-espacio-de-datos","tag-federacion","tag-gobernanza","tag-health-tech","tag-healthtech","tag-salud","tag-seguridad"],"_links":{"self":[{"href":"https:\/\/macarenatorralba.es\/en\/wp-json\/wp\/v2\/posts\/2293","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/macarenatorralba.es\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/macarenatorralba.es\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/macarenatorralba.es\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/macarenatorralba.es\/en\/wp-json\/wp\/v2\/comments?post=2293"}],"version-history":[{"count":6,"href":"https:\/\/macarenatorralba.es\/en\/wp-json\/wp\/v2\/posts\/2293\/revisions"}],"predecessor-version":[{"id":2300,"href":"https:\/\/macarenatorralba.es\/en\/wp-json\/wp\/v2\/posts\/2293\/revisions\/2300"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/macarenatorralba.es\/en\/wp-json\/wp\/v2\/media\/2284"}],"wp:attachment":[{"href":"https:\/\/macarenatorralba.es\/en\/wp-json\/wp\/v2\/media?parent=2293"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/macarenatorralba.es\/en\/wp-json\/wp\/v2\/categories?post=2293"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/macarenatorralba.es\/en\/wp-json\/wp\/v2\/tags?post=2293"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}