{"id":7711,"date":"2026-09-09T16:59:23","date_gmt":"2026-09-09T14:59:23","guid":{"rendered":"https:\/\/idelive.com\/?page_id=7711"},"modified":"2026-09-09T17:20:21","modified_gmt":"2026-09-09T15:20:21","slug":"aviso-legal","status":"publish","type":"page","link":"https:\/\/idelive.com\/es\/aviso-legal\/","title":{"rendered":"Aviso Legal"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"7711\" class=\"elementor elementor-7711\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-section elementor-top-section elementor-element elementor-element-7a9ba6d elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7a9ba6d\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-de3c5c0\" data-id=\"de3c5c0\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b3fb325 elementor-widget elementor-widget-heading\" data-id=\"b3fb325\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Legal<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cd9fcef elementor-widget elementor-widget-text-editor\" data-id=\"cd9fcef\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h2 style=\"text-align: left;\"><strong>Bloque legal resumen<\/strong><\/h2><p style=\"text-align: justify;\">Idelive Urban Breaks is a brand of ROMESTONE, S.L. (B05443155). We offer temporary serviced urban stays exclusively for recreational, holiday or leisure purposes, ranging from 32 days to 11 months, under lease agreements for uses other than permanent residential housing (Article 3.2 of the Spanish Urban Leases Act (LAU) and Catalonia Law 18\/2007, as amended by Law 11\/2025). Our accommodations are not intended to meet permanent housing needs, do not allow professional, academic or medical uses, and may not be used as a permanent address or for municipal registration purposes. The rental registration number is available for each accommodation.<\/p><h2 style=\"text-align: left;\"><strong>Aviso Legal<\/strong><\/h2><p style=\"text-align: justify;\">ROMESTONE, S.L., con NIF B-05443155 y domicilio social en Balmes 211, 3.\u00aa planta, Barcelona, \u200b\u200bes la propietaria de este sitio web y opera bajo la marca Idelive Urban Breaks. La empresa est\u00e1 inscrita en el Registro Mercantil de Barcelona, \u200b\u200bn\u00ba 23, tomo 4779812, folio 18212, hoja B-56254912, inscripci\u00f3n 1\u00aa12. Puede contactarnos por correo electr\u00f3nico a info@idelive.com o por tel\u00e9fono al (+34) 931 863 673. La finalidad de este sitio web es proporcionar informaci\u00f3n y facilitar la reserva de estancias urbanas temporales con fines recreativos. Las condiciones de uso, las disposiciones sobre propiedad intelectual, la responsabilidad, los enlaces y la legislaci\u00f3n aplicable se rigen por los t\u00e9rminos legales correspondientes disponibles en este sitio web. Para m\u00e1s informaci\u00f3n, consulte nuestras Condiciones de Reserva, Pol\u00edtica de Cancelaci\u00f3n, Pol\u00edtica de Privacidad y Pol\u00edtica de Cookies.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c235be8 elementor-widget elementor-widget-html\" data-id=\"c235be8\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"es\">\r\n<head>\r\n  <meta charset=\"UTF-8\">\r\n  <title>IDELIVE Chat<\/title>\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\r\n\r\n  <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n  <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n  <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Montserrat:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\r\n\r\n  <style>\r\n    * {\r\n      box-sizing: border-box;\r\n    }\r\n\r\n    :root {\r\n  --accent: #7D7D7D; \/* Gris para acento *\/\r\n  --bg1: #B0B0B0; \/* Gris para fondo del t\u00edtulo *\/\r\n  --bg2: #D3D3D3; \/* Gris m\u00e1s claro *\/\r\n  --panel: rgba(189, 189, 189, 0.18); \/* Gris suave para panel *\/\r\n  --stroke: rgba(189, 189, 189, 0.28); \/* Gris para borde *\/\r\n  --shadow: 0 20px 60px rgba(0, 0, 0, 0.18);\r\n  --text: #333333; \/* Gris oscuro para el texto *\/\r\n  --bubble: rgba(200, 200, 200, 0.72); \/* Gris claro para los mensajes del bot *\/\r\n  --bubbleStroke: rgba(200, 200, 200, 0.55); \/* Gris m\u00e1s tenue para borde de burbuja *\/\r\n}\r\n\r\n    body {\r\n      margin: 0;\r\n      padding: 0;\r\n      font-family: \"Montserrat\", sans-serif;\r\n    }\r\n\r\n    \/* ===== Bot\u00f3n Flotante ===== *\/\r\n    .chat-button {\r\n      position: fixed;\r\n      bottom: 80px;\r\n      right: 25px;\r\n      background: transparent;\r\n      border-radius: 50%;\r\n      width: 60px;\r\n      height: 60px;\r\n      display: flex;\r\n      justify-content: center;\r\n      align-items: center;\r\n      cursor: pointer;\r\n      z-index: 10000;\r\n      transition: opacity 0.3s ease, transform 0.2s ease;\r\n      filter: drop-shadow(0 10px 10px rgba(0.80, 0.80, 0.80, 0.60));\r\n    }\r\n    \r\n    .message a {\r\n  display: inline-block;\r\n  margin-top: 4px;\r\n  padding: 6px 10px;\r\n  border-radius: 8px;\r\n  background: rgba(0, 0, 0, 0.08);\r\n  color: #2f5cff;\r\n  text-decoration: none;\r\n  font-size: 11px;\r\n  line-height: 1.2;\r\n  max-width: 100%;\r\n}\r\n.link-center {\r\n  display: flex;\r\n  justify-content: center;\r\n  margin: 10px 0 6px;\r\n}\r\n\r\n.message a.chat-link-btn {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  min-width: 110px;\r\n  padding: 7px 14px;\r\n  border-radius: 10px;\r\n  background: rgba(255, 255, 255, 0.45);\r\n  color: #4a4a4a;\r\n  text-decoration: none;\r\n  font-size: 11px;\r\n  font-weight: 600;\r\n  line-height: 1.2;\r\n  text-align: center;\r\n  border: 1px solid rgba(0, 0, 0, 0.06);\r\n}\r\n\r\n.message a.chat-link-btn:hover {\r\n  background: rgba(255, 255, 255, 0.62);\r\n}\r\n\r\n.chat-separator {\r\n  border: 0;\r\n  height: 1px;\r\n  margin: 12px 0;\r\n  background: linear-gradient(\r\n    to right,\r\n    rgba(0,0,0,0),\r\n    rgba(0,0,0,0.18),\r\n    rgba(0,0,0,0)\r\n  );\r\n}\r\n.message a:hover {\r\n  background: rgba(0, 0, 0, 0.12);\r\n}\r\n\r\n.bot-message a {\r\n  background: rgba(0, 0, 0, 0.06);\r\n}\r\n\r\n    .chat-button:active { transform: scale(0.9); }\r\n\r\n   .chat-button {\r\n  overflow: hidden; \/* Recorta lo que se salga *\/\r\n}\r\n\r\n.chat-button img {\r\n  width: 100%;\r\n  height: 100%;\r\n  object-fit: cover; \/* Ajusta la imagen al c\u00edrculo *\/\r\n  border-radius: 50%;\r\n}\r\n\r\n    \/* ===== Chat App Container ===== *\/\r\n    .chat-app {\r\n      position: fixed;\r\n      bottom: 80px;\r\n      right: 16px;\r\n      width: 280px;\r\n      height: 400px;\r\n      border-radius: 16px;\r\n      overflow: hidden;\r\n      background: var(--panel);\r\n      border: 1px solid var(--stroke);\r\n      box-shadow: var(--shadow);\r\n      backdrop-filter: blur(18px) saturate(160%);\r\n      -webkit-backdrop-filter: blur(18px) saturate(160%);\r\n      display: flex;\r\n      flex-direction: column;\r\n      \r\n      \/* Estado Inicial (Oculto abajo) *\/\r\n      transform: translateY(120%);\r\n      opacity: 0;\r\n      pointer-events: none;\r\n      transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.1), opacity 0.3s ease;\r\n      z-index: 9999;\r\n    }\r\n\r\n    .chat-app.open {\r\n      transform: translateY(0);\r\n      opacity: 1;\r\n      pointer-events: auto;\r\n    }\r\n\r\n    \/* ===== Header ===== *\/\r\n    .chat-header {\r\n  padding: 10px 14px;\r\n  background: linear-gradient(135deg, rgba(189, 189, 189, 0.85), rgba(169, 169, 169, 0.78)); \/* Fondo gris *\/\r\n  color: #fff;\r\n  border-bottom: 1px solid rgba(200, 200, 200, 0.25); \/* Gris m\u00e1s suave *\/\r\n}\r\n\r\n    .chat-header .title {\r\n      font-size: 14px;\r\n      font-weight: 700;\r\n      text-align: center;\r\n      margin: 0;\r\n    }\r\n\r\n    .chat-header .session { display: none; }\r\n\r\n    \/* ===== Body ===== *\/\r\n    .chat-body {\r\n      flex: 1;\r\n      padding: 10px;\r\n      overflow-y: auto;\r\n      display: flex;\r\n      flex-direction: column;\r\n      gap: 8px;\r\n      background: linear-gradient(180deg, rgba(255, 255, 255, .10), rgba(255, 255, 255, .06));\r\n    }\r\n    .chat-body {\r\n  overflow-y: auto;\r\n\r\n  \/* Firefox *\/\r\n  scrollbar-width: none;\r\n\r\n  \/* IE y Edge antiguos *\/\r\n  -ms-overflow-style: none;\r\n}\r\n\r\n.chat-body::-webkit-scrollbar {\r\n  display: none; \/* Chrome, Safari *\/\r\n}\r\n\r\n    \/* ===== Messages ===== *\/\r\n    .message {\r\n      max-width: 88%;\r\n      padding: 8px 12px;\r\n      border-radius: 15px;\r\n      font-size: 12px;\r\n      line-height: 1.3;\r\n      word-wrap: break-word;\r\n      animation: fadeIn .22s ease;\r\n      \r\n    }\r\n    .bot-row {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 8px;\r\n}\r\n\r\n.bot-avatar {\r\n  width: 28px;\r\n  height: 28px;\r\n  border-radius: 50%;\r\n  object-fit: cover;\r\n  flex-shrink: 0;\r\n  margin-top: 2px;\r\n}\r\n\r\n.bot-row .bot-message {\r\n  align-self: unset;\r\n  max-width: calc(100% - 40px);\r\n}\r\n\r\n    .message img {\r\n      max-width: 100%;\r\n      border-radius: 8px;\r\n      margin-bottom: 4px;\r\n      display: block;\r\n    }\r\n    .message {\r\n  white-space: normal;\r\n  overflow-wrap: anywhere;\r\n  word-break: break-word;\r\n}\r\n\r\n.message a {\r\n  color: #2f5cff;\r\n  text-decoration: underline;\r\n  word-break: break-word;\r\n}\r\n\r\n.message strong {\r\n  font-weight: 700;\r\n}\r\n\r\n.message ul {\r\n  margin: 6px 0 0 16px;\r\n  padding: 0;\r\n}\r\n\r\n.message li {\r\n  margin: 4px 0;\r\n}\r\n\r\n.message img {\r\n  max-width: 100%;\r\n  border-radius: 8px;\r\n  margin-bottom: 6px;\r\n  display: block;\r\n}\r\n\r\n.bot-message,\r\n.user-message {\r\n  overflow-wrap: anywhere;\r\n}\r\n\r\n.user-message {\r\n  align-self: flex-end;\r\n  color: #fff;\r\n  background: linear-gradient(135deg, #6b6b6b, #8a8a8a);\r\n  border: 1px solid rgba(255, 255, 255, 0.12);\r\n  border-bottom-right-radius: 4px;\r\n}\r\n\r\n    .bot-message {\r\n  align-self: flex-start;\r\n  color: var(--text);\r\n  background: var(--bubble); \/* Fondo gris claro para los mensajes del bot *\/\r\n  border: 1px solid var(--bubbleStroke); \/* Borde gris m\u00e1s tenue *\/\r\n  border-bottom-left-radius: 4px;\r\n}\r\n    \r\n\r\n    \/* ===== Typing indicator ===== *\/\r\n    .typing {\r\n      align-self: flex-start;\r\n      display: flex;\r\n      gap: 4px;\r\n      padding: 10px 14px;\r\n      background: var(--bubble);\r\n      border-radius: 15px;\r\n      border-bottom-left-radius: 4px;\r\n    }\r\n    .typing span {\r\n      width: 6px; height: 6px;\r\n      background: rgba(0, 0, 0, .4);\r\n      border-radius: 50%;\r\n      animation: blink 1.4s infinite both;\r\n    }\r\n    .typing span:nth-child(2) { animation-delay: .2s; }\r\n    .typing span:nth-child(3) { animation-delay: .4s; }\r\n\r\n    @keyframes blink { 0%, 100% { opacity: .2; } 20% { opacity: 1; } }\r\n\r\n    \/* ===== Input Bar ===== *\/\r\n    .chat-input {\r\n  padding: 10px;\r\n   background: rgba(169, 169, 169, 1); \/* Fondo opaco *\/\r\n  background: rgba(169, 169, 169, 1); \/* Fondo opaco *\/\r\n}\r\n\r\n    .input-shell {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 8px;\r\n      padding: 6px 10px;\r\n      border-radius: 20px;\r\n      background: rgba(255, 255, 255, 10.7);\r\n      border: 1px solid rgba(255, 255, 255, .5);\r\n    }\r\n\r\n    .chat-input input {\r\n      flex: 1;\r\n      border: none;\r\n      outline: none;\r\n      background: rgba(169, 169, 169, 0.05); \/* Fondo m\u00e1s tenue y gris oscuro *\/\r\n      font-size: 12px;\r\n      color: var(--text);\r\n    }\r\n    \r\n    \r\n    \/* Desplazar el bot\u00f3n solo en m\u00f3viles *\/\r\n@media (max-width: 767px) {\r\n  .chat-button {\r\n    right: 4px;  \/* Desplaza el bot\u00f3n un poco m\u00e1s a la derecha *\/\r\n  }\r\n}\r\n\/* Asegurarse de que el bot\u00f3n flotante est\u00e9 encima del chat *\/\r\n.chat-button {\r\n  z-index: 10001;  \/* Asegura que est\u00e9 sobre el chat *\/\r\n}\r\n\r\n    .send-btn {\r\n      width: 30px; height: 30px;\r\n      border: none; border-radius: 50%;\r\n       background: #7D7D7D; \/* Gris para el bot\u00f3n de enviar *\/\r\n      cursor: pointer;\r\n      display: flex; justify-content: center; align-items: center;\r\n    }\r\n\r\n    .send-btn svg {\r\n  width: 16px;\r\n  height: 16px;\r\n  fill: #fff;\r\n}\r\n\r\n    @keyframes fadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }\r\n  <\/style>\r\n<\/head>\r\n\r\n<body data-rsssl=1 data-rsssl=\"1\">\r\n\r\n  <div class=\"chat-button\" id=\"chat-toggle\">\r\n  <img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp\" alt=\"chat\" \/>\r\n<\/div>\r\n\r\n  <div class=\"chat-app\" id=\"chat-app\">\r\n    <div class=\"chat-header\">\r\n      <div class=\"title\"><\/div>\r\n      <div id=\"session-id\" class=\"session\"><\/div>\r\n    <\/div>\r\n\r\n    <div id=\"chat-container\" class=\"chat-body\"><\/div>\r\n\r\n    <div class=\"chat-input\">\r\n      <div class=\"input-shell\">\r\n        <input type=\"text\" id=\"message-box\" placeholder=\"Escribe tu mensaje\u2026\" autocomplete=\"off\">\r\n        <button class=\"send-btn\" id=\"send-btn\" aria-label=\"Enviar\">\r\n          <svg viewbox=\"0 0 24 24\"><path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\"\/><\/svg>\r\n        <\/button>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <script>\r\n    const chatToggleBtn = document.getElementById(\"chat-toggle\");\r\n    const chatApp = document.getElementById(\"chat-app\");\r\n    const chat = document.getElementById(\"chat-container\");\r\n    const input = document.getElementById(\"message-box\");\r\n    const sendBtn = document.getElementById(\"send-btn\");\r\n    const sessionId = \"session-\" + Date.now();\r\n    let typingBubble = null;\r\n\r\n    \/* --- L\u00d3GICA DE APERTURA Y CIERRE (Clic fuera) --- *\/\r\n\r\n    chatToggleBtn.addEventListener(\"click\", (e) => {\r\n      e.stopPropagation();\r\n      chatApp.classList.add(\"open\");\r\n      chatToggleBtn.style.opacity = \"0\";\r\n      \/\/ Esperamos el fade out para quitar el bot\u00f3n del flujo\r\n      setTimeout(() => { chatToggleBtn.style.display = \"none\"; }, 300);\r\n    });\r\n\r\n    document.addEventListener(\"click\", (e) => {\r\n      if (chatApp.classList.contains(\"open\") && !chatApp.contains(e.target)) {\r\n        chatApp.classList.remove(\"open\");\r\n        \/\/ Restaurar bot\u00f3n despu\u00e9s de que el chat baje\r\n        setTimeout(() => {\r\n          chatToggleBtn.style.display = \"flex\";\r\n          setTimeout(() => { chatToggleBtn.style.opacity = \"1\"; }, 10);\r\n        }, 400);\r\n      }\r\n    });\r\n\r\n    \/* --- FUNCIONES DE LIMPIEZA Y RENDERIZADO (Originales) --- *\/\r\n\r\n    function sanitizeText(str){\r\n      str = String(str ?? \"\").replace(\/<br\\s*\\\/?>\/gi, \"\\n\");\r\n      str = str.replace(\/[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F-\\u009F]\/g, \"\");\r\n      str = str.replace(\/[\\uE000-\\uF8FF]\/g, \"\");\r\n      return str.replace(\/\\uFFFD\/g, \"\");\r\n    }\r\n\r\n    function escapeHtml(str){\r\n      return str.replace(\/&\/g,\"&amp;\").replace(\/<\/g,\"&lt;\").replace(\/>\/g,\"&gt;\").replace(\/\"\/g,\"&quot;\").replace(\/'\/g,\"&#039;\");\r\n    }\r\n\r\n    function renderMarkdown(text){\r\n  let safe = sanitizeText(text);\r\n\r\n  \/\/ Normaliza saltos\r\n  safe = safe\r\n    .replace(\/\\\\n\/g, \"\\n\")\r\n    .replace(\/\\\\t\/g, \"\\t\")\r\n    .replace(\/\\r\\n\/g, \"\\n\")\r\n    .replace(\/\\r\/g, \"\\n\");\r\n\r\n  \/\/ Escapa HTML\r\n  safe = escapeHtml(safe);\r\n\r\n  const linkPlaceholders = [];\r\n  const saveLink = (url, label = \"Abrir enlace\") => {\r\n    const cleanUrl = url.replace(\/&amp;\/g, \"&\");\r\n    const html = `<div class=\"link-center\"><a href=\"${cleanUrl}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"chat-link-btn\">${label}<\/a><\/div>`;\r\n    const token = `%%LINK_${linkPlaceholders.length}%%`;\r\n    linkPlaceholders.push({ token, html });\r\n    return token;\r\n  };\r\n\r\n  \/\/ Negritas\r\n  safe = safe.replace(\/\\*\\*(.*?)\\*\\*\/g, \"<strong>$1<\/strong>\");\r\n\r\n  \/\/ Convierte l\u00edneas separadoras tipo ---\r\n  safe = safe.replace(\/^\\s*---\\s*$\/gm, \"%%HR%%\");\r\n\r\n  \/\/ Elimina textos redundantes antes de enlaces de reserva\r\n  safe = safe.replace(\/Reserva aqui:\\s*\/gi, \"\");\r\n  safe = safe.replace(\/Reserva aqu\u00ed:\\s*\/gi, \"\");\r\n  safe = safe.replace(\/Enlace de reserva:\\s*\/gi, \"\");\r\n  safe = safe.replace(\/\ud83d\udd17\\s*Enlace de reserva:\\s*\/gi, \"\");\r\n\r\n  \/\/ Links markdown [texto](url)\r\n  safe = safe.replace(\r\n    \/\\[([^\\]]+)\\]\\((https?:\\\/\\\/[^\\s)]+)\\)\/g,\r\n    (match, textLabel, url) => {\r\n      let label = textLabel.trim();\r\n\r\n      if (url.includes(\"typeform\")) label = \"Reserva\";\r\n      else if (url.includes(\"youtube\")) label = \"Ver video\";\r\n      else if (url.includes(\"details-stay\")) label = \"Ver detalles\";\r\n         else if (url.includes(\"available\")) label = \"Ver disponibilidad\";\r\n else if (url.includes(\"checkout\")) label = \"Checkout\";\r\n  else if (url.includes(\"waiting\")) label = \"Lista de espera\";\r\n  else if (url.includes(\"https:\/\/idelive.com\/\")) label = \"Idelive\";\r\n    else if (url.includes(\"switch\")) label = \"Switch\";\r\n  else if (url.includes(\"switch\")) label = \"Switch\";\r\n  else if (url.includes(\"guests\")) label = \"Cita en oficina\";\r\n      return saveLink(url, label);\r\n    }\r\n  );\r\n\r\n  \/\/ Links entre <https:\/\/...>\r\n  safe = safe.replace(\r\n    \/&lt;(https?:\\\/\\\/.*?)&gt;\/g,\r\n    (match, url) => {\r\n      let label = \"Abrir enlace\";\r\n\r\n      if (url.includes(\"typeform\")) label = \"Reservar\";\r\n      else if (url.includes(\"youtube\")) label = \"Ver video\";\r\n      else if (url.includes(\"idealive\")) label = \"Ver detalles\";\r\n\r\n      return saveLink(url, label);\r\n    }\r\n  );\r\n\r\n  \/\/ URLs planas en una l\u00ednea sola\r\n  safe = safe.replace(\r\n    \/(^|[\\n\\s])((https?:\\\/\\\/[^\\s<]+))\/g,\r\n    (match, prefix, fullUrl) => {\r\n      let label = \"Abrir enlace\";\r\n\r\n      if (fullUrl.includes(\"typeform\")) label = \"Reservar\";\r\n      else if (fullUrl.includes(\"youtube\")) label = \"Ver video\";\r\n      else if (fullUrl.includes(\"idealive\")) label = \"Ver detalles\";\r\n\r\n      return `${prefix}${saveLink(fullUrl, label)}`;\r\n    }\r\n  );\r\n\r\n  \/\/ Listas con \"- \"\r\n  safe = safe.replace(\/(?:^|\\n)- (.*?)(?=\\n|$)\/g, \"<li>$1<\/li>\");\r\n  safe = safe.replace(\/(<li>.*?<\\\/li>)\/gs, \"<ul>$1<\/ul>\");\r\n  safe = safe.replace(\/<\\\/ul>\\s*<ul>\/g, \"\");\r\nsafe = safe.replace(\/\ud83d\udc49\\s*\/g, \"\");\r\n\/\/ Limpieza de placeholders y l\u00edneas no deseadas\r\nsafe = safe\r\n  .replace(\/^.*\ud83d\udcce.*$\/gim, \"\")\r\n  .replace(\/^.*\ud83d\udcf8\\s*Fotos.*$\/gim, \"\")\r\n  .replace(\/^\\s*[-\u2022]\\s*\\[[^\\]]+\\]\\(\\)\\s*$\/gim, \"\")\r\n  .replace(\/^\\s*\\[[^\\]]+\\]\\(\\)\\s*$\/gim, \"\")\r\n  .replace(\/^\\s*[\ud83d\udcce\ud83d\udcf8]\\s*$\/gim, \"\")\r\n  .replace(\/\\n{3,}\/g, \"\\n\\n\");\r\n  \/\/ Saltos de l\u00ednea\r\n  safe = safe.replace(\/\\n\/g, \"<br>\");\r\n\r\n  \/\/ Restaurar separadores\r\n  safe = safe.replace(\/%%HR%%\/g, '<hr class=\"chat-separator\">');\r\n\r\n  \/\/ Restaurar enlaces al final para que no se vuelvan a procesar\r\n  linkPlaceholders.forEach(item => {\r\n    safe = safe.replace(item.token, item.html);\r\n  });\r\n\r\n  \/\/ Limpieza opcional de <br> sobrantes alrededor de botones y hr\r\n  safe = safe\r\n    .replace(\/(<br>\\s*)+(<div class=\"link-center\">)\/g, \"$2\")\r\n    .replace(\/(<\\\/div>)(\\s*<br>)+\/g, \"$1\")\r\n    .replace(\/(<br>\\s*)+(<hr class=\"chat-separator\">)\/g, \"$2\")\r\n    .replace(\/(<hr class=\"chat-separator\">)(\\s*<br>)+\/g, \"$1\");\r\n\r\n  return safe;\r\n}\r\n\r\n    \/* --- INTERFAZ --- *\/\r\n\r\n    function showTyping(){\r\n      if(typingBubble) return;\r\n      typingBubble = document.createElement(\"div\");\r\n      typingBubble.className = \"typing\";\r\n      typingBubble.innerHTML = \"<span><\/span><span><\/span><span><\/span>\";\r\n      chat.appendChild(typingBubble);\r\n      chat.scrollTop = chat.scrollHeight;\r\n    }\r\n\r\n    function hideTyping(){\r\n      if(typingBubble){ typingBubble.remove(); typingBubble = null; }\r\n    }\r\n\r\n   function addMessage(text, type){\r\n  const rawText = String(text ?? \"\");\r\n\r\n  const imageRegex = \/(https?:\\\/\\\/(?:lh3\\.googleusercontent\\.com\\\/d\\\/[A-Za-z0-9_-]+|[^\\s]+?\\.(?:jpg|jpeg|png|gif|webp)(?:\\?[^\\s]+)?))\/gi;\r\n  const images = rawText.match(imageRegex) || [];\r\n\r\n  let cleanText = rawText.replace(imageRegex, \"\").trim();\r\n\r\n  const div = document.createElement(\"div\");\r\n  div.className = \"message \" + (type === \"user\" ? \"user-message\" : \"bot-message\");\r\n\r\n  images.forEach(url => {\r\n    const img = document.createElement(\"img\");\r\n    img.src = url;\r\n    img.alt = \"Imagen\";\r\n    img.loading = \"lazy\";\r\n    div.appendChild(img);\r\n  });\r\n\r\n  if (cleanText || (!images.length && !cleanText)) {\r\n    const textDiv = document.createElement(\"div\");\r\n    textDiv.innerHTML = renderMarkdown(cleanText || rawText);\r\n    div.appendChild(textDiv);\r\n  }\r\n\r\n  if(type === \"bot\"){\r\n    const row = document.createElement(\"div\");\r\n    row.className = \"bot-row\";\r\n\r\n    const avatar = document.createElement(\"img\");\r\n    avatar.className = \"bot-avatar\";\r\n    avatar.src = \"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp\";\r\n    avatar.alt = \"Avatar bot\";\r\n\r\n    row.appendChild(avatar);\r\n    row.appendChild(div);\r\n    chat.appendChild(row);\r\n  } else {\r\n    chat.appendChild(div);\r\n  }\r\n\r\n  chat.scrollTop = chat.scrollHeight;\r\n}\r\n\r\n    \/* --- ENV\u00cdO DE MENSAJES --- *\/\r\n\r\nasync function sendMessage(){\r\n  const msg = input.value.trim();\r\n  if(!msg) return;\r\n\r\n  input.value = \"\";\r\n  addMessage(msg, \"user\");\r\n  showTyping();\r\n\r\n  try {\r\n    const response = await fetch(\"https:\/\/n8n.srv965472.hstgr.cloud\/webhook\/87cc5e12-4f11-4f4c-82d6-a80f3f9323c8\", {\r\n      method: \"POST\",\r\n      headers: { \"Content-Type\": \"application\/json\" },\r\n      body: JSON.stringify({ sessionId, message: msg })\r\n    });\r\n\r\n    if (!response.ok) {\r\n      const errorText = await response.text();\r\n      throw new Error(`HTTP ${response.status}: ${errorText}`);\r\n    }\r\n\r\n    const data = await response.json();\r\n    hideTyping();\r\n\r\n    const reply =\r\n      data?.reply ??\r\n      data?.output ??\r\n      data?.data?.reply ??\r\n      (Array.isArray(data) ? data[0]?.reply || data[0]?.output : null);\r\n\r\n    if (reply) {\r\n      addMessage(reply, \"bot\");\r\n    } else {\r\n      console.log(\"Respuesta sin reply:\", data);\r\n      addMessage(\"\u26a0\ufe0f Sin respuesta del servidor\", \"bot\");\r\n    }\r\n  } catch (err) {\r\n    hideTyping();\r\n    console.error(\"Error en fetch:\", err);\r\n    addMessage(\"\u274c Error de conexi\u00f3n\", \"bot\");\r\n  }\r\n}\r\n    sendBtn.addEventListener(\"click\", sendMessage);\r\n    input.addEventListener(\"keydown\", e => { if(e.key === \"Enter\") sendMessage(); });\r\n\r\n    \/\/ Bienvenida\r\n    addMessage(\"\ud83d\udc4b **Bienvenido a IDELIVE**\\nEstoy aqu\u00ed para ayudarte a comenzar tu aventura.\", \"bot\");\r\n  <\/script>\r\n\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Legal Summary legal block Idelive Urban Breaks is a brand of ROMESTONE, S.L. (B05443155). We offer temporary serviced urban stays exclusively for recreational, holiday or leisure purposes, ranging from 32 days to 11 months, under lease agreements for uses other than permanent residential housing (Article 3.2 of the Spanish Urban Leases Act (LAU) and Catalonia [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-7711","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Aviso Legal - Idelive<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/idelive.com\/es\/aviso-legal\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Aviso Legal - Idelive\" \/>\n<meta property=\"og:description\" content=\"Legal Summary legal block Idelive Urban Breaks is a brand of ROMESTONE, S.L. (B05443155). We offer temporary serviced urban stays exclusively for recreational, holiday or leisure purposes, ranging from 32 days to 11 months, under lease agreements for uses other than permanent residential housing (Article 3.2 of the Spanish Urban Leases Act (LAU) and Catalonia [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/idelive.com\/es\/aviso-legal\/\" \/>\n<meta property=\"og:site_name\" content=\"Idelive\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-09T15:20:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/idelive.com\/aviso-legal\/\",\"url\":\"https:\/\/idelive.com\/aviso-legal\/\",\"name\":\"Aviso Legal - Idelive\",\"isPartOf\":{\"@id\":\"https:\/\/idelive.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/idelive.com\/aviso-legal\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/idelive.com\/aviso-legal\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp\",\"datePublished\":\"2026-09-09T14:59:23+00:00\",\"dateModified\":\"2026-09-09T15:20:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/idelive.com\/aviso-legal\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/idelive.com\/aviso-legal\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/idelive.com\/aviso-legal\/#primaryimage\",\"url\":\"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp\",\"contentUrl\":\"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/idelive.com\/aviso-legal\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/idelive.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Aviso Legal\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/idelive.com\/#website\",\"url\":\"https:\/\/idelive.com\/\",\"name\":\"Idelive\",\"description\":\"Private Residences\",\"publisher\":{\"@id\":\"https:\/\/idelive.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/idelive.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/idelive.com\/#organization\",\"name\":\"Idelive\",\"url\":\"https:\/\/idelive.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/idelive.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/idelive.com\/wp-content\/uploads\/2022\/10\/cropped-Only-Square.png\",\"contentUrl\":\"https:\/\/idelive.com\/wp-content\/uploads\/2022\/10\/cropped-Only-Square.png\",\"width\":512,\"height\":512,\"caption\":\"Idelive\"},\"image\":{\"@id\":\"https:\/\/idelive.com\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Aviso Legal - Idelive","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/idelive.com\/es\/aviso-legal\/","og_locale":"es_ES","og_type":"article","og_title":"Aviso Legal - Idelive","og_description":"Legal Summary legal block Idelive Urban Breaks is a brand of ROMESTONE, S.L. (B05443155). We offer temporary serviced urban stays exclusively for recreational, holiday or leisure purposes, ranging from 32 days to 11 months, under lease agreements for uses other than permanent residential housing (Article 3.2 of the Spanish Urban Leases Act (LAU) and Catalonia [&hellip;]","og_url":"https:\/\/idelive.com\/es\/aviso-legal\/","og_site_name":"Idelive","article_modified_time":"2026-09-09T15:20:21+00:00","og_image":[{"url":"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Tiempo de lectura":"2 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/idelive.com\/aviso-legal\/","url":"https:\/\/idelive.com\/aviso-legal\/","name":"Aviso Legal - Idelive","isPartOf":{"@id":"https:\/\/idelive.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/idelive.com\/aviso-legal\/#primaryimage"},"image":{"@id":"https:\/\/idelive.com\/aviso-legal\/#primaryimage"},"thumbnailUrl":"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp","datePublished":"2026-09-09T14:59:23+00:00","dateModified":"2026-09-09T15:20:21+00:00","breadcrumb":{"@id":"https:\/\/idelive.com\/aviso-legal\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/idelive.com\/aviso-legal\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/idelive.com\/aviso-legal\/#primaryimage","url":"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp","contentUrl":"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp"},{"@type":"BreadcrumbList","@id":"https:\/\/idelive.com\/aviso-legal\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/idelive.com\/"},{"@type":"ListItem","position":2,"name":"Aviso Legal"}]},{"@type":"WebSite","@id":"https:\/\/idelive.com\/#website","url":"https:\/\/idelive.com\/","name":"Idelive","description":"Private Residences","publisher":{"@id":"https:\/\/idelive.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/idelive.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/idelive.com\/#organization","name":"Idelive","url":"https:\/\/idelive.com\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/idelive.com\/#\/schema\/logo\/image\/","url":"https:\/\/idelive.com\/wp-content\/uploads\/2022\/10\/cropped-Only-Square.png","contentUrl":"https:\/\/idelive.com\/wp-content\/uploads\/2022\/10\/cropped-Only-Square.png","width":512,"height":512,"caption":"Idelive"},"image":{"@id":"https:\/\/idelive.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/idelive.com\/es\/wp-json\/wp\/v2\/pages\/7711","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/idelive.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/idelive.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/idelive.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/idelive.com\/es\/wp-json\/wp\/v2\/comments?post=7711"}],"version-history":[{"count":12,"href":"https:\/\/idelive.com\/es\/wp-json\/wp\/v2\/pages\/7711\/revisions"}],"predecessor-version":[{"id":7726,"href":"https:\/\/idelive.com\/es\/wp-json\/wp\/v2\/pages\/7711\/revisions\/7726"}],"wp:attachment":[{"href":"https:\/\/idelive.com\/es\/wp-json\/wp\/v2\/media?parent=7711"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}