{"id":1139,"date":"2026-04-01T10:57:17","date_gmt":"2026-04-01T10:57:17","guid":{"rendered":"https:\/\/macarenatorralba.es\/?p=1139"},"modified":"2026-06-09T10:17:00","modified_gmt":"2026-06-09T10:17:00","slug":"blockchain-con-confianza-en-producto","status":"publish","type":"post","link":"https:\/\/macarenatorralba.es\/es\/blockchain-con-confianza-en-producto\/","title":{"rendered":"Blockchain como capa de confianza, no como protagonista del producto"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"1139\" class=\"elementor elementor-1139\">\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\">Blockchain como capa de confianza, no como protagonista del producto<\/h1>\n\t\t\t\t\t<p class=\"Body1 e-paragraph-base\" data-interaction-id=\"805fbd0\">No se trata de poner blockchain en un producto, sino de entender qu\u00e9 evidencia necesita ser confiable, qu\u00e9 actores participan, qu\u00e9 reglas deben cumplirse y qu\u00e9 parte del proceso mejora al hacerla verificable, trazable o resistente a manipulaci\u00f3n.<\/p>\n\t\t\t\t\t<p class=\"e-1dd29b9-777e70e Enphasis1 e-paragraph-base\" data-interaction-id=\"1dd29b9\">Blockchain \u00b7 Tokenizaci\u00f3n \u00b7 Trazabilidad \u00b7 Smart Contracts \u00b7 Evidencias digitales \u00b7 Trust Layer<\/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\">La confianza tambi\u00e9n se dise\u00f1a<\/h2>\n\t\t\t\t\t<p class=\"Enphasis2 e-paragraph-base\" data-interaction-id=\"f81d8b5\">Blockchain aporta valor cuando deja de ser el centro del discurso y se convierte en una capa de confianza al servicio de un proceso real.<\/p>\n\t\t\t\t\t<p class=\"Body2 e-paragraph-base\" data-interaction-id=\"97be46b\">En muchos proyectos de innovaci\u00f3n, blockchain aparece demasiado pronto en la conversaci\u00f3n. A veces incluso antes de entender el proceso, los actores, los datos o el problema que se intenta resolver. Se plantea como una capa diferencial, como una garant\u00eda de transparencia o como un argumento de modernidad. Pero usar blockchain no convierte autom\u00e1ticamente una soluci\u00f3n en m\u00e1s confiable, m\u00e1s innovadora o m\u00e1s \u00fatil.<br><br>Para m\u00ed, blockchain empieza a tener sentido cuando hay reglas definidas, m\u00faltiples actores con intereses propios y una necesidad real de mantener un registro verificable, compartido y resistente a manipulaci\u00f3n. No se trata de registrar datos porque s\u00ed, sino de decidir qu\u00e9 eventos, evidencias o transacciones necesitan quedar trazados de una forma que pueda ser auditada o verificada posteriormente.<br><br>La clave est\u00e1 en entender que blockchain no es el producto. Es infraestructura. Es una capa de confianza que puede sostener procesos donde importan la integridad, la trazabilidad, la auditabilidad, la tokenizaci\u00f3n o la coordinaci\u00f3n entre partes. Pero el valor para quien usa la soluci\u00f3n no est\u00e1 en saber que hay una blockchain detr\u00e1s, sino en poder confiar mejor en lo que ocurre.<br><br>Una buena soluci\u00f3n basada en blockchain no obliga al usuario a entender la tecnolog\u00eda. Le permite ver el valor.<\/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\">El error de poner la tecnolog\u00eda antes que el problema<\/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 es empezar por la frase \u201cmetamos blockchain\u201d sin haber identificado qu\u00e9 problema de confianza existe. Esto suele llevar a soluciones donde la tecnolog\u00eda est\u00e1 presente, pero no necesariamente aporta valor. Se registra informaci\u00f3n en una red, se habla de inmutabilidad y se menciona la trazabilidad, pero no siempre queda claro qu\u00e9 decisi\u00f3n mejora, qu\u00e9 riesgo reduce o qu\u00e9 actor necesita verificar esa informaci\u00f3n.<br><br>Tambi\u00e9n es frecuente confundir inmutabilidad con calidad del dato. Que un dato quede registrado de forma inmutable no significa que sea correcto. Blockchain puede ayudar a demostrar que una informaci\u00f3n no ha sido alterada desde un momento concreto, pero no garantiza por s\u00ed sola que esa informaci\u00f3n fuera verdadera, completa o fiable en origen. Si el dato de entrada es malo, incompleto o no ha sido validado correctamente, la tecnolog\u00eda solo conserva mejor un problema mal resuelto.<br><br>Esto es especialmente importante en proyectos de trazabilidad. Trazar no significa simplemente acumular registros. Significa entender qu\u00e9 eventos del proceso importan, qui\u00e9n los genera, c\u00f3mo se validan, qu\u00e9 evidencia los acompa\u00f1a y qui\u00e9n necesita consultarlos despu\u00e9s. En una cadena agroalimentaria, por ejemplo, no basta con decir que se registra el recorrido del producto. Hay que definir qu\u00e9 ocurre en campo, qu\u00e9 se registra en la transformaci\u00f3n, qu\u00e9 datos proceden de sistemas de bodega, qu\u00e9 evidencias se generan y qu\u00e9 informaci\u00f3n puede entender finalmente el consumidor.<br><br>En proyectos vinculados a ayudas sociales o tokenizaci\u00f3n de recursos ocurre algo parecido. Un token puede representar una ayuda, un derecho de uso, una unidad de valor o una transacci\u00f3n dentro de un ecosistema, pero solo aporta valor si est\u00e1 conectado con reglas claras, actores identificados y una l\u00f3gica operativa que permita usarlo, verificarlo y supervisarlo. Tokenizar por tokenizar no resuelve nada.<br><br>Adem\u00e1s, dise\u00f1ar desde la tecnolog\u00eda y no desde la operaci\u00f3n suele generar experiencias demasiado complejas. Aparecen conceptos como wallet, hash, smart contract, token, transacci\u00f3n, direcci\u00f3n, firma, on-chain u off-chain, pero el usuario final no quiere gestionar esa complejidad. Quiere saber si una ayuda se ha recibido, si una evidencia es v\u00e1lida, si un producto es trazable, si una operaci\u00f3n se ha completado o si puede confiar en la informaci\u00f3n que est\u00e1 viendo.<br><br>El reto no es hacer visible blockchain. El reto es hacer visible la confianza.<\/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=\"1576\" src=\"https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/06\/ricardo-gomez-angel-CIxI3XL1Sz4-unsplash-scaled.jpg\" width=\"1941\" height=\"2560\" srcset=\"https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/06\/ricardo-gomez-angel-CIxI3XL1Sz4-unsplash-scaled.jpg 1941w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/06\/ricardo-gomez-angel-CIxI3XL1Sz4-unsplash-227x300.jpg 227w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/06\/ricardo-gomez-angel-CIxI3XL1Sz4-unsplash-776x1024.jpg 776w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/06\/ricardo-gomez-angel-CIxI3XL1Sz4-unsplash-768x1013.jpg 768w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/06\/ricardo-gomez-angel-CIxI3XL1Sz4-unsplash-1165x1536.jpg 1165w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/06\/ricardo-gomez-angel-CIxI3XL1Sz4-unsplash-1553x2048.jpg 1553w, https:\/\/macarenatorralba.es\/wp-content\/uploads\/2026\/06\/ricardo-gomez-angel-CIxI3XL1Sz4-unsplash-9x12.jpg 9w\" alt=\"fotograf\u00eda abstracta que representa la idea de blockchain porque se visualiza la modularidad\"\/>\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\">Blockchain como infraestructura de producto<\/h2>\n\t\t\t\t\t<p class=\"Body2 e-54bdc55-84ca9db e-paragraph-base\" data-interaction-id=\"54bdc55\">Blockchain puede aportar mucho valor cuando se dise\u00f1a como una capa que sostiene procesos reales, no como una pieza aislada. Para que tenga sentido, debe responder a una necesidad concreta de confianza, integridad, trazabilidad o coordinaci\u00f3n entre actores.<\/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\">Capa de confianza<\/h2>\n\t\t\t\t\t<p class=\"Body2 e-paragraph-base\" data-interaction-id=\"3ac84e4\">Blockchain tiene sentido cuando varios actores necesitan operar sobre una fuente com\u00fan de confianza sin depender exclusivamente de un intermediario \u00fanico. En estos casos, puede ayudar a registrar eventos, transacciones o evidencias de forma verificable, permitiendo que las partes compartan una misma referencia sobre lo que ha ocurrido. Su valor aparece cuando reduce disputas, mejora la auditabilidad o permite comprobar la integridad de un proceso.<\/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\">Trazabilidad con prop\u00f3sito<\/h2>\n\t\t\t\t\t<p class=\"Body2 e-paragraph-base\" data-interaction-id=\"9354f9f\">No todo dato necesita registrarse en blockchain. La trazabilidad \u00fatil empieza por definir qu\u00e9 eventos importan y qu\u00e9 decisi\u00f3n permite tomar su registro. Puede tratarse del origen de una materia prima, una operaci\u00f3n realizada, una evidencia generada, una entrega, una certificaci\u00f3n o un hito dentro de una cadena de valor. Lo importante no es registrar m\u00e1s, sino registrar aquello que realmente necesita ser verificable.<\/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\">Tokenizaci\u00f3n \u00fatil<\/h2>\n\t\t\t\t\t<p class=\"Body2 e-paragraph-base\" data-interaction-id=\"98ecc54\">Un token solo aporta valor si representa algo operativo dentro del proceso: una ayuda, un derecho, una evidencia, un activo, un hito o una autorizaci\u00f3n. La tokenizaci\u00f3n permite modelar unidades de valor o de uso dentro de un ecosistema, pero necesita reglas claras: c\u00f3mo se emite, qui\u00e9n lo recibe, d\u00f3nde puede utilizarse, qu\u00e9 restricciones tiene, c\u00f3mo se transfiere y c\u00f3mo se verifica su estado. Sin esa l\u00f3gica, el token es solo una abstracci\u00f3n t\u00e9cnica.<\/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\">Privacidad y operaci\u00f3n real<\/h2>\n\t\t\t\t\t<p class=\"Body2 e-paragraph-base\" data-interaction-id=\"c31371d\">Una buena soluci\u00f3n blockchain tambi\u00e9n debe decidir qu\u00e9 informaci\u00f3n se registra on-chain y qu\u00e9 permanece off-chain. En muchos contextos, especialmente cuando hay datos personales, comerciales o sensibles, no tiene sentido exponer informaci\u00f3n completa en una red. Puede ser m\u00e1s adecuado registrar hashes, referencias, timestamps o pruebas de integridad, manteniendo el dato original en sistemas seguros y controlados. La confianza no debe construirse a costa de la privacidad.<\/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\">Del caso de uso a la capa de confianza<\/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 identificar qu\u00e9 parte del proceso necesita ser verificable antes de decidir c\u00f3mo registrarla.<\/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 donde blockchain puede tener sentido, intento no empezar por la red, el token o el smart contract. Empiezo por el proceso. Qu\u00e9 ocurre, qui\u00e9n interviene, qu\u00e9 informaci\u00f3n se genera, qu\u00e9 reglas existen y qu\u00e9 parte necesita ser verificable.<br><br>La primera pregunta es si realmente hay un problema de confianza compartida. Si una \u00fanica organizaci\u00f3n controla todo el proceso, una base de datos tradicional puede ser suficiente. Pero si intervienen m\u00faltiples actores, cada uno con responsabilidades, intereses o necesidades de validaci\u00f3n distintas, blockchain puede aportar una capa de confianza adicional. No por ser m\u00e1s moderna, sino porque permite construir una referencia com\u00fan sobre determinados eventos o evidencias.<br><br>Despu\u00e9s hay que identificar qu\u00e9 se debe registrar. No todo evento tiene el mismo valor. En trazabilidad industrial, puede interesar registrar hitos relevantes del recorrido de un producto, evidencias generadas en campo, transformaciones, controles o certificaciones. En sistemas de ayudas, puede interesar registrar emisi\u00f3n, uso, transferencia o liquidaci\u00f3n de tokens. En soluciones de certificaci\u00f3n, puede interesar registrar una prueba de existencia, integridad o validez documental. Cada caso exige una l\u00f3gica distinta.<br><br>Tambi\u00e9n es necesario separar el dato de la prueba. Esta distinci\u00f3n es clave. Muchas veces no se registra la informaci\u00f3n completa en blockchain, sino una referencia, un hash, una prueba criptogr\u00e1fica o un timestamp que permite verificar que un dato no ha sido alterado. <\/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\">El dato puede permanecer off-chain, en sistemas controlados, cifrado o gestionado bajo reglas de acceso espec\u00edficas. Esta arquitectura permite combinar integridad y privacidad, evitando convertir la red en un repositorio de informaci\u00f3n sensible.<br><br>Los smart contracts pueden ser \u00fatiles cuando hay reglas de negocio que deben ejecutarse de forma transparente o verificable. Pueden representar condiciones, restricciones, cambios de estado, emisi\u00f3n de tokens o validaciones autom\u00e1ticas. Pero tampoco son magia. Un smart contract ejecuta reglas; no define por s\u00ed solo si esas reglas tienen sentido en la operaci\u00f3n. Por eso, antes de automatizar, hay que entender bien el proceso y sus excepciones.<br><br>La experiencia de usuario debe ocultar casi toda esta complejidad. Una persona que consulta la trazabilidad de un producto no necesita ver el hash. Necesita entender el origen, el recorrido y las evidencias relevantes. Un comercio que acepta tokens no necesita pensar en contratos inteligentes. Necesita saber si la operaci\u00f3n es v\u00e1lida y qu\u00e9 debe hacer despu\u00e9s. Un administrador no necesita interpretar la red, sino supervisar estados, reglas y operaciones de forma clara.<br><br>Por eso, el trabajo de producto consiste en traducir la capa t\u00e9cnica en acciones comprensibles. Registrar, verificar, consultar, transferir, validar, auditar. Cada una de esas acciones puede apoyarse en blockchain, pero debe presentarse como parte natural del flujo. La tecnolog\u00eda debe sostener la confianza sin convertirse en una carga cognitiva.<\/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\">La mejor DApp es la que no exige entender blockchain<\/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 mejor aplicaci\u00f3n descentralizada basada en blockchain es aquella que resuelve el problema de la confianza sin obligar al usuario a entenderla t\u00e9cnicamente.<\/h2>\n\t\t\t\t\t<p class=\"e-paragraph-base\" data-interaction-id=\"17463f6\">No todos los productos necesitan blockchain. No toda trazabilidad requiere una red distribuida. No toda evidencia necesita tokenizarse. Y no todo registro inmutable resuelve un problema de confianza. A veces basta con una buena arquitectura de datos, una integraci\u00f3n bien dise\u00f1ada o una base de datos tradicional. El criterio est\u00e1 en saber cu\u00e1ndo la confianza necesita algo m\u00e1s.<br><br>Cuando s\u00ed tiene sentido, blockchain deber\u00eda funcionar como una infraestructura discreta: visible en su valor, invisible en su complejidad. El usuario no deber\u00eda tener que entender qu\u00e9 ocurre on-chain, qu\u00e9 queda off-chain, c\u00f3mo se calcula un hash o c\u00f3mo opera un smart contract para poder beneficiarse de la soluci\u00f3n. Lo que debe entender es qu\u00e9 informaci\u00f3n puede confiar, qu\u00e9 operaci\u00f3n se ha realizado y qu\u00e9 evidencia existe para respaldarla.<br><br>La innovaci\u00f3n no est\u00e1 en decir que usamos blockchain. Est\u00e1 en dise\u00f1ar sistemas donde la confianza, la trazabilidad y la verificabilidad resuelven un problema concreto.<\/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 trazabilidad y confianza digital<\/h1>\n\t\t\t\t\t<p class=\"Body1 e-paragraph-base\" data-interaction-id=\"cc84cef\">Podemos conversar sobre producto, UX, tokenizaci\u00f3n, trazabilidad o soluciones blockchain que necesiten convertir una tecnolog\u00eda compleja en valor claro, verificable y \u00fatil para negocio y usuarios.<\/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>Blockchain como capa de confianza, no como protagonista del producto No se trata de poner blockchain en un producto, sino de entender qu\u00e9 evidencia necesita ser confiable, qu\u00e9 actores participan, qu\u00e9 reglas deben cumplirse y qu\u00e9 parte del proceso mejora al hacerla verificable, trazable o resistente a manipulaci\u00f3n. Blockchain \u00b7 Tokenizaci\u00f3n \u00b7 Trazabilidad \u00b7 Smart [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":231,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"elementor_canvas","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[63,45,51,52,46,40,21,29,16,19],"class_list":["post-1139","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-insight","tag-blockchain--tokenizacion--trazabilidad--smart-contracts--evidencias-digitales--trust-layer","tag-consutoria","tag-emerging-tech","tag-ia-data","tag-product-design","tag-research","tag-ssi","tag-token","tag-ux","tag-web3"],"_links":{"self":[{"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/posts\/1139","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=1139"}],"version-history":[{"count":91,"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/posts\/1139\/revisions"}],"predecessor-version":[{"id":1942,"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/posts\/1139\/revisions\/1942"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/media\/231"}],"wp:attachment":[{"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/media?parent=1139"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/categories?post=1139"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/macarenatorralba.es\/es\/wp-json\/wp\/v2\/tags?post=1139"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}