#ecom-norma-detail-normas-referenced .standards-section { position: relative; } #ecom-norma-detail-normas-referenced .standards-section .container { display: block; width: 100%; max-width: 1110px; margin: 0 auto !important; padding: 0 15px !important; box-sizing: border-box; } #ecom-norma-detail-normas-referenced .standards-section .container.m-1.p-1 { margin: 0 !important; padding: 0 15px !important; } #ecom-norma-detail-normas-referenced .standards-section .standards-container { display: flex; flex-wrap: nowrap; gap: 20px 0; width: 100%; max-width: 100%; flex: 0 0 100%; box-sizing: border-box; } #ecom-norma-detail-normas-referenced .standards-section .standards-container.standards-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); column-gap: 3.5%; row-gap: 20px; width: 100%; flex-wrap: unset; } #ecom-norma-detail-normas-referenced .standards-section .standards-container.standards-grid .item-standard { width: 100%; } #ecom-norma-detail-normas-referenced .standards-section .standards-container.standards-grid .item-standard { height: 100%; } #ecom-norma-detail-normas-referenced .standards-section .standards-container.standards-grid .item-standard .info-standard { display: flex; flex-direction: column; height: 100%; } #ecom-norma-detail-normas-referenced .standards-section .standards-container.standards-grid .price-container { margin-top: auto; } @media (max-width: 1200px) { #ecom-norma-detail-normas-referenced .standards-section .standards-container.standards-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 4%; } } @media (max-width: 576px) { #ecom-norma-detail-normas-referenced .standards-section .standards-container.standards-grid { grid-template-columns: 1fr; column-gap: 0; } } #ecom-norma-detail-normas-referenced .standards-section .standards-container:not(.owl-drag) .owl-stage { cursor: auto; } #ecom-norma-detail-normas-referenced .standards-section .item-standard { position: relative; border: 1px solid #e0e0e0; padding: 20px 14px 16px; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); display: flex; flex-direction: column; justify-content: space-between; } #ecom-norma-detail-normas-referenced .standards-section .title-standard { font-family: SohoGothicPro-Regular; font-size: 16px; font-weight: bold; color: #1a4b94; margin-top: 10px; margin-bottom: 10px; } #ecom-norma-detail-normas-referenced .standards-section .description-text { margin-top: 10px; margin-bottom: 12px; font-family: SohoGothicPro-Regular; font-size: 13px; text-align: left; color: #333; } #ecom-norma-detail-normas-referenced .standards-section .price-container { display: flex; flex-direction: column; text-align: left; letter-spacing: -0.02em; } #ecom-norma-detail-normas-referenced .standards-section .price-container .price-text { font-family: SohoGothicPro-Regular; font-size: 12px; font-weight: 400; line-height: 13.2px; color: #000; } #ecom-norma-detail-normas-referenced .standards-section .price-container .price { font-size: 20px; font-weight: bold; margin-bottom: 10px; color: #1a4b94; } #ecom-norma-detail-normas-referenced .standards-section .info-container { display: flex; } @media (min-width: 500px) and (max-width: 767px) { #ecom-norma-detail-normas-referenced .standards-section .info-container { flex-direction: column; justify-content: end; align-items: start; } } #ecom-norma-detail-normas-referenced .standards-section .info-container .standard-mode img, #ecom-norma-detail-normas-referenced .standards-section .info-container .standard-date img, #ecom-norma-detail-normas-referenced .standards-section .info-container .standard-mode picture, #ecom-norma-detail-normas-referenced .standards-section .info-container .standard-date picture { width: 16px; } #ecom-norma-detail-normas-referenced .standards-section .info-container .standard-mode { margin-right: 16px; } #ecom-norma-detail-normas-referenced .standards-section .standard-button { border: 0; outline: 0; padding: 17px; width: 100%; text-align: center; display: block; background-color: var(--brand-color-1, #1f57a3); color: #fff; text-transform: uppercase; font-family: SohoStd-Medium; font-size: 14px; font-weight: 500; line-height: 14px; text-align: center; cursor: pointer; } #ecom-norma-detail-normas-referenced .standards-section .standard-button.disabled, #ecom-norma-detail-normas-referenced .standards-section .standard-button:disabled, #ecom-norma-detail-normas-referenced .standards-section .standard-button[disabled], #ecom-norma-detail-normas-referenced .standards-section .standard-button.ecom-btn-loading { opacity: .6; pointer-events: none; filter: brightness(0.85); } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-next { width: 50px; border: 1px solid #c3c3c3; border-radius: 0; height: 50px; font-size: 30px; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-next:focus { outline: 0; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-prev { width: 50px; border: 1px solid #c3c3c3; border-radius: 0; height: 50px; font-size: 30px; } #ecom-norma-detail-normas-referenced .standards-section .owl-dots { display: flex; justify-content: center; margin-top: 30px; } #ecom-norma-detail-normas-referenced .standards-section button.owl-dot { width: 15px; height: 15px; background: transparent; margin: 10px; border: 1px solid var(--brand-color-2, #6a9bd3); background-color: var(--brand-color-2, #6a9bd3); } #ecom-norma-detail-normas-referenced .standards-section button.owl-dot:focus-visible { outline: solid; } #ecom-norma-detail-normas-referenced .standards-section .owl-dot button { color: white; } #ecom-norma-detail-normas-referenced .standards-section .pagi-btn { font-family: "SohoGothicPro-Regular"; font-size: 16px; font-weight: 400; line-height: 24px; position: relative; width: 100%; background: transparent !important; border: none !important; cursor: pointer; padding: 32px 10px; } #ecom-norma-detail-normas-referenced .standards-section .owl-dot.active { background: var(--brand-color-3, #29337f); border: 1px solid var(--brand-color-3, #29337f); } #ecom-norma-detail-normas-referenced .standards-section .owl-dot.active .pagi-btn { color: white; font-family: "SohoStd-Medium"; font-size: 16px; font-weight: 500; line-height: 24px; } #ecom-norma-detail-normas-referenced .standards-section .owl-dot.active .pagi-btn::before { border-bottom: 28px solid var(--brand-color-2, #6a9bd3); border-left: 15px solid transparent; border-right: 15px solid transparent; width: 0; height: 0; content: ""; position: absolute; bottom: 84px; left: 45%; } @media (min-width: 992px) { #ecom-norma-detail-normas-referenced .standards-section .owl-navigation-mobile { display: none; } } #ecom-norma-detail-normas-referenced .standards-section .owl-navigation-mobile .owl-navigation-mobile-box { background: linear-gradient(0deg, var(--brand-color-2, #6a9bd3) 4.9%, var(--brand-color-1, #1f57a3) 110.78%); padding: 28px; } #ecom-norma-detail-normas-referenced .standards-section .owl-navigation-mobile .owl-navigation-mobile-box p { color: white; font-family: "SohoStd-Medium"; font-size: 14px; font-weight: 500; line-height: 18px; margin-bottom: 0; } #ecom-norma-detail-normas-referenced .standards-section .owl-navigation-mobile .owl-navigation-mobile-box::before { border-bottom: 28px solid var(--brand-color-1, #1f57a3); border-left: 15px solid transparent; border-right: 15px solid transparent; width: 0; height: 0; content: ""; position: absolute; bottom: 72px; z-index: 1; margin-left: -14px; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav { position: absolute; top: 50%; left: 0; right: 0; transform: translateY(-50%); pointer-events: none; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-prev, #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-next { position: absolute; background: none; border: 2px solid #fff; z-index: 100; pointer-events: auto; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-prev.disabled, #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-next.disabled { opacity: 0.5; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-prev { background: var(--brand-color-3, #29337f); padding: 16px !important; left: -55px; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-prev i { color: white; position: absolute; top: 17px; left: 19px; font-size: 13px; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-next { background: var(--brand-color-3, #29337f); padding: 16px !important; right: -55px; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-next i { color: white; position: absolute; top: 17px; left: 19px; font-size: 13px; } @media (max-width: 991px) { #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-prev { left: -55px; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-next { right: -55px; } } @media (max-width: 868px) { #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-prev { left: -25px; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-next { right: -25px; } } @media (max-width: 767px) { #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-prev { left: -60px; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-next { right: -60px; } } @media (max-width: 668px) { #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav { top: 103%; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-prev { left: 40%; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-next { right: 40%; } } @media (max-width: 575px) { #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-prev { left: 35%; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-next { right: 35%; } } @media (max-width: 400px) { #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-prev { left: 32%; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-next { right: 32%; } } @media (min-width: 300px) { #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-stage-outer { overflow: visible; } } @media (min-width: 1100px) { #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-prev { left: -55px; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-next { right: -55px; } } @media (min-width: 1200px) { #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-prev { left: -25px; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-next { right: -25px; } } @media (min-width: 1330px) { #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-prev { left: -75px; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-nav .owl-next { right: -75px; } } #ecom-norma-detail-normas-referenced .standards-section .owl-item { display: flex; flex-direction: column; justify-content: stretch; } .status-standard { margin-right: 10px; color: white; font-size: 10px; padding: 2px 6px; border-radius: 3px; font-weight: bold; } .date-standard { font-size: 12px; color: #666; } #ecom-norma-detail-normas-referenced .standards-section .tag-standard { position: absolute; background-color: #6a9bd3; top: -10px; left: 16px; padding: 4px 10px; border-radius: 4px; color: #fff; font-weight: bold; font-size: 12px; z-index: 5; } #ecom-norma-detail-normas-referenced .standards-section .status-box { text-transform: uppercase; align-items: center; display: flex; flex-wrap: wrap; margin: 0 0 10px; gap: 4px 0; } #ecom-norma-detail-normas-referenced .standards-section .status-box .status-standard.red-tag { background-color: var(--ae-450, #D44436); border: 1px solid var(--ae-450, #D44436); color: #fff; } #ecom-norma-detail-normas-referenced .standards-section .status-box .status-standard.green-tag { background-color: #138636; border: 1px solid #138636; color: #fff; } #ecom-norma-detail-normas-referenced .standards-section .status-box .status-standard.blue-tag { background-color: #0078c0; border: 1px solid #0078c0; color: #fff; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-stage-outer { overflow-x: hidden; overflow-y: visible; } #ecom-norma-detail-normas-referenced .standards-section .owl-carousel .owl-stage-outer .owl-stage { overflow: hidden; display: flex; align-items: stretch; padding-left: 0 !important; padding-right: 0 !important; padding-top: 30px; } /* select */ select .form-control { padding: 15.5px 16px; font-family: "SohoGothicPro-Regular"; font-size: 14px; font-weight: 400; line-height: 18px; letter-spacing: 0.5px; text-align: left; border: 1px solid #c2c2c2; height: 50px; width: 100%; color: #66757f; border-radius: 4px; } select.form-control option { font-family: "SohoGothicPro-Regular"; font-size: 14px; font-weight: 400; line-height: 18px; letter-spacing: 0.5px; text-align: left; } select.form-control, select.form-control:focus, select.form-control:focus-visible { background-image: url(/documents/d/global/ico-chevron-down); position: relative; background-size: 18px 10px; background-position-x: 95%; } #ecom-norma-detail-normas-referenced .standards-section .options-standard { display: flex; gap: 10px; margin-bottom: 16px; border: none; } #ecom-norma-detail-normas-referenced .standards-section .options-standard .select-language { background-color: #f5f5f5; flex: 2; font-size: 13px; } #ecom-norma-detail-normas-referenced .standards-section .options-standard .select-format { background-color: #f5f5f5; flex: 1; font-size: 13px; }
window.ecomGenericScripts = window.ecomGenericScripts || (function () { /* ===================================== PROPIEDADES PRIVADAS ===================================== */ const privateProps = window.ecomGenericScripts?.privateProps || {}; /* ===================================== PROPIEDADES PÚBLICAS ===================================== */ const publicProps = { isDebug: false }; /* ===================================== FUNCIONES PÚBLICAS ===================================== */ //En functions declaramos la functions publicas const functions = {}; functions.init = async function () { await _DOMContentLoaded(); }; /* ===================================== FUNCIONES PRIVADAS ===================================== */ const _loadInit = async function () { if (publicProps.isDebug) console.log("DOMContentLoaded ecom Generic scripts"); }; const _parsePriceText = function (text) { if (!text) return 0; const cleaned = String(text) .replace(/[^\d,.-]/g, "") .replace(/\./g, "") .replace(",", "."); const n = Number(cleaned); return Number.isFinite(n) ? n : 0; }; const _getDetailContext = function (button) { const wrapper = document.querySelector("#ecom-scripts .data-product-wrapper"); const purchaseBox = button?.closest(".purchase-box") || document; const langSelect = purchaseBox.querySelector(".select-language"); const formatSelect = purchaseBox.querySelector(".select-format"); const qtyInput = purchaseBox.querySelector(".qty input[type='number']"); const priceNode = purchaseBox.querySelector(".price-header .price"); const titleNode = document.querySelector(".ecom-libro .title, .ecom-norma .title, .ecom-coleccion_tematica .title, .title-book"); return { wrapper, purchaseBox, langSelect, formatSelect, qtyInput, priceNode, titleNode }; }; const _getDetailData = async function (productERC, productId, isLibro, isNorma, isColeccionTematica) { if (!window.ecomGlobalScripts?.functions) return null; try { if (isLibro) { if (productERC) return await window.ecomGlobalScripts.functions.getProductBooksByERC(productERC); if (productId) return await window.ecomGlobalScripts.functions.getProductBooks(productId); } if (isColeccionTematica) { if (productERC) return await window.ecomGlobalScripts.functions.getProductThematicCollectionsByERC(productERC); if (productId) return await window.ecomGlobalScripts.functions.getProductThematicCollections(productId); } if (isNorma) { if (productERC) return await window.ecomGlobalScripts.functions.getProductNormasDetailsByERC(productERC); if (productId) return await window.ecomGlobalScripts.functions.getProductNormasDetails(productId); } } catch (e) {} return null; }; const _syncDetailBuyButtonState = function (purchaseBox) { if (!purchaseBox) return; const btn = purchaseBox.querySelector(".buy-btn"); if (!btn) return; const langSelect = purchaseBox.querySelector(".select-language"); const formatSelect = purchaseBox.querySelector(".select-format"); const hasSelectors = !!(langSelect || formatSelect); const hasSelection = !!(langSelect?.value && formatSelect?.value); if (!hasSelectors) { if (!btn.disabled) btn.disabled = true; if (!btn.classList.contains("disabled")) btn.classList.add("disabled"); return; } if (btn.disabled === hasSelection) { btn.disabled = !hasSelection; } btn.classList.toggle("disabled", !hasSelection); }; const _setupQtyPriceMultiplier = function (purchaseBox) { if (!purchaseBox || purchaseBox.dataset.aeQtyMultBound === "true") return; purchaseBox.dataset.aeQtyMultBound = "true"; const priceNode = purchaseBox.querySelector(".price-header .price"); const qtyInput = purchaseBox.querySelector(".qty input[type='number']"); if (!priceNode || !qtyInput) return; const formatter = window.ecomGlobalScripts?.properties?.language?.formatterPrice; const splitPriceAndCurrency = function (text) { const m = String(text || "").match(/^(.*?)(\s*[^\d.,\s]+)\s*$/); if (m) return [m[1].trim(), m[2].trim()]; return [String(text || "").trim(), ""]; }; const formatPrice = function (value, currency) { const numText = formatter ? formatter.format(value) : value.toLocaleString("es-ES", { minimumFractionDigits: 2, maximumFractionDigits: 2 }); return currency ? numText + " " + currency : numText; }; const captureUnit = function () { const parts = splitPriceAndCurrency(priceNode.textContent); const parsed = _parsePriceText(parts[0]); if (parsed > 0) { purchaseBox.dataset.aeUnitPrice = String(parsed); purchaseBox.dataset.aeUnitCurrency = parts[1]; } }; let observer; const startObserve = function () { observer.observe(priceNode, { childList: true, characterData: true, subtree: true }); }; const reapply = function () { const unit = Number(purchaseBox.dataset.aeUnitPrice) || 0; if (!unit) return; const qty = Math.max(1, parseInt(qtyInput.value, 10) || 1); const total = unit * qty; const currency = purchaseBox.dataset.aeUnitCurrency || ""; if (observer) observer.disconnect(); priceNode.textContent = formatPrice(total, currency); if (observer) startObserve(); }; // Cuando _renderFragmentPrice (en ECOM-Global_functions/index.js) reescribe // .price con el precio unitario tras cambiar idioma/formato, recapturamos // el unitario y reaplicamos la cantidad actual. observer = new MutationObserver(function () { captureUnit(); reapply(); }); startObserve(); qtyInput.addEventListener("input", reapply); qtyInput.addEventListener("change", reapply); // Captura inicial por si el precio ya estaba renderizado antes de montar el observer. captureUnit(); reapply(); }; const _bindDetailSelectorState = function (purchaseBox) { if (!purchaseBox) return; const sync = function () { _syncDetailBuyButtonState(purchaseBox); }; if (purchaseBox.dataset.aeSelectorsBound === "true") { sync(); return; } purchaseBox.dataset.aeSelectorsBound = "true"; purchaseBox.addEventListener("change", function (event) { if (!event.target?.matches(".select-language, .select-format")) return; sync(); }); const selectorsRoot = purchaseBox.querySelector(".selector-language_format") || purchaseBox; const observer = new MutationObserver(function () { sync(); }); observer.observe(selectorsRoot, { childList: true, subtree: true }); sync(); }; const _attachDetailAddToCart = async function () { const buttons = document.querySelectorAll(".purchase-box .buy-btn"); if (!buttons.length) return; buttons.forEach(btn => { _bindDetailSelectorState(btn.closest(".purchase-box")); _setupQtyPriceMultiplier(btn.closest(".purchase-box")); if (btn.dataset.aeBound === "true") return; btn.dataset.aeBound = "true"; btn.addEventListener("click", (e) => { e.preventDefault(); const run = async () => { const ctx = _getDetailContext(btn); const wrapper = ctx.wrapper; if (!wrapper) { window.dispatchEvent(new CustomEvent("cart:error", { detail: { message: "Error al añadir el producto a la cesta" } })); return; } const productId = Number(wrapper.dataset.productId) || null; const productERC = wrapper.dataset.productErc || ""; const isLibro = wrapper.dataset.productIslibro === "true"; const isNorma = wrapper.dataset.productIsnorma === "true"; const isColeccionTematica = wrapper.dataset.productIscolecciontematica === "true"; const codIdioma = (ctx.langSelect?.value || "").toString(); const codFormato = (ctx.formatSelect?.value || "").toString(); if ((ctx.langSelect || ctx.formatSelect) && (!codIdioma || !codFormato)) { window.dispatchEvent(new CustomEvent("cart:error", { detail: { message: "Selecciona idioma y formato" } })); return; } const entryType = isLibro ? "Libro" : isColeccionTematica ? "Colección Temática" : "Norma"; const code = productERC || (ctx.titleNode?.textContent || "").trim(); const qty = Math.max(1, parseInt(ctx.qtyInput?.value, 10) || 1); const name = (ctx.titleNode?.textContent || "").trim(); let priceToSend = 0; const data = await _getDetailData(productERC, productId, isLibro, isNorma, isColeccionTematica); if (Array.isArray(data) && data.length && codIdioma && codFormato) { const entry = data.find(item => { const langKey = item.codLanguage ?? item.language; const fmtKey = item.codFormat ?? item.format; return String(langKey) === codIdioma && String(fmtKey) === codFormato; }); if (entry) { const basePrice = Number(entry.price) || 0; const discount = Number(entry.webDiscount) || 0; priceToSend = discount > 0 ? Math.floor((basePrice - (basePrice * discount / 100)) * 100) / 100 : basePrice; } } if (!priceToSend && ctx.priceNode) { priceToSend = _parsePriceText(ctx.priceNode.textContent); } await window.ecomGlobalScripts.functions.addToCart({ entryType: entryType, code: code, codIdioma: codIdioma, codFormato: codFormato, price: priceToSend, name: name, amount: qty }); }; const helper = window.ecomGlobalScripts?.functions?.withButtonSpinner; if (typeof helper === "function") { return helper(btn, run, { spinnerClass: "spinner-border spinner-border-sm text-light", mode: "replace" }); } return run(); }); }); }; const _DOMContentLoaded = async function() { //Event DOMContentLoaded if (publicProps.isDebug) console.log("DOMContentLoaded ecom Generic scripts"); if (publicProps.isDebug) console.log("DOMContentLoaded ecom Generic scripts - _loadInit execute"); await _loadInit(); await _attachDetailAddToCart(); }; // ---- Execute Listener DOMContentLoaded ---- document.addEventListener("DOMContentLoaded", async function() { await _DOMContentLoaded(); }); /* ===================================== API PÚBLICA ===================================== */ return { properties: publicProps, // properties public functions: functions // functions public }; })();

UNE 27689-1:1976