{"id":1120,"date":"2026-03-31T09:23:18","date_gmt":"2026-03-31T09:23:18","guid":{"rendered":"https:\/\/macarenatorralba.es\/?p=1120"},"modified":"2026-06-09T10:16:10","modified_gmt":"2026-06-09T10:16:10","slug":"credenciales-verificables-reto-caso-de-uso","status":"publish","type":"post","link":"https:\/\/macarenatorralba.es\/es\/credenciales-verificables-reto-caso-de-uso\/","title":{"rendered":"Credenciales verificables: el reto no es emitirlas, es hacerlas \u00fatiles"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"1120\" class=\"elementor elementor-1120\">\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\">Credenciales verificables: el reto no es emitirlas, es hacerlas \u00fatiles<\/h1>\n\t\t\t\t\t<p class=\"Body1 e-paragraph-base\" data-interaction-id=\"805fbd0\">Una credencial verificable solo aporta valor cuando resuelve una decisi\u00f3n de confianza en un contexto real. No basta con emitirla correctamente: tiene que ser comprensible para quien la recibe, \u00fatil para quien la presenta y verificable para quien necesita confiar en ese dato.<\/p>\n\t\t\t\t\t<p class=\"e-1dd29b9-777e70e Enphasis1 e-paragraph-base\" data-interaction-id=\"1dd29b9\">SSI \u00b7 Credenciales verificables \u00b7 EUDIW \u00b7 eIDAS2 \u00b7 Business Wallet \u00b7 Interoperabilidad<\/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-d0bbc26 e-heading-base\">La identidad digital necesita producto, no solo est\u00e1ndares<\/h2>\n\t\t\t\t\t<p class=\"Enphasis2 e-paragraph-base\" data-interaction-id=\"f81d8b5\">El reto de SSI no es solo emitir credenciales, sino dise\u00f1ar experiencias donde personas, organizaciones y sistemas puedan confiar, compartir y verificar datos de forma \u00fatil.<\/p>\n\t\t\t\t\t<p class=\"Body2 e-paragraph-base\" data-interaction-id=\"97be46b\">En los \u00faltimos a\u00f1os, las credenciales verificables, las wallets digitales y los modelos SSI han pasado de ser un tema de nicho a ocupar un lugar central en muchas conversaciones sobre identidad digital. La evoluci\u00f3n del marco europeo, con eIDAS2, EUDI Wallet y el ARF, ha acelerado todav\u00eda m\u00e1s esa conversaci\u00f3n. Pero para m\u00ed, el reto sigue estando en el mismo sitio: convertir un modelo t\u00e9cnico potente en experiencias que puedan entenderse, adoptarse y usarse en contextos reales.<br><br>Emitir una credencial verificable puede ser t\u00e9cnicamente complejo, pero no es suficiente. La pregunta importante no es solo si una credencial se puede emitir, almacenar o verificar. La pregunta es qu\u00e9 problema resuelve, qu\u00e9 dato necesita ser confiable, qui\u00e9n debe presentarlo, qui\u00e9n debe verificarlo, en qu\u00e9 momento del proceso y con qu\u00e9 consecuencias.<br><br>Ah\u00ed es donde el enfoque de producto se vuelve clave. Porque SSI no es \u00fanicamente una arquitectura de identidad. Es un cambio de paradigma en la forma en que personas, organizaciones y sistemas comparten datos. Y ese cambio no siempre es intuitivo para un ciudadano, para una empresa o para una entidad que necesita operar con garant\u00edas.<br><br>El valor de una credencial verificable no est\u00e1 en que exista, sino en que encaje en una decisi\u00f3n de confianza.<\/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-8572e35 e-heading-base\">Cuando la credencial existe, pero nadie sabe usarla<\/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\">Uno de los errores m\u00e1s habituales al trabajar con credenciales verificables es pensar que el problema termina cuando la credencial ha sido emitida correctamente. Desde una perspectiva t\u00e9cnica, puede parecer un hito importante: hay un issuer, un holder, una wallet, una credential, una proof y un verifier. Pero desde el punto de vista del producto, ah\u00ed empieza otra parte igual de importante: conseguir que todo eso tenga sentido para quienes participan en el proceso.<br><br>El paradigma SSI cambia la forma de compartir informaci\u00f3n. En modelos tradicionales, el ciudadano muchas veces entrega documentos completos, rellena formularios, sube archivos o depende de comprobaciones manuales. En un modelo basado en credenciales verificables, la l\u00f3gica cambia: la persona puede custodiar atributos, presentar pruebas, compartir solo determinada informaci\u00f3n y operar con mayor control sobre sus datos. Esto tiene un valor enorme, pero tambi\u00e9n introduce una complejidad nueva.<br><br>Para muchas personas, una wallet puede convertirse f\u00e1cilmente en un caj\u00f3n de documentos digitales. Algo donde se guardan credenciales, certificados o atributos, pero sin una comprensi\u00f3n clara de qu\u00e9 significan, cu\u00e1ndo deben usarse, qu\u00e9 datos contienen o qu\u00e9 implica presentarlos. Si la experiencia no acompa\u00f1a, el ciudadano puede terminar aceptando, compartiendo o rechazando informaci\u00f3n sin entender del todo la acci\u00f3n que est\u00e1 realizando.<br><br>Tambi\u00e9n puede ocurrir lo contrario: que el caso de uso est\u00e9 perfectamente construido en una demo, pero no encaje en un proceso real. Una prueba de emisi\u00f3n y verificaci\u00f3n puede funcionar en laboratorio, pero fallar cuando aparecen roles, permisos, excepciones, revocaciones, expiraciones, representaci\u00f3n organizacional, soporte, onboarding, sistemas heredados o necesidad de interoperar con distintos marcos de confianza.<br><br>Otro error frecuente es utilizar blockchain como sin\u00f3nimo de SSI. No son lo mismo. SSI puede apoyarse en distintos mecanismos de confianza, y una red blockchain puede formar parte de determinados modelos, pero no define por s\u00ed sola la utilidad de una credencial verificable. El valor est\u00e1 en el flujo de emisi\u00f3n, custodia, presentaci\u00f3n y verificaci\u00f3n; en el marco de confianza que lo sostiene; y en la capacidad de integrarlo en procesos donde exista una necesidad real de verificar informaci\u00f3n.<br><br>El reto, por tanto, no es solo t\u00e9cnico. Es de adopci\u00f3n, de experiencia, de confianza y de producto.<\/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=\"1134\" src=\"https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/05\/rapha-wilde-X0rEU9juF0I-unsplash-scaled.jpg\" width=\"2560\" height=\"1707\" srcset=\"https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/05\/rapha-wilde-X0rEU9juF0I-unsplash-scaled.jpg 2560w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/05\/rapha-wilde-X0rEU9juF0I-unsplash-300x200.jpg 300w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/05\/rapha-wilde-X0rEU9juF0I-unsplash-1024x683.jpg 1024w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/05\/rapha-wilde-X0rEU9juF0I-unsplash-768x512.jpg 768w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/05\/rapha-wilde-X0rEU9juF0I-unsplash-1536x1024.jpg 1536w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/05\/rapha-wilde-X0rEU9juF0I-unsplash-2048x1365.jpg 2048w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/05\/rapha-wilde-X0rEU9juF0I-unsplash-18x12.jpg 18w\" alt=\"fotograf\u00eda abstracta que representa la idea de identidad digital\"\/>\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-52e367b e-heading-base\">Hacer \u00fatiles las credenciales exige dise\u00f1ar el contexto<\/h2>\n\t\t\t\t\t<p class=\"Body2 e-54bdc55-84ca9db e-paragraph-base\" data-interaction-id=\"54bdc55\">Antes de dise\u00f1ar una soluci\u00f3n basada en SSI, hay que entender qu\u00e9 relaci\u00f3n de confianza se quiere resolver. Una credencial no es un objeto aislado: forma parte de un flujo donde alguien acredita algo, alguien lo custodia o presenta, y alguien necesita verificarlo para tomar una decisi\u00f3n.<\/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\">El valor est\u00e1 en la verificaci\u00f3n<\/h2>\n\t\t\t\t\t<p class=\"Body2 e-paragraph-base\" data-interaction-id=\"3ac84e4\">Una credencial verificable tiene sentido cuando permite confiar en un dato sin depender de procesos manuales, documentos est\u00e1ticos o comprobaciones poco trazables. Puede servir para demostrar una condici\u00f3n, una autorizaci\u00f3n, una cualificaci\u00f3n, una pertenencia, una elegibilidad o una representaci\u00f3n. Pero su utilidad aparece cuando esa prueba reduce fricci\u00f3n, aumenta confianza o permite tomar una decisi\u00f3n con mayor seguridad.<\/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\">La wallet no puede ser un caj\u00f3n<\/h2>\n\t\t\t\t\t<p class=\"Body2 e-paragraph-base\" data-interaction-id=\"9354f9f\">Una wallet debe ayudar al ciudadano a entender qu\u00e9 credenciales tiene, qui\u00e9n las ha emitido, qu\u00e9 datos contienen y qu\u00e9 ocurre cuando decide presentarlas. La experiencia debe hacer comprensible el consentimiento: qu\u00e9 se comparte, con qui\u00e9n, para qu\u00e9 y durante cu\u00e1nto tiempo. Automatizar parte del proceso puede ser \u00fatil, pero siempre debe mantenerse una acci\u00f3n expl\u00edcita y comprensible cuando se comparten datos relevantes.<\/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\">El paradigma necesita traducci\u00f3n<\/h2>\n\t\t\t\t\t<p class=\"Body2 e-paragraph-base\" data-interaction-id=\"98ecc54\">SSI introduce conceptos que no siempre son evidentes fuera del nicho t\u00e9cnico: issuer, holder, verifier, DID, proof, revocation, trust framework, selective disclosure o verifiable presentation. El reto de UX y producto est\u00e1 en traducir esos conceptos en acciones claras: recibir, revisar, guardar, presentar, verificar, revocar, renovar o delegar. No se trata de ocultar la complejidad, sino de hacerla operable.<\/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\">Personas y organizaciones no funcionan igual<\/h2>\n\t\t\t\t\t<p class=\"Body2 e-paragraph-base\" data-interaction-id=\"c31371d\">No es lo mismo dise\u00f1ar una Holder Wallet para ciudadanos que una Business Wallet para organizaciones. En el \u00e1mbito enterprise aparecen necesidades adicionales: identidad organizacional, atributos corporativos, representaci\u00f3n, permisos, delegaci\u00f3n, trazabilidad interna y actuaci\u00f3n en nombre de una entidad. La experiencia debe contemplar no solo qui\u00e9n eres, sino en calidad de qu\u00e9 act\u00faas y con qu\u00e9 autoridad.<\/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-44781f7 e-heading-base\">Del est\u00e1ndar al caso de uso<\/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\">Trabajo para traducir flujos t\u00e9cnicos complejos en experiencias que puedan entenderse, validarse y utilizarse en contextos reales.<\/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\">Cuando trabajo en soluciones de identidad digital verificable, intento empezar por el caso de uso, no por la credencial. La primera pregunta no es qu\u00e9 est\u00e1ndar vamos a utilizar, sino qu\u00e9 dato necesita ser confiable y qu\u00e9 decisi\u00f3n depende de verificarlo.<br><br>A partir de ah\u00ed, es necesario mapear los actores del flujo. Qui\u00e9n emite la credencial, qui\u00e9n la recibe, qui\u00e9n la custodia, qui\u00e9n la presenta y qui\u00e9n la verifica. Tambi\u00e9n hay que entender si hablamos de una persona f\u00edsica, una organizaci\u00f3n, un representante o un sistema que necesita operar dentro de un marco de confianza. Esta diferencia cambia completamente la experiencia y la l\u00f3gica funcional.<br><br>Despu\u00e9s viene la conversaci\u00f3n t\u00e9cnica. No se puede dise\u00f1ar una buena experiencia SSI sin hablar con el equipo t\u00e9cnico sobre viabilidad, est\u00e1ndares, integraciones, formatos, protocolos, revocaci\u00f3n, expiraci\u00f3n, confianza, seguridad y restricciones del ecosistema. eIDAS2, EUDI Wallet y el ARF son referencias importantes porque ayudan a ordenar un marco com\u00fan, pero no todas las wallets ni todos los casos de uso son estrictamente EUDI Wallet. Aun as\u00ed, estar alineados con ese marco importa: por interoperabilidad, por expectativas de mercado, por evoluci\u00f3n regulatoria y por la necesidad de no construir soluciones aisladas.<br><br><\/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\">Ese trabajo t\u00e9cnico despu\u00e9s tiene que traducirse a UX. Un ciudadano no deber\u00eda necesitar entender el ARF para saber qu\u00e9 est\u00e1 compartiendo. Una organizaci\u00f3n no deber\u00eda tener que interpretar conceptos criptogr\u00e1ficos para operar con una Business Wallet. Un verificador no deber\u00eda enfrentarse a un flujo opaco para saber si una credencial es v\u00e1lida, est\u00e1 vigente y procede de una entidad confiable.<br><br>Para m\u00ed, el reto est\u00e1 en automatizar todo lo que pueda reducir fricci\u00f3n sin eliminar control. Si el sistema puede reconocer una credencial, interpretar su estado, validar su emisor o preparar una presentaci\u00f3n, perfecto. Pero cuando hay intercambio de datos personales, autorizaci\u00f3n o presentaci\u00f3n de atributos relevantes, el consentimiento debe ser expl\u00edcito, entendible y proporcionado.<br><br>Tambi\u00e9n hay que dise\u00f1ar el contexto de error. Qu\u00e9 ocurre si una credencial est\u00e1 revocada, si ha caducado, si el verifier no la acepta, si falta un atributo, si la wallet no es compatible o si la organizaci\u00f3n no tiene autorizaci\u00f3n para actuar. Muchos prototipos funcionan bien en el happy path, pero los productos reales se sostienen en c\u00f3mo resuelven las excepciones. Por eso, aterrizar SSI en producto exige una mirada h\u00edbrida: entender el est\u00e1ndar, hablar con tecnolog\u00eda, comprender el proceso de negocio y dise\u00f1ar una experiencia que no exponga al ciudadano o a la organizaci\u00f3n a una complejidad innecesaria.<\/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-04800d5 e-heading-base\">La utilidad es la verdadera adopci\u00f3n<\/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\">La identidad digital no se adopta por est\u00e1ndar, se adopta por utilidad.<\/h2>\n\t\t\t\t\t<p class=\"e-paragraph-base\" data-interaction-id=\"17463f6\">Las credenciales verificables tienen un potencial enorme para transformar c\u00f3mo compartimos y verificamos informaci\u00f3n. Pueden reducir fricci\u00f3n, mejorar privacidad, facilitar interoperabilidad, reforzar confianza y abrir nuevos escenarios para ciudadanos y organizaciones. Pero ese potencial solo se materializa si el producto resuelve algo que alguien necesita hacer.<br><br>Una credencial no es \u00fatil porque exista, sino porque encaja en una decisi\u00f3n de confianza. Porque evita pedir un documento completo cuando basta con verificar un atributo. Porque permite a una organizaci\u00f3n actuar con una identidad corporativa verificable. Porque facilita que un ciudadano demuestre una condici\u00f3n sin repetir tr\u00e1mites. Porque permite que sistemas distintos se entiendan sin depender de validaciones manuales o integraciones ad hoc.<br><br>El futuro de SSI no se juega solo en la emisi\u00f3n, sino en la experiencia de usar y verificar. En c\u00f3mo se explican los datos. En c\u00f3mo se dise\u00f1a el consentimiento. En c\u00f3mo se resuelven las excepciones. En c\u00f3mo se integran las wallets en procesos existentes. En c\u00f3mo se conectan personas, organizaciones y sistemas dentro de marcos de confianza que puedan sostenerse en producci\u00f3n.<br><br>La tecnolog\u00eda ya est\u00e1 empujando. Ahora el reto es hacerla \u00fatil.<\/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-9b835f9 e-flex e-con-boxed e-con e-parent\" data-id=\"9b835f9\" 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-bc7e321 elementor-widget elementor-widget-html\" data-id=\"bc7e321\" 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-heading-base\">Hablemos de identidad digital con sentido de producto<\/h1>\n\t\t\t\t\t<p class=\"Body1 e-paragraph-base\" data-interaction-id=\"cc84cef\">Podemos conversar sobre SSI, credenciales verificables, EUDI Wallet, interoperabilidad o soluciones de confianza digital que necesiten pasar de la complejidad t\u00e9cnica a experiencias claras, \u00fatiles y adoptables.<\/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-06a5018 elementor-widget elementor-widget-button\" data-id=\"06a5018\" 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-b173e45 e-flex e-con-boxed e-con e-parent\" data-id=\"b173e45\" 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-ffd755b e-con-full e-flex e-con e-child\" data-id=\"ffd755b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-f53690b e-con-full e-flex e-con e-child\" data-id=\"f53690b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<h1 data-interaction-id=\"0fb493b\" class=\"Enphasis1 e-heading-base\">Macarena Torralba<\/h1>\n\t\t\t\t\t<p class=\"Body1 e-paragraph-base\" data-interaction-id=\"13258fc\">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-64b859b e-con-full e-flex e-con e-child\" data-id=\"64b859b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<p class=\"Body1 e-456be80-0e59b82 e-paragraph-base\" data-interaction-id=\"456be80\"><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=\"00344f9\"><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-7669b69 e-con-full e-flex e-con e-child\" data-id=\"7669b69\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<h1 data-interaction-id=\"195434c\" class=\"e-195434c-af2dbcd 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-69d34a8 e-con-full e-flex e-con e-child\" data-id=\"69d34a8\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0848d1a elementor-widget elementor-widget-html\" data-id=\"0848d1a\" 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-55c9f4b elementor-widget elementor-widget-html\" data-id=\"55c9f4b\" 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-f071c74 elementor-widget elementor-widget-html\" data-id=\"f071c74\" 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-e0e1357 elementor-widget elementor-widget-html\" data-id=\"e0e1357\" 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-d996dfb elementor-widget elementor-widget-html\" data-id=\"d996dfb\" 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-bb9f957 elementor-widget elementor-widget-html\" data-id=\"bb9f957\" 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-3f10b0b elementor-widget elementor-widget-html\" data-id=\"3f10b0b\" 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-965911d elementor-widget elementor-widget-html\" data-id=\"965911d\" 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-1838de8 e-con-full e-flex e-con e-child\" data-id=\"1838de8\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<p class=\"Body1 e-d1ce5bd-0de84ec e-paragraph-base\" data-interaction-id=\"d1ce5bd\"><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>Credenciales verificables: el reto no es emitirlas, es hacerlas \u00fatiles Una credencial verificable solo aporta valor cuando resuelve una decisi\u00f3n de confianza en un contexto real. No basta con emitirla correctamente: tiene que ser comprensible para quien la recibe, \u00fatil para quien la presenta y verificable para quien necesita confiar en ese dato. SSI \u00b7 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":232,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"elementor_canvas","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[45,51,52,18,62,17,46,61,16,19],"class_list":["post-1120","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-insight","tag-consutoria","tag-emerging-tech","tag-ia-data","tag-identidad-digital","tag-oidc","tag-product","tag-product-design","tag-ssi--credenciales-verificables--eudiw--eidas2--business-wallet--interoperabilidad","tag-ux","tag-web3"],"_links":{"self":[{"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/posts\/1120","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/comments?post=1120"}],"version-history":[{"count":58,"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/posts\/1120\/revisions"}],"predecessor-version":[{"id":1964,"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/posts\/1120\/revisions\/1964"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/media\/232"}],"wp:attachment":[{"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/media?parent=1120"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/categories?post=1120"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/tags?post=1120"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}