{"id":1085,"date":"2026-02-05T18:15:03","date_gmt":"2026-02-05T18:15:03","guid":{"rendered":"https:\/\/easarte.com\/?page_id=1085"},"modified":"2026-03-05T02:03:49","modified_gmt":"2026-03-05T02:03:49","slug":"lista-de-precios","status":"publish","type":"page","link":"https:\/\/easarte.com\/en\/lista-de-precios\/","title":{"rendered":"Price list"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1085\" class=\"elementor elementor-1085\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4302d74 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4302d74\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a146fcf\" data-id=\"a146fcf\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-14cbab9 elementor-widget elementor-widget-html\" data-id=\"14cbab9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"es\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n    <title>Lista de Precios | UMBRA|ES<\/title>\r\n\r\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=DM+Sans:opsz,wght@9..40,300;400;500;700;800&display=swap\" rel=\"stylesheet\">\r\n\r\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/html2canvas\/1.4.1\/html2canvas.min.js\"><\/script>\r\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js\"><\/script>\r\n\r\n    <style>\r\n        \/* --- UMBRA|ES: IDENTIDAD VISUAL --- *\/\r\n        :root {\r\n            --u-black: #000000;\r\n            --u-grey: #555;\r\n            --u-bg: #ffffff;\r\n        }\r\n\r\n        @font-face {\r\n            font-family: 'CODE';\r\n            src: local('CODE Bold'), local('CODE-Bold'), url('https:\/\/fonts.cdnfonts.com\/s\/14352\/Code-Bold.woff') format('woff');\r\n            font-weight: bold;\r\n        }\r\n\r\n        h1, h2, .hero-title, .hero-subtitle, .input-umbra, .select-umbra, .status-tag, .meta-bar, .hero-super-title, .btn-pdf, .valor-final {\r\n            font-family: 'CODE', 'Helvetica', sans-serif !important;\r\n            text-transform: uppercase;\r\n            font-weight: bold !important;\r\n            letter-spacing: 2px;\r\n        }\r\n\r\n        body, p, .intro-text, .ficha-tecnica, .obra-autor, .base-valor, .valor-final small {\r\n            font-family: 'DM Sans', sans-serif !important;\r\n        }\r\n\r\n        body { margin: 0; padding: 0; background-color: var(--u-bg); overflow-x: hidden; }\r\n\r\n        \/* --- PORTADA EDITORIAL --- *\/\r\n        .calendar-header-wrapper {\r\n            width: 100%;\r\n            max-width: 1200px;\r\n            margin: 0 auto;\r\n            padding: 120px 20px 80px 20px;\r\n            border-bottom: 1px solid var(--u-black);\r\n            text-align: center;\r\n        }\r\n\r\n        .hero-super-title {\r\n            font-size: 0.9rem;\r\n            margin-bottom: 40px;\r\n            display: inline-block;\r\n            border-bottom: 2px solid var(--u-black);\r\n            padding-bottom: 10px;\r\n        }\r\n\r\n        .hero-title { font-size: clamp(2.8rem, 7vw, 5rem); line-height: 0.85; margin: 0 0 25px 0; color: var(--u-black); }\r\n        .hero-subtitle { font-size: 2rem; color: #333; margin: 0 0 45px 0; display: block; }\r\n        .intro-text { font-size: 1.1rem; line-height: 1.6; color: var(--u-grey); max-width: 600px; margin: 0 auto 50px auto; font-weight: 300; }\r\n\r\n        .btn-pdf {\r\n            background-color: var(--u-black);\r\n            color: #fff;\r\n            border: 2px solid var(--u-black);\r\n            padding: 22px 50px;\r\n            font-size: 0.85rem;\r\n            cursor: pointer;\r\n            transition: all 0.3s ease;\r\n            margin: 20px 0;\r\n            display: inline-block;\r\n        }\r\n        .btn-pdf:hover { background-color: #333; transform: translateY(-3px); }\r\n        .btn-pdf:disabled { background-color: #999; border-color: #999; cursor: progress; }\r\n\r\n        .meta-bar { margin-top: 60px; display: flex; justify-content: center; gap: 40px; font-size: 1.3rem; }\r\n\r\n        \/* --- CONTROLES FLOTANTES UX --- *\/\r\n        .sticky-controls {\r\n            position: fixed; top: 0; left: 0; width: 100%; background: rgba(255, 255, 255, 0.98);\r\n            backdrop-filter: blur(10px); z-index: 2000; padding: 20px 40px;\r\n            border-bottom: 1px solid #eee; display: flex; gap: 20px; align-items: center;\r\n            box-sizing: border-box; transition: transform 0.5s ease, opacity 0.4s ease;\r\n        }\r\n        .nav-hidden { transform: translateY(-101%); opacity: 0; }\r\n\r\n        .input-umbra, .select-umbra {\r\n            width: 100%; padding: 10px 0; border: none; border-bottom: 1px solid #000;\r\n            font-size: 0.9rem; background: transparent; outline: none;\r\n        }\r\n\r\n        \/* --- GRID WEB --- *\/\r\n        .grid-obras { display: grid; grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); gap: 0; }\r\n        \r\n        .obra-card { \r\n            padding: 50px; border-right: 1px solid #eee; border-bottom: 1px solid #eee; \r\n            display: flex; flex-direction: column; background: #fff;\r\n        }\r\n        \r\n        .img-wrapper { \r\n            width: 100%; aspect-ratio: 1\/1; margin-bottom: 35px; display: flex; \r\n            align-items: center; justify-content: center; background-color: #fcfcfc;\r\n            padding: 20px; \/* Aire en la foto web *\/\r\n            box-sizing: border-box;\r\n        }\r\n        .img-wrapper img { max-width: 100%; max-height: 100%; object-fit: contain; }\r\n\r\n        \/* JUSTIFICADO CENTRAL PARA ORDENADOR Y M\u00d3VIL *\/\r\n        .obra-info { text-align: center; display: flex; flex-direction: column; align-items: center; }\r\n\r\n        .obra-info h2 { font-size: 1.6rem; margin: 0 0 10px 0; line-height: 1.2; color: #000; font-weight: 800; max-width: 90%; }\r\n        .obra-autor { \r\n            font-weight: 500; font-size: 1.05rem; color: #555; margin-bottom: 25px; \r\n            display: inline-block; border-bottom: 2px solid #000; padding: 0 15px 5px 15px; \r\n        }\r\n        \r\n        .ficha-tecnica { font-size: 0.95rem; line-height: 1.8; color: #333; font-weight: 300; margin-bottom: 35px; flex-grow: 1; }\r\n        .ficha-tecnica strong { font-weight: 700; color: #000; font-size: 0.9rem; }\r\n\r\n        .precio-container { display: flex; flex-direction: column; align-items: center; border-top: 1px solid #ddd; padding-top: 25px; margin-top: auto; width: 100%; }\r\n        .valor-final { font-size: 2.2rem; white-space: nowrap; margin: 0; }\r\n        .valor-final.texto-no-disponible { font-size: 1.2rem; color: #666; }\r\n\r\n        .status-tag { font-size: 0.8rem; padding: 6px 12px; border: 1px solid #000; white-space: nowrap; margin-top: 10px; }\r\n        .vendida { background: #000; color: #fff; }\r\n\r\n        .base-valor { font-size: 0.7rem; color: #999; margin-top: 15px; font-weight: 500; text-transform: uppercase; }\r\n\r\n        @media (max-width: 900px) {\r\n            .grid-obras { grid-template-columns: 1fr; }\r\n            .sticky-controls { top: auto; bottom: 25px; left: 5%; width: 90%; border-radius: 50px; flex-direction: row; padding: 12px 25px; box-shadow: 0 10px 30px rgba(0,0,0,0.1); }\r\n            .nav-hidden { transform: translateY(150%); }\r\n        }\r\n    <\/style>\r\n<\/head>\r\n<body>\r\n\r\n    <div class=\"calendar-header-wrapper\">\r\n        <span class=\"hero-super-title\">EDICI\u00d3N 2026<\/span>\r\n        <h1 class=\"hero-title\">LISTA DE PRECIOS<\/h1>\r\n        <h2 class=\"hero-subtitle\">UMBRA|ES<\/h2>\r\n        <div class=\"intro-text\">\r\n            <p>Cat\u00e1logo din\u00e1mico de disponibilidad y valuaci\u00f3n de obra. Todas las piezas incluyen certificado de autenticidad.<\/p>\r\n        <\/div>\r\n        <button id=\"btnPDF\" onclick=\"generarPDF()\" class=\"btn-pdf\">DESCARGAR CAT\u00c1LOGO PDF<\/button>\r\n    <\/div>\r\n\r\n    <div class=\"sticky-controls\" id=\"autoHideMenu\">\r\n        <input type=\"text\" id=\"obraSearch\" class=\"input-umbra\" placeholder=\"BUSCAR OBRA...\">\r\n        <select id=\"artistFilter\" class=\"select-umbra\"><option value=\"\">TODOS LOS ARTISTAS<\/option><\/select>\r\n    <\/div>\r\n\r\n    <div id=\"grid\" class=\"grid-obras\"><\/div>\r\n\r\n<script>\r\n    let globalData = [];\r\n    let currentFiltered = [];\r\n    let isScrolling;\r\n    const menu = document.getElementById('autoHideMenu');\r\n\r\n    window.addEventListener('scroll', () => {\r\n        menu.classList.remove('nav-hidden');\r\n        window.clearTimeout(isScrolling);\r\n        isScrolling = setTimeout(() => { menu.classList.add('nav-hidden'); }, 1800);\r\n    });\r\n\r\n    function fixImage(url) {\r\n        if(!url) return \"\";\r\n        const m = url.match(\/\\\/d\\\/([^\/]+)\/) || url.match(\/id=([^&]+)\/);\r\n        return m ? `http:\/\/googleusercontent.com\/profile\/picture\/3{m[1]}=s1500` : url;\r\n    }\r\n\r\n    async function init() {\r\n        const url = \"https:\/\/docs.google.com\/spreadsheets\/d\/e\/2PACX-1vTJwx_xoNFNjz_7Y7c0SwuxjeAV9sIjYkEXE4ZB47mLjJ0xvkMIHPSA3gWcpj3SKw\/pub?output=csv\";\r\n        try {\r\n            const res = await fetch(url + \"&t=\" + Date.now());\r\n            const csv = await res.text();\r\n            const rows = csv.split(\"\\n\").slice(6);\r\n\r\n            globalData = rows.map(r => {\r\n                const c = r.split(\/,(?=(?:(?:[^\"]*\"){2})*[^\"]*$)\/);\r\n                if(c.length < 11 || !c[2]) return null;\r\n                return {\r\n                    titulo: c[2].replace(\/\"\/g,\"\").trim(),\r\n                    autor: c[3].replace(\/\"\/g,\"\").trim(),\r\n                    tecnica: c[4].replace(\/\"\/g,\"\").trim(),\r\n                    medidas: c[5].replace(\/\"\/g,\"\").trim(),\r\n                    a\u00f1o: c[6].replace(\/\"\/g,\"\").trim(),\r\n                    valor: c[7].replace(\/\"\/g,\"\").trim(),\r\n                    moneda: c[8].replace(\/\"\/g,\"\").trim(),\r\n                    base: c[9]?.replace(\/\"\/g,\"\").trim() || \"Recibo, Factura y\/o Certificado\",\r\n                    img: fixImage(c[10].trim()),\r\n                    estatus: (c[11] || \"DISPONIBLE\").toUpperCase()\r\n                };\r\n            }).filter(x => x);\r\n\r\n            const select = document.getElementById('artistFilter');\r\n            [...new Set(globalData.map(o => o.autor))].sort().forEach(a => {\r\n                const opt = document.createElement('option');\r\n                opt.value = a; opt.textContent = a;\r\n                select.appendChild(opt);\r\n            });\r\n\r\n            currentFiltered = globalData;\r\n            render(currentFiltered);\r\n        } catch(e) { console.error(e); }\r\n    }\r\n\r\n    function render(items) {\r\n        document.getElementById(\"grid\").innerHTML = items.map(o => {\r\n            const isV = o.estatus.includes(\"VENDIDA\");\r\n            const isNoDisp = o.valor.toUpperCase().includes(\"NO DISPONIBLE\");\r\n            \r\n            return `\r\n                <div class=\"obra-card\" style=\"opacity: ${isV ? '0.5' : '1'}\">\r\n                    <div class=\"img-wrapper\"><img decoding=\"async\" src=\"${o.img}\" crossorigin=\"anonymous\"><\/div>\r\n                    <div class=\"obra-info\">\r\n                        <h2>${o.titulo}<\/h2>\r\n                        <span class=\"obra-autor\">${o.autor}<\/span>\r\n                        <div class=\"ficha-tecnica\">\r\n                            <strong>T\u00c9CNICA:<\/strong> ${o.tecnica}<br>\r\n                            <strong>MEDIDAS:<\/strong> ${o.medidas}<br>\r\n                            <strong>A\u00d1O:<\/strong> ${o.a\u00f1o}\r\n                        <\/div>\r\n                        <div class=\"precio-container\">\r\n                            <p class=\"valor-final ${isNoDisp ? 'texto-no-disponible' : ''}\">\r\n                                ${o.valor} ${isNoDisp ? '' : `<small style=\"font-size:0.45em; color:#666;\">${o.moneda}<\/small>`}\r\n                            <\/p>\r\n                            ${isV ? '<span class=\"status-tag vendida\">VENDIDA<\/span>' : ''}\r\n                        <\/div>\r\n                        <div class=\"base-valor\">INCLUYE: ${o.base}<\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            `;\r\n        }).join(\"\");\r\n    }\r\n\r\n    function applyFilters() {\r\n        const q = document.getElementById('obraSearch').value.toLowerCase();\r\n        const a = document.getElementById('artistFilter').value;\r\n        currentFiltered = globalData.filter(o => (o.titulo.toLowerCase().includes(q) || o.tecnica.toLowerCase().includes(q)) && (a === \"\" || o.autor === a));\r\n        render(currentFiltered);\r\n    }\r\n    document.getElementById('obraSearch').addEventListener('input', applyFilters);\r\n    document.getElementById('artistFilter').addEventListener('change', applyFilters);\r\n\r\n    \/\/ --- MOTOR PDF: REFINADO CON ZONA DE SEGURIDAD PARA KATYA ---\r\n    async function generarPDF() {\r\n        const btn = document.getElementById(\"btnPDF\");\r\n        btn.disabled = true;\r\n        btn.innerText = \"PROCESANDO CAT\u00c1LOGO...\";\r\n\r\n        const { jsPDF } = window.jspdf;\r\n        const pdf = new jsPDF({ orientation: \"portrait\", unit: \"px\", format: [1080, 1920] });\r\n\r\n        const container = document.createElement(\"div\");\r\n        container.style.cssText = \"position:fixed; left:-9999px; top:0; width:1080px; background:#ffffff;\";\r\n        document.body.appendChild(container);\r\n\r\n        for(let i = 0; i < currentFiltered.length; i++) {\r\n            const o = currentFiltered[i];\r\n            const isNoDisp = o.valor.toUpperCase().includes(\"NO DISPONIBLE\");\r\n            const isV = o.estatus.includes(\"VENDIDA\");\r\n\r\n            btn.innerText = `GENERANDO P\u00c1GINA ${i+1}\/${currentFiltered.length}`;\r\n\r\n            container.innerHTML = `\r\n                <div style=\"width:1080px; height:1920px; background:#ffffff; display:flex; flex-direction:column; align-items:center; font-family:'DM Sans',sans-serif; box-sizing:border-box; position:relative;\">\r\n                    \r\n                    <div style=\"height:80px; width:100%;\"><\/div>\r\n\r\n                    <div style=\"height:820px; width:920px; display:flex; align-items:center; justify-content:center; padding:40px; box-sizing:border-box; background:#ffffff;\">\r\n                        <img decoding=\"async\" id=\"imgpdf\" src=\"${o.img}\" crossorigin=\"anonymous\" style=\"max-width:100%; max-height:100%; object-fit:contain;\">\r\n                    <\/div>\r\n\r\n                    <div style=\"padding:40px 140px 180px 140px; text-align:center; width:100%; box-sizing:border-box; display:flex; flex-direction:column; align-items:center;\">\r\n                        \r\n                        <h1 style=\"font-size:62px; font-weight:800; margin:0 0 15px 0; line-height:1.1; color:#000; text-transform:uppercase;\">${o.titulo}<\/h1>\r\n                        \r\n                        <p style=\"font-size:38px; margin:0; font-weight:500; color:#444; text-transform:uppercase; border-bottom:3px solid #000; padding-bottom:8px; display:inline-block; margin-bottom:40px;\">${o.autor}<\/p>\r\n                        \r\n                        <div style=\"font-size:32px; line-height:1.6; color:#333; font-weight:300; margin-bottom:50px;\">\r\n                            <span style=\"font-weight:700;\">T\u00c9CNICA:<\/span> ${o.tecnica}<br>\r\n                            <span style=\"font-weight:700;\">MEDIDAS:<\/span> ${o.medidas}<br>\r\n                            <span style=\"font-weight:700;\">A\u00d1O:<\/span> ${o.a\u00f1o}\r\n                        <\/div>\r\n\r\n                        <div style=\"margin-top:auto;\">\r\n                            <p style=\"font-size:${isNoDisp ? '42px':'72px'}; font-weight:800; color:#000; margin:0;\">\r\n                                ${o.valor} ${isNoDisp ? '' : `<span style=\"font-size:30px; color:#777; font-weight:400;\">${o.moneda}<\/span>`}\r\n                            <\/p>\r\n                            ${isV ? '<div style=\"background:#000; color:#fff; display:inline-block; padding:15px 40px; font-size:26px; font-weight:bold; margin-top:20px; letter-spacing:2px;\">VENDIDA<\/div>' : ''}\r\n                            <p style=\"font-size:22px; color:#aaa; margin-top:30px; text-transform:uppercase; font-weight:500;\">INCLUYE: ${o.base}<\/p>\r\n                        <\/div>\r\n                    <\/div>\r\n\r\n                    <div style=\"position:absolute; bottom:70px; left:0; width:100%; text-align:center; font-size:26px; color:#000; font-weight:bold; letter-spacing:5px;\">UMBRA|ES<\/div>\r\n                <\/div>\r\n            `;\r\n\r\n            const img = container.querySelector(\"#imgpdf\");\r\n            await new Promise(r => { if(img.complete) r(); else { img.onload = r; img.onerror = r; } });\r\n            await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r)));\r\n\r\n            const canvas = await html2canvas(container, { scale: 1.5, useCORS: true, backgroundColor: \"#ffffff\" });\r\n            const imgData = canvas.toDataURL(\"image\/jpeg\", 0.90);\r\n\r\n            if(i > 0) pdf.addPage();\r\n            pdf.addImage(imgData, \"JPEG\", 0, 0, 1080, 1920);\r\n        }\r\n\r\n        pdf.save(\"Catalogo_UMBRA_Curaduria.pdf\");\r\n        document.body.removeChild(container);\r\n        btn.disabled = false;\r\n        btn.innerText = \"DESCARGAR CAT\u00c1LOGO PDF\";\r\n    }\r\n\r\n    init();\r\n<\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Lista de Precios | UMBRA|ES EDICI\u00d3N 2026 LISTA DE PRECIOS UMBRA|ES Cat\u00e1logo din\u00e1mico de disponibilidad y valuaci\u00f3n de obra. Todas las piezas incluyen certificado de autenticidad. DESCARGAR CAT\u00c1LOGO PDF TODOS LOS ARTISTAS<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-1085","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/easarte.com\/en\/wp-json\/wp\/v2\/pages\/1085","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/easarte.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/easarte.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/easarte.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/easarte.com\/en\/wp-json\/wp\/v2\/comments?post=1085"}],"version-history":[{"count":199,"href":"https:\/\/easarte.com\/en\/wp-json\/wp\/v2\/pages\/1085\/revisions"}],"predecessor-version":[{"id":2081,"href":"https:\/\/easarte.com\/en\/wp-json\/wp\/v2\/pages\/1085\/revisions\/2081"}],"wp:attachment":[{"href":"https:\/\/easarte.com\/en\/wp-json\/wp\/v2\/media?parent=1085"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}