{"id":299,"date":"2026-04-20T01:11:44","date_gmt":"2026-04-20T01:11:44","guid":{"rendered":"https:\/\/goitiaperfumes.ex31.net\/?page_id=299"},"modified":"2026-04-20T01:11:47","modified_gmt":"2026-04-20T01:11:47","slug":"goitia-perfumes-2","status":"publish","type":"page","link":"https:\/\/goitiaperfumes.ex31.net\/index.php\/goitia-perfumes-2\/","title":{"rendered":"Goitia Perfumes"},"content":{"rendered":"\n<div class=\"wp-block-cover alignfull is-light\" style=\"margin-top:0;padding-top:5vw;padding-right:5vw;padding-bottom:5vw;padding-left:5vw;min-height:66vh;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim has-background-gradient\" style=\"background:linear-gradient(90deg,rgb(35,74,20) 50%,rgb(225,137,116) 50%)\"><\/span><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-group wp-container-content-9cfa9a5a\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-7cac7b9f wp-block-group-is-layout-constrained\">\n<div style=\"height:746px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<!DOCTYPE html>\n<html lang=\"es\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>\u00c9LIXIR \u2014 Eau de Parfum<\/title>\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Cormorant+Garamond:wght@300;400;600&#038;family=Outfit:wght@200;300;400&#038;display=swap\" rel=\"stylesheet\">\n    <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.5.0\/css\/all.min.css\">\n    <style>\n        *{margin:0;padding:0;box-sizing:border-box}\n        body{background:#000;overflow:hidden;font-family:'Outfit',sans-serif;color:#fff}\n        canvas{display:block}\n\n        .vignette{\n            position:fixed;inset:0;pointer-events:none;z-index:1;\n            background:radial-gradient(ellipse at center,transparent 35%,rgba(0,0,0,0.85) 100%);\n        }\n\n        .brand-header{\n            position:fixed;top:36px;left:50%;transform:translateX(-50%);\n            text-align:center;z-index:2;pointer-events:none;\n            animation:fadeDown 2.2s cubic-bezier(.22,1,.36,1) both;\n        }\n        .brand-header h1{\n            font-family:'Cormorant Garamond',serif;font-weight:300;\n            font-size:clamp(1.6rem,4vw,2.8rem);letter-spacing:1.1em;\n            color:rgba(212,175,55,0.88);text-transform:uppercase;\n            text-indent:1.1em;\n        }\n        .brand-header p{\n            font-weight:200;font-size:clamp(0.55rem,1.2vw,0.72rem);\n            letter-spacing:.55em;color:rgba(255,255,255,0.32);\n            margin-top:10px;text-transform:uppercase;text-indent:.55em;\n        }\n\n        .controls-panel{\n            position:fixed;bottom:28px;right:28px;z-index:10;\n            background:rgba(8,8,14,0.65);\n            backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);\n            border:1px solid rgba(212,175,55,0.12);\n            border-radius:18px;padding:26px 24px;width:256px;\n            animation:slideLeft 1s cubic-bezier(.22,1,.36,1) .6s both;\n        }\n        .controls-panel h3{\n            font-family:'Cormorant Garamond',serif;font-weight:300;\n            font-size:.9rem;letter-spacing:.35em;\n            color:rgba(212,175,55,0.75);text-transform:uppercase;\n            margin-bottom:22px;padding-bottom:14px;\n            border-bottom:1px solid rgba(212,175,55,0.08);\n        }\n        .control-group{margin-bottom:20px}\n        .control-group:last-child{margin-bottom:0}\n        .control-group label{\n            display:flex;justify-content:space-between;align-items:center;\n            font-size:.65rem;font-weight:300;letter-spacing:.16em;\n            color:rgba(255,255,255,0.42);text-transform:uppercase;margin-bottom:10px;\n        }\n        .control-group label span{\n            color:rgba(212,175,55,0.65);font-weight:400;font-size:.7rem;\n            min-width:24px;text-align:right;\n        }\n\n        input[type=\"range\"]{\n            -webkit-appearance:none;appearance:none;width:100%;height:2px;\n            background:rgba(212,175,55,0.15);border-radius:1px;outline:none;cursor:pointer;\n        }\n        input[type=\"range\"]::-webkit-slider-thumb{\n            -webkit-appearance:none;width:14px;height:14px;border-radius:50%;\n            background:radial-gradient(circle at 35% 35%,#f0d060,#D4AF37);\n            cursor:pointer;\n            box-shadow:0 0 14px rgba(212,175,55,0.45),0 0 4px rgba(212,175,55,0.8);\n            transition:box-shadow .3s;\n        }\n        input[type=\"range\"]::-webkit-slider-thumb:hover{\n            box-shadow:0 0 22px rgba(212,175,55,0.7),0 0 6px rgba(212,175,55,1);\n        }\n        input[type=\"range\"]::-moz-range-thumb{\n            width:14px;height:14px;border-radius:50%;border:none;\n            background:radial-gradient(circle at 35% 35%,#f0d060,#D4AF37);\n            cursor:pointer;box-shadow:0 0 14px rgba(212,175,55,0.45);\n        }\n\n        .btn-toggle{\n            display:flex;align-items:center;justify-content:center;width:100%;\n            padding:11px 12px;\n            background:rgba(212,175,55,0.06);\n            border:1px solid rgba(212,175,55,0.18);border-radius:10px;\n            color:rgba(212,175,55,0.85);\n            font-family:'Outfit',sans-serif;font-size:.65rem;font-weight:300;\n            letter-spacing:.22em;text-transform:uppercase;cursor:pointer;\n            transition:all .35s cubic-bezier(.22,1,.36,1);\n        }\n        .btn-toggle:hover{\n            background:rgba(212,175,55,0.12);\n            border-color:rgba(212,175,55,0.35);\n            color:rgba(212,175,55,1);\n        }\n        .btn-toggle:active{transform:scale(0.97)}\n        .btn-toggle i{margin-right:8px;font-size:.6rem}\n\n        .hint{\n            position:fixed;bottom:28px;left:28px;z-index:10;\n            font-size:.58rem;font-weight:200;letter-spacing:.12em;\n            color:rgba(255,255,255,0.18);\n            animation:fadeDown 2s cubic-bezier(.22,1,.36,1) 1.5s both;\n            pointer-events:none;\n        }\n\n        @keyframes fadeDown{\n            from{opacity:0;transform:translateX(-50%) translateY(-18px)}\n            to{opacity:1;transform:translateX(-50%) translateY(0)}\n        }\n        @keyframes slideLeft{\n            from{opacity:0;transform:translateX(40px)}\n            to{opacity:1;transform:translateX(0)}\n        }\n\n        @media(max-width:640px){\n            .controls-panel{bottom:14px;right:14px;left:14px;width:auto;padding:20px 18px}\n            .hint{display:none}\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"vignette\"><\/div>\n\n    <header class=\"brand-header\">\n        <h1>\u00c9lixir<\/h1>\n        <p>Eau de Parfum Intense<\/p>\n    <\/header>\n\n    <aside class=\"controls-panel\" role=\"region\" aria-label=\"Controles de visualizaci\u00f3n\">\n        <h3>Controles<\/h3>\n        <div class=\"control-group\">\n            <label>Rotaci\u00f3n Autom\u00e1tica<\/label>\n            <button class=\"btn-toggle\" id=\"btnRotate\" aria-label=\"Pausar rotaci\u00f3n autom\u00e1tica\">\n                <i class=\"fas fa-pause\"><\/i> Pausar\n            <\/button>\n        <\/div>\n        <div class=\"control-group\">\n            <label>Velocidad de Giro <span id=\"speedVal\">50<\/span><\/label>\n            <input type=\"range\" id=\"speedSlider\" min=\"0\" max=\"100\" value=\"50\" aria-label=\"Velocidad de giro\">\n        <\/div>\n        <div class=\"control-group\">\n            <label>Zoom <span id=\"zoomVal\">50<\/span><\/label>\n            <input type=\"range\" id=\"zoomSlider\" min=\"5\" max=\"95\" value=\"50\" aria-label=\"Nivel de zoom\">\n        <\/div>\n        <div class=\"control-group\">\n            <label>Intensidad Lum\u00ednica <span id=\"lightVal\">65<\/span><\/label>\n            <input type=\"range\" id=\"lightSlider\" min=\"5\" max=\"100\" value=\"65\" aria-label=\"Intensidad de la luz\">\n        <\/div>\n    <\/aside>\n\n    <div class=\"hint\">Arrastra para rotar &middot; Desliza para orbitar<\/div>\n\n    <script type=\"importmap\">\n    {\n        \"imports\": {\n            \"three\": \"https:\/\/unpkg.com\/three@0.160.0\/build\/three.module.js\",\n            \"three\/addons\/\": \"https:\/\/unpkg.com\/three@0.160.0\/examples\/jsm\/\"\n        }\n    }\n    <\/script>\n\n    <script type=\"module\">\n        import * as THREE from 'three';\n        import { OrbitControls } from 'three\/addons\/controls\/OrbitControls.js';\n        import { EffectComposer } from 'three\/addons\/postprocessing\/EffectComposer.js';\n        import { RenderPass } from 'three\/addons\/postprocessing\/RenderPass.js';\n        import { UnrealBloomPass } from 'three\/addons\/postprocessing\/UnrealBloomPass.js';\n        import { OutputPass } from 'three\/addons\/postprocessing\/OutputPass.js';\n        import { RoomEnvironment } from 'three\/addons\/environments\/RoomEnvironment.js';\n\n        \/* ============================\n           RENDERER \u2014 M\u00e1xima calidad\n           ============================ *\/\n        const renderer = new THREE.WebGLRenderer({\n            antialias: true,\n            powerPreference: 'high-performance'\n        });\n        renderer.setSize(window.innerWidth, window.innerHeight);\n        renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n        renderer.toneMapping = THREE.ACESFilmicToneMapping;\n        renderer.toneMappingExposure = 1.15;\n        renderer.shadowMap.enabled = true;\n        renderer.shadowMap.type = THREE.PCFSoftShadowMap;\n        document.body.appendChild(renderer.domElement);\n\n        \/* ============================\n           ESCENA & ENTORNO\n           ============================ *\/\n        const scene = new THREE.Scene();\n        scene.background = new THREE.Color(0x000000);\n\n        \/\/ Generar environment map de estudio para reflejos PBR\n        const pmremGenerator = new THREE.PMREMGenerator(renderer);\n        pmremGenerator.compileEquirectangularShader();\n        const envTexture = pmremGenerator.fromScene(new RoomEnvironment(), 0.04).texture;\n        scene.environment = envTexture;\n        pmremGenerator.dispose();\n\n        \/* ============================\n           C\u00c1MARA\n           ============================ *\/\n        const camera = new THREE.PerspectiveCamera(\n            32, window.innerWidth \/ window.innerHeight, 0.1, 100\n        );\n        camera.position.set(4.5, 3.2, 6.5);\n\n        \/* ============================\n           CONTROLES ORBITALES\n           ============================ *\/\n        const controls = new OrbitControls(camera, renderer.domElement);\n        controls.enableDamping = true;\n        controls.dampingFactor = 0.04;\n        controls.minDistance = 2.8;\n        controls.maxDistance = 9.5;\n        controls.maxPolarAngle = Math.PI * 0.82;\n        controls.minPolarAngle = Math.PI * 0.12;\n        controls.target.set(0, 1.9, 0);\n        controls.enablePan = false;\n        controls.enableZoom = false; \/\/ Zoom controlado por slider\n        controls.update();\n\n        \/* ============================\n           GRUPO DE LA BOTELLA\n           ============================ *\/\n        const bottleGroup = new THREE.Group();\n        scene.add(bottleGroup);\n\n        \/* --- Perfil del cuerpo (LatheGeometry) --- *\/\n        function makeBottleProfile() {\n            const p = [\n                [0.001, 0], [0.70, 0], [0.77, 0.035],\n                [0.83, 0.10], [0.89, 0.24], [0.94, 0.48],\n                [0.97, 0.76], [0.99, 1.08], [1.01, 1.42],\n                [1.02, 1.76], [1.02, 2.02], [1.0, 2.20],\n                [0.94, 2.38], [0.84, 2.54], [0.70, 2.68],\n                [0.54, 2.80], [0.42, 2.89], [0.34, 2.98],\n                [0.30, 3.12], [0.30, 3.38],\n                [0.32, 3.42], [0.36, 3.45],\n                [0.36, 3.50], [0.33, 3.53],\n                [0.30, 3.53], [0.001, 3.53]\n            ];\n            return p.map(v => new THREE.Vector2(v[0], v[1]));\n        }\n\n        \/* --- Perfil del l\u00edquido interior --- *\/\n        function makeLiquidProfile() {\n            const w = 0.055; \/\/ Grosor del vidrio\n            const lvl = 2.05;\n            const p = [\n                [0.001, 0.055],\n                [0.645, 0.055], [0.715, 0.09],\n                [0.775, 0.155], [0.835, 0.30],\n                [0.885, 0.54], [0.915, 0.82],\n                [0.935, 1.08], [0.955, 1.42],\n                [0.965, 1.76], [0.965, 2.02],\n                [0.001, lvl]\n            ];\n            return p.map(v => new THREE.Vector2(v[0], v[1]));\n        }\n\n        \/* ============================\n           MATERIALES PBR\n           ============================ *\/\n        \/\/ Vidrio transparente de alta calidad\n        const glassMat = new THREE.MeshPhysicalMaterial({\n            color: 0xffffff,\n            transmission: 0.97,\n            roughness: 0.015,\n            metalness: 0,\n            ior: 1.52,\n            thickness: 1.1,\n            envMapIntensity: 1.6,\n            clearcoat: 1,\n            clearcoatRoughness: 0.02,\n            side: THREE.DoubleSide,\n        });\n\n        \/\/ L\u00edquido \u00e1mbar\/dorado\n        const liquidMat = new THREE.MeshPhysicalMaterial({\n            color: 0xC8921A,\n            transmission: 0.48,\n            roughness: 0.0,\n            metalness: 0.04,\n            ior: 1.36,\n            thickness: 2.8,\n            envMapIntensity: 0.5,\n            side: THREE.DoubleSide,\n            attenuationColor: new THREE.Color(0x7A5510),\n            attenuationDistance: 0.45,\n        });\n\n        \/\/ Oro pulido\n        const goldMat = new THREE.MeshPhysicalMaterial({\n            color: 0xD4AF37,\n            metalness: 1,\n            roughness: 0.10,\n            envMapIntensity: 2.0,\n            clearcoat: 0.6,\n            clearcoatRoughness: 0.08,\n        });\n\n        \/\/ Metal oscuro especular\n        const darkMetalMat = new THREE.MeshPhysicalMaterial({\n            color: 0x06060C,\n            metalness: 1,\n            roughness: 0.06,\n            envMapIntensity: 2.2,\n            clearcoat: 1,\n            clearcoatRoughness: 0.03,\n        });\n\n        \/\/ Metal oscuro facetado (para la tapa octogonal)\n        const darkFacetedMat = new THREE.MeshPhysicalMaterial({\n            color: 0x07070E,\n            metalness: 1,\n            roughness: 0.07,\n            envMapIntensity: 2.4,\n            clearcoat: 1,\n            clearcoatRoughness: 0.04,\n            flatShading: true,\n        });\n\n        \/* ============================\n           CONSTRUIR LA BOTELLA\n           ============================ *\/\n        \/\/ Cuerpo de vidrio\n        const bottleGeo = new THREE.LatheGeometry(makeBottleProfile(), 72);\n        const bottleMesh = new THREE.Mesh(bottleGeo, glassMat);\n        bottleMesh.castShadow = true;\n        bottleMesh.receiveShadow = true;\n        bottleGroup.add(bottleMesh);\n\n        \/\/ L\u00edquido interior\n        const liquidGeo = new THREE.LatheGeometry(makeLiquidProfile(), 72);\n        const liquidMesh = new THREE.Mesh(liquidGeo, liquidMat);\n        bottleGroup.add(liquidMesh);\n\n        \/\/ --- Anillos decorativos dorados ---\n        \/\/ Collar del cuello\n        const collarGeo = new THREE.TorusGeometry(0.34, 0.04, 16, 48);\n        const collar = new THREE.Mesh(collarGeo, goldMat);\n        collar.position.y = 3.49;\n        collar.rotation.x = Math.PI \/ 2;\n        bottleGroup.add(collar);\n\n        \/\/ Anillo inferior del cuello\n        const neckRingGeo = new THREE.TorusGeometry(0.37, 0.014, 12, 48);\n        const neckRing = new THREE.Mesh(neckRingGeo, goldMat);\n        neckRing.position.y = 3.05;\n        neckRing.rotation.x = Math.PI \/ 2;\n        bottleGroup.add(neckRing);\n\n        \/\/ Anillo de la base\n        const baseRingGeo = new THREE.TorusGeometry(0.73, 0.016, 12, 48);\n        const baseRing = new THREE.Mesh(baseRingGeo, goldMat);\n        baseRing.position.y = 0.01;\n        baseRing.rotation.x = Math.PI \/ 2;\n        bottleGroup.add(baseRing);\n\n        \/\/ --- TAPA ---\n        \/\/ Base cil\u00edndrica dorada\n        const capBaseGeo = new THREE.CylinderGeometry(0.39, 0.37, 0.14, 32);\n        const capBase = new THREE.Mesh(capBaseGeo, goldMat);\n        capBase.position.y = 3.60;\n        bottleGroup.add(capBase);\n\n        \/\/ Cuerpo octogonal facetado (cristal oscuro)\n        const capBodyGeo = new THREE.CylinderGeometry(0.35, 0.38, 0.95, 8);\n        const capBody = new THREE.Mesh(capBodyGeo, darkFacetedMat);\n        capBody.position.y = 4.14;\n        capBody.castShadow = true;\n        bottleGroup.add(capBody);\n\n        \/\/ Aro dorado central en la tapa\n        const capRingGeo = new THREE.TorusGeometry(0.365, 0.016, 12, 8);\n        const capRing = new THREE.Mesh(capRingGeo, goldMat);\n        capRing.position.y = 4.14;\n        capRing.rotation.x = Math.PI \/ 2;\n        bottleGroup.add(capRing);\n\n        \/\/ Disco dorado superior\n        const capTopGeo = new THREE.CylinderGeometry(0.30, 0.34, 0.04, 32);\n        const capTop = new THREE.Mesh(capTopGeo, goldMat);\n        capTop.position.y = 4.635;\n        bottleGroup.add(capTop);\n\n        \/\/ Peque\u00f1a c\u00fapula en el tope\n        const capDomeGeo = new THREE.SphereGeometry(0.28, 24, 12, 0, Math.PI * 2, 0, Math.PI \/ 2);\n        const capDome = new THREE.Mesh(capDomeGeo, darkMetalMat);\n        capDome.position.y = 4.655;\n        bottleGroup.add(capDome);\n\n        \/* ============================\n           SUELO REFLECTANTE\n           ============================ *\/\n        const floorGeo = new THREE.CircleGeometry(7, 64);\n        const floorMat = new THREE.MeshPhysicalMaterial({\n            color: 0x020204,\n            metalness: 0.96,\n            roughness: 0.06,\n            envMapIntensity: 0.35,\n        });\n        const floor = new THREE.Mesh(floorGeo, floorMat);\n        floor.rotation.x = -Math.PI \/ 2;\n        floor.position.y = -0.02;\n        floor.receiveShadow = true;\n        scene.add(floor);\n\n        \/* ============================\n           RESPLANDOR BAJO LA BOTELLA\n           ============================ *\/\n        function makeGlowTexture() {\n            const c = document.createElement('canvas');\n            c.width = c.height = 256;\n            const ctx = c.getContext('2d');\n            const g = ctx.createRadialGradient(128, 128, 0, 128, 128, 128);\n            g.addColorStop(0, 'rgba(212,175,55,0.22)');\n            g.addColorStop(0.35, 'rgba(180,140,30,0.07)');\n            g.addColorStop(1, 'rgba(0,0,0,0)');\n            ctx.fillStyle = g;\n            ctx.fillRect(0, 0, 256, 256);\n            return new THREE.CanvasTexture(c);\n        }\n        const glowPlane = new THREE.Mesh(\n            new THREE.PlaneGeometry(5, 5),\n            new THREE.MeshBasicMaterial({\n                map: makeGlowTexture(),\n                transparent: true,\n                blending: THREE.AdditiveBlending,\n                depthWrite: false,\n            })\n        );\n        glowPlane.rotation.x = -Math.PI \/ 2;\n        glowPlane.position.y = 0.005;\n        scene.add(glowPlane);\n\n        \/* ============================\n           PART\u00cdCULAS FLOTANTES\n           ============================ *\/\n        const PARTICLE_COUNT = 180;\n        const pGeo = new THREE.BufferGeometry();\n        const pPos = new Float32Array(PARTICLE_COUNT * 3);\n        const pVel = new Float32Array(PARTICLE_COUNT * 3);\n        for (let i = 0; i < PARTICLE_COUNT; i++) {\n            pPos[i * 3]     = (Math.random() - 0.5) * 12;\n            pPos[i * 3 + 1] = Math.random() * 8;\n            pPos[i * 3 + 2] = (Math.random() - 0.5) * 12;\n            pVel[i * 3]     = (Math.random() - 0.5) * 0.002;\n            pVel[i * 3 + 1] = (Math.random() - 0.5) * 0.0015;\n            pVel[i * 3 + 2] = (Math.random() - 0.5) * 0.002;\n        }\n        pGeo.setAttribute('position', new THREE.BufferAttribute(pPos, 3));\n\n        function makeParticleTex() {\n            const c = document.createElement('canvas');\n            c.width = c.height = 64;\n            const ctx = c.getContext('2d');\n            const g = ctx.createRadialGradient(32, 32, 0, 32, 32, 32);\n            g.addColorStop(0, 'rgba(255,240,200,1)');\n            g.addColorStop(0.15, 'rgba(212,175,55,0.7)');\n            g.addColorStop(0.5, 'rgba(212,175,55,0.12)');\n            g.addColorStop(1, 'rgba(212,175,55,0)');\n            ctx.fillStyle = g;\n            ctx.fillRect(0, 0, 64, 64);\n            return new THREE.CanvasTexture(c);\n        }\n        const particles = new THREE.Points(pGeo, new THREE.PointsMaterial({\n            map: makeParticleTex(),\n            size: 0.09,\n            transparent: true,\n            opacity: 0.6,\n            blending: THREE.AdditiveBlending,\n            depthWrite: false,\n            sizeAttenuation: true,\n        }));\n        scene.add(particles);\n\n        \/* ============================\n           ILUMINACI\u00d3N DRAM\u00c1TICA\n           ============================ *\/\n        \/\/ Luz clave \u2014 c\u00e1lida, lateral superior derecha\n        const keyLight = new THREE.SpotLight(0xFFF0D0, 45);\n        keyLight.position.set(3.5, 6.5, 3);\n        keyLight.angle = Math.PI \/ 7;\n        keyLight.penumbra = 0.55;\n        keyLight.decay = 1.4;\n        keyLight.distance = 22;\n        keyLight.castShadow = true;\n        keyLight.shadow.mapSize.set(1024, 1024);\n        keyLight.shadow.bias = -0.0002;\n        keyLight.target.position.set(0, 1.5, 0);\n        scene.add(keyLight, keyLight.target);\n\n        \/\/ Luz de relleno \u2014 fr\u00eda, desde la izquierda\n        const fillLight = new THREE.SpotLight(0xC8DDFF, 14);\n        fillLight.position.set(-4.5, 4, 2.5);\n        fillLight.angle = Math.PI \/ 5;\n        fillLight.penumbra = 0.8;\n        fillLight.decay = 1.4;\n        fillLight.distance = 16;\n        fillLight.target.position.set(0, 1.8, 0);\n        scene.add(fillLight, fillLight.target);\n\n        \/\/ Luz de contorno (rim) \u2014 desde atr\u00e1s, intensa\n        const rimLight = new THREE.SpotLight(0xFFFFFF, 30);\n        rimLight.position.set(-1, 5.5, -4.5);\n        rimLight.angle = Math.PI \/ 8;\n        rimLight.penumbra = 0.35;\n        rimLight.decay = 1.4;\n        rimLight.distance = 18;\n        rimLight.target.position.set(0, 2.2, 0);\n        scene.add(rimLight, rimLight.target);\n\n        \/\/ Acento dorado lateral\n        const accentLight = new THREE.PointLight(0xD4AF37, 10, 9, 1.5);\n        accentLight.position.set(1.8, 0.6, 3.2);\n        scene.add(accentLight);\n\n        \/\/ Rebote inferior sutil\n        const bottomFill = new THREE.PointLight(0x0e0e22, 4, 7, 2);\n        bottomFill.position.set(0, -0.3, 0);\n        scene.add(bottomFill);\n\n        \/\/ Ambient m\u00ednimo\n        scene.add(new THREE.AmbientLight(0x080810, 0.25));\n\n        \/\/ Guardar intensidades base para el control de luz\n        const controlledLights = [keyLight, fillLight, rimLight, accentLight];\n        const baseIntensities = controlledLights.map(l => l.intensity);\n\n        \/* ============================\n           POST-PROCESAMIENTO\n           ============================ *\/\n        const composer = new EffectComposer(renderer);\n        composer.addPass(new RenderPass(scene, camera));\n\n        const bloomPass = new UnrealBloomPass(\n            new THREE.Vector2(window.innerWidth, window.innerHeight),\n            0.32, 0.45, 0.80\n        );\n        composer.addPass(bloomPass);\n        composer.addPass(new OutputPass());\n\n        \/* ============================\n           ESTADO & CONTROLES DE UI\n           ============================ *\/\n        let autoRotate = true;\n        let rotationSpeed = 0.5;\n        let targetDistance = 6.5;\n\n        const btnRotate   = document.getElementById('btnRotate');\n        const speedSlider = document.getElementById('speedSlider');\n        const speedVal    = document.getElementById('speedVal');\n        const zoomSlider  = document.getElementById('zoomSlider');\n        const zoomVal     = document.getElementById('zoomVal');\n        const lightSlider = document.getElementById('lightSlider');\n        const lightVal    = document.getElementById('lightVal');\n\n        btnRotate.addEventListener('click', () => {\n            autoRotate = !autoRotate;\n            btnRotate.innerHTML = autoRotate\n                ? '<i class=\"fas fa-pause\"><\/i> Pausar'\n                : '<i class=\"fas fa-play\"><\/i> Reanudar';\n            btnRotate.setAttribute('aria-label',\n                autoRotate ? 'Pausar rotaci\u00f3n autom\u00e1tica' : 'Reanudar rotaci\u00f3n autom\u00e1tica'\n            );\n        });\n\n        speedSlider.addEventListener('input', e => {\n            rotationSpeed = e.target.value \/ 100;\n            speedVal.textContent = e.target.value;\n        });\n\n        zoomSlider.addEventListener('input', e => {\n            const v = e.target.value \/ 100;\n            targetDistance = THREE.MathUtils.lerp(2.8, 9.5, 1 - v);\n            zoomVal.textContent = e.target.value;\n        });\n\n        lightSlider.addEventListener('input', e => {\n            const v = e.target.value \/ 100;\n            lightVal.textContent = e.target.value;\n            controlledLights.forEach((l, i) => {\n                l.intensity = baseIntensities[i] * (0.15 + v * 0.85);\n            });\n        });\n\n        \/* ============================\n           BUCLE DE ANIMACI\u00d3N\n           ============================ *\/\n        const clock = new THREE.Clock();\n\n        function animate() {\n            requestAnimationFrame(animate);\n            const t = clock.getElapsedTime();\n\n            \/\/ Rotaci\u00f3n autom\u00e1tica de la botella\n            if (autoRotate) {\n                bottleGroup.rotation.y += rotationSpeed * 0.014;\n            }\n\n            \/\/ Flotaci\u00f3n sutil de la botella\n            bottleGroup.position.y = Math.sin(t * 0.6) * 0.04;\n\n            \/\/ Zoom suave hacia la distancia objetivo\n            const offset = camera.position.clone().sub(controls.target);\n            const curDist = offset.length();\n            if (curDist > 0.01) {\n                const dir = offset.normalize();\n                const newDist = THREE.MathUtils.lerp(curDist, targetDistance, 0.055);\n                camera.position.copy(controls.target).add(dir.multiplyScalar(newDist));\n            }\n\n            \/\/ Animar part\u00edculas\n            const posArr = particles.geometry.attributes.position.array;\n            for (let i = 0; i < PARTICLE_COUNT; i++) {\n                const i3 = i * 3;\n                posArr[i3]     += pVel[i3]     + Math.sin(t * 0.28 + i) * 0.00025;\n                posArr[i3 + 1] += pVel[i3 + 1] + Math.cos(t * 0.22 + i * 0.4) * 0.00018;\n                posArr[i3 + 2] += pVel[i3 + 2] + Math.sin(t * 0.25 + i * 0.7) * 0.00025;\n\n                \/\/ Reenvolver si se alejan demasiado\n                if (Math.abs(posArr[i3])     > 6) pVel[i3]     *= -1;\n                if (posArr[i3 + 1] > 8 || posArr[i3 + 1] < -0.5) pVel[i3 + 1] *= -1;\n                if (Math.abs(posArr[i3 + 2]) > 6) pVel[i3 + 2] *= -1;\n            }\n            particles.geometry.attributes.position.needsUpdate = true;\n\n            \/\/ Pulso del resplandor\n            glowPlane.material.opacity = 0.65 + Math.sin(t * 0.7) * 0.15;\n\n            \/\/ Movimiento sutil de la luz de acento\n            accentLight.position.x = 1.8 + Math.sin(t * 0.45) * 0.6;\n            accentLight.position.z = 3.2 + Math.cos(t * 0.3) * 0.5;\n            accentLight.intensity = baseIntensities[3] * (lightSlider.value \/ 100) * (0.85 + Math.sin(t * 0.9) * 0.15);\n\n            controls.update();\n            composer.render();\n        }\n\n        animate();\n\n        \/* ============================\n           RESPONSIVE\n           ============================ *\/\n        window.addEventListener('resize', () => {\n            const w = window.innerWidth, h = window.innerHeight;\n            camera.aspect = w \/ h;\n            camera.updateProjectionMatrix();\n            renderer.setSize(w, h);\n            composer.setSize(w, h);\n        });\n\n        \/\/ Respetar preferencia de movimiento reducido\n        if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n            autoRotate = false;\n            btnRotate.innerHTML = '<i class=\"fas fa-play\"><\/i> Reanudar';\n            btnRotate.setAttribute('aria-label', 'Reanudar rotaci\u00f3n autom\u00e1tica');\n        }\n    <\/script>\n<\/body>\n<\/html>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading alignwide has-text-align-center has-white-color has-text-color\" style=\"padding-left:32px;font-size:50px;font-style:normal;font-weight:400;letter-spacing:32px;line-height:1;text-transform:uppercase\">Etc\u00e9tera<\/h2>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div><\/div>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-299","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Goitia Perfumes - Goitia Perfumes<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/goitiaperfumes.ex31.net\/index.php\/goitia-perfumes-2\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Goitia Perfumes - Goitia Perfumes\" \/>\n<meta property=\"og:url\" content=\"https:\/\/goitiaperfumes.ex31.net\/index.php\/goitia-perfumes-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Goitia Perfumes\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-20T01:11:47+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minuto\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/goitiaperfumes.ex31.net\\\/index.php\\\/goitia-perfumes-2\\\/\",\"url\":\"https:\\\/\\\/goitiaperfumes.ex31.net\\\/index.php\\\/goitia-perfumes-2\\\/\",\"name\":\"Goitia Perfumes - Goitia Perfumes\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/goitiaperfumes.ex31.net\\\/#website\"},\"datePublished\":\"2026-04-20T01:11:44+00:00\",\"dateModified\":\"2026-04-20T01:11:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/goitiaperfumes.ex31.net\\\/index.php\\\/goitia-perfumes-2\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/goitiaperfumes.ex31.net\\\/index.php\\\/goitia-perfumes-2\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/goitiaperfumes.ex31.net\\\/index.php\\\/goitia-perfumes-2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/goitiaperfumes.ex31.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Goitia Perfumes\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/goitiaperfumes.ex31.net\\\/#website\",\"url\":\"https:\\\/\\\/goitiaperfumes.ex31.net\\\/\",\"name\":\"Goitia Perfumes\",\"description\":\"tu mejor opci\u00f3n en perfumes online\",\"publisher\":{\"@id\":\"https:\\\/\\\/goitiaperfumes.ex31.net\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/goitiaperfumes.ex31.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/goitiaperfumes.ex31.net\\\/#organization\",\"name\":\"Goitia Perfumes\",\"url\":\"https:\\\/\\\/goitiaperfumes.ex31.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/goitiaperfumes.ex31.net\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/goitiaperfumes.ex31.net\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/cropped-GP.png\",\"contentUrl\":\"https:\\\/\\\/goitiaperfumes.ex31.net\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/cropped-GP.png\",\"width\":240,\"height\":181,\"caption\":\"Goitia Perfumes\"},\"image\":{\"@id\":\"https:\\\/\\\/goitiaperfumes.ex31.net\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Goitia Perfumes - Goitia Perfumes","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/goitiaperfumes.ex31.net\/index.php\/goitia-perfumes-2\/","og_locale":"es_ES","og_type":"article","og_title":"Goitia Perfumes - Goitia Perfumes","og_url":"https:\/\/goitiaperfumes.ex31.net\/index.php\/goitia-perfumes-2\/","og_site_name":"Goitia Perfumes","article_modified_time":"2026-04-20T01:11:47+00:00","twitter_card":"summary_large_image","twitter_misc":{"Tiempo de lectura":"1 minuto"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/goitiaperfumes.ex31.net\/index.php\/goitia-perfumes-2\/","url":"https:\/\/goitiaperfumes.ex31.net\/index.php\/goitia-perfumes-2\/","name":"Goitia Perfumes - Goitia Perfumes","isPartOf":{"@id":"https:\/\/goitiaperfumes.ex31.net\/#website"},"datePublished":"2026-04-20T01:11:44+00:00","dateModified":"2026-04-20T01:11:47+00:00","breadcrumb":{"@id":"https:\/\/goitiaperfumes.ex31.net\/index.php\/goitia-perfumes-2\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/goitiaperfumes.ex31.net\/index.php\/goitia-perfumes-2\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/goitiaperfumes.ex31.net\/index.php\/goitia-perfumes-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/goitiaperfumes.ex31.net\/"},{"@type":"ListItem","position":2,"name":"Goitia Perfumes"}]},{"@type":"WebSite","@id":"https:\/\/goitiaperfumes.ex31.net\/#website","url":"https:\/\/goitiaperfumes.ex31.net\/","name":"Goitia Perfumes","description":"tu mejor opci\u00f3n en perfumes online","publisher":{"@id":"https:\/\/goitiaperfumes.ex31.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/goitiaperfumes.ex31.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/goitiaperfumes.ex31.net\/#organization","name":"Goitia Perfumes","url":"https:\/\/goitiaperfumes.ex31.net\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/goitiaperfumes.ex31.net\/#\/schema\/logo\/image\/","url":"https:\/\/goitiaperfumes.ex31.net\/wp-content\/uploads\/2026\/04\/cropped-GP.png","contentUrl":"https:\/\/goitiaperfumes.ex31.net\/wp-content\/uploads\/2026\/04\/cropped-GP.png","width":240,"height":181,"caption":"Goitia Perfumes"},"image":{"@id":"https:\/\/goitiaperfumes.ex31.net\/#\/schema\/logo\/image\/"}}]}},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/goitiaperfumes.ex31.net\/index.php\/wp-json\/wp\/v2\/pages\/299","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/goitiaperfumes.ex31.net\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/goitiaperfumes.ex31.net\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/goitiaperfumes.ex31.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/goitiaperfumes.ex31.net\/index.php\/wp-json\/wp\/v2\/comments?post=299"}],"version-history":[{"count":2,"href":"https:\/\/goitiaperfumes.ex31.net\/index.php\/wp-json\/wp\/v2\/pages\/299\/revisions"}],"predecessor-version":[{"id":301,"href":"https:\/\/goitiaperfumes.ex31.net\/index.php\/wp-json\/wp\/v2\/pages\/299\/revisions\/301"}],"wp:attachment":[{"href":"https:\/\/goitiaperfumes.ex31.net\/index.php\/wp-json\/wp\/v2\/media?parent=299"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}