{"id":2,"date":"2026-06-08T15:54:10","date_gmt":"2026-06-08T15:54:10","guid":{"rendered":"https:\/\/test.sofarium.com\/?page_id=2"},"modified":"2026-06-08T17:48:46","modified_gmt":"2026-06-08T17:48:46","slug":"sample-page","status":"publish","type":"page","link":"https:\/\/test.sofarium.com\/","title":{"rendered":"Sample Page"},"content":{"rendered":"<div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container has-pattern-background has-mask-background nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1456px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:20px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><!-- SOFARIUM AVADA - TODO EN UNO - ICONOS SVG + GALERIA ACTUALIZADA\nPegar TODO este contenido dentro de un elemento AVADA CODE BLOCK.\nNo pegar en Text Block. No hace falta poner este CSS en Avada Options.\nSustituir los placeholders https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_muestra_01.jpg por URLs reales de WordPress.\n-->\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Open+Sans:wght@400;500;600;700&family=Raleway:wght@300;400;500;600;700;800;900&display=swap\" rel=\"stylesheet\">\n<style id=\"sofarium-avada-inline-css\">\n@import url(\"https:\/\/fonts.googleapis.com\/css2?family=Open+Sans:wght@400;500;600;700&family=Raleway:wght@300;400;500;600;700;800;900&display=swap\");\n\n\/* =========================================================\n   SOFARIUM AVADA - CSS ESTABLE SIN CSS GRID\n   Pegar en Avada > Options > Custom CSS.\n   Compatible con el editor CSS de Avada.\n   ========================================================= *\/\n\n\/* Reset seguro dentro del bloque Sofarium *\/\n.sfav-root,\n.sfav-root * {\n  box-sizing: border-box;\n}\n\n.sfav-root {\n  width: 100%;\n  overflow-x: hidden;\n  background: #f4efe6;\n  color: #15130f;\n  font-family: \"Open Sans\", Arial, sans-serif;\n  font-size: 16px;\n  line-height: 1.62;\n}\n\n.sfav-root a {\n  color: inherit;\n  text-decoration: none;\n}\n\n.sfav-root img,\n.sfav-root video,\n.sfav-root svg {\n  max-width: 100%;\n}\n\n.sfav-root img,\n.sfav-root video {\n  display: block;\n}\n\n.sfav-root p,\n.sfav-root h1,\n.sfav-root h2,\n.sfav-root h3,\n.sfav-root h4,\n.sfav-root h5 {\n  margin: 0;\n}\n\n.sfav-root strong {\n  color: #15130f;\n  font-weight: 800;\n}\n\n.sfav-root .reveal {\n  opacity: 1;\n  transform: none;\n}\n\n\/* Evita que Avada estreche los Code Blocks *\/\n.sfavada-page-wrapper,\n.sfavada-header-wrapper,\n.sfavada-footer-wrapper,\n.sfavada-page-wrapper .fusion-builder-row,\n.sfavada-header-wrapper .fusion-builder-row,\n.sfavada-footer-wrapper .fusion-builder-row,\n.sfavada-page-wrapper .fusion-layout-column,\n.sfavada-header-wrapper .fusion-layout-column,\n.sfavada-footer-wrapper .fusion-layout-column,\n.sfavada-page-wrapper .fusion-column-wrapper,\n.sfavada-header-wrapper .fusion-column-wrapper,\n.sfavada-footer-wrapper .fusion-column-wrapper,\n.sfavada-page-wrapper .fusion-code,\n.sfavada-header-wrapper .fusion-code,\n.sfavada-footer-wrapper .fusion-code {\n  width: 100% !important;\n  max-width: none !important;\n  margin-left: 0 !important;\n  margin-right: 0 !important;\n  padding-left: 0 !important;\n  padding-right: 0 !important;\n}\n\n.sfav-root .inner,\n.sfav-root .nav,\n.sfav-root .top-contact-inner,\n.sfav-root .footer-inner,\n.sfav-root .custom-card,\n.sfav-root .hero-shell {\n  width: 100%;\n  max-width: 1400px;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n\/* Botones y textos base *\/\n.sfav-root .eyebrow {\n  font-family: \"Raleway\", Arial, sans-serif;\n  text-transform: uppercase;\n  letter-spacing: 0.19em;\n  font-size: 12px;\n  font-weight: 900;\n  color: #5f4c3d;\n}\n\n.sfav-root .btn,\n.sfav-root .mini-btn {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  border: 1px solid #11100d;\n  background: #11100d;\n  color: #fff;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-weight: 900;\n  text-transform: uppercase;\n  letter-spacing: 0.14em;\n  cursor: pointer;\n  transition: background 0.2s ease, color 0.2s ease, transform 0.2s ease;\n}\n\n.sfav-root .btn {\n  min-height: 48px;\n  padding: 0 26px;\n  font-size: 11px;\n}\n\n.sfav-root .mini-btn {\n  min-height: 34px;\n  padding: 0 13px;\n  font-size: 10.5px;\n  background: transparent;\n  color: #15130f;\n}\n\n.sfav-root .btn:hover,\n.sfav-root .mini-btn:hover {\n  transform: translateY(-2px);\n}\n\n.sfav-root .btn.light {\n  background: #fff;\n  color: #15130f;\n  border-color: #fff;\n}\n\n.sfav-root .btn.light:hover {\n  background: transparent;\n  color: #fff;\n}\n\n.sfav-root .btn.hero-alt {\n  background: rgba(255,255,255,0.12);\n  color: #fff;\n  border-color: rgba(255,255,255,0.72);\n  box-shadow: inset 0 1px 0 rgba(255,255,255,0.14);\n}\n\n.sfav-root .btn.hero-alt:hover {\n  background: #fff;\n  color: #15130f;\n  border-color: #fff;\n}\n\n.sfav-root .btn.ghost {\n  background: transparent;\n  color: #15130f;\n}\n\n.sfav-root .btn.ghost:hover,\n.sfav-root .mini-btn:hover {\n  background: #15130f;\n  color: #fff;\n}\n\n.sfav-root .section-title,\n.sfav-root h1,\n.sfav-root .contact-info h2,\n.sfav-root .custom-copy h2,\n.sfav-root .seo-aside h2 {\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-weight: 300;\n  letter-spacing: -0.045em;\n}\n\n.sfav-root h1 {\n  max-width: 780px;\n  font-size: 86px;\n  line-height: 0.91;\n  color: #fff;\n  text-shadow: 0 8px 32px rgba(0,0,0,0.35);\n}\n\n.sfav-root .section-title {\n  font-size: 58px;\n  line-height: 0.98;\n}\n\n.sfav-root .section-lead {\n  max-width: 620px;\n  color: #6f675d;\n  font-size: 17px;\n}\n\n\/* Header *\/\n.sfav-root .site-header {\n  position: sticky;\n  top: 0;\n  z-index: 50;\n  background: rgba(255,253,248,0.96);\n  border-bottom: 1px solid rgba(21,19,15,0.14);\n}\n\n.sfav-root .top-contact-bar {\n  background: #11100d;\n  color: rgba(255,255,255,0.82);\n  font-size: 13px;\n}\n\n.sfav-root .top-contact-inner {\n  min-height: 36px;\n  padding: 0 34px;\n  display: flex;\n  justify-content: flex-end;\n  align-items: center;\n  flex-wrap: wrap;\n}\n\n.sfav-root .top-contact-inner a {\n  display: inline-flex;\n  align-items: center;\n  margin-left: 22px;\n  color: rgba(255,255,255,0.82);\n}\n\n.sfav-root .top-contact-inner svg {\n  width: 15px;\n  height: 15px;\n  margin-right: 7px;\n  stroke: currentColor;\n  fill: none;\n  stroke-width: 1.8;\n}\n\n.sfav-root .nav {\n  min-height: 78px;\n  padding: 0 24px;\n  display: flex;\n  align-items: center;\n}\n\n.sfav-root .brand {\n  width: 165px;\n  flex: 0 0 165px;\n  display: flex;\n  align-items: center;\n}\n\n.sfav-root .brand-logo {\n  width: 154px;\n  height: auto;\n}\n\n.sfav-root .header-logo {\n  filter: invert(1);\n}\n\n.sfav-root .nav-links {\n  flex: 1 1 auto;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-wrap: wrap;\n  padding: 0 12px;\n}\n\n.sfav-root .nav-links a {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  min-height: 78px;\n  margin: 0 9px;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 13.6px;\n  font-weight: 800;\n  text-transform: uppercase;\n  letter-spacing: 0.055em;\n  white-space: nowrap;\n}\n\n.sfav-root .nav-links a:after {\n  content: \"\";\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 20px;\n  height: 1px;\n  background: #15130f;\n  transform: scaleX(0);\n  transform-origin: left;\n  transition: transform 0.24s ease;\n}\n\n.sfav-root .nav-links a:hover:after,\n.sfav-root .nav-links a.active:after {\n  transform: scaleX(1);\n}\n\n.sfav-root .nav-cta {\n  flex: 0 0 auto;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 11.6px;\n  font-weight: 900;\n  letter-spacing: 0.14em;\n  text-transform: uppercase;\n  padding: 13px 18px;\n  border: 1px solid #15130f;\n  background: #15130f;\n  color: #fff;\n  white-space: nowrap;\n}\n\n.sfav-root .menu-toggle {\n  display: none;\n  width: 44px;\n  height: 44px;\n  border: 1px solid rgba(21,19,15,0.14);\n  background: transparent;\n  font-size: 20px;\n}\n\n\/* Hero *\/\n.sfav-root .hero-inner-page {\n  position: relative;\n  min-height: 720px;\n  overflow: hidden;\n  background: #1d1b18;\n}\n\n.sfav-root .hero-video {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n  opacity: 0.88;\n}\n\n.sfav-root .hero-inner-page:after {\n  content: \"\";\n  position: absolute;\n  left: 0;\n  right: 0;\n  top: 0;\n  bottom: 0;\n  background: linear-gradient(90deg, rgba(0,0,0,0.72) 0%, rgba(0,0,0,0.44) 45%, rgba(0,0,0,0.12) 100%);\n}\n\n.sfav-root .hero-shell {\n  position: relative;\n  z-index: 1;\n  min-height: 720px;\n  padding: 120px 34px 92px;\n  display: flex;\n  align-items: flex-end;\n}\n\n.sfav-root .hero-copy {\n  width: 58%;\n  padding-right: 50px;\n  color: #fff;\n}\n\n.sfav-root .breadcrumb {\n  margin-bottom: 22px;\n  color: rgba(255,255,255,0.78);\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 12px;\n  text-transform: uppercase;\n  letter-spacing: 0.16em;\n}\n\n.sfav-root .hero-copy p {\n  max-width: 590px;\n  margin-top: 28px;\n  color: rgba(255,255,255,0.9);\n  font-size: 18px;\n}\n\n.sfav-root .hero-copy strong {\n  color: #fff;\n}\n\n.sfav-root .hero-actions {\n  display: flex;\n  flex-wrap: wrap;\n  margin-top: 34px;\n}\n\n.sfav-root .hero-actions .btn {\n  margin-right: 14px;\n  margin-bottom: 12px;\n}\n\n.sfav-root .hero-panel {\n  width: 38%;\n  max-width: 430px;\n  margin-left: auto;\n  padding: 30px;\n  background: rgba(255,253,248,0.9);\n  border: 1px solid rgba(255,255,255,0.42);\n  box-shadow: 0 24px 80px rgba(0,0,0,0.18);\n}\n\n.sfav-root .hero-panel h3 {\n  margin-bottom: 12px;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 14px;\n  text-transform: uppercase;\n  letter-spacing: 0.13em;\n}\n\n.sfav-root .hero-panel p,\n.sfav-root .hero-stat span {\n  color: #6f675d;\n}\n\n.sfav-root .hero-stats {\n  display: flex;\n  margin-top: 24px;\n}\n\n.sfav-root .hero-stat {\n  width: 33.333%;\n  padding-top: 14px;\n  padding-right: 10px;\n  border-top: 1px solid rgba(21,19,15,0.14);\n}\n\n.sfav-root .hero-stat b {\n  display: block;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 26px;\n  line-height: 1;\n}\n\n.sfav-root .hero-stat span {\n  display: block;\n  margin-top: 6px;\n  font-size: 11px;\n  line-height: 1.25;\n  text-transform: uppercase;\n  letter-spacing: 0.08em;\n}\n\n\/* Secciones *\/\n.sfav-root .section {\n  padding: 96px 34px;\n}\n\n.sfav-root .section.alt {\n  background: #fffdf8;\n}\n\n.sfav-root .section-head {\n  display: flex;\n  justify-content: space-between;\n  align-items: flex-end;\n  margin-bottom: 40px;\n}\n\n.sfav-root .section-head > div {\n  padding-right: 28px;\n}\n\n.sfav-root .intro-grid,\n.sfav-root .seo-grid,\n.sfav-root .contact-box,\n.sfav-root .materials-layout,\n.sfav-root .custom-card {\n  display: flex;\n  align-items: center;\n}\n\n.sfav-root .intro-media,\n.sfav-root .intro-copy {\n  width: 50%;\n}\n\n.sfav-root .intro-media {\n  min-height: 560px;\n  overflow: hidden;\n  background: #ebe2d6;\n  box-shadow: 0 28px 80px rgba(31,25,18,0.12);\n}\n\n.sfav-root .intro-media img {\n  width: 100%;\n  height: 560px;\n  object-fit: cover;\n}\n\n.sfav-root .intro-copy {\n  padding-left: 70px;\n}\n\n.sfav-root .intro-copy h2 {\n  margin-top: 14px;\n  margin-bottom: 24px;\n}\n\n.sfav-root .intro-copy p,\n.sfav-root .text-block p,\n.sfav-root .gallery-note,\n.sfav-root .swatch-body p,\n.sfav-root .materials-cta p,\n.sfav-root .contact-info p,\n.sfav-root .form-intro,\n.sfav-root .planner-intro-note,\n.sfav-root .planner-help,\n.sfav-root .editor-empty,\n.sfav-root .feature p,\n.sfav-root .gallery-card .meta p {\n  color: #6f675d;\n}\n\n.sfav-root .intro-highlight {\n  display: flex;\n  flex-wrap: wrap;\n  margin: 18px -6px 0;\n}\n\n.sfav-root .highlight-card {\n  width: 33.333%;\n  padding: 20px;\n  border: 1px solid rgba(21,19,15,0.14);\n  background: #fffdf8;\n}\n\n.sfav-root .highlight-card strong {\n  display: block;\n  margin-bottom: 8px;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 12px;\n  text-transform: uppercase;\n  letter-spacing: 0.09em;\n}\n\n.sfav-root .highlight-card span {\n  color: #6f675d;\n  font-size: 13px;\n  line-height: 1.45;\n}\n\n\/* Cards de confort *\/\n.sfav-root #ventajas {\n  background: linear-gradient(180deg, #eee6da 0%, #f3eadf 100%);\n}\n\n.sfav-root .feature-grid,\n.sfav-root .gallery-full,\n.sfav-root .materials-grid,\n.sfav-root .seo-content,\n.sfav-root .footer-grid,\n.sfav-root .custom-steps,\n.sfav-root .form-row,\n.sfav-root .planner-measures,\n.sfav-root .planner-tools,\n.sfav-root .editor-fields,\n.sfav-root .editor-actions,\n.sfav-root .editor-resize-buttons {\n  display: flex;\n  flex-wrap: wrap;\n}\n\n.sfav-root .feature {\n  width: 25%;\n  min-height: 310px;\n  padding: 24px;\n  background: #fffdf8;\n  border: 1px solid rgba(21,19,15,0.14);\n  transition: transform 0.22s ease, box-shadow 0.22s ease;\n}\n\n.sfav-root .feature:hover,\n.sfav-root .gallery-card:hover,\n.sfav-root .swatch-card:hover {\n  transform: translateY(-4px);\n  box-shadow: 0 24px 70px rgba(31,26,20,0.08);\n}\n\n.sfav-root .feature-illu,\n.sfav-root .detail-icon,\n.sfav-root .field-icon,\n.sfav-root .planner-badge {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex: 0 0 auto;\n}\n\n.sfav-root .feature-illu {\n  width: 68px;\n  height: 68px;\n  margin-bottom: 18px;\n  border-radius: 18px;\n  border: 1px solid rgba(21,19,15,0.14);\n  background: linear-gradient(180deg, #f5eee5 0%, #efe5d8 100%);\n}\n\n.sfav-root .feature-illu svg {\n  width: 42px;\n  height: 42px;\n  display: block;\n}\n.sfav-root .feature-illu svg * {\n  stroke: #5f4c3d;\n  fill: none;\n  stroke-width: 1.85;\n  stroke-linecap: round;\n  stroke-linejoin: round;\n  vector-effect: non-scaling-stroke;\n}\n\n.sfav-root .feature-number,\n.sfav-root .model-kicker {\n  display: block;\n  font-family: \"Raleway\", Arial, sans-serif;\n  color: #8d725b;\n  font-size: 11px;\n  font-weight: 900;\n  letter-spacing: 0.14em;\n  text-transform: uppercase;\n}\n\n.sfav-root .feature h3 {\n  margin-top: 10px;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 24px;\n  line-height: 1.05;\n  font-weight: 500;\n  letter-spacing: -0.025em;\n}\n\n.sfav-root .feature p {\n  margin-top: 14px;\n  font-size: 14px;\n}\n\n\/* Galer\u00eda *\/\n.sfav-root .gallery-full {\n  margin: 0 -12px;\n}\n\n.sfav-root .gallery-card {\n  width: 33.333%;\n  padding: 0 12px 24px;\n  background: transparent;\n  border: 0;\n  cursor: pointer;\n  transition: transform 0.24s ease, box-shadow 0.24s ease;\n}\n\n.sfav-root .gallery-card .media,\n.sfav-root .gallery-card .meta {\n  background: #fff;\n  border-left: 1px solid rgba(21,19,15,0.14);\n  border-right: 1px solid rgba(21,19,15,0.14);\n}\n\n.sfav-root .gallery-card .media {\n  height: 270px;\n  overflow: hidden;\n  border-top: 1px solid rgba(21,19,15,0.14);\n  background: #e9e0d4;\n}\n\n.sfav-root .gallery-card .media img {\n  width: 100%;\n  height: 270px;\n  object-fit: cover;\n  transition: transform 0.75s ease;\n}\n\n.sfav-root .gallery-card:hover img {\n  transform: scale(1.035);\n}\n\n.sfav-root .gallery-card .meta {\n  min-height: 250px;\n  padding: 20px;\n  border-bottom: 1px solid rgba(21,19,15,0.14);\n}\n\n.sfav-root .gallery-card .meta h3 {\n  margin-top: 8px;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 22px;\n  line-height: 1.08;\n  font-weight: 500;\n  letter-spacing: -0.03em;\n}\n\n.sfav-root .model-tags {\n  display: flex;\n  flex-wrap: wrap;\n  margin-top: 12px;\n}\n\n.sfav-root .model-tags span {\n  display: inline-flex;\n  align-items: center;\n  min-height: 24px;\n  margin: 0 7px 7px 0;\n  padding: 0 9px;\n  border: 1px solid rgba(21,19,15,0.14);\n  border-radius: 999px;\n  background: #f7f1e9;\n  color: #5f4c3d;\n  font-size: 11px;\n  font-weight: 700;\n}\n\n.sfav-root .card-actions {\n  display: flex;\n  flex-wrap: wrap;\n  margin-top: 10px;\n}\n\n.sfav-root .card-actions .mini-btn {\n  margin-right: 10px;\n  margin-bottom: 8px;\n}\n\n\/* A medida *\/\n.sfav-root .custom-band {\n  position: relative;\n  background: linear-gradient(90deg, #14110e 0%, #171511 46%, #2a221b 100%);\n  color: #fff;\n  overflow: hidden;\n}\n\n.sfav-root .custom-band:before {\n  content: \"\";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 46%;\n  height: 100%;\n  background: linear-gradient(90deg, rgba(255,255,255,0.03) 0%, rgba(255,255,255,0.0) 100%);\n  pointer-events: none;\n}\n\n.sfav-root .custom-card {\n  position: relative;\n  z-index: 1;\n  padding: 88px 34px;\n}\n\n.sfav-root .custom-visual,\n.sfav-root .custom-copy {\n  width: 50%;\n}\n\n.sfav-root .custom-visual {\n  order: 2;\n  height: 420px;\n  overflow: hidden;\n  background: #ebe2d6;\n}\n\n.sfav-root .custom-visual img {\n  width: 100%;\n  height: 420px;\n  object-fit: cover;\n}\n\n.sfav-root .custom-copy {\n  order: 1;\n  padding-right: 60px;\n}\n\n.sfav-root .custom-copy .eyebrow {\n  color: #c9b39d;\n}\n\n.sfav-root .custom-copy h2 {\n  margin: 12px 0 20px;\n  color: #fff;\n  font-size: 56px;\n  line-height: 0.95;\n}\n\n.sfav-root .custom-copy p {\n  color: rgba(255,255,255,0.73);\n}\n\n.sfav-root .custom-steps {\n  margin: 34px -8px 18px;\n}\n\n.sfav-root .custom-step {\n  width: 25%;\n  padding: 0 8px;\n  text-align: center;\n  color: rgba(255,255,255,0.78);\n}\n\n.sfav-root .custom-step-number {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 56px;\n  height: 56px;\n  margin: 0 auto 12px;\n  border: 1px solid rgba(255,255,255,0.42);\n  border-radius: 50%;\n  color: #fff;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 22px;\n  line-height: 1;\n  font-weight: 600;\n}\n\n.sfav-root .custom-step b {\n  display: block;\n  margin-bottom: 7px;\n  color: #fff;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 13px;\n}\n\n.sfav-root .custom-step span:last-child {\n  display: block;\n  font-size: 12.5px;\n  line-height: 1.45;\n}\n\n.sfav-root .chips {\n  display: flex;\n  flex-wrap: wrap;\n  margin: 22px 0 28px;\n}\n\n.sfav-root .chip {\n  margin: 0 10px 10px 0;\n  padding: 8px 12px;\n  border: 1px solid rgba(255,255,255,0.22);\n  background: rgba(255,255,255,0.07);\n  color: rgba(255,255,255,0.82);\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 11px;\n  font-weight: 900;\n  text-transform: uppercase;\n  letter-spacing: 0.12em;\n}\n\n\/* SEO y materiales *\/\n.sfav-root #seo {\n  background: #fffdf8;\n}\n\n.sfav-root .seo-aside {\n  width: 36%;\n  padding-right: 60px;\n}\n\n.sfav-root .seo-aside h2 {\n  margin-top: 14px;\n  font-size: 52px;\n  line-height: 0.98;\n}\n\n.sfav-root .seo-content {\n  width: 64%;\n  margin: 0 -10px;\n}\n\n.sfav-root .text-block {\n  width: 50%;\n  padding: 22px 10px 0;\n  border-top: 1px solid rgba(21,19,15,0.14);\n}\n\n.sfav-root .text-block h3 {\n  margin-bottom: 10px;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 18px;\n  text-transform: uppercase;\n  letter-spacing: 0.09em;\n}\n\n.sfav-root .materials-section {\n  background: linear-gradient(180deg, #f7f1e8 0%, #fffdf8 100%);\n}\n\n.sfav-root .materials-layout {\n  align-items: stretch;\n}\n\n.sfav-root .materials-grid {\n  width: 76%;\n  margin: 0 -10px;\n}\n\n.sfav-root .swatch-card {\n  width: 25%;\n  padding: 0 10px 20px;\n  transition: transform 0.24s ease, box-shadow 0.24s ease;\n}\n\n.sfav-root .swatch {\n  height: 150px;\n  border: 1px solid rgba(21,19,15,0.14);\n  background: #8d725b;\n}\n\n.sfav-root .swatch.anilina {\n  background: linear-gradient(135deg, #3f3025, #8c705b 44%, #2a211c);\n}\n\n.sfav-root .swatch.semi {\n  background: linear-gradient(135deg, #77553a, #c39a72 50%, #4f3829);\n}\n\n.sfav-root .swatch.pigmentada {\n  background: linear-gradient(135deg, #090807, #34302b 48%, #020202);\n}\n\n.sfav-root .swatch.costuras {\n  background: linear-gradient(135deg, #b79c80, #6b523c 52%, #dac8b4);\n}\n\n.sfav-root .swatch-body {\n  min-height: 130px;\n  padding: 18px;\n  background: #fff;\n  border-left: 1px solid rgba(21,19,15,0.14);\n  border-right: 1px solid rgba(21,19,15,0.14);\n  border-bottom: 1px solid rgba(21,19,15,0.14);\n}\n\n.sfav-root .swatch-body h3,\n.sfav-root .materials-cta h3,\n.sfav-root .form-title {\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-weight: 500;\n}\n\n.sfav-root .swatch-body h3 {\n  margin-bottom: 6px;\n  font-size: 18px;\n}\n\n.sfav-root .materials-cta {\n  width: 24%;\n  margin-left: 20px;\n  padding: 30px;\n  background: #e8dccd;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n}\n\n.sfav-root .materials-cta h3 {\n  margin: 14px 0;\n  font-size: 31px;\n  line-height: 1;\n  letter-spacing: -0.04em;\n}\n\n\/* Contacto *\/\n.sfav-root .contact-box {\n  align-items: stretch;\n  background: #fffefa;\n  border: 1px solid rgba(21,19,15,0.14);\n  box-shadow: 0 24px 90px rgba(38,31,23,0.08);\n}\n\n.sfav-root .contact-info {\n  width: 42%;\n  padding: 56px;\n  background: linear-gradient(135deg, #e8dccd 0%, #d7c4b0 100%);\n}\n\n.sfav-root .contact-info h2 {\n  margin: 14px 0 18px;\n  font-size: 52px;\n  line-height: 0.98;\n}\n\n.sfav-root .contact-details {\n  margin-top: 28px;\n}\n\n.sfav-root .detail {\n  display: flex;\n  padding: 16px 0;\n  border-top: 1px solid rgba(21,19,15,0.16);\n}\n\n.sfav-root .detail-icon {\n  width: 42px;\n  height: 42px;\n  margin-right: 14px;\n  border-radius: 50%;\n  background: rgba(255,255,255,0.45);\n  color: #5f4c3d;\n}\n\n.sfav-root .detail-icon svg,\n.sfav-root .field-icon svg {\n  width: 20px;\n  height: 20px;\n  stroke: currentColor;\n  fill: none;\n  stroke-width: 1.9;\n  stroke-linecap: round;\n  stroke-linejoin: round;\n}\n\n.sfav-root .detail b {\n  display: block;\n  margin-bottom: 4px;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 12px;\n  text-transform: uppercase;\n  letter-spacing: 0.14em;\n}\n\n.sfav-root form.contact-form {\n  width: 58%;\n  padding: 56px;\n}\n\n.sfav-root .form-title {\n  margin-bottom: 8px;\n  font-size: 36px;\n  line-height: 1.1;\n}\n\n.sfav-root .form-intro {\n  margin-bottom: 24px;\n}\n\n.sfav-root .form-row {\n  margin: 0 -8px;\n}\n\n.sfav-root .form-row .field-label {\n  width: 50%;\n  padding: 0 8px;\n}\n\n.sfav-root .field-label,\n.sfav-root .measure-field,\n.sfav-root .editor-field {\n  display: block;\n  margin-bottom: 15px;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 11px;\n  font-weight: 900;\n  letter-spacing: 0.12em;\n  text-transform: uppercase;\n}\n\n.sfav-root .field-label > span:first-child,\n.sfav-root .measure-field > span:first-child,\n.sfav-root .editor-field span:first-child {\n  display: block;\n  margin-bottom: 7px;\n}\n\n.sfav-root .field-control {\n  position: relative;\n  display: block;\n}\n\n.sfav-root .field-icon {\n  position: absolute;\n  left: 13px;\n  top: 13px;\n  width: 22px;\n  height: 22px;\n  color: #8d725b;\n  z-index: 1;\n}\n\n.sfav-root input,\n.sfav-root textarea,\n.sfav-root select {\n  width: 100%;\n  min-height: 48px;\n  border: 1px solid rgba(21,19,15,0.14);\n  background: #fff;\n  padding: 12px 14px;\n  font-family: \"Open Sans\", Arial, sans-serif;\n  color: #15130f;\n  outline: none;\n}\n\n.sfav-root .field-control input,\n.sfav-root .field-control select,\n.sfav-root .field-control textarea {\n  padding-left: 46px;\n}\n\n.sfav-root textarea {\n  min-height: 136px;\n  resize: vertical;\n}\n\n.sfav-root input:focus,\n.sfav-root textarea:focus,\n.sfav-root select:focus {\n  border-color: #8d725b;\n  box-shadow: 0 0 0 3px rgba(141,114,91,0.12);\n}\n\n.sfav-root .privacy-row {\n  display: flex;\n  align-items: flex-start;\n  margin: 18px 0;\n  color: #6f675d;\n  font-size: 12px;\n  line-height: 1.45;\n}\n\n.sfav-root .privacy-row input {\n  width: auto;\n  min-height: auto;\n  margin: 4px 8px 0 0;\n}\n\n\/* Planner *\/\n.sfav-root .room-planner {\n  margin-top: 22px;\n  border: 1px solid rgba(141,114,91,0.22);\n  background: #fffaf3;\n}\n\n.sfav-root .planner-header {\n  display: flex;\n  align-items: center;\n  padding: 20px;\n  cursor: pointer;\n}\n\n.sfav-root .planner-badge {\n  width: 48px;\n  height: 48px;\n  margin-right: 16px;\n  border-radius: 50%;\n  background: #e8dccd;\n  color: #5f4c3d;\n}\n\n.sfav-root .planner-badge svg {\n  width: 22px;\n  height: 22px;\n  stroke: currentColor;\n  fill: none;\n  stroke-width: 1.8;\n}\n\n.sfav-root .planner-kicker {\n  margin-bottom: 4px;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 11px;\n  font-weight: 900;\n  text-transform: uppercase;\n  letter-spacing: 0.14em;\n  color: #8d725b;\n}\n\n.sfav-root .planner-header h4 {\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 28px;\n  line-height: 1.1;\n  letter-spacing: -0.03em;\n}\n\n.sfav-root .planner-header p:last-child {\n  color: #6f675d;\n}\n\n.sfav-root .planner-toggle {\n  margin-left: auto;\n  padding: 11px 14px;\n  border: 1px solid #15130f;\n  background: #15130f;\n  color: #fff;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 11px;\n  font-weight: 900;\n  text-transform: uppercase;\n  letter-spacing: 0.12em;\n}\n\n.sfav-root .planner-body {\n  display: none;\n  padding: 0 20px 22px;\n  border-top: 1px solid rgba(141,114,91,0.18);\n}\n\n.sfav-root .room-planner.open .planner-body {\n  display: block;\n}\n\n.sfav-root .planner-measures,\n.sfav-root .planner-tools,\n.sfav-root .editor-fields,\n.sfav-root .editor-actions,\n.sfav-root .editor-resize-buttons {\n  margin-left: -6px;\n  margin-right: -6px;\n}\n\n.sfav-root .measure-field {\n  width: 50%;\n  padding: 18px 6px 0;\n}\n\n.sfav-root .measure-input {\n  position: relative;\n  display: block;\n}\n\n.sfav-root .measure-input em {\n  position: absolute;\n  right: 14px;\n  top: 12px;\n  color: #6f675d;\n  font-style: normal;\n  font-family: \"Open Sans\", Arial, sans-serif;\n}\n\n.sfav-root .measure-input input {\n  padding-right: 42px;\n}\n\n.sfav-root .planner-tool,\n.sfav-root .resize-btn {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  min-height: 40px;\n  margin: 0 6px 10px;\n  padding: 0 12px;\n  border: 1px solid rgba(21,19,15,0.14);\n  background: #fff;\n  color: #15130f;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 11px;\n  font-weight: 900;\n  text-transform: uppercase;\n  letter-spacing: 0.09em;\n  cursor: pointer;\n}\n\n.sfav-root .planner-tool svg {\n  width: 18px;\n  height: 18px;\n  margin-right: 7px;\n  stroke: currentColor;\n  fill: none;\n  stroke-width: 1.8;\n}\n\n.sfav-root .edit-action,\n.sfav-root .resize-btn {\n  background: #8d725b;\n  border-color: #8d725b;\n  color: #fff;\n}\n\n.sfav-root .danger-action {\n  background: #5a211c;\n  border-color: #5a211c;\n  color: #fff;\n}\n\n.sfav-root .neutral-action {\n  background: #e8dccd;\n  border-color: #d4c2ad;\n  color: #15130f;\n}\n\n.sfav-root .planner-editor {\n  margin-top: 16px;\n  padding: 18px;\n  border: 1px solid rgba(21,19,15,0.12);\n  background: #fff;\n}\n\n.sfav-root .planner-editor-title {\n  margin-bottom: 10px;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 13px;\n  font-weight: 900;\n  text-transform: uppercase;\n  letter-spacing: 0.12em;\n}\n\n.sfav-root .editor-content {\n  display: none;\n}\n\n.sfav-root .planner-editor:not(.empty) .editor-content {\n  display: block;\n}\n\n.sfav-root .planner-editor:not(.empty) .editor-empty {\n  display: none;\n}\n\n.sfav-root .editor-head {\n  display: flex;\n  justify-content: space-between;\n  align-items: flex-start;\n  margin-bottom: 14px;\n}\n\n.sfav-root .editor-head h5 {\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 20px;\n}\n\n.sfav-root .dimension-chip {\n  display: inline-flex;\n  padding: 7px 10px;\n  border-radius: 999px;\n  background: #f4efe6;\n  color: #5f4c3d;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 11px;\n  font-weight: 900;\n  text-transform: uppercase;\n  letter-spacing: 0.08em;\n}\n\n.sfav-root .editor-field {\n  width: 33.333%;\n  padding: 0 6px;\n}\n\n.sfav-root .planner-canvas-wrap {\n  width: 100%;\n  margin-top: 16px;\n  padding: 14px;\n  overflow-x: auto;\n  border: 1px solid rgba(21,19,15,0.14);\n  background: #f6f2ec;\n}\n\n.sfav-root #roomCanvas {\n  width: 100%;\n  max-width: 760px;\n  height: 440px;\n  background: #f8f8f8;\n  border: 1px solid rgba(21,19,15,0.18);\n  cursor: default;\n}\n\n.sfav-root #roomCanvas.dragging {\n  cursor: grabbing;\n}\n\n.sfav-root #roomCanvas.resizing {\n  cursor: nwse-resize;\n}\n\n.sfav-root .planner-help {\n  display: flex;\n  margin-top: 12px;\n  font-size: 13px;\n}\n\n.sfav-root .planner-help svg {\n  flex: 0 0 18px;\n  width: 18px;\n  height: 18px;\n  margin: 2px 8px 0 0;\n  stroke: #5f4c3d;\n  fill: none;\n  stroke-width: 1.9;\n}\n\n\/* Lightbox *\/\n.sfav-root .lightbox {\n  position: fixed;\n  left: 0;\n  right: 0;\n  top: 0;\n  bottom: 0;\n  z-index: 200;\n  display: none;\n  padding: 24px;\n  background: rgba(17,16,13,0.84);\n}\n\n.sfav-root .lightbox.open {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.sfav-root .lightbox-panel {\n  width: 100%;\n  max-width: 1260px;\n  max-height: 92vh;\n  display: flex;\n  overflow: hidden;\n  background: #fffdf8;\n  box-shadow: 0 32px 100px rgba(0,0,0,0.42);\n}\n\n.sfav-root .lightbox-media {\n  position: relative;\n  width: 62%;\n  min-height: 620px;\n  background: #16130f;\n}\n\n.sfav-root .lightbox-media img {\n  width: 100%;\n  height: 100%;\n  max-height: 78vh;\n  object-fit: contain;\n}\n\n.sfav-root .lightbox-side {\n  width: 38%;\n  padding: 42px;\n  overflow-y: auto;\n}\n\n.sfav-root .lightbox-close {\n  position: absolute;\n  top: 16px;\n  right: 16px;\n  z-index: 4;\n  width: 44px;\n  height: 44px;\n  border: 0;\n  border-radius: 50%;\n  background: rgba(255,255,255,0.92);\n  color: #111;\n  font-size: 25px;\n  cursor: pointer;\n}\n\n.sfav-root .lightbox-title {\n  margin: 10px 0 12px;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 48px;\n  line-height: 0.98;\n  font-weight: 300;\n  letter-spacing: -0.045em;\n}\n\n.sfav-root .lightbox-subtitle {\n  margin-bottom: 18px;\n  color: #5f4c3d;\n  font-weight: 700;\n}\n\n.sfav-root .lightbox-text {\n  margin-bottom: 24px;\n  color: #6f675d;\n}\n\n.sfav-root .lightbox-nav {\n  position: absolute;\n  left: 16px;\n  right: 16px;\n  bottom: 16px;\n  z-index: 3;\n  display: flex;\n  justify-content: space-between;\n}\n\n.sfav-root .lightbox-nav button {\n  width: 46px;\n  height: 46px;\n  border: 1px solid rgba(255,255,255,0.5);\n  border-radius: 50%;\n  background: rgba(255,255,255,0.9);\n  color: #111;\n  font-size: 24px;\n  cursor: pointer;\n}\n\n.sfav-root .lightbox-details {\n  margin: 24px 0;\n}\n\n.sfav-root .detail-row {\n  display: flex;\n  padding-top: 12px;\n  margin-top: 12px;\n  border-top: 1px solid rgba(21,19,15,0.14);\n}\n\n.sfav-root .detail-row b {\n  width: 118px;\n  flex: 0 0 118px;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 12px;\n  letter-spacing: 0.12em;\n  text-transform: uppercase;\n}\n\n.sfav-root .detail-row span {\n  color: #6f675d;\n  font-size: 14px;\n}\n\n.sfav-root .lightbox-thumbs {\n  display: flex;\n  flex-wrap: wrap;\n  margin: 20px -5px 0;\n}\n\n.sfav-root .lightbox-thumbs button {\n  width: 33.333%;\n  padding: 0 5px 10px;\n  border: 0;\n  background: transparent;\n  cursor: pointer;\n  opacity: 0.7;\n}\n\n.sfav-root .lightbox-thumbs button.active,\n.sfav-root .lightbox-thumbs button:hover {\n  opacity: 1;\n}\n\n.sfav-root .lightbox-thumbs img {\n  width: 100%;\n  height: 82px;\n  object-fit: cover;\n  border: 2px solid transparent;\n}\n\n.sfav-root .lightbox-thumbs button.active img,\n.sfav-root .lightbox-thumbs button:hover img {\n  border-color: #8d725b;\n}\n\n.sfav-root .protection-note {\n  margin-top: 22px;\n  padding: 14px 16px;\n  background: #f2eadf;\n  color: #6f675d;\n  font-size: 12.5px;\n  line-height: 1.45;\n  border-left: 3px solid #8d725b;\n}\n\n.sfav-root .back-top {\n  position: fixed;\n  right: 22px;\n  bottom: 22px;\n  z-index: 40;\n  width: 48px;\n  height: 48px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 50%;\n  background: #15130f;\n  color: #fff;\n  box-shadow: 0 10px 30px rgba(0,0,0,0.2);\n  opacity: 0;\n  pointer-events: none;\n  transform: translateY(10px);\n  transition: 0.25s ease;\n}\n\n.sfav-root .back-top.show {\n  opacity: 1;\n  pointer-events: auto;\n  transform: translateY(0);\n}\n\n\/* Footer *\/\n.sfav-root .footer {\n  background: #11100d;\n  color: rgba(255,255,255,0.82);\n  padding: 58px 34px 26px;\n}\n\n.sfav-root .footer-grid {\n  margin: 0 -18px;\n}\n\n.sfav-root .footer-grid > div {\n  width: 18%;\n  padding: 0 18px 24px;\n}\n\n.sfav-root .footer-grid .footer-brand {\n  width: 28%;\n}\n\n.sfav-root .footer-logo {\n  width: 176px;\n  filter: none;\n}\n\n.sfav-root .footer p {\n  max-width: 360px;\n  margin-top: 16px;\n  color: rgba(255,255,255,0.62);\n}\n\n.sfav-root .footer h4 {\n  margin-bottom: 14px;\n  color: #fff;\n  font-family: \"Raleway\", Arial, sans-serif;\n  font-size: 12px;\n  text-transform: uppercase;\n  letter-spacing: 0.16em;\n}\n\n.sfav-root .footer a,\n.sfav-root .footer span {\n  display: block;\n  margin: 7px 0;\n  color: rgba(255,255,255,0.66);\n  font-size: 14px;\n}\n\n.sfav-root .footer-bottom {\n  display: flex;\n  justify-content: space-between;\n  margin-top: 34px;\n  padding-top: 18px;\n  border-top: 1px solid rgba(255,255,255,0.12);\n  color: rgba(255,255,255,0.48);\n  font-size: 12px;\n}\n\n\/* Responsive *\/\n@media only screen and (max-width: 1180px) {\n  .sfav-root .nav {\n    flex-wrap: wrap;\n    padding-top: 10px;\n    padding-bottom: 10px;\n  }\n\n  .sfav-root .brand {\n    width: 150px;\n    flex-basis: 150px;\n  }\n\n  .sfav-root .nav-links {\n    order: 3;\n    width: 100%;\n    flex-basis: 100%;\n    padding-top: 10px;\n  }\n\n  .sfav-root .nav-links a {\n    min-height: 34px;\n  }\n\n  .sfav-root .hero-copy,\n  .sfav-root .hero-panel,\n  .sfav-root .intro-media,\n  .sfav-root .intro-copy,\n  .sfav-root .custom-visual,\n  .sfav-root .custom-copy,\n  .sfav-root .seo-aside,\n  .sfav-root .seo-content,\n  .sfav-root .materials-grid,\n  .sfav-root .materials-cta,\n  .sfav-root .contact-info,\n  .sfav-root form.contact-form {\n    width: 100%;\n  }\n\n  .sfav-root .hero-shell,\n  .sfav-root .intro-grid,\n  .sfav-root .custom-card,\n  .sfav-root .seo-grid,\n  .sfav-root .materials-layout,\n  .sfav-root .contact-box {\n    display: block;\n  }\n\n  .sfav-root .hero-copy,\n  .sfav-root .intro-copy,\n  .sfav-root .custom-copy,\n  .sfav-root .seo-aside {\n    padding-right: 0;\n    padding-left: 0;\n  }\n\n  .sfav-root .hero-panel {\n    margin: 40px 0 0;\n  }\n\n  .sfav-root .intro-media,\n  .sfav-root .custom-visual {\n    margin-bottom: 36px;\n  }\n\n  .sfav-root .feature {\n    width: 50%;\n  }\n\n  .sfav-root .gallery-card {\n    width: 50%;\n  }\n\n  .sfav-root .swatch-card {\n    width: 50%;\n  }\n\n  .sfav-root .materials-cta {\n    margin-left: 0;\n  }\n\n  .sfav-root .footer-grid > div,\n  .sfav-root .footer-grid .footer-brand {\n    width: 50%;\n  }\n}\n\n@media only screen and (max-width: 860px) {\n  .sfav-root .top-contact-inner {\n    justify-content: center;\n    padding: 8px 18px;\n  }\n\n  .sfav-root .top-contact-inner a {\n    margin: 3px 10px;\n  }\n\n  .sfav-root .nav {\n    min-height: 68px;\n  }\n\n  .sfav-root .nav-links,\n  .sfav-root .nav-cta {\n    display: none;\n  }\n\n  .sfav-root .menu-toggle {\n    display: block;\n    margin-left: auto;\n  }\n\n  .sfav-root .nav.open .nav-links {\n    display: block;\n    width: 100%;\n    flex-basis: 100%;\n    padding: 12px 0 24px;\n  }\n\n  .sfav-root .nav.open .nav-links a {\n    display: block;\n    min-height: auto;\n    padding: 12px 0;\n    border-top: 1px solid rgba(21,19,15,0.14);\n  }\n\n  .sfav-root .hero-inner-page,\n  .sfav-root .hero-shell {\n    min-height: 680px;\n  }\n\n  .sfav-root .hero-shell,\n  .sfav-root .section,\n  .sfav-root .custom-card {\n    padding-left: 22px;\n    padding-right: 22px;\n  }\n\n  .sfav-root h1 {\n    font-size: 56px;\n  }\n\n  .sfav-root .section-title,\n  .sfav-root .custom-copy h2,\n  .sfav-root .seo-aside h2,\n  .sfav-root .contact-info h2 {\n    font-size: 42px;\n  }\n\n  .sfav-root .section-head {\n    display: block;\n  }\n\n  .sfav-root .section-lead {\n    margin-top: 16px;\n  }\n\n  .sfav-root .feature,\n  .sfav-root .gallery-card,\n  .sfav-root .swatch-card,\n  .sfav-root .text-block,\n  .sfav-root .form-row .field-label,\n  .sfav-root .measure-field,\n  .sfav-root .editor-field,\n  .sfav-root .custom-step {\n    width: 100%;\n  }\n\n  .sfav-root .intro-highlight .highlight-card {\n    width: 100%;\n  }\n\n  .sfav-root .gallery-card .media,\n  .sfav-root .gallery-card .media img {\n    height: 250px;\n  }\n\n  .sfav-root .contact-info,\n  .sfav-root form.contact-form {\n    padding: 30px 22px;\n  }\n\n  .sfav-root .planner-header {\n    display: block;\n  }\n\n  .sfav-root .planner-badge {\n    margin-bottom: 12px;\n  }\n\n  .sfav-root .planner-toggle {\n    margin: 14px 0 0;\n  }\n\n  .sfav-root #roomCanvas {\n    min-width: 540px;\n    height: 390px;\n  }\n\n  .sfav-root .lightbox-panel {\n    display: block;\n    overflow-y: auto;\n  }\n\n  .sfav-root .lightbox-media,\n  .sfav-root .lightbox-side {\n    width: 100%;\n  }\n\n  .sfav-root .lightbox-media {\n    min-height: 360px;\n  }\n\n  .sfav-root .footer-grid > div,\n  .sfav-root .footer-grid .footer-brand {\n    width: 100%;\n  }\n\n  .sfav-root .footer-bottom {\n    display: block;\n  }\n}\n\n@media only screen and (max-width: 560px) {\n  .sfav-root .btn,\n  .sfav-root .hero-actions,\n  .sfav-root .hero-actions .btn {\n    width: 100%;\n  }\n\n  .sfav-root h1 {\n    font-size: 46px;\n  }\n\n  .sfav-root .section-title,\n  .sfav-root .custom-copy h2,\n  .sfav-root .seo-aside h2,\n  .sfav-root .contact-info h2 {\n    font-size: 36px;\n  }\n\n  .sfav-root .hero-stats {\n    display: block;\n  }\n\n  .sfav-root .hero-stat {\n    width: 100%;\n    margin-top: 10px;\n  }\n\n  .sfav-root .section {\n    padding-top: 64px;\n    padding-bottom: 64px;\n  }\n}\n\n\n\/* === MODO TODO EN UNO: fuerza ancho aunque Avada lo meta dentro de un contenedor estrecho === *\/\n.sfav-root{width:100vw !important;max-width:100vw !important;margin-left:calc(50% - 50vw) !important;margin-right:calc(50% - 50vw) !important;}\n.sfav-root .inner,.sfav-root .hero-shell,.sfav-root .custom-card,.sfav-root .sf-topbar-inner,.sfav-root .sf-nav-inner,.sfav-root .footer-inner{max-width:1400px !important;margin-left:auto !important;margin-right:auto !important;}\n.sfav-root .hero-video source:empty{display:none;}\n\n\n\/* === Ajustes finales solicitados === *\/\n.sfav-root, .sfav-root input, .sfav-root textarea, .sfav-root select, .sfav-root button { font-family:\"Open Sans\", Arial, sans-serif !important; }\n.sfav-root h1, .sfav-root h2, .sfav-root h3, .sfav-root h4, .sfav-root h5, .sfav-root .section-title, .sfav-root .eyebrow, .sfav-root .btn, .sfav-root .mini-btn, .sfav-root .nav-links, .sfav-root .nav-cta, .sfav-root .form-title { font-family:\"Raleway\", Arial, sans-serif !important; }\n.sfav-root .header-logo { filter:none !important; }\n.sfav-root .footer-logo { filter:invert(1) brightness(3) !important; }\n.sfav-root .site-header { width:100% !important; }\n.sfav-root .hero-video { background:#1d1b18; }\n\n\n\/* Refinado visual premium v3 *\/\n.sfav-root .site-header {\n  box-shadow: 0 10px 30px rgba(30,22,15,0.035);\n}\n\n.sfav-root .nav-links {\n  justify-content: flex-end;\n}\n\n.sfav-root .nav-links a {\n  font-size: 14.2px;\n  letter-spacing: 0.06em;\n}\n\n.sfav-root .nav-cta {\n  border-radius: 0;\n  box-shadow: 0 10px 24px rgba(17,16,13,0.10);\n}\n\n.sfav-root .section-head {\n  margin-bottom: 48px;\n}\n\n.sfav-root .feature {\n  background: linear-gradient(180deg, #fffdf8 0%, #fbf6ef 100%);\n  box-shadow: 0 22px 54px rgba(52,38,25,0.055);\n}\n\n.sfav-root .feature:hover {\n  box-shadow: 0 30px 78px rgba(52,38,25,0.105);\n}\n\n.sfav-root .feature h3 {\n  font-size: 25px;\n}\n\n.sfav-root .feature p {\n  font-size: 15.5px;\n  line-height: 1.62;\n}\n\n.sfav-root .gallery-card {\n  background: #fffdf8;\n  box-shadow: 0 18px 46px rgba(52,38,25,0.055);\n}\n\n.sfav-root .gallery-card .media {\n  position: relative;\n}\n\n.sfav-root .gallery-card .media:after {\n  content: \"\";\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  height: 42%;\n  background: linear-gradient(0deg, rgba(17,16,13,0.16), rgba(17,16,13,0));\n  opacity: 0;\n  transition: opacity 0.28s ease;\n  pointer-events: none;\n}\n\n.sfav-root .gallery-card:hover .media:after {\n  opacity: 1;\n}\n\n.sfav-root .gallery-card .meta {\n  padding: 22px 22px 24px;\n}\n\n.sfav-root .gallery-card .meta h3 {\n  font-size: 25px;\n  margin-top: 2px;\n}\n\n.sfav-root .model-tags span {\n  background: #f4ede4;\n  border-color: rgba(141,114,91,0.22);\n}\n\n.sfav-root .mini-btn {\n  min-height: 38px;\n  padding: 0 15px;\n  background: #fffdf8;\n}\n\n.sfav-root .mini-btn:first-child {\n  background: #15130f;\n  color: #fff;\n}\n\n.sfav-root .mini-btn:first-child:hover {\n  background: transparent;\n  color: #15130f;\n}\n\n.sfav-root .custom-band {\n  background:\n    radial-gradient(circle at 78% 42%, rgba(210,176,139,0.24) 0%, rgba(210,176,139,0.09) 30%, rgba(210,176,139,0) 58%),\n    linear-gradient(90deg, #11100d 0%, #171511 45%, #2d241d 100%);\n}\n\n.sfav-root .custom-visual {\n  position: relative;\n  box-shadow: 0 28px 80px rgba(0,0,0,0.24);\n}\n\n.sfav-root .custom-visual:after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  background: linear-gradient(90deg, rgba(17,16,13,0.10), rgba(17,16,13,0));\n  pointer-events: none;\n}\n\n.sfav-root .custom-step-number {\n  background: rgba(255,255,255,0.045);\n  box-shadow: inset 0 1px 0 rgba(255,255,255,0.14);\n}\n\n.sfav-root .contact-box {\n  box-shadow: 0 28px 90px rgba(52,38,25,0.09);\n}\n\n.sfav-root .btn.hero-alt {\n  background: rgba(255,255,255,0.16);\n  color: #fff;\n  border-color: rgba(255,255,255,0.86);\n  box-shadow: 0 12px 30px rgba(0,0,0,0.18), inset 0 1px 0 rgba(255,255,255,0.18);\n}\n\n.sfav-root .btn.hero-alt:hover {\n  background: #fff;\n  color: #15130f;\n}\n\n@media only screen and (max-width: 1180px) {\n  .sfav-root .nav-links a {\n    font-size: 13.2px;\n  }\n}\n\n@media only screen and (max-width: 760px) {\n  .sfav-root .feature h3,\n  .sfav-root .gallery-card .meta h3 {\n    font-size: 23px;\n  }\n}\n\n\n\/* Ajuste v4: quitar CTA de muestras y mejorar copy de pieles *\/\n.sfav-root .materials-cta .btn,\n.sfav-root .materials-cta a.btn,\n.sfav-root .materials-cta button.btn {\n  display: none !important;\n}\n\n<\/style>\n<div id=\"top\" class=\"sfav-root sfav-page-root\">\n<header class=\"site-header\">\n  <div aria-label=\"Contacto Sofarium\" class=\"top-contact-bar\">\n    <div class=\"top-contact-inner\">\n      <a aria-label=\"Llamar a Sofarium\" href=\"tel:+34943423248\"><svg aria-hidden=\"true\" viewBox=\"0 0 24 24\"><path d=\"M22 16.9v3a2 2 0 0 1-2.2 2 19.8 19.8 0 0 1-8.6-3.1 19.4 19.4 0 0 1-6-6A19.8 19.8 0 0 1 2.1 4.2 2 2 0 0 1 4.1 2h3a2 2 0 0 1 2 1.7c.1.9.3 1.8.6 2.6a2 2 0 0 1-.5 2.1L8 9.6a16 16 0 0 0 6.4 6.4l1.2-1.2a2 2 0 0 1 2.1-.5c.8.3 1.7.5 2.6.6a2 2 0 0 1 1.7 2z\"><\/path><\/svg>943 423 248<\/a>\n      <a aria-label=\"Enviar email a Sofarium\" href=\"mailto:info@sofarium.com\"><svg aria-hidden=\"true\" viewBox=\"0 0 24 24\"><path d=\"M4 5h16a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2z\"><\/path><path d=\"m22 7-10 7L2 7\"><\/path><\/svg>info@sofarium.com<\/a>\n    <\/div>\n  <\/div>\n  <nav class=\"nav\" id=\"nav\">\n    <a aria-label=\"Sofarium inicio\" class=\"brand\" href=\"#top\"><img decoding=\"async\" alt=\"Sofarium\" class=\"brand-logo header-logo\" src=\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/sofarium_negro.gif\"\/><\/a>\n    <div aria-label=\"Men\u00fa principal\" class=\"nav-links\">\n      <a class=\"active\" href=\"#coleccion\">Sof\u00e1s de piel<\/a>\n      <a href=\"#coleccion\">Sof\u00e1s de tela<\/a>\n      <a href=\"#coleccion\">Butacas<\/a>\n      <a href=\"#ventajas\">Descanso y sof\u00e1s cama<\/a>\n      <a href=\"#coleccion\">Mesas<\/a>\n      <a href=\"#coleccion\">Novedades<\/a>\n      <a href=\"#ventajas\">Entrega express<\/a>\n    <\/div>\n    <a class=\"nav-cta\" href=\"#contacto\">Contactar<\/a>\n    <button aria-label=\"Abrir men\u00fa\" class=\"menu-toggle\" id=\"menuToggle\" type=\"button\">\u2630<\/button>\n  <\/nav>\n<\/header>\n<main>\n<section aria-label=\"Sof\u00e1s de piel\" class=\"hero-inner-page\">\n<video autoplay=\"\" class=\"hero-video\" loop=\"\" muted=\"\" playsinline=\"\" preload=\"auto\"><source src=\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/sofapiel.mp4\" type=\"video\/mp4\"\/><\/video>\n<div class=\"hero-shell\">\n<div class=\"hero-copy reveal\">\n<div class=\"breadcrumb\">Colecciones \/ Sof\u00e1s de piel<\/div>\n<h1>En Donostia, hechos para durar.<\/h1>\n<p><strong>Sof\u00e1s de piel naturales, c\u00f3modos y elegantes<\/strong>, pensados para ofrecer m\u00e1ximo confort y resistencia en el uso diario. Te ayudamos a elegir el modelo, la piel y la configuraci\u00f3n ideal para tu hogar.<\/p>\n<div class=\"hero-actions\">\n<a class=\"btn light\" href=\"#coleccion\">Ver colecci\u00f3n<\/a>\n<a class=\"btn hero-alt\" href=\"#contacto\">Pedir asesoramiento<\/a>\n<\/div>\n<\/div>\n<aside class=\"hero-panel reveal\">\n<h3>Asesoramiento personalizado<\/h3>\n<p>Te orientamos para elegir el sof\u00e1 perfecto por medidas, distribuci\u00f3n, materiales premium y opciones a medida.<\/p>\n<div class=\"hero-stats\">\n<div class=\"hero-stat\"><b>20+<\/b><span>a\u00f1os de experiencia<\/span><\/div>\n<div class=\"hero-stat\"><b>1:1<\/b><span>atenci\u00f3n personalizada<\/span><\/div>\n<div class=\"hero-stat\"><b>100%<\/b><span>opciones a medida<\/span><\/div>\n<\/div>\n<\/aside>\n<\/div>\n<\/section>\n<section class=\"section alt\" id=\"intro\">\n<div class=\"inner intro-grid\">\n<div class=\"intro-media reveal\"><img decoding=\"async\" alt=\"Sof\u00e1 de piel gris en sal\u00f3n contempor\u00e1neo\" src=\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_03.png\"\/><\/div>\n<div class=\"intro-copy reveal\">\n<p class=\"eyebrow\">Sof\u00e1s de piel en San Sebasti\u00e1n<\/p>\n<h2 class=\"section-title\">Un cl\u00e1sico c\u00f3modo, actual y resistente.<\/h2>\n<p>Los <strong>sof\u00e1s de piel<\/strong> se adaptan a todo tipo de interiores: desde salones modernos y minimalistas hasta espacios m\u00e1s c\u00e1lidos y cl\u00e1sicos. Su acabado aporta presencia, pero tambi\u00e9n una ventaja pr\u00e1ctica: <strong>son duraderos, f\u00e1ciles de cuidar y muy agradables en el uso diario<\/strong>.<\/p>\n<p>En Sofarium seleccionamos modelos pensados para que puedas elegir el equilibrio adecuado entre dise\u00f1o, confort y funcionalidad, con opciones de relax, chaise longue, respaldos multiposici\u00f3n y mecanismos motorizados.<\/p>\n<div class=\"intro-highlight\">\n<div class=\"highlight-card\"><strong>Durabilidad<\/strong><span>Pieles pensadas para resistir el paso del tiempo y el uso cotidiano.<\/span><\/div>\n<div class=\"highlight-card\"><strong>Confort<\/strong><span>Asientos fijos, deslizantes o relax para adaptarse a cada forma de sentarse.<\/span><\/div>\n<div class=\"highlight-card\"><strong>Estilo<\/strong><span>Colores, acabados y configuraciones para integrar el sof\u00e1 en tu hogar.<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section class=\"section\" id=\"ventajas\">\n<div class=\"inner\">\n<div class=\"section-head reveal\">\n<div>\n<p class=\"eyebrow\">Elige seg\u00fan tu forma de vivir<\/p>\n<h2 class=\"section-title\">Sof\u00e1s de piel con opciones reales de confort<\/h2>\n<\/div>\n<p class=\"section-lead\">Elige el nivel de descanso que mejor encaja con tu rutina: desde asientos deslizantes hasta relax motorizado, chaise longue o acabados de piel personalizados.<\/p>\n<\/div>\n<div class=\"feature-grid\">\n<article class=\"feature reveal\"><div><div aria-hidden=\"true\" class=\"feature-illu\"><svg aria-hidden=\"true\" viewBox=\"0 0 64 64\"><path d=\"M18 36v-8c0-3 2.5-5.5 5.5-5.5H31c3 0 5 2 5 5v8\"><\/path><path d=\"M36 36h7.5c2.8 0 4.5 2.2 4.5 5v1\"><\/path><path d=\"M16 42h34\"><\/path><path d=\"M18 42v5\"><\/path><path d=\"M46 42v5\"><\/path><path d=\"M24 49h12\"><\/path><path d=\"M20 53h12\"><\/path><path d=\"M34 53h10\"><\/path><path d=\"M40 50l3 3-3 3\"><\/path><\/svg><\/div><span class=\"feature-number\">01<\/span><h3>Asientos deslizantes<\/h3><p><strong>M\u00e1s profundidad cuando la necesitas.<\/strong> Una soluci\u00f3n pr\u00e1ctica para sentarte, estirarte o recibir visitas sin perder una est\u00e9tica limpia.<\/p><\/div><\/article>\n<article class=\"feature reveal\"><div><div aria-hidden=\"true\" class=\"feature-illu\"><svg aria-hidden=\"true\" viewBox=\"0 0 64 64\"><path d=\"M20 37v-8c0-3 2.5-5 5.5-5H31c2 0 3.8.9 4.8 2.4\"><\/path><path d=\"M35.8 26.4l5-3.9\"><\/path><path d=\"M39 37h6.5c2.8 0 4.5 2.2 4.5 5v1\"><\/path><path d=\"M18 43h33\"><\/path><path d=\"M20 43v5\"><\/path><path d=\"M47 43v5\"><\/path><path d=\"M27 50h13\"><\/path><path d=\"M43.2 22.8c2.2.8 3.8 2.7 4.4 5\"><\/path><path d=\"M47.5 19.6c3 1 5.3 3.4 6.2 6.4\"><\/path><\/svg><\/div><span class=\"feature-number\">02<\/span><h3>Relax motorizado<\/h3><p><strong>Confort real para el d\u00eda a d\u00eda.<\/strong> Mecanismos suaves y posiciones c\u00f3modas para leer, ver la televisi\u00f3n o descansar con mayor apoyo.<\/p><\/div><\/article>\n<article class=\"feature reveal\"><div><div aria-hidden=\"true\" class=\"feature-illu\"><svg aria-hidden=\"true\" viewBox=\"0 0 64 64\"><path d=\"M17 36v-8c0-3 2.4-5.2 5.2-5.2H30c2.8 0 5 2.2 5 5.2V36\"><\/path><path d=\"M35 36h8c3 0 5 2 5 5v1\"><\/path><path d=\"M16 42h34\"><\/path><path d=\"M18 42v5\"><\/path><path d=\"M47 42v5\"><\/path><path d=\"M35 36v6\"><\/path><path d=\"M35 42h15\"><\/path><\/svg><\/div><span class=\"feature-number\">03<\/span><h3>Chaise longue<\/h3><p><strong>Ideal para tumbarse y desconectar.<\/strong> Puede configurarse fija, reclinable o incluso con arc\u00f3n, seg\u00fan el uso que quieras dar al sal\u00f3n.<\/p><\/div><\/article>\n<article class=\"feature reveal\"><div><div aria-hidden=\"true\" class=\"feature-illu\"><svg aria-hidden=\"true\" viewBox=\"0 0 64 64\"><rect x=\"16\" y=\"18\" width=\"10\" height=\"14\" rx=\"2.5\"><\/rect><rect x=\"27\" y=\"18\" width=\"10\" height=\"14\" rx=\"2.5\"><\/rect><rect x=\"38\" y=\"18\" width=\"10\" height=\"14\" rx=\"2.5\"><\/rect><path d=\"M16 39h32\"><\/path><path d=\"M20 39v7\"><\/path><path d=\"M32 39v7\"><\/path><path d=\"M44 39v7\"><\/path><path d=\"M21 22.8h0\"><\/path><path d=\"M32 22.8h0\"><\/path><path d=\"M43 22.8h0\"><\/path><\/svg><\/div><span class=\"feature-number\">04<\/span><h3>Pieles y acabados<\/h3><p><strong>Colores, texturas y terminaciones.<\/strong> Diferentes opciones para que el sof\u00e1 combine con tu estilo y mantenga un car\u00e1cter elegante y atemporal.<\/p><\/div><\/article>\n<\/div>\n<\/div><\/section>\n<section class=\"section alt\" id=\"coleccion\">\n<div class=\"inner\">\n<div class=\"section-head reveal\">\n<div>\n<p class=\"eyebrow\">Colecci\u00f3n Sofarium<\/p>\n<h2 class=\"section-title\">Modelos, acabados y ambientes<\/h2>\n<\/div>\n<a class=\"btn ghost\" href=\"#contacto\">Consultar disponibilidad<\/a>\n<\/div>\n<div class=\"gallery-full\">\n<article class=\"gallery-card reveal\" data-model=\"0\">\n<div class=\"media\"><img decoding=\"async\" alt=\"Sof\u00e1 Aloha\" draggable=\"false\" src=\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_01.png\"\/><\/div>\n<div class=\"meta\">\n<span class=\"model-kicker\">Modelo Sofarium<\/span>\n<h3>Sof\u00e1 Aloha<\/h3>\n<p>Modular, deslizante y personalizable<\/p>\n<div class=\"model-tags\"><span>Piel o tela<\/span><span>Deslizante<\/span><span>Opci\u00f3n motorizada<\/span><\/div>\n<div class=\"card-actions\"><button class=\"mini-btn\" data-open-model=\"0\" type=\"button\">Ver galer\u00eda<\/button><button class=\"mini-btn\" data-open-model=\"0\" type=\"button\">Detalles<\/button><\/div>\n<\/div>\n<\/article>\n<article class=\"gallery-card reveal\" data-model=\"1\">\n<div class=\"media\"><img decoding=\"async\" alt=\"Sof\u00e1 Treviso\" draggable=\"false\" src=\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_04.png\"\/><\/div>\n<div class=\"meta\">\n<span class=\"model-kicker\">Modelo Sofarium<\/span>\n<h3>Sof\u00e1 Treviso<\/h3>\n<p>Dise\u00f1o modular para salones familiares<\/p>\n<div class=\"model-tags\"><span>Modular<\/span><span>Chaise longue<\/span><span>Rinconera<\/span><\/div>\n<div class=\"card-actions\"><button class=\"mini-btn\" data-open-model=\"1\" type=\"button\">Ver galer\u00eda<\/button><button class=\"mini-btn\" data-open-model=\"1\" type=\"button\">Detalles<\/button><\/div>\n<\/div>\n<\/article>\n<article class=\"gallery-card reveal\" data-model=\"2\">\n<div class=\"media\"><img decoding=\"async\" alt=\"Sof\u00e1 Michigan\" draggable=\"false\" src=\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_03.png\"\/><\/div>\n<div class=\"meta\">\n<span class=\"model-kicker\">Modelo Sofarium<\/span>\n<h3>Sof\u00e1 Michigan<\/h3>\n<p>Sof\u00e1 a medida de l\u00edneas actuales<\/p>\n<div class=\"model-tags\"><span>A medida<\/span><span>Vers\u00e1til<\/span><span>Dise\u00f1o actual<\/span><\/div>\n<div class=\"card-actions\"><button class=\"mini-btn\" data-open-model=\"2\" type=\"button\">Ver galer\u00eda<\/button><button class=\"mini-btn\" data-open-model=\"2\" type=\"button\">Detalles<\/button><\/div>\n<\/div>\n<\/article>\n<article class=\"gallery-card reveal\" data-model=\"3\">\n<div class=\"media\"><img decoding=\"async\" alt=\"Sof\u00e1 Elvas\" draggable=\"false\" src=\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_05.png\"\/><\/div>\n<div class=\"meta\">\n<span class=\"model-kicker\">Modelo Sofarium<\/span>\n<h3>Sof\u00e1 Elvas<\/h3>\n<p>Deslizante, relax motor o fijo<\/p>\n<div class=\"model-tags\"><span>Deslizante<\/span><span>Relax motor<\/span><span>Fijo<\/span><\/div>\n<div class=\"card-actions\"><button class=\"mini-btn\" data-open-model=\"3\" type=\"button\">Ver galer\u00eda<\/button><button class=\"mini-btn\" data-open-model=\"3\" type=\"button\">Detalles<\/button><\/div>\n<\/div>\n<\/article>\n<article class=\"gallery-card reveal\" data-model=\"4\">\n<div class=\"media\"><img decoding=\"async\" alt=\"Sof\u00e1 Penta\" draggable=\"false\" src=\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_06.png\"\/><\/div>\n<div class=\"meta\">\n<span class=\"model-kicker\">Modelo Sofarium<\/span>\n<h3>Sof\u00e1 Penta<\/h3>\n<p>Dise\u00f1o n\u00f3rdico y proporci\u00f3n ligera<\/p>\n<div class=\"model-tags\"><span>Dise\u00f1o n\u00f3rdico<\/span><span>Ligero<\/span><span>Elegante<\/span><\/div>\n<div class=\"card-actions\"><button class=\"mini-btn\" data-open-model=\"4\" type=\"button\">Ver galer\u00eda<\/button><button class=\"mini-btn\" data-open-model=\"4\" type=\"button\">Detalles<\/button><\/div>\n<\/div>\n<\/article>\n<article class=\"gallery-card reveal\" data-model=\"5\">\n<div class=\"media\"><img decoding=\"async\" alt=\"Sof\u00e1 de piel Sofarium\" draggable=\"false\" src=\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_08_detalle_01.jpg\"\/><\/div>\n<div class=\"meta\">\n<span class=\"model-kicker\">Modelo Sofarium<\/span>\n<h3>Sof\u00e1 de piel Sofarium<\/h3>\n<p>Piel, presencia y uso diario<\/p>\n<div class=\"model-tags\"><span>Piel<\/span><span>Duradero<\/span><span>Atemporal<\/span><\/div>\n<div class=\"card-actions\"><button class=\"mini-btn\" data-open-model=\"5\" type=\"button\">Ver galer\u00eda<\/button><button class=\"mini-btn\" data-open-model=\"5\" type=\"button\">Detalles<\/button><\/div>\n<\/div>\n<\/article>\n<article class=\"gallery-card reveal\" data-model=\"6\">\n<div class=\"media\"><img decoding=\"async\" alt=\"Sof\u00e1 relax piel Sofarium\" draggable=\"false\" src=\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_09.png\"\/><\/div>\n<div class=\"meta\">\n<span class=\"model-kicker\">Modelo Sofarium<\/span>\n<h3>Sof\u00e1 relax piel Sofarium<\/h3>\n<p>Descanso con mecanismos de confort<\/p>\n<div class=\"model-tags\"><span>Relax<\/span><span>Piel<\/span><span>Confort<\/span><\/div>\n<div class=\"card-actions\"><button class=\"mini-btn\" data-open-model=\"6\" type=\"button\">Ver galer\u00eda<\/button><button class=\"mini-btn\" data-open-model=\"6\" type=\"button\">Detalles<\/button><\/div>\n<\/div>\n<\/article>\n<article class=\"gallery-card reveal\" data-model=\"7\">\n<div class=\"media\"><img decoding=\"async\" alt=\"Chaise longue piel Sofarium\" draggable=\"false\" src=\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_01.png\"\/><\/div>\n<div class=\"meta\">\n<span class=\"model-kicker\">Modelo Sofarium<\/span>\n<h3>Chaise longue piel Sofarium<\/h3>\n<p>Comodidad extendida para el sal\u00f3n<\/p>\n<div class=\"model-tags\"><span>Chaise longue<\/span><span>Piel<\/span><span>Composici\u00f3n<\/span><\/div>\n<div class=\"card-actions\"><button class=\"mini-btn\" data-open-model=\"7\" type=\"button\">Ver galer\u00eda<\/button><button class=\"mini-btn\" data-open-model=\"7\" type=\"button\">Detalles<\/button><\/div>\n<\/div>\n<\/article>\n<article class=\"gallery-card reveal\" data-model=\"8\">\n<div class=\"media\"><img decoding=\"async\" alt=\"Rinconera piel Sofarium\" draggable=\"false\" src=\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_05.png\"\/><\/div>\n<div class=\"meta\">\n<span class=\"model-kicker\">Modelo Sofarium<\/span>\n<h3>Rinconera piel Sofarium<\/h3>\n<p>Composici\u00f3n amplia y luminosa<\/p>\n<div class=\"model-tags\"><span>Rinconera<\/span><span>Piel clara<\/span><span>Amplio<\/span><\/div>\n<div class=\"card-actions\"><button class=\"mini-btn\" data-open-model=\"8\" type=\"button\">Ver galer\u00eda<\/button><button class=\"mini-btn\" data-open-model=\"8\" type=\"button\">Detalles<\/button><\/div>\n<\/div>\n<\/article>\n<\/div>\n<p class=\"gallery-note reveal\"><strong>Galer\u00eda completa con lightbox.<\/strong> Cada modelo abre una galer\u00eda propia con imagen general y detalles ampliados del sof\u00e1. En los modelos cuyo nombre comercial aparece publicado en Sofarium se ha usado ese nombre; en el resto se mantiene una denominaci\u00f3n de colecci\u00f3n Sofarium hasta confirmar la referencia comercial exacta.<\/p>\n<\/div><\/section>\n<section class=\"custom-band\" id=\"amedida\">\n<div class=\"custom-card reveal\">\n<div class=\"custom-visual\"><img decoding=\"async\" alt=\"Sof\u00e1 personalizable Sofarium\" src=\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_03.png\"\/><\/div>\n<div class=\"custom-copy\">\n<p class=\"eyebrow\">A tu medida<\/p>\n<h2>Dise\u00f1a tu propio sof\u00e1 de piel.<\/h2>\n<p>Elige medidas, m\u00f3dulos, piel, color y mecanismos. Creamos un sof\u00e1 \u00fanico para tu hogar y para tu forma de vivir, con una propuesta visual clara antes de decidir.<\/p>\n<div aria-label=\"Proceso de personalizaci\u00f3n\" class=\"custom-steps\">\n<div class=\"custom-step\"><span class=\"custom-step-number\">1<\/span><b>Elige el modelo<\/b><span>Selecciona la base que mejor se adapta a tu espacio.<\/span><\/div>\n<div class=\"custom-step\"><span class=\"custom-step-number\">2<\/span><b>Personaliza<\/b><span>Medidas, m\u00f3dulos, confort y acabados a tu gusto.<\/span><\/div>\n<div class=\"custom-step\"><span class=\"custom-step-number\">3<\/span><b>Elige tu piel<\/b><span>Texturas, colores y acabados para tu sal\u00f3n.<\/span><\/div>\n<div class=\"custom-step\"><span class=\"custom-step-number\">4<\/span><b>Hecho para ti<\/b><span>Asesoramiento en tienda y fabricaci\u00f3n cuidada.<\/span><\/div>\n<\/div>\n<div class=\"chips\">\n<span class=\"chip\">Medidas especiales<\/span>\n<span class=\"chip\">Pieles y colores<\/span>\n<span class=\"chip\">Relax o fijo<\/span>\n<span class=\"chip\">Asesoramiento en tienda<\/span>\n<\/div>\n<a class=\"btn\" href=\"#contacto\">Pedir asesoramiento<\/a>\n<\/div>\n<\/div>\n<\/section>\n<section class=\"section\" id=\"seo\">\n<div class=\"inner seo-grid\">\n<aside class=\"seo-aside reveal\">\n<p class=\"eyebrow\">Gu\u00eda de compra<\/p>\n<h2>Sof\u00e1s de piel para hogares que buscan dise\u00f1o y uso diario.<\/h2>\n<\/aside>\n<div class=\"seo-content\">\n<article class=\"text-block reveal\"><h3>Ventajas de los sof\u00e1s de piel<\/h3><p>La piel es un material resistente, elegante y f\u00e1cil de limpiar. Por eso es una opci\u00f3n especialmente interesante para quienes buscan un sof\u00e1 con <strong>larga vida \u00fatil<\/strong>, buen envejecimiento y una est\u00e9tica que no pase de moda.<\/p><\/article>\n<article class=\"text-block reveal\"><h3>Comodidad y funcionalidad<\/h3><p>Si disfrutas relaj\u00e1ndote en el sof\u00e1, los modelos con <strong>chaise longue, asiento deslizante o relax motorizado<\/strong> permiten transformar el sal\u00f3n en una zona de descanso m\u00e1s c\u00f3moda sin renunciar al dise\u00f1o.<\/p><\/article>\n<article class=\"text-block reveal\"><h3>Personalizaci\u00f3n<\/h3><p>Cada hogar tiene unas medidas y una distribuci\u00f3n distintas. Por eso trabajamos opciones personalizables para adaptar el sof\u00e1 a tu espacio, tanto en composici\u00f3n como en piel, color y acabado.<\/p><\/article>\n<article class=\"text-block reveal\"><h3>Experiencia y confianza<\/h3><p>Con m\u00e1s de 20 a\u00f1os de experiencia, Sofarium re\u00fane selecci\u00f3n de producto, atenci\u00f3n cercana y asesoramiento t\u00e9cnico para ayudarte a elegir un sof\u00e1 de piel c\u00f3modo, proporcionado y coherente con tu sal\u00f3n.<\/p><\/article>\n<\/div>\n<\/div>\n<\/section>\n<section class=\"section materials-section\" id=\"pieles\">\n<div class=\"inner\">\n<div class=\"section-head reveal\">\n<div>\n<p class=\"eyebrow\">Pieles y acabados<\/p>\n<h2 class=\"section-title\">Materiales que marcan la diferencia<\/h2>\n<\/div>\n<p class=\"section-lead\">Elige entre diferentes pieles, texturas, colores y acabados para crear un sof\u00e1 con presencia, c\u00f3modo para el uso diario y perfectamente integrado en el estilo de tu sal\u00f3n.<\/p>\n<\/div>\n<div class=\"materials-layout\">\n<div class=\"materials-grid\">\n<article class=\"swatch-card reveal\">\n<div aria-hidden=\"true\" class=\"swatch anilina\"><\/div>\n<div class=\"swatch-body\"><h3>Piel natural anilina<\/h3><p>Aspecto suave, profundo y con car\u00e1cter natural.<\/p><\/div>\n<\/article>\n<article class=\"swatch-card reveal\">\n<div aria-hidden=\"true\" class=\"swatch semi\"><\/div>\n<div class=\"swatch-body\"><h3>Piel semianilina<\/h3><p>Equilibrio entre belleza, tacto y resistencia diaria.<\/p><\/div>\n<\/article>\n<article class=\"swatch-card reveal\">\n<div aria-hidden=\"true\" class=\"swatch pigmentada\"><\/div>\n<div class=\"swatch-body\"><h3>Piel pigmentada<\/h3><p>Mayor protecci\u00f3n y f\u00e1cil mantenimiento.<\/p><\/div>\n<\/article>\n<article class=\"swatch-card reveal\">\n<div aria-hidden=\"true\" class=\"swatch costuras\"><\/div>\n<div class=\"swatch-body\"><h3>Acabados premium<\/h3><p>Costuras, patas y detalles que elevan el conjunto.<\/p><\/div>\n<\/article>\n<\/div>\n<aside class=\"materials-cta reveal\">\n<div>\n<p class=\"eyebrow\">T\u00f3calo antes de decidir<\/p>\n<h3>\u00bfQuieres ver nuestras pieles?<\/h3>\n<p>Pide asesoramiento o vis\u00edtanos en tienda para comparar texturas, colores y acabados reales.<\/p>\n<\/div>\n\n<\/aside>\n<\/div>\n<\/div>\n<\/section>\n<section class=\"section alt\" id=\"contacto\">\n<div class=\"inner contact-box reveal\">\n<div class=\"contact-info\">\n<p class=\"eyebrow\">Estamos en Donostia<\/p>\n<h2>Te ayudamos a elegir el sof\u00e1 de piel perfecto.<\/h2>\n<p>Cu\u00e9ntanos qu\u00e9 espacio tienes, qu\u00e9 uso le vas a dar y qu\u00e9 estilo buscas. Te orientaremos con medidas, modelos, pieles y acabados para que la elecci\u00f3n sea sencilla.<\/p>\n<div class=\"contact-details\">\n<div class=\"detail\"><span aria-hidden=\"true\" class=\"detail-icon\"><svg viewbox=\"0 0 24 24\"><path d=\"M12 21s7-5.2 7-12a7 7 0 0 0-14 0c0 6.8 7 12 7 12z\"><\/path><circle cx=\"12\" cy=\"9\" r=\"2.5\"><\/circle><\/svg><\/span><div><b>Direcci\u00f3n<\/b><span>C\/ Arrasate, 1 \u00b7 20005 San Sebasti\u00e1n<\/span><\/div><\/div>\n<div class=\"detail\"><span aria-hidden=\"true\" class=\"detail-icon\"><svg viewbox=\"0 0 24 24\"><path d=\"M22 16.9v3a2 2 0 0 1-2.2 2 19.8 19.8 0 0 1-8.6-3.1 19.4 19.4 0 0 1-6-6A19.8 19.8 0 0 1 2.1 4.2 2 2 0 0 1 4.1 2h3a2 2 0 0 1 2 1.7c.1.9.3 1.8.6 2.6a2 2 0 0 1-.5 2.1L8 9.6a16 16 0 0 0 6.4 6.4l1.2-1.2a2 2 0 0 1 2.1-.5c.8.3 1.7.5 2.6.6a2 2 0 0 1 1.7 2z\"><\/path><\/svg><\/span><div><b>Tel\u00e9fono<\/b><span>943 423 248<\/span><\/div><\/div>\n<div class=\"detail\"><span aria-hidden=\"true\" class=\"detail-icon\"><svg viewbox=\"0 0 24 24\"><path d=\"M4 5h16a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2z\"><\/path><path d=\"m22 7-10 7L2 7\"><\/path><\/svg><\/span><div><b>Email<\/b><span>info@sofarium.com<\/span><\/div><\/div>\n<div class=\"detail\"><span aria-hidden=\"true\" class=\"detail-icon\"><svg viewbox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"9\"><\/circle><path d=\"M12 7v5l3 2\"><\/path><\/svg><\/span><div><b>Horario<\/b><span>Lunes 16:00\u201320:00 h \u00b7 Martes a s\u00e1bado 10:00\u201313:30 \/ 16:00\u201320:00 h<\/span><\/div><\/div>\n<\/div>\n<\/div>\n<form class=\"contact-form\">\n<h3 class=\"form-title\">Solicita m\u00e1s informaci\u00f3n<\/h3>\n<p class=\"form-intro\">D\u00e9janos tus datos y te orientamos con una propuesta de sof\u00e1 adaptada a tu sal\u00f3n.<\/p>\n<div class=\"form-row\">\n<label class=\"field-label\"><span>Nombre<\/span><span class=\"field-control\"><span aria-hidden=\"true\" class=\"field-icon\"><svg viewbox=\"0 0 24 24\"><path d=\"M20 21a8 8 0 0 0-16 0\"><\/path><circle cx=\"12\" cy=\"7\" r=\"4\"><\/circle><\/svg><\/span><input placeholder=\"Tu nombre\" type=\"text\"\/><\/span><\/label>\n<label class=\"field-label\"><span>Tel\u00e9fono<\/span><span class=\"field-control\"><span aria-hidden=\"true\" class=\"field-icon\"><svg viewbox=\"0 0 24 24\"><path d=\"M22 16.9v3a2 2 0 0 1-2.2 2 19.8 19.8 0 0 1-8.6-3.1 19.4 19.4 0 0 1-6-6A19.8 19.8 0 0 1 2.1 4.2 2 2 0 0 1 4.1 2h3a2 2 0 0 1 2 1.7c.1.9.3 1.8.6 2.6a2 2 0 0 1-.5 2.1L8 9.6a16 16 0 0 0 6.4 6.4l1.2-1.2a2 2 0 0 1 2.1-.5c.8.3 1.7.5 2.6.6a2 2 0 0 1 1.7 2z\"><\/path><\/svg><\/span><input placeholder=\"943 000 000\" type=\"tel\"\/><\/span><\/label>\n<\/div>\n<div class=\"form-row\">\n<label class=\"field-label\"><span>Email<\/span><span class=\"field-control\"><span aria-hidden=\"true\" class=\"field-icon\"><svg viewbox=\"0 0 24 24\"><path d=\"M4 5h16a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2z\"><\/path><path d=\"m22 7-10 7L2 7\"><\/path><\/svg><\/span><input placeholder=\"tu@email.com\" type=\"email\"\/><\/span><\/label>\n<label class=\"field-label\"><span>Inter\u00e9s<\/span><span class=\"field-control\"><span aria-hidden=\"true\" class=\"field-icon\"><svg viewbox=\"0 0 24 24\"><path d=\"M4 12V8a3 3 0 0 1 6 0v4\"><\/path><path d=\"M14 12V8a3 3 0 0 1 6 0v4\"><\/path><path d=\"M3 12h18v5H3z\"><\/path><path d=\"M5 17v3\"><\/path><path d=\"M19 17v3\"><\/path><\/svg><\/span><select><option>Sof\u00e1s de piel<\/option><option>Sof\u00e1 relax<\/option><option>Chaise longue<\/option><option>Asesoramiento a medida<\/option><\/select><\/span><\/label>\n<\/div>\n<label class=\"field-label\"><span>Consulta<\/span><span class=\"field-control textarea\"><span aria-hidden=\"true\" class=\"field-icon\"><svg viewbox=\"0 0 24 24\"><path d=\"M21 15a4 4 0 0 1-4 4H8l-5 3V7a4 4 0 0 1 4-4h10a4 4 0 0 1 4 4z\"><\/path><\/svg><\/span><textarea placeholder=\"Cu\u00e9ntanos medidas aproximadas, estilo, color o tipo de sof\u00e1 que buscas.\"><\/textarea><\/span><\/label>\n<div class=\"room-planner\" id=\"roomPlanner\">\n<div aria-controls=\"plannerBody\" aria-expanded=\"false\" class=\"planner-header\" id=\"plannerHeader\" role=\"button\" tabindex=\"0\">\n<span aria-hidden=\"true\" class=\"planner-badge\"><svg viewbox=\"0 0 24 24\"><path d=\"M3 21V3h18v18H3z\"><\/path><path d=\"M3 9h7V3\"><\/path><path d=\"M14 21v-7h7\"><\/path><path d=\"M10 15h4\"><\/path><\/svg><\/span>\n<div>\n<p class=\"planner-kicker\">Opcional \u00b7 plano orientativo<\/p>\n<h4>Dibuja la planta de tu sal\u00f3n<\/h4>\n<p>Indica ancho y largo en m y coloca sof\u00e1, TV, mesa, puerta o ventana. El plano se adjunta autom\u00e1ticamente como imagen y datos editables.<\/p>\n<\/div>\n<button class=\"planner-toggle\" id=\"plannerToggle\" type=\"button\">Dibujar plano<\/button>\n<\/div>\n<div class=\"planner-body\" id=\"plannerBody\">\n<div class=\"planner-measures\">\n<label class=\"measure-field\"><span>Anchura del sal\u00f3n<\/span><span class=\"measure-input\"><input id=\"roomWidth\" inputmode=\"decimal\" max=\"12\" min=\"1.5\" name=\"salon_anchura_m\" step=\"0.1\" type=\"number\" value=\"4.2\"\/><em>m<\/em><\/span><\/label>\n<label class=\"measure-field\"><span>Largura del sal\u00f3n<\/span><span class=\"measure-input\"><input id=\"roomLength\" inputmode=\"decimal\" max=\"15\" min=\"1.5\" name=\"salon_largura_m\" step=\"0.1\" type=\"number\" value=\"5.8\"\/><em>m<\/em><\/span><\/label>\n<\/div>\n<p class=\"planner-intro-note\">Primero indica las medidas del sal\u00f3n en m. Despu\u00e9s a\u00f1ade elementos y selecci\u00f3nalos para editar medidas exactas: puertas y ventanas por anchura, TV por pulgadas, mesa redonda o rectangular, sof\u00e1 y chaise longue en L.<\/p>\n<div aria-label=\"A\u00f1adir elementos al plano\" class=\"planner-tools planner-add-tools\">\n<button class=\"planner-tool\" data-add=\"sofa\" type=\"button\"><svg viewbox=\"0 0 24 24\"><path d=\"M4 12V8a3 3 0 0 1 6 0v4\"><\/path><path d=\"M14 12V8a3 3 0 0 1 6 0v4\"><\/path><path d=\"M3 12h18v5H3z\"><\/path><path d=\"M5 17v3\"><\/path><path d=\"M19 17v3\"><\/path><\/svg><span>Sof\u00e1<\/span><\/button>\n<button class=\"planner-tool\" data-add=\"chaise\" type=\"button\"><svg viewbox=\"0 0 24 24\"><path d=\"M4 7h9v5H4z\"><\/path><path d=\"M10 12h7v6h-7z\"><\/path><path d=\"M4 12h6v6H4z\"><\/path><\/svg><span>Chaise L<\/span><\/button>\n<button class=\"planner-tool\" data-add=\"tv\" type=\"button\"><svg viewbox=\"0 0 24 24\"><rect height=\"12\" rx=\"1.5\" width=\"18\" x=\"3\" y=\"5\"><\/rect><path d=\"M8 21h8\"><\/path><path d=\"M12 17v4\"><\/path><\/svg><span>TV<\/span><\/button>\n<button class=\"planner-tool\" data-add=\"table\" type=\"button\"><svg viewbox=\"0 0 24 24\"><ellipse cx=\"12\" cy=\"9\" rx=\"7\" ry=\"3\"><\/ellipse><path d=\"M7 10.5V17\"><\/path><path d=\"M17 10.5V17\"><\/path><path d=\"M6 17h12\"><\/path><\/svg><span>Mesa<\/span><\/button>\n<button class=\"planner-tool\" data-add=\"door\" type=\"button\"><svg viewbox=\"0 0 24 24\"><path d=\"M5 21V3h10v18\"><\/path><path d=\"M15 6l4 2v13\"><\/path><path d=\"M11 12h.01\"><\/path><\/svg><span>Puerta<\/span><\/button>\n<button class=\"planner-tool\" data-add=\"window\" type=\"button\"><svg viewbox=\"0 0 24 24\"><rect height=\"14\" rx=\"1\" width=\"16\" x=\"4\" y=\"5\"><\/rect><path d=\"M12 5v14\"><\/path><path d=\"M4 12h16\"><\/path><\/svg><span>Ventana<\/span><\/button>\n<\/div>\n<div aria-live=\"polite\" class=\"planner-editor empty\" id=\"plannerEditor\">\n<p class=\"planner-editor-title\">Editar elemento seleccionado<\/p>\n<p class=\"editor-empty\">Selecciona un elemento del plano para editar sus medidas. Tambi\u00e9n puedes arrastrarlo o tirar del punto inferior derecho para alargarlo o acortarlo. En puertas y ventanas solo se modifica la anchura.<\/p>\n<div class=\"editor-content\" id=\"editorContent\">\n<div class=\"editor-head\">\n<div>\n<h5 id=\"editorTitle\">Elemento seleccionado<\/h5>\n<p id=\"editorHelp\">Ajusta las medidas para que el comercial entienda exactamente lo que buscas.<\/p>\n<\/div>\n<span class=\"dimension-chip\" id=\"editorDims\">0 \u00d7 0 m<\/span>\n<\/div>\n<div class=\"editor-fields\" id=\"editorFields\"><\/div>\n<div class=\"editor-resize-buttons\" id=\"editorResizeButtons\">\n<button class=\"resize-btn\" data-resize=\"wDec\" type=\"button\">\u2212 ancho<\/button>\n<button class=\"resize-btn\" data-resize=\"wInc\" type=\"button\">+ ancho<\/button>\n<button class=\"resize-btn\" data-resize=\"hDec\" type=\"button\">\u2212 fondo<\/button>\n<button class=\"resize-btn\" data-resize=\"hInc\" type=\"button\">+ fondo<\/button>\n<\/div>\n<div class=\"editor-actions\">\n<button class=\"planner-tool edit-action\" data-planner-action=\"rotate\" type=\"button\"><svg viewbox=\"0 0 24 24\"><path d=\"M21 12a9 9 0 1 1-2.64-6.36\"><\/path><path d=\"M21 3v6h-6\"><\/path><\/svg><span>Girar<\/span><\/button>\n<button class=\"planner-tool edit-action\" data-planner-action=\"flip\" id=\"flipAction\" type=\"button\"><svg viewbox=\"0 0 24 24\"><path d=\"M4 7h16\"><\/path><path d=\"M8 3 4 7l4 4\"><\/path><path d=\"M16 13l4 4-4 4\"><\/path><path d=\"M4 17h16\"><\/path><\/svg><span>Flipear chaise<\/span><\/button>\n<button class=\"planner-tool danger-action\" data-planner-action=\"delete\" type=\"button\"><svg viewbox=\"0 0 24 24\"><path d=\"M3 6h18\"><\/path><path d=\"M8 6V4h8v2\"><\/path><path d=\"M19 6l-1 15H6L5 6\"><\/path><\/svg><span>Borrar<\/span><\/button>\n<button class=\"planner-tool neutral-action\" data-planner-action=\"clear\" type=\"button\"><svg viewbox=\"0 0 24 24\"><path d=\"M4 4l16 16\"><\/path><path d=\"M20 4 4 20\"><\/path><\/svg><span>Limpiar plano<\/span><\/button>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"planner-canvas-wrap\">\n<canvas aria-label=\"Plano orientativo del sal\u00f3n\" height=\"440\" id=\"roomCanvas\" width=\"760\"><\/canvas>\n<\/div>\n<p class=\"planner-help\"><svg viewbox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"9\"><\/circle><path d=\"M12 10v6\"><\/path><path d=\"M12 7h.01\"><\/path><\/svg><span>No hace falta que sea exacto. Este plano sirve para orientar el tama\u00f1o del sof\u00e1, la posici\u00f3n de la chaise longue, la TV, puertas, ventanas y zonas de paso.<\/span><\/p>\n<input id=\"roomPlanImage\" name=\"plano_salon_png\" type=\"hidden\"\/>\n<input id=\"roomPlanData\" name=\"plano_salon_datos\" type=\"hidden\"\/>\n<\/div>\n<\/div>\n<label class=\"privacy-row\"><input type=\"checkbox\"\/><span>He le\u00eddo y acepto la pol\u00edtica de privacidad. Usaremos tus datos \u00fanicamente para responder a tu consulta comercial.<\/span><\/label>\n<button class=\"btn\" type=\"button\">Enviar consulta<\/button>\n<\/form>\n<\/div>\n<\/section>\n<\/main>\n<footer class=\"footer\">\n  <div class=\"footer-inner\">\n    <div class=\"footer-grid\">\n      <div class=\"footer-brand\">\n        <img decoding=\"async\" alt=\"Sofarium\" class=\"brand-logo footer-logo\" src=\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/sofarium_negro.gif\">\n        <p>Sof\u00e1s, butacas, descanso y mesas en Donostia \u2014 San Sebasti\u00e1n. Dise\u00f1o, calidad, servicio y personalizaci\u00f3n.<\/p>\n      <\/div>\n      <div><h4>Colecciones<\/h4><a href=\"#coleccion\">Sof\u00e1s de piel<\/a><a href=\"#coleccion\">Sof\u00e1s de tela<\/a><a href=\"#coleccion\">Butacas<\/a><a href=\"#coleccion\">Descanso<\/a><\/div>\n      <div><h4>Servicios<\/h4><a href=\"#amedida\">A tu medida<\/a><a href=\"#contacto\">Financiaci\u00f3n<\/a><a href=\"#ventajas\">Entrega express<\/a><a href=\"#contacto\">Asesoramiento<\/a><\/div>\n      <div><h4>Informaci\u00f3n<\/h4><a href=\"#intro\">Qui\u00e9nes somos<\/a><a href=\"#contacto\">Contacto<\/a><a href=\"#pieles\">Materiales<\/a><a href=\"#contacto\">FAQs<\/a><\/div>\n      <div><h4>Contacto<\/h4><span>C\/ Arrasate, 1<\/span><span>20005 San Sebasti\u00e1n<\/span><span>943 423 248<\/span><span>info@sofarium.com<\/span><\/div>\n    <\/div>\n    <div class=\"footer-bottom\"><span>\u00a9 2026 SOFARIUM. Todos los derechos reservados.<\/span><span>Pol\u00edtica de privacidad \u00b7 Pol\u00edtica de cookies \u00b7 Aviso legal<\/span><\/div>\n  <\/div>\n<\/footer>\n\n<div aria-hidden=\"true\" aria-label=\"Galer\u00eda de sof\u00e1\" aria-modal=\"true\" class=\"lightbox\" id=\"modelLightbox\" role=\"dialog\">\n<div class=\"lightbox-panel\">\n<div class=\"lightbox-media\">\n<button aria-label=\"Cerrar\" class=\"lightbox-close\" id=\"lightboxClose\" type=\"button\">\u00d7<\/button>\n<img decoding=\"async\" alt=\"\" draggable=\"false\" id=\"lightboxImage\" src=\"\"\/>\n<div class=\"lightbox-nav\">\n<button aria-label=\"Imagen anterior\" id=\"lightboxPrev\" type=\"button\">\u2039<\/button>\n<button aria-label=\"Imagen siguiente\" id=\"lightboxNext\" type=\"button\">\u203a<\/button>\n<\/div>\n<\/div>\n<aside class=\"lightbox-side\">\n<p class=\"eyebrow\">Galer\u00eda del modelo<\/p>\n<h2 class=\"lightbox-title\" id=\"lightboxTitle\"><\/h2>\n<p class=\"lightbox-subtitle\" id=\"lightboxSubtitle\"><\/p>\n<p class=\"lightbox-text\" id=\"lightboxText\"><\/p>\n<div class=\"model-tags\" id=\"lightboxTags\"><\/div>\n<div class=\"lightbox-details\" id=\"lightboxDetails\"><\/div>\n<div class=\"lightbox-thumbs\" id=\"lightboxThumbs\"><\/div>\n<p class=\"protection-note\">Protecci\u00f3n b\u00e1sica activada: se ha deshabilitado el bot\u00f3n derecho y el arrastre de im\u00e1genes. Esto evita la descarga casual, aunque ning\u00fan bloqueo de navegador impide completamente una captura o extracci\u00f3n t\u00e9cnica.<\/p>\n<\/aside>\n<\/div>\n<\/div>\n<a aria-label=\"Volver arriba\" class=\"back-top\" href=\"#top\" id=\"backTop\">\u2191<\/a>\n<\/div>\n<script id=\"sofarium-avada-inline-js\">\n\/* SOFARIUM AVADA - JS ESTABLE *\/\nwindow.sofariumModels = [{\"name\": \"Sof\u00e1 Aloha\", \"subtitle\": \"Modular, deslizante y personalizable\", \"text\": \"Sof\u00e1 personalizable disponible en piel o tela, con dise\u00f1o modular, asiento y respaldo deslizantes y posibilidad de incorporar opci\u00f3n motorizada.\", \"tags\": [\"Piel o tela\", \"Deslizante\", \"Opci\u00f3n motorizada\", \"A medida\"], \"details\": [[\"Tipo\", \"Sof\u00e1 modular personalizable\"], [\"Confort\", \"Asiento y respaldo deslizantes\"], [\"Acabados\", \"Piel o tela con colores a elegir\"], [\"Ideal para\", \"Salones modernos que necesitan flexibilidad\"]], \"img\": \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_01.png\", \"gallery\": [\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_01.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_03.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_04.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_05.png\"]}, {\"name\": \"Sof\u00e1 Treviso\", \"subtitle\": \"Dise\u00f1o modular para salones familiares\", \"text\": \"Modelo disponible en piel o tela con m\u00faltiples configuraciones: chaise longue, rinconera, sill\u00f3n individual o composiciones amplias.\", \"tags\": [\"Modular\", \"Chaise longue\", \"Rinconera\", \"Piel o tela\"], \"details\": [[\"Tipo\", \"Sof\u00e1 modular\"], [\"Confort\", \"Asientos profundos y respaldo ergon\u00f3mico\"], [\"Configuraci\u00f3n\", \"M\u00f3dulos con o sin brazo, pouff y chaise longue\"], [\"Ideal para\", \"Espacios familiares y composiciones grandes\"]], \"img\": \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_04.png\", \"gallery\": [\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_04.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_05.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_06.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_08_detalle_01.jpg\"]}, {\"name\": \"Sof\u00e1 Michigan\", \"subtitle\": \"Sof\u00e1 a medida de l\u00edneas actuales\", \"text\": \"Propuesta a medida de Sofarium para quien busca un sof\u00e1 vers\u00e1til, c\u00f3modo y adaptable a la distribuci\u00f3n del sal\u00f3n.\", \"tags\": [\"A medida\", \"Vers\u00e1til\", \"Dise\u00f1o actual\", \"Sofarium\"], \"details\": [[\"Tipo\", \"Sof\u00e1 a medida\"], [\"Confort\", \"Composici\u00f3n pensada para uso diario\"], [\"Acabados\", \"Personalizaci\u00f3n de medidas y materiales\"], [\"Ideal para\", \"Proyectos personalizados en Donostia\"]], \"img\": \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_03.png\", \"gallery\": [\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_03.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_04.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_05.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_06.png\"]}, {\"name\": \"Sof\u00e1 Elvas\", \"subtitle\": \"Deslizante, relax motor o fijo\", \"text\": \"Modelo con opci\u00f3n deslizante manual, relax motorizado o fijo, pensado para combinar funcionalidad, dise\u00f1o y comodidad.\", \"tags\": [\"Deslizante\", \"Relax motor\", \"Fijo\", \"Cabecero motorizado\"], \"details\": [[\"Tipo\", \"Sof\u00e1 con deslizante\"], [\"Confort\", \"Suspensi\u00f3n de muelles en ZZ\"], [\"Configuraci\u00f3n\", \"M\u00f3dulos con brazo, sin brazo, rincones y chaise longue\"], [\"Ideal para\", \"Usuarios que quieren ajustar la postura\"]], \"img\": \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_05.png\", \"gallery\": [\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_05.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_06.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_08_detalle_01.jpg\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_09.png\"]}, {\"name\": \"Sof\u00e1 Penta\", \"subtitle\": \"Dise\u00f1o n\u00f3rdico y proporci\u00f3n ligera\", \"text\": \"Modelo de estilo n\u00f3rdico, visualmente ligero y pensado para salones donde se busca una pieza elegante sin recargar el espacio.\", \"tags\": [\"Dise\u00f1o n\u00f3rdico\", \"Ligero\", \"Elegante\", \"Sofarium\"], \"details\": [[\"Tipo\", \"Sof\u00e1 de dise\u00f1o\"], [\"Confort\", \"Asiento equilibrado\"], [\"Acabados\", \"Disponible seg\u00fan exposici\u00f3n y selecci\u00f3n de materiales\"], [\"Ideal para\", \"Interiores contempor\u00e1neos y limpios\"]], \"img\": \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_06.png\", \"gallery\": [\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_06.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_08_detalle_01.jpg\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_09.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_01.png\"]}, {\"name\": \"Sof\u00e1 de piel Sofarium\", \"subtitle\": \"Piel, presencia y uso diario\", \"text\": \"Modelo de la colecci\u00f3n de sof\u00e1s de piel de Sofarium, orientado a hogares que buscan resistencia, est\u00e9tica atemporal y mantenimiento sencillo.\", \"tags\": [\"Piel\", \"Duradero\", \"Atemporal\", \"F\u00e1cil cuidado\"], \"details\": [[\"Tipo\", \"Sof\u00e1 de piel\"], [\"Confort\", \"Asiento c\u00f3modo para uso diario\"], [\"Acabados\", \"Piel en distintos tonos y texturas\"], [\"Ideal para\", \"Salones con personalidad\"]], \"img\": \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_08_detalle_01.jpg\", \"gallery\": [\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_08_detalle_01.jpg\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_09.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_01.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_03.png\"]}, {\"name\": \"Sof\u00e1 relax piel Sofarium\", \"subtitle\": \"Descanso con mecanismos de confort\", \"text\": \"Modelo de piel orientado al descanso, con una est\u00e9tica c\u00e1lida y opciones pensadas para relajarse con mayor apoyo.\", \"tags\": [\"Relax\", \"Piel\", \"Confort\", \"Sal\u00f3n\"], \"details\": [[\"Tipo\", \"Sof\u00e1 relax de piel\"], [\"Confort\", \"Postura m\u00e1s descansada\"], [\"Acabados\", \"Tonos c\u00e1lidos y piel de f\u00e1cil mantenimiento\"], [\"Ideal para\", \"Leer, ver televisi\u00f3n y descanso diario\"]], \"img\": \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_09.png\", \"gallery\": [\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_09.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_01.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_03.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_04.png\"]}, {\"name\": \"Chaise longue piel Sofarium\", \"subtitle\": \"Comodidad extendida para el sal\u00f3n\", \"text\": \"Composici\u00f3n con chaise longue pensada para aprovechar la zona de estar y crear un espacio c\u00f3modo de lectura, televisi\u00f3n o descanso.\", \"tags\": [\"Chaise longue\", \"Piel\", \"Composici\u00f3n\", \"Confort\"], \"details\": [[\"Tipo\", \"Sof\u00e1 con chaise longue\"], [\"Confort\", \"Zona extendida para tumbarse\"], [\"Acabados\", \"Piel marr\u00f3n de aspecto c\u00e1lido\"], [\"Ideal para\", \"Salones familiares y zonas de descanso\"]], \"img\": \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_01.png\", \"gallery\": [\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_01.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_03.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_04.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_05.png\"]}, {\"name\": \"Rinconera piel Sofarium\", \"subtitle\": \"Composici\u00f3n amplia y luminosa\", \"text\": \"Sof\u00e1 de piel con composici\u00f3n amplia, adecuado para salones donde se quiere maximizar asientos sin perder una imagen limpia.\", \"tags\": [\"Rinconera\", \"Piel clara\", \"Amplio\", \"Modular\"], \"details\": [[\"Tipo\", \"Sof\u00e1 rinconera\"], [\"Confort\", \"Asientos amplios\"], [\"Acabados\", \"Tonos claros y est\u00e9tica contempor\u00e1nea\"], [\"Ideal para\", \"Aprovechar esquinas y crear zona social\"]], \"img\": \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_05.png\", \"gallery\": [\"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_05.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_06.png\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_08_detalle_01.jpg\", \"https:\/\/test.sofarium.com\/wp-content\/uploads\/2026\/06\/piel_modelo_09.png\"]}];\n(function(){\n  function initSofariumAvada(){\n\n    const menuToggle = document.getElementById('menuToggle');\n    const nav = document.getElementById('nav');\n    menuToggle?.addEventListener('click', () => nav.classList.toggle('open'));\n\n    const io = 'IntersectionObserver' in window ? new IntersectionObserver((entries) => {\n      entries.forEach(entry => {\n        if (entry.isIntersecting) {\n          entry.target.classList.add('visible');\n          io.unobserve(entry.target);\n        }\n      });\n    }, { threshold: 0.13 }) : null;\n    if (io) document.querySelectorAll('.sfav-root .reveal').forEach(el => io.observe(el)); else document.querySelectorAll('.sfav-root .reveal').forEach(el => el.classList.add('visible'));\n\n    const backTop = document.getElementById('backTop');\n    window.addEventListener('scroll', () => {\n      backTop.classList.toggle('show', window.scrollY > 720);\n    });\n\n    \/\/ Protecci\u00f3n b\u00e1sica de im\u00e1genes: evita men\u00fa contextual y arrastre casual.\n    document.querySelectorAll('.sfav-root img, .sfav-root .gallery-card, .sfav-root .lightbox').forEach(el => el.addEventListener('contextmenu', event => event.preventDefault()));\n    document.querySelectorAll('.sfav-root img').forEach(img => {\n      img.setAttribute('draggable', 'false');\n      img.addEventListener('dragstart', event => event.preventDefault());\n    });\n\n    const models = window.sofariumModels || [];\n    const lightbox = document.getElementById('modelLightbox');\n    const lightboxImage = document.getElementById('lightboxImage');\n    const lightboxTitle = document.getElementById('lightboxTitle');\n    const lightboxSubtitle = document.getElementById('lightboxSubtitle');\n    const lightboxText = document.getElementById('lightboxText');\n    const lightboxTags = document.getElementById('lightboxTags');\n    const lightboxDetails = document.getElementById('lightboxDetails');\n    const lightboxThumbs = document.getElementById('lightboxThumbs');\n    const lightboxClose = document.getElementById('lightboxClose');\n    const lightboxPrev = document.getElementById('lightboxPrev');\n    const lightboxNext = document.getElementById('lightboxNext');\n    let currentModel = 0;\n    let currentPhoto = 0;\n\n    function renderLightbox() {\n      const model = models[currentModel];\n      const src = model.gallery[currentPhoto];\n      lightboxImage.src = src;\n      lightboxImage.alt = `${model.name} \u2014 imagen ${currentPhoto + 1}`;\n      lightboxTitle.textContent = model.name;\n      lightboxSubtitle.textContent = model.subtitle;\n      lightboxText.textContent = model.text;\n      lightboxTags.innerHTML = model.tags.map(tag => `<span>${tag}<\/span>`).join('');\n      lightboxDetails.innerHTML = model.details.map(([label, value]) => `<div class=\"detail-row\"><b>${label}<\/b><span>${value}<\/span><\/div>`).join('');\n      lightboxThumbs.innerHTML = model.gallery.map((img, index) => `\n        <button type=\"button\" class=\"${index === currentPhoto ? 'active' : ''}\" data-photo=\"${index}\" aria-label=\"Ver imagen ${index + 1}\">\n          <img decoding=\"async\" src=\"${img}\" alt=\"Miniatura ${index + 1}\" draggable=\"false\">\n        <\/button>`).join('');\n      lightboxThumbs.querySelectorAll('button').forEach(button => {\n        button.addEventListener('click', () => {\n          currentPhoto = Number(button.dataset.photo);\n          renderLightbox();\n        });\n      });\n    }\n\n    function openLightbox(index) {\n      currentModel = Number(index);\n      currentPhoto = 0;\n      renderLightbox();\n      lightbox.classList.add('open');\n      lightbox.setAttribute('aria-hidden', 'false');\n      document.body.style.overflow = 'hidden';\n    }\n\n    function closeLightbox() {\n      lightbox.classList.remove('open');\n      lightbox.setAttribute('aria-hidden', 'true');\n      document.body.style.overflow = '';\n    }\n\n    document.querySelectorAll('[data-model], [data-open-model]').forEach(el => {\n      el.addEventListener('click', event => {\n        const button = event.target.closest('[data-open-model]');\n        const card = event.currentTarget.closest('[data-model]') || event.currentTarget;\n        openLightbox(button ? button.dataset.openModel : card.dataset.model);\n      });\n    });\n\n    lightboxPrev.addEventListener('click', () => {\n      const gallery = models[currentModel].gallery;\n      currentPhoto = (currentPhoto - 1 + gallery.length) % gallery.length;\n      renderLightbox();\n    });\n    lightboxNext.addEventListener('click', () => {\n      const gallery = models[currentModel].gallery;\n      currentPhoto = (currentPhoto + 1) % gallery.length;\n      renderLightbox();\n    });\n    lightboxClose.addEventListener('click', closeLightbox);\n    lightbox.addEventListener('click', event => {\n      if (event.target === lightbox) closeLightbox();\n    });\n    document.addEventListener('keydown', event => {\n      if (!lightbox.classList.contains('open')) return;\n      if (event.key === 'Escape') closeLightbox();\n      if (event.key === 'ArrowLeft') lightboxPrev.click();\n      if (event.key === 'ArrowRight') lightboxNext.click();\n    });\n\n\n    \/\/ Plano opcional avanzado del sal\u00f3n dentro del formulario.\n    const roomPlanner = document.getElementById('roomPlanner');\n    const plannerHeader = document.getElementById('plannerHeader');\n    const plannerToggle = document.getElementById('plannerToggle');\n    const roomCanvas = document.getElementById('roomCanvas');\n    const roomWidthInput = document.getElementById('roomWidth');\n    const roomLengthInput = document.getElementById('roomLength');\n    const roomPlanImage = document.getElementById('roomPlanImage');\n    const roomPlanData = document.getElementById('roomPlanData');\n    const contactForm = document.querySelector('form.contact-form');\n    const plannerEditor = document.getElementById('plannerEditor');\n    const editorTitle = document.getElementById('editorTitle');\n    const editorHelp = document.getElementById('editorHelp');\n    const editorDims = document.getElementById('editorDims');\n    const editorFields = document.getElementById('editorFields');\n    const flipAction = document.getElementById('flipAction');\n\n    if (roomPlanner && roomCanvas) {\n      const ctx = roomCanvas.getContext('2d');\n      const state = {\n        width: Number(roomWidthInput.value) || 4.2,\n        length: Number(roomLengthInput.value) || 5.8,\n        items: [],\n        selectedId: null,\n        dragging: null,\n        resizing: null,\n        open: false\n      };\n      let editorSignature = '';\n\n      const tvWidthFromInches = inches => Number((Math.max(24, Math.min(98, inches)) * 0.02214).toFixed(2));\n      const tvHeightFromInches = inches => Number((Math.max(24, Math.min(98, inches)) * 0.01245).toFixed(2));\n      const templates = {\n        sofa: { label: 'Sof\u00e1', w: 2.4, h: .95, minW: 1.2, minH: .7, maxW: 5.5, maxH: 1.4, fill: '#8d725b', stroke: '#5f4c3d' },\n        chaise: { label: 'Chaise longue', w: 2.85, h: 1.65, minW: 1.9, minH: 1.15, maxW: 5.5, maxH: 2.35, fill: '#9c7a58', stroke: '#5f4c3d', side: 'right' },\n        tv: { label: 'TV', inches: 55, w: tvWidthFromInches(55), h: .12, minW: .75, minH: .08, maxW: 2.4, maxH: 2.4, fill: '#191713', stroke: '#191713' },\n        table: { label: 'Mesa', shape: 'round', diameter: .9, w: .9, h: .9, minW: .45, minH: .45, maxW: 2.4, maxH: 1.6, fill: '#d9c5ad', stroke: '#8d725b' },\n        door: { label: 'Puerta', w: .82, h: .12, minW: .55, minH: .08, maxW: 1.4, maxH: 1.4, fill: 'transparent', stroke: '#8d725b' },\n        window: { label: 'Ventana', w: 1.2, h: .1, minW: .5, minH: .06, maxW: 3.2, maxH: 3.2, fill: 'transparent', stroke: '#577176' }\n      };\n\n      const clamp = (value, min, max) => Math.min(Math.max(value, min), max);\n      const round2 = value => Math.round((Number(value) || 0) * 100) \/ 100;\n      const fmt = value => Number(value || 0).toLocaleString('es-ES', { maximumFractionDigits: 2 });\n      const inputValue = value => round2(value).toFixed(2);\n      const selectedItem = () => state.items.find(item => item.id === state.selectedId) || null;\n      const isVertical = item => Number(item.h) > Number(item.w);\n      const openingThickness = type => type === 'window' ? .10 : .12;\n\n      function limitDecimalPlaces(input, decimals = 2) {\n        if (!input) return;\n        let value = String(input.value || '').replace(',', '.');\n        if (!value) return;\n        value = value.replace(\/[^0-9.]\/g, '');\n        const parts = value.split('.');\n        if (parts.length > 2) value = parts.shift() + '.' + parts.join('');\n        const [integer, decimal = ''] = value.split('.');\n        input.value = decimal.length > decimals ? `${integer}.${decimal.slice(0, decimals)}` : value;\n      }\n\n      function attachDecimalLimit(input) {\n        if (!input || input.dataset.decimalLimited === 'true') return;\n        input.dataset.decimalLimited = 'true';\n        input.addEventListener('input', () => limitDecimalPlaces(input, Number(input.dataset.decimalLimit || 2)));\n        input.addEventListener('blur', () => {\n          if (input.value !== '') input.value = inputValue(input.value);\n        });\n      }\n\n      function openPlanner(force) {\n        state.open = typeof force === 'boolean' ? force : !state.open;\n        roomPlanner.classList.toggle('open', state.open);\n        plannerHeader.setAttribute('aria-expanded', String(state.open));\n        plannerToggle.textContent = state.open ? 'Ocultar plano' : 'Dibujar plano';\n        if (state.open) setTimeout(() => drawRoom(), 60);\n      }\n\n      plannerHeader.addEventListener('click', event => {\n        if (event.target.closest('button, input, select, textarea, canvas')) return;\n        openPlanner();\n      });\n      plannerHeader.addEventListener('keydown', event => {\n        if (event.key === 'Enter' || event.key === ' ') {\n          event.preventDefault();\n          openPlanner();\n        }\n      });\n      plannerToggle.addEventListener('click', event => {\n        event.stopPropagation();\n        openPlanner();\n      });\n\n      function metrics() {\n        const pad = 46;\n        const scale = Math.min((roomCanvas.width - pad * 2) \/ state.width, (roomCanvas.height - pad * 2) \/ state.length);\n        const w = state.width * scale;\n        const h = state.length * scale;\n        return { scale, x: (roomCanvas.width - w) \/ 2, y: (roomCanvas.height - h) \/ 2, w, h };\n      }\n\n      function pxToMeters(point) {\n        const m = metrics();\n        return { x: (point.x - m.x) \/ m.scale, y: (point.y - m.y) \/ m.scale };\n      }\n\n      function getPointer(event) {\n        const rect = roomCanvas.getBoundingClientRect();\n        return {\n          x: (event.clientX - rect.left) * (roomCanvas.width \/ rect.width),\n          y: (event.clientY - rect.top) * (roomCanvas.height \/ rect.height)\n        };\n      }\n\n      function itemBounds(item) {\n        const m = metrics();\n        return {\n          x: m.x + item.x * m.scale,\n          y: m.y + item.y * m.scale,\n          w: item.w * m.scale,\n          h: item.h * m.scale,\n          scale: m.scale\n        };\n      }\n\n      function normalizeRoom() {\n        state.width = round2(clamp(Number(roomWidthInput.value) || 4.2, 1.5, 12));\n        state.length = round2(clamp(Number(roomLengthInput.value) || 5.8, 1.5, 15));\n        if (document.activeElement !== roomWidthInput) roomWidthInput.value = inputValue(state.width);\n        if (document.activeElement !== roomLengthInput) roomLengthInput.value = inputValue(state.length);\n        state.items.forEach(item => normalizeItem(item));\n      }\n\n      function normalizeItem(item) {\n        const template = templates[item.type];\n        if (!template) return;\n\n        if (item.type === 'door' || item.type === 'window') {\n          const vertical = isVertical(item);\n          const thickness = openingThickness(item.type);\n          const maxLong = Math.min(template.maxW, vertical ? state.length : state.width);\n          const longSide = round2(clamp(Math.max(Number(item.w) || template.w, Number(item.h) || template.h), template.minW, maxLong));\n          item.w = vertical ? thickness : longSide;\n          item.h = vertical ? longSide : thickness;\n        } else if (item.type === 'tv') {\n          const vertical = isVertical(item);\n          item.inches = clamp(Math.round(Number(item.inches) || 55), 24, 98);\n          const longSide = round2(clamp(tvWidthFromInches(item.inches), template.minW, Math.min(template.maxW, vertical ? state.length : state.width)));\n          const thickness = openingThickness('tv');\n          item.w = vertical ? thickness : longSide;\n          item.h = vertical ? longSide : thickness;\n        } else {\n          const minW = template.minW || .2;\n          const minH = template.minH || .08;\n          const maxW = Math.min(template.maxW || 10, state.width);\n          const maxH = Math.min(template.maxH || 10, state.length);\n          item.w = round2(clamp(Number(item.w) || minW, minW, maxW));\n          item.h = round2(clamp(Number(item.h) || minH, minH, maxH));\n          if (item.type === 'table' && item.shape === 'round') {\n            item.diameter = round2(clamp(Number(item.diameter) || item.w, templates.table.minW, Math.min(templates.table.maxW, state.width, state.length)));\n            item.w = item.diameter;\n            item.h = item.diameter;\n          }\n        }\n        item.x = round2(clamp(Number(item.x) || 0, 0, Math.max(0, state.width - item.w)));\n        item.y = round2(clamp(Number(item.y) || 0, 0, Math.max(0, state.length - item.h)));\n      }\n\n      function drawRoundRect(x, y, w, h, r) {\n        const radius = Math.min(r, w \/ 2, h \/ 2);\n        ctx.beginPath();\n        ctx.moveTo(x + radius, y);\n        ctx.arcTo(x + w, y, x + w, y + h, radius);\n        ctx.arcTo(x + w, y + h, x, y + h, radius);\n        ctx.arcTo(x, y + h, x, y, radius);\n        ctx.arcTo(x, y, x + w, y, radius);\n        ctx.closePath();\n      }\n\n      function drawItemShape(item, x, y, w, h, selected) {\n        ctx.save();\n        ctx.shadowColor = selected ? 'rgba(95,76,61,.30)' : 'rgba(31,26,20,.12)';\n        ctx.shadowBlur = selected ? 16 : 8;\n        ctx.shadowOffsetY = selected ? 8 : 4;\n        ctx.fillStyle = item.fill;\n        ctx.strokeStyle = selected ? '#15130f' : item.stroke;\n        ctx.lineWidth = selected ? 2.4 : 1.4;\n\n        if (item.type === 'chaise') {\n          const seatDepth = Math.min(h * .58, .95 * metrics().scale);\n          const chaiseWidth = Math.min(w * .42, 1.05 * metrics().scale);\n          drawRoundRect(x, y, w, seatDepth, 10);\n          ctx.fill(); ctx.stroke();\n          const legX = item.side === 'left' ? x : x + w - chaiseWidth;\n          drawRoundRect(legX, y + seatDepth - 2, chaiseWidth, Math.max(8, h - seatDepth + 2), 10);\n          ctx.fill(); ctx.stroke();\n          ctx.shadowColor = 'transparent';\n          ctx.strokeStyle = 'rgba(255,253,248,.35)';\n          ctx.lineWidth = 1;\n          ctx.beginPath();\n          ctx.moveTo(x + w \/ 3, y + 4);\n          ctx.lineTo(x + w \/ 3, y + seatDepth - 5);\n          ctx.moveTo(x + w * 2 \/ 3, y + 4);\n          ctx.lineTo(x + w * 2 \/ 3, y + seatDepth - 5);\n          ctx.stroke();\n        } else if (item.type === 'table' && item.shape === 'round') {\n          ctx.beginPath();\n          ctx.ellipse(x + w \/ 2, y + h \/ 2, w \/ 2, h \/ 2, 0, 0, Math.PI * 2);\n          ctx.fill(); ctx.stroke();\n        } else if (item.type === 'door') {\n          ctx.shadowColor = 'transparent';\n          ctx.strokeStyle = selected ? '#15130f' : '#8d725b';\n          ctx.lineWidth = selected ? 4 : 3;\n          ctx.lineCap = 'round';\n          ctx.beginPath();\n          if (h > w) { ctx.moveTo(x + w \/ 2, y); ctx.lineTo(x + w \/ 2, y + h); }\n          else { ctx.moveTo(x, y + h \/ 2); ctx.lineTo(x + w, y + h \/ 2); }\n          ctx.stroke();\n        } else if (item.type === 'window') {\n          ctx.shadowColor = 'transparent';\n          ctx.strokeStyle = selected ? '#15130f' : '#577176';\n          ctx.lineWidth = selected ? 4 : 3;\n          ctx.lineCap = 'round';\n          const gap = 4;\n          ctx.beginPath();\n          if (h > w) {\n            ctx.moveTo(x + w \/ 2 - gap, y); ctx.lineTo(x + w \/ 2 - gap, y + h);\n            ctx.moveTo(x + w \/ 2 + gap, y); ctx.lineTo(x + w \/ 2 + gap, y + h);\n          } else {\n            ctx.moveTo(x, y + h \/ 2 - gap); ctx.lineTo(x + w, y + h \/ 2 - gap);\n            ctx.moveTo(x, y + h \/ 2 + gap); ctx.lineTo(x + w, y + h \/ 2 + gap);\n          }\n          ctx.stroke();\n        } else {\n          drawRoundRect(x, y, w, h, Math.min(12, w \/ 5, h \/ 5));\n          ctx.fill(); ctx.stroke();\n          if (item.type === 'sofa') {\n            ctx.shadowColor = 'transparent';\n            ctx.strokeStyle = 'rgba(255,253,248,.30)';\n            ctx.lineWidth = 1;\n            ctx.beginPath();\n            ctx.moveTo(x + w \/ 3, y + 5);\n            ctx.lineTo(x + w \/ 3, y + h - 5);\n            ctx.moveTo(x + w * 2 \/ 3, y + 5);\n            ctx.lineTo(x + w * 2 \/ 3, y + h - 5);\n            ctx.stroke();\n          }\n        }\n        ctx.restore();\n      }\n\n      function drawLabel(item, x, y, w, h, selected) {\n        const name = item.type === 'tv' ? `TV ${item.inches || 55}\"` : item.label;\n        ctx.save();\n        ctx.fillStyle = item.type === 'tv' ? '#fffdf8' : '#15130f';\n        ctx.font = '800 11px Raleway, Arial, sans-serif';\n        ctx.textAlign = 'center';\n        ctx.textBaseline = 'middle';\n        if (w > 38 && h > 18) ctx.fillText(name, x + w \/ 2, y + h \/ 2);\n        ctx.font = '700 10px Open Sans, Arial, sans-serif';\n        ctx.fillStyle = selected ? '#15130f' : '#6f675d';\n        ctx.textBaseline = 'alphabetic';\n        let dim;\n        if (item.type === 'table' && item.shape === 'round') dim = `\u00d8 ${fmt(item.diameter || item.w)} m`;\n        else if (item.type === 'door') dim = `Puerta ${fmt(Math.max(item.w, item.h))} m`;\n        else if (item.type === 'window') dim = `Ventana ${fmt(Math.max(item.w, item.h))} m`;\n        else if (item.type === 'tv') dim = `Ancho ${fmt(Math.max(item.w, item.h))} m`;\n        else dim = `${fmt(item.w)} \u00d7 ${fmt(item.h)} m`;\n        ctx.fillText(dim, x + w \/ 2, y - 8);\n        ctx.restore();\n      }\n\n      function drawSelection(item, x, y, w, h) {\n        ctx.save();\n        ctx.setLineDash([6, 5]);\n        ctx.strokeStyle = 'rgba(21,19,15,.62)';\n        ctx.lineWidth = 1.4;\n        ctx.strokeRect(x - 7, y - 7, w + 14, h + 14);\n        ctx.setLineDash([]);\n        ctx.fillStyle = '#15130f';\n        ctx.strokeStyle = '#fffdf8';\n        ctx.lineWidth = 2;\n        ctx.beginPath();\n        ctx.arc(x + w + 7, y + h + 7, 7, 0, Math.PI * 2);\n        ctx.fill();\n        ctx.stroke();\n        ctx.restore();\n      }\n\n      function drawRoom() {\n        normalizeRoom();\n        const m = metrics();\n        ctx.clearRect(0, 0, roomCanvas.width, roomCanvas.height);\n        ctx.fillStyle = '#fffdf8';\n        ctx.fillRect(0, 0, roomCanvas.width, roomCanvas.height);\n\n        ctx.save();\n        ctx.fillStyle = '#faf6ef';\n        ctx.fillRect(m.x, m.y, m.w, m.h);\n\n        const gridStep = .5 * m.scale;\n        ctx.strokeStyle = 'rgba(141,114,91,.16)';\n        ctx.lineWidth = 1;\n        for (let gx = m.x; gx <= m.x + m.w + .1; gx += gridStep) {\n          ctx.beginPath(); ctx.moveTo(gx, m.y); ctx.lineTo(gx, m.y + m.h); ctx.stroke();\n        }\n        for (let gy = m.y; gy <= m.y + m.h + .1; gy += gridStep) {\n          ctx.beginPath(); ctx.moveTo(m.x, gy); ctx.lineTo(m.x + m.w, gy); ctx.stroke();\n        }\n\n        ctx.strokeStyle = '#15130f';\n        ctx.lineWidth = 3;\n        ctx.strokeRect(m.x, m.y, m.w, m.h);\n\n        ctx.font = '700 12px Open Sans, Arial, sans-serif';\n        ctx.fillStyle = '#6f675d';\n        ctx.textAlign = 'center';\n        ctx.fillText(`${fmt(state.width)} m`, m.x + m.w \/ 2, m.y - 16);\n        ctx.save();\n        ctx.translate(m.x - 23, m.y + m.h \/ 2);\n        ctx.rotate(-Math.PI \/ 2);\n        ctx.fillText(`${fmt(state.length)} m`, 0, 0);\n        ctx.restore();\n\n        state.items.forEach(item => {\n          const selected = item.id === state.selectedId;\n          const b = itemBounds(item);\n          drawItemShape(item, b.x, b.y, b.w, b.h, selected);\n          drawLabel(item, b.x, b.y, b.w, b.h, selected);\n          if (selected) drawSelection(item, b.x, b.y, b.w, b.h);\n        });\n        ctx.restore();\n        updateEditor();\n        updatePlanFields();\n      }\n\n      function fieldHTML(id, label, value, unit, min, max, step = '0.01') {\n        const isInteger = String(step) === '1';\n        const shownValue = isInteger ? Math.round(Number(value) || 0) : inputValue(value);\n        const decimalAttr = isInteger ? '' : ' data-decimal-limit=\"2\"';\n        return `<label class=\"editor-field\"><span>${label}<\/span><input id=\"${id}\" type=\"number\" min=\"${min}\" max=\"${max}\" step=\"${step}\" value=\"${shownValue}\" inputmode=\"decimal\"${decimalAttr}>${unit ? `<small>${unit}<\/small>` : ''}<\/label>`;\n      }\n\n      function syncEditorValues(item) {\n        const setVal = (id, value) => {\n          const el = document.getElementById(id);\n          if (el && document.activeElement !== el) el.value = value;\n        };\n        if (!item) return;\n        if (item.type === 'door' || item.type === 'window') setVal('editWidth', inputValue(Math.max(item.w, item.h)));\n        else setVal('editWidth', inputValue(item.w));\n        setVal('editDepth', inputValue(item.h));\n        setVal('editDiameter', inputValue(item.diameter || item.w));\n        setVal('editTvInches', item.inches || 55);\n        const side = document.getElementById('editChaiseSide');\n        if (side && document.activeElement !== side) side.value = item.side || 'right';\n      }\n\n      function updateEditor() {\n        const item = selectedItem();\n        plannerEditor.classList.toggle('empty', !item);\n        if (!item) { editorSignature = ''; return; }\n        editorTitle.textContent = item.label;\n        if (item.type === 'table' && item.shape === 'round') editorDims.textContent = `\u00d8 ${fmt(item.diameter || item.w)} m`;\n        else if (item.type === 'door') editorDims.textContent = `Ancho puerta ${fmt(Math.max(item.w, item.h))} m`;\n        else if (item.type === 'window') editorDims.textContent = `Ancho ventana ${fmt(Math.max(item.w, item.h))} m`;\n        else if (item.type === 'tv') editorDims.textContent = `${item.inches || 55}\" \u00b7 ancho ${fmt(Math.max(item.w, item.h))} m`;\n        else editorDims.textContent = `${fmt(item.w)} \u00d7 ${fmt(item.h)} m`;\n        flipAction.style.display = item.type === 'chaise' ? 'inline-flex' : 'none';\n        document.querySelectorAll('[data-resize=\"hDec\"], [data-resize=\"hInc\"]').forEach(btn => {\n          btn.style.display = (item.type === 'door' || item.type === 'window' || item.type === 'tv') ? 'none' : 'inline-flex';\n        });\n        const nextSignature = `${item.id}|${item.type}|${item.shape || ''}|${item.side || ''}`;\n        syncEditorValues(item);\n        if (nextSignature === editorSignature) return;\n        editorSignature = nextSignature;\n        let html = '';\n        let help = 'Edita sus medidas o arr\u00e1stralo dentro de la planta.';\n\n        if (item.type === 'sofa') {\n          help = 'Define el ancho y fondo aproximados del sof\u00e1 que quiere el cliente.';\n          html = fieldHTML('editWidth', 'Ancho sof\u00e1', item.w, 'm', .9, Math.min(6, state.width), .01) + fieldHTML('editDepth', 'Fondo sof\u00e1', item.h, 'm', .6, 1.6, .01);\n        } else if (item.type === 'chaise') {\n          help = 'La chaise se representa en L. Puedes cambiar sus medidas y flipear la prolongaci\u00f3n izquierda\/derecha.';\n          html = fieldHTML('editWidth', 'Ancho total', item.w, 'm', 1.6, Math.min(6, state.width), .01) + fieldHTML('editDepth', 'Fondo chaise', item.h, 'm', 1.0, Math.min(2.6, state.length), .01) + `<label class=\"editor-field\"><span>Lado chaise<\/span><select id=\"editChaiseSide\"><option value=\"left\" ${item.side === 'left' ? 'selected' : ''}>Izquierda<\/option><option value=\"right\" ${item.side !== 'left' ? 'selected' : ''}>Derecha<\/option><\/select><\/label>`;\n        } else if (item.type === 'tv') {\n          help = 'Introduce las pulgadas: el ancho real aproximado de la pantalla 16:9 se calcula autom\u00e1ticamente.';\n          html = fieldHTML('editTvInches', 'Pulgadas TV', item.inches || 55, 'ancho calculado en m', 24, 98, 1) + `<label class=\"editor-field\"><span>Ancho calculado<\/span><input value=\"${fmt(Math.max(item.w, item.h))} m\" disabled><\/label>`;\n        } else if (item.type === 'door') {\n          help = 'Indica el hueco aproximado de la puerta para saber zonas de paso y apertura.';\n          html = fieldHTML('editWidth', 'Ancho puerta', Math.max(item.w, item.h), 'm', .55, 1.4, .01);\n        } else if (item.type === 'window') {\n          help = 'Indica el ancho aproximado de la ventana para respetar pared \u00fatil, luz y composici\u00f3n.';\n          html = fieldHTML('editWidth', 'Ancho ventana', Math.max(item.w, item.h), 'm', .5, 3.2, .01);\n        } else if (item.type === 'table') {\n          help = 'Elige si la mesa es redonda o cuadrada\/rectangular y ajusta sus medidas.';\n          html = `<label class=\"editor-field\"><span>Forma mesa<\/span><select id=\"editTableShape\"><option value=\"round\" ${item.shape !== 'square' ? 'selected' : ''}>Redonda<\/option><option value=\"square\" ${item.shape === 'square' ? 'selected' : ''}>Cuadrada \/ rectangular<\/option><\/select><\/label>`;\n          if (item.shape === 'square') {\n            html += fieldHTML('editWidth', 'Largo mesa', item.w, 'm', .45, 2.4, .01) + fieldHTML('editDepth', 'Ancho mesa', item.h, 'm', .45, 1.8, .01);\n          } else {\n            html += fieldHTML('editDiameter', 'Di\u00e1metro', item.diameter || item.w, 'm', .45, 2.2, .01);\n          }\n        }\n        editorHelp.textContent = help;\n        editorFields.innerHTML = html;\n        editorFields.querySelectorAll('input[data-decimal-limit]').forEach(attachDecimalLimit);\n\n        const widthInput = document.getElementById('editWidth');\n        const depthInput = document.getElementById('editDepth');\n        const diameterInput = document.getElementById('editDiameter');\n        const tvInput = document.getElementById('editTvInches');\n        const tableShape = document.getElementById('editTableShape');\n        const chaiseSide = document.getElementById('editChaiseSide');\n\n        widthInput?.addEventListener('input', () => {\n          const val = Number(widthInput.value);\n          if (item.type === 'door' || item.type === 'window') setLongThinDimension(item, val);\n          else item.w = val;\n          drawRoom();\n        });\n        depthInput?.addEventListener('input', () => { item.h = Number(depthInput.value); drawRoom(); });\n        diameterInput?.addEventListener('input', () => { item.shape = 'round'; item.diameter = Number(diameterInput.value); item.w = item.diameter; item.h = item.diameter; drawRoom(); });\n        tvInput?.addEventListener('input', () => { setTvSize(item, Number(tvInput.value)); drawRoom(); });\n        tableShape?.addEventListener('change', () => {\n          item.shape = tableShape.value;\n          if (item.shape === 'round') {\n            item.diameter = Math.max(item.w, item.h, .7);\n            item.w = item.diameter;\n            item.h = item.diameter;\n          } else {\n            item.w = Math.max(item.w, .8);\n            item.h = Math.max(item.h * .72, .55);\n          }\n          drawRoom();\n        });\n        chaiseSide?.addEventListener('change', () => { item.side = chaiseSide.value; drawRoom(); });\n      }\n\n      function setLongThinDimension(item, longSide) {\n        const t = templates[item.type];\n        const vertical = isVertical(item);\n        const thickness = openingThickness(item.type);\n        const maxLong = Math.min(t.maxW, vertical ? state.length : state.width);\n        const nextLong = round2(clamp(Number(longSide) || Math.max(item.w, item.h), t.minW, maxLong));\n        if (vertical) { item.h = nextLong; item.w = thickness; }\n        else { item.w = nextLong; item.h = thickness; }\n        normalizeItem(item);\n      }\n\n      function setTvSize(item, inches) {\n        item.inches = clamp(Math.round(Number(inches) || 55), 24, 98);\n        const vertical = isVertical(item);\n        const longSide = round2(tvWidthFromInches(item.inches));\n        const depth = openingThickness('tv');\n        if (vertical) { item.h = longSide; item.w = depth; }\n        else { item.w = longSide; item.h = depth; }\n        normalizeItem(item);\n      }\n\n      function updatePlanFields() {\n        const readableItems = state.items.map(item => {\n          const base = {\n            tipo: item.label,\n            x_m: Number(item.x.toFixed(2)),\n            y_m: Number(item.y.toFixed(2)),\n            ancho_m: Number(item.w.toFixed(2)),\n            fondo_m: Number(item.h.toFixed(2))\n          };\n          if (item.type === 'tv') base.pulgadas = item.inches;\n          if (item.type === 'chaise') base.lado_chaise = item.side === 'left' ? 'izquierda' : 'derecha';\n          if (item.type === 'table') {\n            base.forma = item.shape === 'square' ? 'cuadrada_rectangular' : 'redonda';\n            if (item.shape !== 'square') base.diametro_m = Number((item.diameter || item.w).toFixed(2));\n          }\n          if (item.type === 'door') { base.ancho_puerta_m = Number(Math.max(item.w, item.h).toFixed(2)); base.orientacion = isVertical(item) ? 'vertical' : 'horizontal'; }\n          if (item.type === 'window') { base.ancho_ventana_m = Number(Math.max(item.w, item.h).toFixed(2)); base.orientacion = isVertical(item) ? 'vertical' : 'horizontal'; }\n          return base;\n        });\n        roomPlanData.value = JSON.stringify({ anchura_m: state.width, largura_m: state.length, elementos: readableItems });\n        try { roomPlanImage.value = roomCanvas.toDataURL('image\/png'); }\n        catch (error) { roomPlanImage.value = ''; }\n      }\n\n      function addItem(type) {\n        const template = templates[type];\n        if (!template) return;\n        const item = {\n          ...template,\n          id: `${type}-${Date.now()}-${Math.random().toString(16).slice(2)}`,\n          type,\n          x: 0,\n          y: 0\n        };\n        if (type === 'table') item.shape = 'round';\n        if (type === 'chaise') item.side = 'right';\n        if (type === 'tv') setTvSize(item, item.inches || 55);\n        item.w = Math.min(item.w, state.width * .9);\n        item.h = Math.min(item.h, state.length * .9);\n        item.x = clamp((state.width - item.w) \/ 2, 0, Math.max(0, state.width - item.w));\n        item.y = clamp((state.length - item.h) \/ 2, 0, Math.max(0, state.length - item.h));\n        state.items.push(item);\n        state.selectedId = item.id;\n        openPlanner(true);\n        drawRoom();\n      }\n\n      function hitTest(point) {\n        const p = pxToMeters(point);\n        for (let i = state.items.length - 1; i >= 0; i--) {\n          const item = state.items[i];\n          if (p.x >= item.x && p.x <= item.x + item.w && p.y >= item.y && p.y <= item.y + item.h) return item;\n        }\n        return null;\n      }\n\n      function onResizeHandle(point, item) {\n        const b = itemBounds(item);\n        const hx = b.x + b.w + 7;\n        const hy = b.y + b.h + 7;\n        return Math.hypot(point.x - hx, point.y - hy) <= 15;\n      }\n\n      function applyResize(item, w, h) {\n        const t = templates[item.type];\n        if (item.type === 'tv') {\n          const longSide = Math.max(w, h, .75);\n          setTvSize(item, longSide \/ 0.02214);\n        } else if (item.type === 'door' || item.type === 'window') {\n          setLongThinDimension(item, Math.max(w, h));\n        } else if (item.type === 'table' && item.shape === 'round') {\n          item.diameter = clamp(Math.max(w, h), t.minW, Math.min(t.maxW, state.width, state.length));\n          item.w = item.diameter;\n          item.h = item.diameter;\n        } else {\n          item.w = clamp(w, t.minW, Math.min(t.maxW, state.width));\n          item.h = clamp(h, t.minH, Math.min(t.maxH, state.length));\n        }\n        normalizeItem(item);\n      }\n\n      document.querySelectorAll('[data-add]').forEach(button => {\n        button.addEventListener('click', () => addItem(button.dataset.add));\n      });\n      document.querySelectorAll('[data-planner-action]').forEach(button => {\n        button.addEventListener('click', () => {\n          const action = button.dataset.plannerAction;\n          const selected = selectedItem();\n          if (action === 'clear') {\n            state.items = [];\n            state.selectedId = null;\n          }\n          if (action === 'delete' && selected) {\n            state.items = state.items.filter(item => item.id !== selected.id);\n            state.selectedId = null;\n          }\n          if (action === 'rotate' && selected) {\n            if (selected.type === 'door' || selected.type === 'window' || selected.type === 'tv') {\n              const longSide = Math.max(selected.w, selected.h);\n              const thickness = openingThickness(selected.type);\n              if (isVertical(selected)) { selected.w = longSide; selected.h = thickness; }\n              else { selected.w = thickness; selected.h = longSide; }\n            } else {\n              const oldW = selected.w;\n              selected.w = selected.h;\n              selected.h = oldW;\n            }\n            normalizeItem(selected);\n          }\n          if (action === 'flip' && selected?.type === 'chaise') {\n            selected.side = selected.side === 'left' ? 'right' : 'left';\n          }\n          openPlanner(true);\n          drawRoom();\n        });\n      });\n      document.querySelectorAll('[data-resize]').forEach(button => {\n        button.addEventListener('click', () => {\n          const selected = selectedItem();\n          if (!selected) return;\n          const action = button.dataset.resize;\n          const delta = .1;\n          let nextW = selected.w;\n          let nextH = selected.h;\n          if (action === 'wInc') nextW += delta;\n          if (action === 'wDec') nextW -= delta;\n          if (action === 'hInc') nextH += delta;\n          if (action === 'hDec') nextH -= delta;\n          applyResize(selected, nextW, nextH);\n          drawRoom();\n        });\n      });\n\n      [roomWidthInput, roomLengthInput].forEach(input => {\n        input.dataset.decimalLimit = '2';\n        attachDecimalLimit(input);\n        input.addEventListener('input', drawRoom);\n        input.addEventListener('change', () => { limitDecimalPlaces(input); drawRoom(); });\n      });\n\n      roomCanvas.addEventListener('pointerdown', event => {\n        const point = getPointer(event);\n        const current = selectedItem();\n        if (current && onResizeHandle(point, current)) {\n          const p = pxToMeters(point);\n          state.resizing = { id: current.id, startX: p.x, startY: p.y, origW: current.w, origH: current.h };\n          roomCanvas.classList.add('resizing');\n          roomCanvas.setPointerCapture?.(event.pointerId);\n          event.preventDefault();\n          return;\n        }\n        const item = hitTest(point);\n        if (!item) {\n          state.selectedId = null;\n          drawRoom();\n          return;\n        }\n        const p = pxToMeters(point);\n        state.selectedId = item.id;\n        state.dragging = { id: item.id, dx: p.x - item.x, dy: p.y - item.y };\n        roomCanvas.classList.add('dragging');\n        roomCanvas.setPointerCapture?.(event.pointerId);\n        drawRoom();\n      });\n      roomCanvas.addEventListener('pointermove', event => {\n        const p = pxToMeters(getPointer(event));\n        if (state.resizing) {\n          const item = state.items.find(entry => entry.id === state.resizing.id);\n          if (!item) return;\n          const nextW = state.resizing.origW + (p.x - state.resizing.startX);\n          const nextH = state.resizing.origH + (p.y - state.resizing.startY);\n          applyResize(item, nextW, nextH);\n          drawRoom();\n          return;\n        }\n        if (!state.dragging) return;\n        const item = state.items.find(entry => entry.id === state.dragging.id);\n        if (!item) return;\n        item.x = clamp(p.x - state.dragging.dx, 0, Math.max(0, state.width - item.w));\n        item.y = clamp(p.y - state.dragging.dy, 0, Math.max(0, state.length - item.h));\n        drawRoom();\n      });\n      ['pointerup', 'pointercancel', 'pointerleave'].forEach(name => {\n        roomCanvas.addEventListener(name, () => {\n          state.dragging = null;\n          state.resizing = null;\n          roomCanvas.classList.remove('dragging', 'resizing');\n          updatePlanFields();\n        });\n      });\n\n      contactForm?.addEventListener('submit', updatePlanFields);\n      contactForm?.querySelector('button[type=\"button\"]')?.addEventListener('click', updatePlanFields);\n      drawRoom();\n    }\n\n  \n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', initSofariumAvada);\n  } else {\n    initSofariumAvada();\n  }\n})();\n\n<\/script>\n<\/div><\/div><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"open","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-2","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/test.sofarium.com\/index.php?rest_route=\/wp\/v2\/pages\/2","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.sofarium.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/test.sofarium.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/test.sofarium.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/test.sofarium.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2"}],"version-history":[{"count":17,"href":"https:\/\/test.sofarium.com\/index.php?rest_route=\/wp\/v2\/pages\/2\/revisions"}],"predecessor-version":[{"id":42,"href":"https:\/\/test.sofarium.com\/index.php?rest_route=\/wp\/v2\/pages\/2\/revisions\/42"}],"wp:attachment":[{"href":"https:\/\/test.sofarium.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}